見出し画像

解説クラスCopyClear(14)

解説クラスCopyClear(14)


2025年1月14初稿

(4-14-28)関数「void Make3Lut(BYTE lut[],int x1,int y1,int x2,int y2){・・・}」の説明

/************************************************************************/
/*****          LUTデータの作成:任意直線パターン                *****/
/************************************************************************/

void            CopyClear::Make3Lut(
    BYTE        lut[],                          // 作成するLUT
    int         x1,                             // Pattern書込始点Ix
    int         y1,                             // Pattern書込始点データ
    int         x2,                             // Pattern書込終点Ix
    int         y2                              // Pattern書込終点データ
){
    BYTE        *p;                             // 始点ポインタ
    int         k;                              // 直線の傾き係数
    int         x;                              // 書き込むIx値

    if( x1 == x2 ){                             // 始終点が同じなら
        lut[ x1 ] = y2;                         // 終点の値を書き込み
        return;                                 // 抜ける
    }                                           //
    k = ( ( y2 - y1 ) << 23 ) / ( x2 - x1 );    // 傾きを求める
    p = &lut[ x1 ];                             // 始点作成
    for( x = 0, x2 -= x1; x <= x2; x++ ){       // インデックスの範囲で
        *p++ = y1 + ((( k * x >> 22) + 1) >> 1);// データを算出し書込む
    }                                           //
}

☆備考☆この関数はファイル「CopyClear040.cpp」に存在!
★注意★この関数は「public:」属性ですのでライブラリの
外から使用可能です!

(A)関数「Make3Lut()」の【関数名】説明

「Make」は、作成するで
「Lut」は、勿論、LUT変換用のLUTです!
ココでは、「Make○○Lut」と枝番号○○で機能分けした内の
一つのLUTパターン作成の意味です!
ここの○○=3は、任意直線パターン作成です!

任意直線

このイメージです!

(B)関数「void Make3Lut()」の【返値】説明

返値を返さない関数です!
★注意★詰り、実引数の検査を実行時に行いませんので
使用する時は、正しい実引数を記載する必要が有ります!

(C)関数「Make3Lut()」の【仮引数】説明

void            CopyClear::Make3Lut(
    BYTE        lut[],                          // 作成するLUT
    int         x1,                             // Pattern書込始点Ix
    int         y1,                             // Pattern書込始点データ
    int         x2,                             // Pattern書込終点Ix
    int         y2                              // Pattern書込終点データ
){

「BYTE lut[],」はLUTを一次元配列として使用!
「int x1,」は、始点X座標です
「int y1,」は、始点Y座標です
「int x2,」は、終点X座標です
「int y2」は、終点Y座標です
★注意★LUT配列の添え字方向をX座標方向とし、
LUT配列に格納する値をY座標方向として幾何学的に
図示したグラフと考えてXY座標との表現にしています!

(D)関数「Make3Lut()」の【アルゴリズム】説明

){
    BYTE        *p;                             // 始点ポインタ
    int         k;                              // 直線の傾き係数
    int         x;                              // 書き込むIx値

    if( x1 == x2 ){                             // 始終点が同じなら
        lut[ x1 ] = y2;                         // 終点の値を書き込み
        return;                                 // 抜ける
    }                                           //
    k = ( ( y2 - y1 ) << 23 ) / ( x2 - x1 );    // 傾きを求める
    p = &lut[ x1 ];                             // 始点作成
    for( x = 0, x2 -= x1; x <= x2; x++ ){       // インデックスの範囲で
        *p++ = y1 + ((( k * x >> 22) + 1) >> 1);// データを算出し書込む
    }                                           //
}

(D-1)ローカル変数

){
    BYTE        *p;                             // 始点ポインタ
    int         k;                              // 直線の傾き係数
    int         x;                              // 書き込むIx値

「BYTE* p;」は、LUT格納操作用のポインタ
「int k;」は、直線線分の傾き係数
「int x;」は、LUT配列の添え字

(D-2)アルゴリズムコード

    if( x1 == x2 ){                             // 始終点が同じなら
        lut[ x1 ] = y2;                         // 終点の値を書き込み
        return;                                 // 抜ける
    }                                           //
    k = ( ( y2 - y1 ) << 23 ) / ( x2 - x1 );    // 傾きを求める
    p = &lut[ x1 ];                             // 始点作成
    for( x = 0, x2 -= x1; x <= x2; x++ ){       // インデックスの範囲で
        *p++ = y1 + ((( k * x >> 22) + 1) >> 1);// データを算出し書込む
    }                                           //
}

「if(x1==x2){lut[x1]=y2;return;}」は、X座標の始終点
が同じということでそのLUT配列の添え字場所にY座標
終点値を格納し関数終了
「k=((y2-y1)<<23)/(x2-x1);」は、傾き係数の算出です!
★注意★「<<23」とは、元のLUTへの格納値がY座標値で
8ビット以内(0~255)と見なしているのでシフト演算
[<<23]と乗算「×8388608」と同じ演算を古いCPUでも
シフト演算なので高速に動作出来る事で32ビット整数を
目いっぱい下駄履きに使用した演算で「/(x2-x1)」と
X座標方向の変位を使用して除算しても小数点以下の値が
十分と考えた!
「p=&lut[x1];」は、LUT配列書き込みポインタセット
「for(x=0,x2-=x1;x<=x2;x++){
*p++=y1+(((k*x>>22)+1)>>1);}」は、forループ構文で
「for(x=0,x2-=x1;x<=x2;x++){・・中身・・}」と
作図上のX座標を0にし、終点座標を「x2-=x1」と0
から原点に補正し、条件「x<=x2;」と終点まで「x++」と
増加、そして中身「*p++=y1+(((k*x>>22)+1)>>1);」で
作図上Y座標成分値「y1+(((k*x>>22)+1)>>1)」とY座標
始点「y1」に増分「((k*x>>22)+1)>>1」と演算し増分を
8ビット内に下駄を外す為に「>>22」と「>>1」と2段で
下駄を外しています!★注意★「+1)>>1」の記載は、
「「+1)」が、一番奥の最小桁数値の四捨五入処理だと
理解して下さい!※備考※勿論、C言語ならではのシフト
演算を使用した高速化処理例で下駄履きで小数点以下の数値
も扱っても結果整数値に四捨五入で丸めています!

(4-14-29)関数「void Make4Lut(BYTE lut[],int x1,int y1,int x2,int y2){・・・}」の説明

/************************************************************************/
/*****          LUTデータの作成:任意曲線パターン                *****/
/*****          ※注意:現在はMake3Lut()と同じ処理※                *****/
/************************************************************************/

void            CopyClear::Make4Lut(
    BYTE        lut[],                          // 作成するLUT
    int         x1,                             // Pattern書込始点Ix
    int         y1,                             // Pattern書込始点データ
    int         x2,                             // Pattern書込終点Ix
    int         y2                              // Pattern書込終点データ
){
    BYTE        *p;                             // 始点ポインタ
    int         k;                              // 直線の傾き係数
    int         x;                              // 書き込むIx値

    if( x1 == x2 ){                             // 始終点が同じなら
        lut[ x1 ] = y2;                         // 終点の値を書き込み
        return;                                 // 抜ける
    }                                           //
    k = ( ( y2 - y1 ) << 23 ) / ( x2 - x1 );    // 傾きを求める
    p = &lut[ x1 ];                             // 始点作成
    for( x = 0, x2 -= x1; x <= x2; x++ ){       // インデックスの範囲で
        *p++ = y1 + ((( k * x >> 22) + 1) >> 1);// データを算出し書込む
    }                                           //
}

☆備考☆この関数はファイル「CopyClear040.cpp」に存在!
★注意★この関数は「public:」属性ですのでライブラリの
外から使用可能です!

(A)関数「Make4Lut()」の【関数名】説明

「Make」は、作成するで
「Lut」は、勿論、LUT変換用のLUTです!
ココでは、「Make○○Lut」と枝番号○○で機能分けした内の
一つのLUTパターン作成の意味です!
ここの○○=4は、任意曲線パターン作成です!

任意直線

このイメージです!

(B)関数「void Make4Lut()」の【返値】説明

返値を返さない関数です!
★注意★詰り、実引数の検査を実行時に行いませんので
使用する時は、正しい実引数を記載する必要が有ります!

(C)関数「Make4Lut()」の【仮引数】説明

void            CopyClear::Make4Lut(
    BYTE        lut[],                          // 作成するLUT
    int         x1,                             // Pattern書込始点Ix
    int         y1,                             // Pattern書込始点データ
    int         x2,                             // Pattern書込終点Ix
    int         y2                              // Pattern書込終点データ
){

「BYTE lut[],」はLUTを一次元配列として使用!
「int x1,」は、始点X座標です
「int y1,」は、始点Y座標です
「int x2,」は、終点X座標です
「int y2」は、終点Y座標です
★注意★LUT配列の添え字方向をX座標方向とし、
LUT配列に格納する値をY座標方向として幾何学的に
図示したグラフと考えてXY座標との表現にしています!

(D)関数「Make4Lut()」の【アルゴリズム】説明

){
    BYTE        *p;                             // 始点ポインタ
    int         k;                              // 直線の傾き係数
    int         x;                              // 書き込むIx値

    if( x1 == x2 ){                             // 始終点が同じなら
        lut[ x1 ] = y2;                         // 終点の値を書き込み
        return;                                 // 抜ける
    }                                           //
    k = ( ( y2 - y1 ) << 23 ) / ( x2 - x1 );    // 傾きを求める
    p = &lut[ x1 ];                             // 始点作成
    for( x = 0, x2 -= x1; x <= x2; x++ ){       // インデックスの範囲で
        *p++ = y1 + ((( k * x >> 22) + 1) >> 1);// データを算出し書込む
    }                                           //
}

(D-1)ローカル変数

){
    BYTE        *p;                             // 始点ポインタ
    int         k;                              // 直線の傾き係数
    int         x;                              // 書き込むIx値

「BYTE* p;」は、LUT格納操作用のポインタ
「int k;」は、直線線分の傾き係数
「int x;」は、LUT配列の添え字

(D-2)アルゴリズムコード

    if( x1 == x2 ){                             // 始終点が同じなら
        lut[ x1 ] = y2;                         // 終点の値を書き込み
        return;                                 // 抜ける
    }                                           //
    k = ( ( y2 - y1 ) << 23 ) / ( x2 - x1 );    // 傾きを求める
    p = &lut[ x1 ];                             // 始点作成
    for( x = 0, x2 -= x1; x <= x2; x++ ){       // インデックスの範囲で
        *p++ = y1 + ((( k * x >> 22) + 1) >> 1);// データを算出し書込む
    }                                           //
}

「if(x1==x2){lut[x1]=y2;return;}」は、X座標の始終点
が同じということでそのLUT配列の添え字場所にY座標
終点値を格納し関数終了
「k=((y2-y1)<<23)/(x2-x1);」は、傾き係数の算出です!
★注意★「<<23」とは、元のLUTへの格納値がY座標値で
8ビット以内(0~255)と見なしているのでシフト演算
[<<23]と乗算「8388608」と同じ演算を古いCPUでも
シフト演算なので高速に動作出来る事で32ビット整数を
目いっぱい下駄履きに使用した演算で「/(x2-x1)」と
X座標方向の変位を使用して除算しても小数点以下の値が
十分と考えた!
「*p=&lut[x1];」は、LUT配列書き込みポインタセット
「for(x=0,x2-=x1;x<=x2;x++){
*p++=y1+(((k*x>>22)+1)>>1);}」は、forループ構文で
「for(x=0,x2-=x1;x<=x2;x++){・・中身・・}」と
作図上のX座標を0にし、終点座標を「x2-=x1」と0
から原点に補正し、条件「x<=x2;」と終点まで「x++」と
増加、そして中身「*p++=y1+(((k*x>>22)+1)>>1);」で
作図上Y座標成分値「y1+(((k*x>>22)+1)>>1)」とY座標
始点「y1」に増分「((k*x>>22)+1)>>1」と演算し増分を
8ビット内に下駄を外す為に「>>22」と「>>1」と2段で
下駄を外しています!★注意★「+1)>>1」の記載は、
「「+1)」が、一番奥の最小桁数値の四捨五入処理だと
理解して下さい!※備考※勿論、C言語ならではのシフト
演算を使用した高速化処理例で下駄履きで小数点以下の数値
も扱っても結果整数値に四捨五入で丸めています!

(E)関数「Make4Lut()」の【備考】

関数コードの記載の中のコメント
「※注意:現在はMake3Lut()と同じ処理※」と有る様に
仮引数「int x1,int y1,int x2,int y2」とXY座標が
(x1,y1)と(x2,y2)と2点間を結ぶ曲線を作成する心算
だったが、勿論、2点間では直線にしか成らないので
「Make3Lut()と同じ」に成るのだ?!当初、C++言語の
多重定義(オーバーロード)関数追加、詰り
「void Make4Lut(BYTE lut[],int x1,int y1,
int x2,int y2,int x3,int y3)」とか「void Make4Lut(
BYTE lut[],int x1,int y1,int x2,int y2,int x3,
int y3,int x4,int y4)」及び「void Make4Lut(
BYTE lut[],int x1,int y1,int x2,int y2,int x3,
int y3,int x4,int y4),int x5,int y5)」と座標の点数を
増やし、3点以上は、其れなりに曲線に成る事を考えていた
が、他のライブラリ関数を整備する方を優先し、コレは後回
しにし、ソノママです!※備考※特に必要とは考えて無かっ
たと言い訳!

(4-14-30)関数「int Make5Lut(BYTE lut[],int k,int sw){・・・}」の説明

/************************************************************************/
/*****          LUTデータの作成:Γ/logパターン              *****/
/*****          返し値:エラーチェックの値(END_STI,STI_FLG)       *****/
/*****          注意①  Γ/log選択子省略時(負値)              *****/
/*****                                  →  0(Γ補正:中央強調)  *****/
/*****          注意②  反転sw選択子省略時(負値)→0(無反転)  *****/
/************************************************************************/

int         CopyClear::Make5Lut(
    BYTE    lut[],                              // 作成するLUT
    int     k,                                  // Γ/log選択子
    int     sw                                  // 反転sw(0:無/1:反転)
){

    /********************************************************************/
    /**********     Γ table for LUT                         *********/
    /**********     y = 256 * ( x / 256 ) ** 1.2                *********/
    /********************************************************************/

    static const BYTE   pow12[] = {
        0,    0,    1,    1,    2,    2,    3,    3,    4,    5,
        5,    6,    7,    7,    8,    9,    9,   10,   11,   11,
       12,   13,   13,   14,   15,   16,   16,   17,   18,   19,
       20,   20,   21,   22,   23,   24,   24,   25,   26,   27,
       28,   28,   29,   30,   31,   32,   33,   33,   34,   35,
       36,   37,   38,   39,   40,   40,   41,   42,   43,   44,
       45,   46,   47,   48,   49,   49,   50,   51,   52,   53,
       54,   55,   56,   57,   58,   59,   60,   61,   61,   62,
       63,   64,   65,   66,   67,   68,   69,   70,   71,   72,
       73,   74,   75,   76,   77,   78,   79,   80,   81,   82,
       83,   84,   85,   86,   87,   88,   89,   90,   91,   92,
       93,   94,   95,   96,   97,   98,   99,  100,  101,  102,
      103,  104,  105,  106,  107,  108,  109,  110,  111,  112,
      114,  115,  116,  117,  118,  119,  120,  121,  122,  123,
      124,  125,  126,  127,  128,  129,  130,  132,  133,  134,
      135,  136,  137,  138,  139,  140,  141,  142,  143,  145,
      146,  147,  148,  149,  150,  151,  152,  153,  154,  156,
      157,  158,  159,  160,  161,  162,  163,  164,  166,  167,
      168,  169,  170,  171,  172,  173,  174,  176,  177,  178,
      179,  180,  181,  182,  184,  185,  186,  187,  188,  189,
      190,  192,  193,  194,  195,  196,  197,  198,  200,  201,
      202,  203,  204,  205,  206,  208,  209,  210,  211,  212,
      213,  215,  216,  217,  218,  219,  220,  222,  223,  224,
      225,  226,  227,  229,  230,  231,  232,  233,  235,  236,
      237,  238,  239,  240,  242,  243,  244,  245,  246,  248,
      249,  250,  251,  252,  254,  255,
    };

    /********************************************************************/
    /**********     Γ table for LUT                         *********/
    /**********     y = 256 * ( x / 256 ) ** 0.8                *********/
    /********************************************************************/

    static const BYTE   pow08[0x100] = {
        0,    3,    5,    7,    9,   11,   13,   14,   16,   18,
       19,   21,   22,   24,   25,   26,   28,   29,   31,   32,
       33,   35,   36,   37,   39,   40,   41,   42,   44,   45,
       46,   47,   49,   50,   51,   52,   53,   54,   56,   57,
       58,   59,   60,   61,   63,   64,   65,   66,   67,   68,
       69,   70,   72,   73,   74,   75,   76,   77,   78,   79,
       80,   81,   82,   83,   84,   86,   87,   88,   89,   90,
       91,   92,   93,   94,   95,   96,   97,   98,   99,  100,
      101,  102,  103,  104,  105,  106,  107,  108,  109,  110,
      111,  112,  113,  114,  115,  116,  117,  118,  119,  120,
      121,  122,  123,  124,  125,  125,  126,  127,  128,  129,
      130,  131,  132,  133,  134,  135,  136,  137,  138,  139,
      140,  141,  141,  142,  143,  144,  145,  146,  147,  148,
      149,  150,  151,  152,  153,  153,  154,  155,  156,  157,
      158,  159,  160,  161,  162,  162,  163,  164,  165,  166,
      167,  168,  169,  170,  170,  171,  172,  173,  174,  175,
      176,  177,  178,  178,  179,  180,  181,  182,  183,  184,
      185,  185,  186,  187,  188,  189,  190,  191,  191,  192,
      193,  194,  195,  196,  197,  197,  198,  199,  200,  201,
      202,  203,  203,  204,  205,  206,  207,  208,  208,  209,
      210,  211,  212,  213,  213,  214,  215,  216,  217,  218,
      218,  219,  220,  221,  222,  223,  223,  224,  225,  226,
      227,  228,  228,  229,  230,  231,  232,  233,  233,  234,
      235,  236,  237,  237,  238,  239,  240,  241,  241,  242,
      243,  244,  245,  246,  246,  247,  248,  249,  250,  250,
      251,  252,  253,  254,  254,  255,
    };

    //page
    /********************************************************************/
    /**********     log table for LUT                     *********/
    /**********     y = 256 * log255( x )                       *********/
    /********************************************************************/

    static const BYTE   log0tbl[0x100] = {
        0,    0,   32,   50,   64,   74,   82,   89,   96,  101,
      106,  110,  114,  118,  121,  125,  128,  130,  133,  135,
      138,  140,  142,  144,  146,  148,  150,  152,  153,  155,
      157,  158,  160,  161,  162,  164,  165,  166,  167,  169,
      170,  171,  172,  173,  174,  175,  176,  177,  178,  179,
      180,  181,  182,  183,  184,  185,  185,  186,  187,  188,
      189,  189,  190,  191,  192,  192,  193,  194,  194,  195,
      196,  196,  197,  198,  198,  199,  199,  200,  201,  201,
      202,  202,  203,  204,  204,  205,  205,  206,  206,  207,
      207,  208,  208,  209,  209,  210,  210,  211,  211,  212,
      212,  213,  213,  213,  214,  214,  215,  215,  216,  216,
      217,  217,  217,  218,  218,  219,  219,  219,  220,  220,
      221,  221,  221,  222,  222,  222,  223,  223,  224,  224,
      224,  225,  225,  225,  226,  226,  226,  227,  227,  227,
      228,  228,  228,  229,  229,  229,  230,  230,  230,  231,
      231,  231,  231,  232,  232,  232,  233,  233,  233,  234,
      234,  234,  234,  235,  235,  235,  236,  236,  236,  236,
      237,  237,  237,  237,  238,  238,  238,  238,  239,  239,
      239,  239,  240,  240,  240,  241,  241,  241,  241,  241,
      242,  242,  242,  242,  243,  243,  243,  243,  244,  244,
      244,  244,  245,  245,  245,  245,  245,  246,  246,  246,
      246,  247,  247,  247,  247,  247,  248,  248,  248,  248,
      249,  249,  249,  249,  249,  250,  250,  250,  250,  250,
      251,  251,  251,  251,  251,  252,  252,  252,  252,  252,
      253,  253,  253,  253,  253,  253,  254,  254,  254,  254,
      254,  255,  255,  255,  255,  255,
    };

    //page
    /********************************************************************/
    /**********     log table for LUT                     *********/
    /**********     y = 255 ** ( x / 255 )                      *********/
    /********************************************************************/

    static const BYTE   log1tbl[0x100] = {
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    2,    2,    2,    2,    2,    2,    2,    2,
        2,    2,    2,    2,    2,    2,    2,    2,    2,    2,
        2,    3,    3,    3,    3,    3,    3,    3,    3,    3,
        3,    3,    3,    3,    4,    4,    4,    4,    4,    4,
        4,    4,    4,    4,    4,    5,    5,    5,    5,    5,
        5,    5,    5,    6,    6,    6,    6,    6,    6,    6,
        7,    7,    7,    7,    7,    7,    8,    8,    8,    8,
        8,    8,    9,    9,    9,    9,   10,   10,   10,   10,
       10,   11,   11,   11,   11,   12,   12,   12,   13,   13,
       13,   13,   14,   14,   14,   15,   15,   15,   16,   16,
       16,   17,   17,   18,   18,   18,   19,   19,   20,   20,
       20,   21,   21,   22,   22,   23,   23,   24,   24,   25,
       26,   26,   27,   27,   28,   29,   29,   30,   31,   31,
       32,   33,   33,   34,   35,   36,   36,   37,   38,   39,
       40,   41,   42,   43,   43,   44,   45,   46,   47,   48,
       50,   51,   52,   53,   54,   55,   57,   58,   59,   60,
       62,   63,   65,   66,   67,   69,   70,   72,   74,   75,
       77,   79,   80,   82,   84,   86,   88,   90,   92,   94,
       96,   98,  100,  102,  104,  107,  109,  111,  114,  116,
      119,  122,  124,  127,  130,  133,  136,  139,  142,  145,
      148,  151,  155,  158,  162,  165,  169,  172,  176,  180,
      184,  188,  192,  197,  201,  205,  210,  214,  219,  224,
      229,  234,  239,  244,  250,  255,
    };
    const BYTE      *pat;                       // 元パターンのポインタ

    if( k <= 0 ){                               // Γ補正:中央強調
        pat = pow12;                            // パターン用テーブル
    }else if( k == 1 ){                         // Γ補正:周辺強調
        pat = pow08;                            // パターン用テーブル
    }else if( k == 2 ){                         // log補正:中央強調
        pat = log0tbl;                          // パターン用テーブル
    }else if( k == 3 ){                         // 指数補正:周辺強調
        pat = log1tbl;                          // パターン用テーブル
    }else{                                      // 上記外なら
        return( STI_FLG );                      // 引数検査違反
    }                                           //
    set_lut( pat, lut, sw );                    // パターンのコピー
    return( END_STI );                          // 正常終了
}

☆備考☆この関数はファイル「CopyClear040.cpp」に存在!
★注意★この関数は「public:」属性ですのでライブラリの
外から使用可能です!

(A)関数「Make5Lut()」の【関数名】説明

「Make」は、作成するで
「Lut」は、勿論、LUT変換用のLUTです!
ココでは、「Make○○Lut」と枝番号○○で機能分けした内の
一つのLUTパターン作成の意味です!
ここの○○=5は、Γガンマlogパターン作成
です!
定型のパターン書き込みです!

LUT:γLog反転

このイメージです!

(B)関数「int Make5Lut()」の【返値】説明

この関数内で明示的に検査しているのは、
仮引数「int k,」が、所定の値に成って
居るか如何かを判定し仕様外ならエラー「STI_FLG」を
返します!
最後まで実行時は、正常終了「END_STI」を返します!

(C)関数「Make5Lut()」の【仮引数】説明

int         CopyClear::Make5Lut(
    BYTE    lut[],                              // 作成するLUT
    int     k,                                  // Γ/log選択子
    int     sw                                  // 反転sw(0:無/1:反転)
){

「BYTE lut[],」はLUTを一次元配列として使用!
「int k,」は、選択肢≪0から3≫の値で対応する
パターンをLUTに書き込みます!
「int sw」は、パターン左右反転書き込み指定スイッチ
です!

(D)関数「Make5Lut()」の【アルゴリズム】説明

){

    /********************************************************************/
    /**********     Γ table for LUT                         *********/
    /**********     y = 256 * ( x / 256 ) ** 1.2                *********/
    /********************************************************************/

    static const BYTE   pow12[] = {
        0,    0,    1,    1,    2,    2,    3,    3,    4,    5,
        5,    6,    7,    7,    8,    9,    9,   10,   11,   11,
       12,   13,   13,   14,   15,   16,   16,   17,   18,   19,
       20,   20,   21,   22,   23,   24,   24,   25,   26,   27,
       28,   28,   29,   30,   31,   32,   33,   33,   34,   35,
       36,   37,   38,   39,   40,   40,   41,   42,   43,   44,
       45,   46,   47,   48,   49,   49,   50,   51,   52,   53,
       54,   55,   56,   57,   58,   59,   60,   61,   61,   62,
       63,   64,   65,   66,   67,   68,   69,   70,   71,   72,
       73,   74,   75,   76,   77,   78,   79,   80,   81,   82,
       83,   84,   85,   86,   87,   88,   89,   90,   91,   92,
       93,   94,   95,   96,   97,   98,   99,  100,  101,  102,
      103,  104,  105,  106,  107,  108,  109,  110,  111,  112,
      114,  115,  116,  117,  118,  119,  120,  121,  122,  123,
      124,  125,  126,  127,  128,  129,  130,  132,  133,  134,
      135,  136,  137,  138,  139,  140,  141,  142,  143,  145,
      146,  147,  148,  149,  150,  151,  152,  153,  154,  156,
      157,  158,  159,  160,  161,  162,  163,  164,  166,  167,
      168,  169,  170,  171,  172,  173,  174,  176,  177,  178,
      179,  180,  181,  182,  184,  185,  186,  187,  188,  189,
      190,  192,  193,  194,  195,  196,  197,  198,  200,  201,
      202,  203,  204,  205,  206,  208,  209,  210,  211,  212,
      213,  215,  216,  217,  218,  219,  220,  222,  223,  224,
      225,  226,  227,  229,  230,  231,  232,  233,  235,  236,
      237,  238,  239,  240,  242,  243,  244,  245,  246,  248,
      249,  250,  251,  252,  254,  255,
    };

    /********************************************************************/
    /**********     Γ table for LUT                         *********/
    /**********     y = 256 * ( x / 256 ) ** 0.8                *********/
    /********************************************************************/

    static const BYTE   pow08[0x100] = {
        0,    3,    5,    7,    9,   11,   13,   14,   16,   18,
       19,   21,   22,   24,   25,   26,   28,   29,   31,   32,
       33,   35,   36,   37,   39,   40,   41,   42,   44,   45,
       46,   47,   49,   50,   51,   52,   53,   54,   56,   57,
       58,   59,   60,   61,   63,   64,   65,   66,   67,   68,
       69,   70,   72,   73,   74,   75,   76,   77,   78,   79,
       80,   81,   82,   83,   84,   86,   87,   88,   89,   90,
       91,   92,   93,   94,   95,   96,   97,   98,   99,  100,
      101,  102,  103,  104,  105,  106,  107,  108,  109,  110,
      111,  112,  113,  114,  115,  116,  117,  118,  119,  120,
      121,  122,  123,  124,  125,  125,  126,  127,  128,  129,
      130,  131,  132,  133,  134,  135,  136,  137,  138,  139,
      140,  141,  141,  142,  143,  144,  145,  146,  147,  148,
      149,  150,  151,  152,  153,  153,  154,  155,  156,  157,
      158,  159,  160,  161,  162,  162,  163,  164,  165,  166,
      167,  168,  169,  170,  170,  171,  172,  173,  174,  175,
      176,  177,  178,  178,  179,  180,  181,  182,  183,  184,
      185,  185,  186,  187,  188,  189,  190,  191,  191,  192,
      193,  194,  195,  196,  197,  197,  198,  199,  200,  201,
      202,  203,  203,  204,  205,  206,  207,  208,  208,  209,
      210,  211,  212,  213,  213,  214,  215,  216,  217,  218,
      218,  219,  220,  221,  222,  223,  223,  224,  225,  226,
      227,  228,  228,  229,  230,  231,  232,  233,  233,  234,
      235,  236,  237,  237,  238,  239,  240,  241,  241,  242,
      243,  244,  245,  246,  246,  247,  248,  249,  250,  250,
      251,  252,  253,  254,  254,  255,
    };

    //page
    /********************************************************************/
    /**********     log table for LUT                     *********/
    /**********     y = 256 * log255( x )                       *********/
    /********************************************************************/

    static const BYTE   log0tbl[0x100] = {
        0,    0,   32,   50,   64,   74,   82,   89,   96,  101,
      106,  110,  114,  118,  121,  125,  128,  130,  133,  135,
      138,  140,  142,  144,  146,  148,  150,  152,  153,  155,
      157,  158,  160,  161,  162,  164,  165,  166,  167,  169,
      170,  171,  172,  173,  174,  175,  176,  177,  178,  179,
      180,  181,  182,  183,  184,  185,  185,  186,  187,  188,
      189,  189,  190,  191,  192,  192,  193,  194,  194,  195,
      196,  196,  197,  198,  198,  199,  199,  200,  201,  201,
      202,  202,  203,  204,  204,  205,  205,  206,  206,  207,
      207,  208,  208,  209,  209,  210,  210,  211,  211,  212,
      212,  213,  213,  213,  214,  214,  215,  215,  216,  216,
      217,  217,  217,  218,  218,  219,  219,  219,  220,  220,
      221,  221,  221,  222,  222,  222,  223,  223,  224,  224,
      224,  225,  225,  225,  226,  226,  226,  227,  227,  227,
      228,  228,  228,  229,  229,  229,  230,  230,  230,  231,
      231,  231,  231,  232,  232,  232,  233,  233,  233,  234,
      234,  234,  234,  235,  235,  235,  236,  236,  236,  236,
      237,  237,  237,  237,  238,  238,  238,  238,  239,  239,
      239,  239,  240,  240,  240,  241,  241,  241,  241,  241,
      242,  242,  242,  242,  243,  243,  243,  243,  244,  244,
      244,  244,  245,  245,  245,  245,  245,  246,  246,  246,
      246,  247,  247,  247,  247,  247,  248,  248,  248,  248,
      249,  249,  249,  249,  249,  250,  250,  250,  250,  250,
      251,  251,  251,  251,  251,  252,  252,  252,  252,  252,
      253,  253,  253,  253,  253,  253,  254,  254,  254,  254,
      254,  255,  255,  255,  255,  255,
    };

    //page
    /********************************************************************/
    /**********     log table for LUT                     *********/
    /**********     y = 255 ** ( x / 255 )                      *********/
    /********************************************************************/

    static const BYTE   log1tbl[0x100] = {
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    2,    2,    2,    2,    2,    2,    2,    2,
        2,    2,    2,    2,    2,    2,    2,    2,    2,    2,
        2,    3,    3,    3,    3,    3,    3,    3,    3,    3,
        3,    3,    3,    3,    4,    4,    4,    4,    4,    4,
        4,    4,    4,    4,    4,    5,    5,    5,    5,    5,
        5,    5,    5,    6,    6,    6,    6,    6,    6,    6,
        7,    7,    7,    7,    7,    7,    8,    8,    8,    8,
        8,    8,    9,    9,    9,    9,   10,   10,   10,   10,
       10,   11,   11,   11,   11,   12,   12,   12,   13,   13,
       13,   13,   14,   14,   14,   15,   15,   15,   16,   16,
       16,   17,   17,   18,   18,   18,   19,   19,   20,   20,
       20,   21,   21,   22,   22,   23,   23,   24,   24,   25,
       26,   26,   27,   27,   28,   29,   29,   30,   31,   31,
       32,   33,   33,   34,   35,   36,   36,   37,   38,   39,
       40,   41,   42,   43,   43,   44,   45,   46,   47,   48,
       50,   51,   52,   53,   54,   55,   57,   58,   59,   60,
       62,   63,   65,   66,   67,   69,   70,   72,   74,   75,
       77,   79,   80,   82,   84,   86,   88,   90,   92,   94,
       96,   98,  100,  102,  104,  107,  109,  111,  114,  116,
      119,  122,  124,  127,  130,  133,  136,  139,  142,  145,
      148,  151,  155,  158,  162,  165,  169,  172,  176,  180,
      184,  188,  192,  197,  201,  205,  210,  214,  219,  224,
      229,  234,  239,  244,  250,  255,
    };
    const BYTE      *pat;                       // 元パターンのポインタ

    if( k <= 0 ){                               // Γ補正:中央強調
        pat = pow12;                            // パターン用テーブル
    }else if( k == 1 ){                         // Γ補正:周辺強調
        pat = pow08;                            // パターン用テーブル
    }else if( k == 2 ){                         // log補正:中央強調
        pat = log0tbl;                          // パターン用テーブル
    }else if( k == 3 ){                         // 指数補正:周辺強調
        pat = log1tbl;                          // パターン用テーブル
    }else{                                      // 上記外なら
        return( STI_FLG );                      // 引数検査違反
    }                                           //
    set_lut( pat, lut, sw );                    // パターンのコピー
    return( END_STI );                          // 正常終了
}

(D-1)ローカル変数

){

    /********************************************************************/
    /**********     Γ table for LUT                         *********/
    /**********     y = 256 * ( x / 256 ) ** 1.2                *********/
    /********************************************************************/

    static const BYTE   pow12[] = {
        0,    0,    1,    1,    2,    2,    3,    3,    4,    5,
        5,    6,    7,    7,    8,    9,    9,   10,   11,   11,
       12,   13,   13,   14,   15,   16,   16,   17,   18,   19,
       20,   20,   21,   22,   23,   24,   24,   25,   26,   27,
       28,   28,   29,   30,   31,   32,   33,   33,   34,   35,
       36,   37,   38,   39,   40,   40,   41,   42,   43,   44,
       45,   46,   47,   48,   49,   49,   50,   51,   52,   53,
       54,   55,   56,   57,   58,   59,   60,   61,   61,   62,
       63,   64,   65,   66,   67,   68,   69,   70,   71,   72,
       73,   74,   75,   76,   77,   78,   79,   80,   81,   82,
       83,   84,   85,   86,   87,   88,   89,   90,   91,   92,
       93,   94,   95,   96,   97,   98,   99,  100,  101,  102,
      103,  104,  105,  106,  107,  108,  109,  110,  111,  112,
      114,  115,  116,  117,  118,  119,  120,  121,  122,  123,
      124,  125,  126,  127,  128,  129,  130,  132,  133,  134,
      135,  136,  137,  138,  139,  140,  141,  142,  143,  145,
      146,  147,  148,  149,  150,  151,  152,  153,  154,  156,
      157,  158,  159,  160,  161,  162,  163,  164,  166,  167,
      168,  169,  170,  171,  172,  173,  174,  176,  177,  178,
      179,  180,  181,  182,  184,  185,  186,  187,  188,  189,
      190,  192,  193,  194,  195,  196,  197,  198,  200,  201,
      202,  203,  204,  205,  206,  208,  209,  210,  211,  212,
      213,  215,  216,  217,  218,  219,  220,  222,  223,  224,
      225,  226,  227,  229,  230,  231,  232,  233,  235,  236,
      237,  238,  239,  240,  242,  243,  244,  245,  246,  248,
      249,  250,  251,  252,  254,  255,
    };

    /********************************************************************/
    /**********     Γ table for LUT                         *********/
    /**********     y = 256 * ( x / 256 ) ** 0.8                *********/
    /********************************************************************/

    static const BYTE   pow08[0x100] = {
        0,    3,    5,    7,    9,   11,   13,   14,   16,   18,
       19,   21,   22,   24,   25,   26,   28,   29,   31,   32,
       33,   35,   36,   37,   39,   40,   41,   42,   44,   45,
       46,   47,   49,   50,   51,   52,   53,   54,   56,   57,
       58,   59,   60,   61,   63,   64,   65,   66,   67,   68,
       69,   70,   72,   73,   74,   75,   76,   77,   78,   79,
       80,   81,   82,   83,   84,   86,   87,   88,   89,   90,
       91,   92,   93,   94,   95,   96,   97,   98,   99,  100,
      101,  102,  103,  104,  105,  106,  107,  108,  109,  110,
      111,  112,  113,  114,  115,  116,  117,  118,  119,  120,
      121,  122,  123,  124,  125,  125,  126,  127,  128,  129,
      130,  131,  132,  133,  134,  135,  136,  137,  138,  139,
      140,  141,  141,  142,  143,  144,  145,  146,  147,  148,
      149,  150,  151,  152,  153,  153,  154,  155,  156,  157,
      158,  159,  160,  161,  162,  162,  163,  164,  165,  166,
      167,  168,  169,  170,  170,  171,  172,  173,  174,  175,
      176,  177,  178,  178,  179,  180,  181,  182,  183,  184,
      185,  185,  186,  187,  188,  189,  190,  191,  191,  192,
      193,  194,  195,  196,  197,  197,  198,  199,  200,  201,
      202,  203,  203,  204,  205,  206,  207,  208,  208,  209,
      210,  211,  212,  213,  213,  214,  215,  216,  217,  218,
      218,  219,  220,  221,  222,  223,  223,  224,  225,  226,
      227,  228,  228,  229,  230,  231,  232,  233,  233,  234,
      235,  236,  237,  237,  238,  239,  240,  241,  241,  242,
      243,  244,  245,  246,  246,  247,  248,  249,  250,  250,
      251,  252,  253,  254,  254,  255,
    };

    //page
    /********************************************************************/
    /**********     log table for LUT                     *********/
    /**********     y = 256 * log255( x )                       *********/
    /********************************************************************/

    static const BYTE   log0tbl[0x100] = {
        0,    0,   32,   50,   64,   74,   82,   89,   96,  101,
      106,  110,  114,  118,  121,  125,  128,  130,  133,  135,
      138,  140,  142,  144,  146,  148,  150,  152,  153,  155,
      157,  158,  160,  161,  162,  164,  165,  166,  167,  169,
      170,  171,  172,  173,  174,  175,  176,  177,  178,  179,
      180,  181,  182,  183,  184,  185,  185,  186,  187,  188,
      189,  189,  190,  191,  192,  192,  193,  194,  194,  195,
      196,  196,  197,  198,  198,  199,  199,  200,  201,  201,
      202,  202,  203,  204,  204,  205,  205,  206,  206,  207,
      207,  208,  208,  209,  209,  210,  210,  211,  211,  212,
      212,  213,  213,  213,  214,  214,  215,  215,  216,  216,
      217,  217,  217,  218,  218,  219,  219,  219,  220,  220,
      221,  221,  221,  222,  222,  222,  223,  223,  224,  224,
      224,  225,  225,  225,  226,  226,  226,  227,  227,  227,
      228,  228,  228,  229,  229,  229,  230,  230,  230,  231,
      231,  231,  231,  232,  232,  232,  233,  233,  233,  234,
      234,  234,  234,  235,  235,  235,  236,  236,  236,  236,
      237,  237,  237,  237,  238,  238,  238,  238,  239,  239,
      239,  239,  240,  240,  240,  241,  241,  241,  241,  241,
      242,  242,  242,  242,  243,  243,  243,  243,  244,  244,
      244,  244,  245,  245,  245,  245,  245,  246,  246,  246,
      246,  247,  247,  247,  247,  247,  248,  248,  248,  248,
      249,  249,  249,  249,  249,  250,  250,  250,  250,  250,
      251,  251,  251,  251,  251,  252,  252,  252,  252,  252,
      253,  253,  253,  253,  253,  253,  254,  254,  254,  254,
      254,  255,  255,  255,  255,  255,
    };

    //page
    /********************************************************************/
    /**********     log table for LUT                     *********/
    /**********     y = 255 ** ( x / 255 )                      *********/
    /********************************************************************/

    static const BYTE   log1tbl[0x100] = {
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    2,    2,    2,    2,    2,    2,    2,    2,
        2,    2,    2,    2,    2,    2,    2,    2,    2,    2,
        2,    3,    3,    3,    3,    3,    3,    3,    3,    3,
        3,    3,    3,    3,    4,    4,    4,    4,    4,    4,
        4,    4,    4,    4,    4,    5,    5,    5,    5,    5,
        5,    5,    5,    6,    6,    6,    6,    6,    6,    6,
        7,    7,    7,    7,    7,    7,    8,    8,    8,    8,
        8,    8,    9,    9,    9,    9,   10,   10,   10,   10,
       10,   11,   11,   11,   11,   12,   12,   12,   13,   13,
       13,   13,   14,   14,   14,   15,   15,   15,   16,   16,
       16,   17,   17,   18,   18,   18,   19,   19,   20,   20,
       20,   21,   21,   22,   22,   23,   23,   24,   24,   25,
       26,   26,   27,   27,   28,   29,   29,   30,   31,   31,
       32,   33,   33,   34,   35,   36,   36,   37,   38,   39,
       40,   41,   42,   43,   43,   44,   45,   46,   47,   48,
       50,   51,   52,   53,   54,   55,   57,   58,   59,   60,
       62,   63,   65,   66,   67,   69,   70,   72,   74,   75,
       77,   79,   80,   82,   84,   86,   88,   90,   92,   94,
       96,   98,  100,  102,  104,  107,  109,  111,  114,  116,
      119,  122,  124,  127,  130,  133,  136,  139,  142,  145,
      148,  151,  155,  158,  162,  165,  169,  172,  176,  180,
      184,  188,  192,  197,  201,  205,  210,  214,  219,  224,
      229,  234,  239,  244,  250,  255,
    };
    const BYTE      *pat;                       // 元パターンのポインタ



「static const BYTE pow12[]={・・中身・・};」は、
勿論、「static const BYTE ・・[]」と固定データテーブル
で「1.2」を冪指数べきしすうとする冪演算べきえんざん
で作成したていを0から255までの値とする
テーブルです!※備考※「pow12[]」と「[]」と中身を省略
してこのテーブルは記載して居ます=定数値の数が「[]」
の中身を指定した事と同じです!
「static const BYTE pow08[0x100]={・・中身・・
};」は、勿論、「static const BYTE ・・[]」と固定データテーブル
で「0.8」を冪指数べきしすうとする冪演算べきえんざん
で作成したていを0から255までの値とする
テーブルです!※備考※「pow08[0x100]」と「[0x100]」と
中身を明示的に記載し、「0x100=256」とヘキサ表示で
8ビット目いっぱい使用して居る事を示して居ます!と説明
の為の記法で「覚書」として記載した心算!
「static const BYTE log0tbl[0x100]={・・中身・・
};」は、ログ対数関数を使用した0~255内を凸方向に
カーブしたパターン!
「static const BYTE log1tbl[0x100]={・・中身・・
};」は、ログ対数関数を使用した0~255内を凹方向に
カーブしたパターン!
「const BYTE *pat;」は、テーブルのパターンを
ポインタで取り出し、コピーする時に使用するポインタ変数

(D-2)アルゴリズムコード

    if( k <= 0 ){                               // Γ補正:中央強調
        pat = pow12;                            // パターン用テーブル
    }else if( k == 1 ){                         // Γ補正:周辺強調
        pat = pow08;                            // パターン用テーブル
    }else if( k == 2 ){                         // log補正:中央強調
        pat = log0tbl;                          // パターン用テーブル
    }else if( k == 3 ){                         // 指数補正:周辺強調
        pat = log1tbl;                          // パターン用テーブル
    }else{                                      // 上記外なら
        return( STI_FLG );                      // 引数検査違反
    }                                           //
    set_lut( pat, lut, sw );                    // パターンのコピー
    return( END_STI );                          // 正常終了
}

「if(k<=0){pat=pow12;}else if(k==1){pat=pow08;}
else if(k==2){pat=log0tbl;}else if(k==3){pat=log1tbl;
}else{return(STI_FLG);}」は、仮引数「int k,」が0の
場合、ローカルポインタ変数「pat」に
テーブル「pow12」をセット、同じく1の場合、変数に
テーブル「pow08」をセット、同じく2の場合、変数に
テーブル「log0tbl」をセット、同じく3の場合、変数に
テーブル「log0tbl」をセット、同じく4の場合、変数に
テーブル「log1tbl」をセット、それ以外ならば、
「return(STI_FLG);」とエラーコードを返し関数終了
「set_lut(pat,lut,sw);」は、サブルーチン関数「
set_lut();」でLUTにパターンをセット!
「return(END_STI);」は、正常終了を返し関数終了

(E)関数「Make5Lut()」の【使用例】

★注意★
使用例は、別の解説エッセイ『LUT使用例』で別途説明す
る事に方針変換しました!使用例発表まで乞うご期待と記載
して置きます!

(4-14-31)関数「int Make6Lut(BYTE lut[],int k,int col){・・・}」の説明

/************************************************************************/
/*****          LUTデータの作成:疑似カラーパターン              *****/
/*****          返し値:エラーチェックの値(END_STI,STI_FLG)       *****/
/*****          注意①  パターン選択子省略時(負値)→0            *****/
/*****          注意②  色選択子省略時(負値)      →0            *****/
/************************************************************************/

int             CopyClear::Make6Lut(
    BYTE        lut[],                          // 作成するLUT
    int         k,                              // Pattern選択子 0..9
                                                // 0:8色, 1:16色
                                                // 2..5:32..256色:寒暖系
                                                // 6..9:32..256色:色相系
    int         col                             // 色選択子 0:R,1:G,2:B
){
    if( col < 0  ){                             // 色指定が、省略時は、
        col = 0;                                // Rにセットし
    }else if( col > 2 ){                        // 色の範囲外なら
        return( STI_FLG );                      // 引数検査違反
    }                                           //
    if( k <= 0 ){                               // 8色疑似カラー
        lut_6_0( lut, col );                    // 上記Patternの作成
    }else if( k == 1 ){                         // 16色疑似カラー
        lut_6_1( lut, col );                    // 上記Patternの作成
    }else if( k >= 2 && k <= 5 ){               // 寒色→暖色疑似Col
        lut_6_2( lut, col );                    // 寒暖256色Dataの設定
        lut_6_4( lut, k - 2 );                  // 32/64/128色へ圧縮
    }else if( k >= 6 && k <= 9 ){               // 色相疑似カラー
        lut_6_3( lut, col );                    // 色差256色Dataの設定
        lut_6_4( lut, k - 6 );                  // 32/64/128色へ圧縮
    }else if( k == 10 ){                        // 色抽出疑似Col:RGB
        lut_6_10( lut, col );                   // 色抽出:RGB用を作成
    }else if( k == 11 ){                        // 色抽出疑似Col:RGB
        lut_6_11( lut, col );                   // 色抽出:色差用を作成
    }else{                                      // Patternの範囲外なら
        return( STI_FLG );                      // 引数検査違反
    }                                           //
    return( END_STI );                          // 正常終了
}

☆備考☆この関数はファイル「CopyClear040.cpp」に存在!
★注意★この関数は「public:」属性ですのでライブラリの
外から使用可能です!

(A)関数「Make6Lut()」の【関数名】説明

「Make」は、作成するで
「Lut」は、勿論、LUT変換用のLUTです!
ココでは、「Make○○Lut」と枝番号○○で機能分けした内の
一つのLUTパターン作成の意味です!
ここの○○=6は、疑似カラー表示用LUTパターン作成用
です!モノクロ画素(白黒濃淡)画像からRGB3色3枚の
画像メモリを疑似カラー表示用に生成する為のLUTの
パターンを作成します!

(B)関数「int Make6Lut()」の【返値】説明

この関数内で明示的に検査しているのは、
仮引数「int col」が、所定の値≪R(赤)を示す「0」・
G(緑)を示す「1」・B(青)を示す「2」≫に成って居る
か否かでエラーならエラーコード「STI_FLG」を辺値!
仮引数「int k,」が、所定の値≪11以下≫に成って
居るか如何かを判定し仕様外ならエラー「STI_FLG」を
返します!
最後まで実行時は、正常終了「END_STI」を返します!

(C)関数「Make6Lut()」の【仮引数】説明

int             CopyClear::Make6Lut(
    BYTE        lut[],                          // 作成するLUT
    int         k,                              // Pattern選択子 0..9
                                                // 0:8色, 1:16色
                                                // 2..5:32..256色:寒暖系
                                                // 6..9:32..256色:色相系
    int         col                             // 色選択子 0:R,1:G,2:B
){

「BYTE lut[],」はLUTを一次元配列として使用!
「int k,」は、選択肢≪0以下ならば、「8色疑似カラー
パターン」そして「1から11」ならモット細かい疑似
カラーパターン≫の値で対応する処理を実行!
パターンをLUTに書き込みます!
「int col」は、色選択肢≪R(赤)を示す「0」・G(緑)
を示す「1」・B(青)を示す「2」≫で選択します!

(D)関数「Make6Lut()」の【アルゴリズム】説明

){
    if( col < 0  ){                             // 色指定が、省略時は、
        col = 0;                                // Rにセットし
    }else if( col > 2 ){                        // 色の範囲外なら
        return( STI_FLG );                      // 引数検査違反
    }                                           //
    if( k <= 0 ){                               // 8色疑似カラー
        lut_6_0( lut, col );                    // 上記Patternの作成
    }else if( k == 1 ){                         // 16色疑似カラー
        lut_6_1( lut, col );                    // 上記Patternの作成
    }else if( k >= 2 && k <= 5 ){               // 寒色→暖色疑似Col
        lut_6_2( lut, col );                    // 寒暖256色Dataの設定
        lut_6_4( lut, k - 2 );                  // 32/64/128色へ圧縮
    }else if( k >= 6 && k <= 9 ){               // 色相疑似カラー
        lut_6_3( lut, col );                    // 色差256色Dataの設定
        lut_6_4( lut, k - 6 );                  // 32/64/128色へ圧縮
    }else if( k == 10 ){                        // 色抽出疑似Col:RGB
        lut_6_10( lut, col );                   // 色抽出:RGB用を作成
    }else if( k == 11 ){                        // 色抽出疑似Col:RGB
        lut_6_11( lut, col );                   // 色抽出:色差用を作成
    }else{                                      // Patternの範囲外なら
        return( STI_FLG );                      // 引数検査違反
    }                                           //
    return( END_STI );                          // 正常終了
}

「if(col<0){col=0;}else if(col>2){
return(STI_FLG);}」は、条件「col<0」の場合、
「col=0;」と仮引数「int col」を「0」にセットし、
次条件「col>2」と2を越えたら「return(STI_FLG);」と
エラーコード「STI_FLG」を返し関数終了!
1番目条件「k<=0」成立時、「lut_6_0(lut,col);」と
サブルーチン関数「lut_6_0()」で8色疑似カラーパターン
作成!
2番目条件「k==1」成立時、「lut_6_1(lut,col);」と
サブルーチン関数「lut_6_1()」で16色疑似カラー
パターン作成!
3番目条件「k>=2&&k<=5」成立時≪2から5の場合≫、
「lut_6_2(lut,col);lut_6_4(lut,k-2);」と
「寒色⇒暖色」パターンをサブルーチン関数「lut_6_2()」
で作成しとサブルーチン関数「lut_6_4()」で諧調圧縮を
かけます!
4番目条件「k>=6&&k<=9」成立時≪6から9の場合≫、
「lut_6_3(lut,col);lut_6_4(lut,k-2);」と
色相疑似カラーパターンをサブルーチン関数
「lut_6_3()」で作成しとサブルーチン関数
「lut_6_4()」で諧調色抽出をかけます!
5番目条件「k==10」成立時、「lut_6_10(lut,col);」と
サブルーチン関数「lut_6_10()」で色(RGB系)抽出用
疑似カラーパターンを作成!
6番目条件「k==11」成立時、「lut_6_11(lut,col);」と
サブルーチン関数「lut_6_11()」で色(色差系)抽出用
疑似カラーパターンを作成!
「return(END_STI);」は、正常終了を返し関数終了!

(E)関数「Make6Lut()」の【使用例】

★注意★
使用例は、別の解説エッセイ『LUT使用例』で別途説明す
る事に方針変換しました!使用例発表まで乞うご期待と記載
して置きます!

(4-14-32)関数「int Make7Lut(BYTE *lut,int bit,int data){・・・}」の説明

/************************************************************************/
/*****          LUTデータの作成:ビットスライスパターン          *****/
/*****          返し値:エラーチェックの値(END_STI,STI_FLG)       *****/
/*****          注意①  ビット位置省略時(負値)    →0            *****/
/*****          注意②  出力データ省略時(負値)    →1            *****/
/************************************************************************/

int         CopyClear::Make7Lut(
    BYTE    *lut,                               // 作成するLUT
    int     bit,                                // ビット位置 0..7
    int     data                                // 出力データ 0..255
){
    int     i;                                  // カウンタ 0..255
    int     mask;                               // ビット位置のマスク

    if( bit < 0 ){                              // ビット位置省略時
        bit  = 0;                               // 0をビット位置にし
        mask = 1;                               // 1をMaskDataにする
    }else if( bit <= 7 ){                       // 0..7 の範囲内なら
        mask = 1 << bit;                        // 左記でMaskData算出
    }else{                                      // 範囲外なら
        return( STI_FLG );                      // 引数検査違反
    }                                           //
    if( data < 0 ){                             // 出力値省略時
        data = 1;                               // 1を出力値にする
    }else if( data > 255 ){                     // 0..255 の範囲外なら
        return( STI_FLG );                      // 引数検査違反
    }                                           //
    up_fill_void( 0, lut, 256 );                // LUTを一旦0クリア
    for( i = 0; i <= 255; i++ ){                // 0..255の間で
        *lut++ = ( (i & mask) >> bit ) * data;  // スライスパターン作成
    }                                           // 
    return( END_STI );                          // 正常終了
}

☆備考☆この関数はファイル「CopyClear040.cpp」に存在!
★注意★この関数は「public:」属性ですのでライブラリの
外から使用可能です!

(A)関数「int Make7Lut()」の【関数名】説明

「Make」は、作成するで
「Lut」は、勿論、LUT変換用のLUTです!
ココでは、「Make○○Lut」と枝番号○○で機能分けした内の
一つのLUTパターン作成の意味です!
ここの○○=7は、ビットスライスパターン作成用
です!

(B)関数「Make7Lut()」の【返値】説明

この関数内で明示的に検査しているのは、
仮引数「int bit,」が、ビット位置≪8ビット画像用なので
0から7≫に成って居るか否かでエラーならエラーコード
「STI_FLG」を辺値とし関数終了!
仮引数「int data」が、所定の値≪8ビット画像用なので
0から255と画素の書き込むデータ値≫に成って居るか
如何かを判定し仕様外ならエラー「STI_FLG」を返します!
最後まで実行時は、正常終了「END_STI」を返します!

(C)関数「Make7Lut()」の【仮引数】説明

int         CopyClear::Make7Lut(
    BYTE    *lut,                               // 作成するLUT
    int     bit,                                // ビット位置 0..7
    int     data                                // 出力データ 0..255
){

「BYTE* lut,」はLUTを一次元配列として使用!
「int bit,」は、ビット位置≪8ビット画像用なので
0から7≫
「int data」は、値≪8ビット画像用なので0から
255と画素の書き込むデータ値≫

(D)関数「Make7Lut()」の【アルゴリズム】説明

){
    int     i;                                  // カウンタ 0..255
    int     mask;                               // ビット位置のマスク

    if( bit < 0 ){                              // ビット位置省略時
        bit  = 0;                               // 0をビット位置にし
        mask = 1;                               // 1をMaskDataにする
    }else if( bit <= 7 ){                       // 0..7 の範囲内なら
        mask = 1 << bit;                        // 左記でMaskData算出
    }else{                                      // 範囲外なら
        return( STI_FLG );                      // 引数検査違反
    }                                           //
    if( data < 0 ){                             // 出力値省略時
        data = 1;                               // 1を出力値にする
    }else if( data > 255 ){                     // 0..255 の範囲外なら
        return( STI_FLG );                      // 引数検査違反
    }                                           //
    up_fill_void( 0, lut, 256 );                // LUTを一旦0クリア
    for( i = 0; i <= 255; i++ ){                // 0..255の間で
        *lut++ = ( (i & mask) >> bit ) * data;  // スライスパターン作成
    }                                           // 
    return( END_STI );                          // 正常終了
}

(D-1)ローカル変数

){
    int     i;                                  // カウンタ 0..255
    int     mask;                               // ビット位置のマスク

「int i;」は、ループカウンタ≪0・・255≫
「int mask;」は、ビット位置をマスクする値

(D-2)アルゴリズムコード

    if( bit < 0 ){                              // ビット位置省略時
        bit  = 0;                               // 0をビット位置にし
        mask = 1;                               // 1をMaskDataにする
    }else if( bit <= 7 ){                       // 0..7 の範囲内なら
        mask = 1 << bit;                        // 左記でMaskData算出
    }else{                                      // 範囲外なら
        return( STI_FLG );                      // 引数検査違反
    }                                           //
    if( data < 0 ){                             // 出力値省略時
        data = 1;                               // 1を出力値にする
    }else if( data > 255 ){                     // 0..255 の範囲外なら
        return( STI_FLG );                      // 引数検査違反
    }                                           //
    up_fill_void( 0, lut, 256 );                // LUTを一旦0クリア
    for( i = 0; i <= 255; i++ ){                // 0..255の間で
        *lut++ = ( (i & mask) >> bit ) * data;  // スライスパターン作成
    }                                           // 
    return( END_STI );                          // 正常終了
}

「if(bit<0){bit=0;mask=1;}
else if(bit<=7){mask=1<<bit;}
else{return(STI_FLG);}」は、
最初の条件「bit<0」で成立時「bit=0;mask=1;」とセット
2番の条件「bit<=7」で成立時「mask=1<<bit;」と演算!
「else」と条件不成立「return(STI_FLG);」とエラーコー
ド「STI_FLG」を返し関数終了!
「if(data<0){data=1;}else if(data>255){
return(STI_FLG);}」は、最初の条件「data<0」で
成立時「data=1;」とセット
2番の条件「data>255」詰り≪255と8ビットの値を
超える場合≫で「return(STI_FLG);」とエラーコード
「STI_FLG」を返し関数終了!
「up_fill_void (0,lut,256);」は、一旦、LUT配列を
0クリア、
「for(i=0;i<=255;i++){*lut++=((i&mask)>>bit)*data;}」
は、forループ定番「i=0;i<=255;i++」と0から255
まで繰り返し、
ループ中身「*lut++=((i&mask)>>bit)*data;」で
ビットスライスパターンを発生!※備考※使用例で確認
して下さい!
「return(END_STI);」は、正常終了!

(E)関数「Make7Lut()」の【使用例】

★注意★
使用例は、別の解説エッセイ『LUT使用例』で別途説明す
る事に方針変換しました!使用例発表まで乞うご期待と記載
して置きます!

(4-14-33)関数「int Make8Lut(BYTE lut[],int k,int sw){・・・}」の説明

/************************************************************************/
/*****          LUTデータの作成:任意Γパターン                  *****/
/*****          返し値:エラーチェックの値(END_STI,STI_FLG)       *****/
/*****          計算式:y = 256 * ( x / 256 ) ** r                  *****/
/************************************************************************/

int             CopyClear::Make8Lut(
    BYTE        lut[],                          // 作成するLUT
    int         k,                              // 係数1~100→0.1~10.0
    int         sw                              // 反転sw(0:無/1:反転)
){
    BYTE        buf[ 256 ];                     // パターンバッファー
    BYTE        *ptr;                           // 上記へのポインタ
    double      r;                              // 0.01~10.0
    double      dt_256;                         // 定数:256.0:高速化
    double      dv_256;                         // 上記の逆数
    double      x;                              // 0.0~255.0/256.0
    double      y;                              // Γ=256.0×pow(x,r)
    int         i;                              // カウンタ 0..255

    if( k < 1 || k > 1000 ){                    // 範囲検査で不正なら
        return( STI_FLG );                      // 引数検査違反
    }                                           //
    r      = (double)k * 0.01;                  // 1~1000→0.01~10.00
    dt_256 = 256.0;                             // 定数:256.0:高速化
    dv_256 = 1.0 / 256.0;                       // 256.0の逆数をセット
    ptr    = buf;                               // ポインタをセット
    for( i = 0; i < 256; i++ ){                 // 0..255の間で
        x = (double)i * dv_256;                 // 1.0/256.0刻みを算出し
        y = dt_256 * pow( x, r );               // Γ値を算出し
        if( y >= dt_256 ){                      // 256.0以上なら
            *ptr++ = 255;                       // 255を格納し
        }else{                                  // 上記以外なら
            *ptr++ = (int)( y + 0.5 );          // 四捨五入し格納
        }                                       // 
    }                                           // 
    set_lut( buf, lut, sw );                    // パターンのコピー
    return( END_STI );                          // 正常終了
}

☆備考☆この関数はファイル「CopyClear040.cpp」に存在!
★注意★この関数は「public:」属性ですのでライブラリの
外から使用可能です!

(A)関数「Make8Lut()」の【関数名】説明

「Make」は、作成するで
「Lut」は、勿論、LUT変換用のLUTです!
ココでは、「Make○○Lut」と枝番号○○で機能分けした内の
一つのLUTパターン作成の意味です!
ここの○○=8は、任意Γパターン作成用です!
計算式「y=256*(x/256)**r」に従いパターンを
作成します!「**」演算子は、べき乗です!

(B)関数「int Make8Lut()」の【返値】説明

この関数内で明示的に検査しているのは、
仮引数「int k,」が、範囲「1..100」に成って居るか否かで
エラーならエラーコード「STI_FLG」を辺値とし関数終了!
最後まで実行時は、正常終了「END_STI」を返します!

(C)関数「Make8Lut()」の【仮引数】説明

int             CopyClear::Make8Lut(
    BYTE        lut[],                          // 作成するLUT
    int         k,                              // 係数1~100→0.1~10.0
    int         sw                              // 反転sw(0:無/1:反転)
){

「BYTE lut[],」はLUTを一次元配列として使用!
「int k,」は、係数「1..100」で内部では、
「(double)k*0.01」と「0.01」を乗算し
「0.01から1.0」の値を係数として使用
「int sw」は、左右反転スイッチ⇒真なら左右反転

(D)関数「Make8Lut()」の【アルゴリズム】説明

){
    BYTE        buf[ 256 ];                     // パターンバッファー
    BYTE        *ptr;                           // 上記へのポインタ
    double      r;                              // 0.01~10.0
    double      dt_256;                         // 定数:256.0:高速化
    double      dv_256;                         // 上記の逆数
    double      x;                              // 0.0~255.0/256.0
    double      y;                              // Γ=256.0×pow(x,r)
    int         i;                              // カウンタ 0..255

    if( k < 1 || k > 1000 ){                    // 範囲検査で不正なら
        return( STI_FLG );                      // 引数検査違反
    }                                           //
    r      = (double)k * 0.01;                  // 1~1000→0.01~10.00
    dt_256 = 256.0;                             // 定数:256.0:高速化
    dv_256 = 1.0 / 256.0;                       // 256.0の逆数をセット
    ptr    = buf;                               // ポインタをセット
    for( i = 0; i < 256; i++ ){                 // 0..255の間で
        x = (double)i * dv_256;                 // 1.0/256.0刻みを算出し
        y = dt_256 * pow( x, r );               // Γ値を算出し
        if( y >= dt_256 ){                      // 256.0以上なら
            *ptr++ = 255;                       // 255を格納し
        }else{                                  // 上記以外なら
            *ptr++ = (int)( y + 0.5 );          // 四捨五入し格納
        }                                       // 
    }                                           // 
    set_lut( buf, lut, sw );                    // パターンのコピー
    return( END_STI );                          // 正常終了
}

(D-1)ローカル変数

){
    BYTE        buf[ 256 ];                     // パターンバッファー
    BYTE        *ptr;                           // 上記へのポインタ
    double      r;                              // 0.01~10.0
    double      dt_256;                         // 定数:256.0:高速化
    double      dv_256;                         // 上記の逆数
    double      x;                              // 0.0~255.0/256.0
    double      y;                              // Γ=256.0×pow(x,r)
    int         i;                              // カウンタ 0..255

「BYTE buf[256];」は、ローカルに使用するパターンバッ
ファ!
「BYTE ptr;」は、上記バッファを操作するポインタ!
「double r;」は、内部で使用する係数
「double dt_256;」は、定数「256.0」☆注意☆アルゴ
リズム中に定数を直接記載するより早く成るコードが生成さ
れる事が多いのでコノ記法を使用!
「double dv_256;」は、「256.0」の除算用逆数値☆除算
より乗算の方が往々にして速度が早く成るので使用!
「double x;」は、X座標方向≪LUT変換を二次元表現
すると、変換前の入力をX座標、変換後をY座標とした
グラフに成るのでコノ表現≫
「double y;」は、X座標方向≪上記の説明を参考≫
「int i;」は、for構文用ループ変数!

(D-2)アルゴリズムコード

    if( k < 1 || k > 1000 ){                    // 範囲検査で不正なら
        return( STI_FLG );                      // 引数検査違反
    }                                           //
    r      = (double)k * 0.01;                  // 1~1000→0.01~10.00
    dt_256 = 256.0;                             // 定数:256.0:高速化
    dv_256 = 1.0 / 256.0;                       // 256.0の逆数をセット
    ptr    = buf;                               // ポインタをセット
    for( i = 0; i < 256; i++ ){                 // 0..255の間で
        x = (double)i * dv_256;                 // 1.0/256.0刻みを算出し
        y = dt_256 * pow( x, r );               // Γ値を算出し
        if( y >= dt_256 ){                      // 256.0以上なら
            *ptr++ = 255;                       // 255を格納し
        }else{                                  // 上記以外なら
            *ptr++ = (int)( y + 0.5 );          // 四捨五入し格納
        }                                       // 
    }                                           // 
    set_lut( buf, lut, sw );                    // パターンのコピー
    return( END_STI );                          // 正常終了
}

「if(k<1||k>1000){return(STI_FLG);}」は、
仮引数「int k,」の範囲検査です!範囲≪1から100≫
の範囲外ならば、エラーコード「STI_FLG」を返し関数終了
「r=(double)k0.01;」は、係数「r」を仮引数「int k,」
を百分の一にしてセット!
「dt_256=256.0;dv_256=1.0/256.0;」は、定数セット!
「ptr=buf;」は、パターン格納用ポインタをセット!
「for(i=0;i<256;i++){・・ループ中身・・}」は、勿論、
教科書的な標準的なforループでループカウンタ「i」を
昇順に「0から255」までカウントアップしながら、
ループ中身を実行します!★注意★散々、モット、トリッ
キーな方法で早く動作させる為にはと記載して居ますが、
コンな普通の方法を使用して居るのは「分かり易い」からで
す!そしてループ中身の方が処理時間が圧倒的に掛かるので
少々早い記載をしても無意味で更に256回しか繰り返さ無
いので相対的に「分かり易い」方を選んだと説明します!
更に中身で「x=(double)idv_256;」とループカウンタの
値「i」を重要なカウントアップする値として使用して居る
のforループを採用した理由です!
ではループ中身の解説を行います!
「x=(double)idv_256;」は、グラフX座標に相当する
値を算出!
「y=dt_256*pow(x,r);」は、上記で作成したグラフX座標
と係数「r」でXのrべき乗演算を任意Γパターンとして
グラフY座標を示す変数「y」に格納!
「if(y>=dt_256){*ptr++=255;}else{
*ptr++=(int )(y+0.5);}」は、条件≪変数「y」の値が
「256.0」以上ならば≫条件成立「*ptr++=255;」と上限を
越えたとして「255」をパターン書き込み、
条件不成立「*ptr++=(int )(y+0.5);」で変数「y」の値を
「(int )(y+0.5)」で四捨五入してから整数値変換を行い
パターン書き込み!
「set_lut(buf,lut,sw);」は、ローカルパターンを
仮引数「BYTE lut[],」を介して実引数に値をセット!
「return(END_STI);」は、関数正常終了!

(E)関数「Make8Lut()」の【使用例】

★注意★
使用例は、別の解説エッセイ『LUT使用例』で別途説明す
る事に方針変換しました!使用例発表まで乞うご期待と記載
して置きます!

(4-14-34)関数「int Make9Lut(BYTE lut[],int k){・・・}」の説明

/************************************************************************/
/*****          LUTデータの作成:階調圧縮パターン                *****/
/************************************************************************/

int             CopyClear::Make9Lut(
    BYTE        lut[],                          // 作成するLUT
    int         k                               // 圧縮段数 1..256
){
    BYTE        *p;                             // LUTへのポインタ
    BYTE        *pend;                          // ポインタ終点
    int         step;                           // ステップ数
    int         d;                              // データ
    int         d255;                           // 定数255:高速化用
    int         i;                              // カウンタ

    if( k < 1 || k > 256 ){                     // 範囲検査で不正なら
        return( STI_FLG );                      // 引数検査違反
    }                                           //
    p    = lut;                                 // ポインタをセット
    pend = &lut[255];                           // 終点をセット
    step = 256 / k;                             // ステップ数算出
    d    = 0;                                   // データ初期化
    d255 = 255;                                 // 定数255:高速化用
    while( --k >= 0 ){                          // 段数分
        for( i = step; --i >= 0; ){             // ステップ単位で
            *p++ = d;                           // データを書き込み
        }                                       // 
        d += step;                              // データをStepUp
        if( d > d255 ){                         // 255を超えたらば
            d = d255;                           // 255に補正
        }                                       // 
    }                                           // 
    while( p <= pend ){                         // 残りの部分を
        *p++ = d;                               // データ書き込み
    }                                           // 
    return( END_STI );                          // 正常終了
}

☆備考☆この関数はファイル「CopyClear040.cpp」に存在!
★注意★この関数は「public:」属性ですのでライブラリの
外から使用可能です!

(A)関数「Make9Lut()」の【関数名】説明

「Make」は、作成するで
「Lut」は、勿論、LUT変換用のLUTです!
ココでは、「Make○○Lut」と枝番号○○で機能分けした内の
一つのLUTパターン作成の意味です!
ここの○○=9は、階調色抽出パターン作成用です!

諧調圧縮

★注意★上記の様に階段状のパターンです

(B)関数「int Make9Lut()」の【返値】説明

この関数内で明示的に検査しているのは、
仮引数「int k,」が、範囲「1..256」に成って居るか否かで
エラーならエラーコード「STI_FLG」を辺値とし関数終了!
最後まで実行時は、正常終了「END_STI」を返します!

(C)関数「Make9Lut()」の【仮引数】説明

int             CopyClear::Make9Lut(
    BYTE        lut[],                          // 作成するLUT
    int         k                               // 圧縮段数 1..256
){

「BYTE lut[],」はLUTを一次元配列として使用!
「int k」は、色抽出段数「1..256」で諧調色抽出する
段数を指定します!

(D)関数「Make9Lut()」の【アルゴリズム】説明

){
    BYTE        *p;                             // LUTへのポインタ
    BYTE        *pend;                          // ポインタ終点
    int         step;                           // ステップ数
    int         d;                              // データ
    int         d255;                           // 定数255:高速化用
    int         i;                              // カウンタ

    if( k < 1 || k > 256 ){                     // 範囲検査で不正なら
        return( STI_FLG );                      // 引数検査違反
    }                                           //
    p    = lut;                                 // ポインタをセット
    pend = &lut[255];                           // 終点をセット
    step = 256 / k;                             // ステップ数算出
    d    = 0;                                   // データ初期化
    d255 = 255;                                 // 定数255:高速化用
    while( --k >= 0 ){                          // 段数分
        for( i = step; --i >= 0; ){             // ステップ単位で
            *p++ = d;                           // データを書き込み
        }                                       // 
        d += step;                              // データをStepUp
        if( d > d255 ){                         // 255を超えたらば
            d = d255;                           // 255に補正
        }                                       // 
    }                                           // 
    while( p <= pend ){                         // 残りの部分を
        *p++ = d;                               // データ書き込み
    }                                           // 
    return( END_STI );                          // 正常終了
}

(D-1)ローカル変数

){
    BYTE        *p;                             // LUTへのポインタ
    BYTE        *pend;                          // ポインタ終点
    int         step;                           // ステップ数
    int         d;                              // データ
    int         d255;                           // 定数255:高速化用
    int         i;                              // カウンタ

「BYTE *p;」は、バッファを操作するポインタ!
「BYTE *pend;」は、バッファを操作するポインタ終点!
「int step;」は、ステップ数!
「int d;」は、書き込むデータ!
「int d255;」は、定数値「255」★注意★高速化用です!
「int i;」は、for構文用ループ変数!

(D-2)アルゴリズムコード

    if( k < 1 || k > 256 ){                     // 範囲検査で不正なら
        return( STI_FLG );                      // 引数検査違反
    }                                           //
    p    = lut;                                 // ポインタをセット
    pend = &lut[255];                           // 終点をセット
    step = 256 / k;                             // ステップ数算出
    d    = 0;                                   // データ初期化
    d255 = 255;                                 // 定数255:高速化用
    while( --k >= 0 ){                          // 段数分
        for( i = step; --i >= 0; ){             // ステップ単位で
            *p++ = d;                           // データを書き込み
        }                                       // 
        d += step;                              // データをStepUp
        if( d > d255 ){                         // 255を超えたらば
            d = d255;                           // 255に補正
        }                                       // 
    }                                           // 
    while( p <= pend ){                         // 残りの部分を
        *p++ = d;                               // データ書き込み
    }                                           // 
    return( END_STI );                          // 正常終了
}

「if(k<1||k>256){return(STI_FLG);}」は、
色抽出段数「int k」が1..256の範囲外ならば、エラー
コード「STI_FLG」を返し関数終了!
「p=lut;pend=&lut[255];」は、操作ポインタの初期値と
ポインタ終点のセットです!
「step=256/k;d=0;d255=255;」は、「step」に一段当りの
データ書き込み数を算出しセット、「d」書き込みデータの
初期値セット、定数値「255」セット!
「while(--k>=0){・・外側ループ中身・・}」は、
★備考★「while(--k>=0」の様に「--k>=0」とデクリ
メント演算子で変数値が変化しても影響が無い応用には、
経験上最適なCPU機械コードが生成出来るので、
この画像処理ライブラリは、この記法を多用して居ます!
学校の教科書的には余り教えて無い(恐らく変数の値が変わ
る事を説明する必要が有るので説明がヤヤコシク成る事を
嫌ったと推測)】と高速化の為に【「while(--k>=0)】と
whileループ使用しています!そして外側ループ中身
と記載した様に「for(i=step;--i>=0;){*p++=d;}」と
forループで同じ様にループ条件「--i>=0」を使って
高速に内側ループ中身「*p++=d;」とパターンをループで
「step」の数分、書き込みます!更に外側ループ中身では
「d+=step;if(d>d255){d=d255;}」で次に書き込む
データを算出し、セットします!但し、
分岐条件「d>d255」でデータが「255」を越えたら上限と
してその内側に補正します!
「while(p<=pend){*p++=d;}」は、whileループ使用で
バッファー最後までパターンとしてデータを書き込みます!
「return(END_STI);」は、正常終了を返し関数終了!

(E)関数「Make9Lut()」の【使用例】

★注意★
使用例は、別の解説エッセイ『LUT使用例』で別途説明す
る事に方針変換しました!使用例発表まで乞うご期待と記載
して置きます!

(4-14-35)関数「int MakeLut(BYTE lut[],int k,
int *arg,int l,int size){・・・}」の説明

/************************************************************************/
/*****                  LUTデータの作成                  :実行部*****/
/*****          返し値:エラーチェックの値(END_STI,STI_FLG)       *****/
/************************************************************************/

int             CopyClear::MakeLut(
    BYTE        lut[],                          // 作成するLUT
    int         k,                              // 作成メニュー
    int         *arg,                           // 引数へのポインタ
    int         l,                              // 上記の組の数
    int         size                            // LUTの大きさ
){
    int         m;                              // Pattern書込始点Ix
    int         n;                              // Pattern書込終点Ix
    int         d;                              // パターン書込データ
    int         flg;                            // エラーフラッグ

    switch( k ){                                // 作成メニューが
    case 0:                                     // 0:増パターン加作成
    case 1:                                     // 1:減少パターン作成
        m = *arg++;                             // 始点Ixをセット
        n = *arg++;                             // 終点Ixをセット
        d = *arg;                               // 初期値データ をセット
        m = ( m < 0 ) ? 0 : m;                  // 始点省略時:LUT始点
        n = ( n < 0 ) ? size - 1 : n;           // 終点省略時:LUT終点
        if( n >= size ){                        // 終点が範囲外なら
            return( STI_FLG );                  // 引数検査違反を返す
        }                                       // 
        if( k == 0 ){                           // 増加なら
            d = ( d < 0 ) ? 0 : d;              // データ省略時:0
            return( Make0Lut( lut, m, n, d ) ); // そのPatternを作成する
        }else{                                  // 減少なら
            d = ( d < 0 ) ? 255 : d;            // データ省略時:255
            return( Make1Lut( lut, m, n, d ) ); // そのパターンを作成
        }                                       //
    case 2:                                     // 2:2値Pattern作成
        flg = STI_FLG;                          // エラーフラグ初期化
        while( ( l -= 3 ) >= 0 ){               // 組数(3)だけ以下を繰返
            m = *arg++;                         // 始点Ixをセット
            n = *arg++;                         // 終点Ixをセット
            d = *arg++;                         // 書き込みDataをセット
            if( n >= size ){                    // 終点が範囲外なら
                return( STI_FLG );              // 引数検査違反を返す
            }                                   // 
            flg = Make2Lut( lut, m, n, d );     // 2値Patternを作成する
            if( flg != END_STI ){               // 正常終了していなけれ
                break;                          // 抜ける
            }                                   //
        }                                       //
        return( flg );                          // フラグを返す
    case 3:                                     // 3:任意直線
    case 4:                                     // 4:任意曲線
        return( make_lut_xy( lut, k, arg, l,    // 直線/曲線Pattern作成
                                    size ) );   // 
    case 5:                                     // 5:Γ/log選択
        m = *arg++;                             // パターン選択値セット
        n = *arg;                               // 反転swをセット
        return( Make5Lut( lut, m, n ) );        // Γ/logを選択する
    case 6:                                     // 6:疑似カラー
        m = *arg++;                             // パターン選択値セット
        n = *arg;                               // 色選択子をセット
        return( Make6Lut( lut, m, n ) );        // 疑似ColPattern作成
    case 7:                                     // 7:ビットスライス
        m = *arg++;                             // ビット位置 0..7
        n = *arg;                               // 出力データ 1..255
        return( Make7Lut( lut, m, n ) );        // BitSlicePattern作成
    case 8:                                     // 8:任意Γ選択
        m = *arg++;                             // Γ係数セット
        n = *arg;                               // 反転swをセット
        return( Make8Lut( lut, m, n ) );        // 任意Γパターンを作成
    case 9:                                     // 8:任意Γ選択
        m = *arg++;                             // Γ係数セット
        return( Make9Lut( lut, m ) );           // 階調圧縮パターン作成
    default:                                    // 上記外なら
        return( STI_FLG );                      // 引数検査違反を返す
    }                                           //
}

☆備考☆この関数はファイル「CopyClear040.cpp」に存在!
★注意★この関数は「public:」属性ですのでライブラリの
外から使用可能です!

(A)関数「MakeLut()」の【関数名】説明

「Make」は、作成するで
「Lut」は、勿論、LUT変換用のLUTです!
ココでは、「Make○○Lut」と枝番号○○で機能分けした
関数をサブルーチン関数として呼び出すとかでパターン発生
の親関数です!★注意★サブルーチン関数も「public:」属性
を付けていますので場合に依り、使用時に使い分けて下さ
い!

(B)関数「int MakeLut()」の【返値】説明

この関数内で明示的に検査しているのは、
仮引数「int k,」が、関数の選択肢として枝番号の
範囲「0..9」に成って居るか否かでエラーなら、
エラーコード「STI_FLG」を辺値とし関数終了!
最後まで実行時は、呼び出した枝番号のサブルーチン関数
の値を返します!

(C)関数「MakeLut()」の【仮引数】説明

int             CopyClear::MakeLut(
    BYTE        lut[],                          // 作成するLUT
    int         k,                              // 作成メニュー
    int         *arg,                           // 引数へのポインタ
    int         l,                              // 上記の組の数
    int         size                            // LUTの大きさ
){

「BYTE lut[],」はLUTを一次元配列として使用!
「int k」は、枝番号「0..9」です!
「int *arg,」は、枝番号のサブルーチン関数へパラメータ
を渡す為のポインタ!
「int l,」は、枝番号のサブルーチン関数へパラメータの
個数!★注意★「int arg,int l,」は、C言語処理系の
「int main(int argc,char*argv)」の「char*argv」が、
文字列へのポインタですが、ココでは数値の列に成ったと
考えて下さい!
「int size」は、LUTサイズ!

(D)関数「MakeLut()」の【アルゴリズム】説明

){
    int         m;                              // Pattern書込始点Ix
    int         n;                              // Pattern書込終点Ix
    int         d;                              // パターン書込データ
    int         flg;                            // エラーフラッグ

    switch( k ){                                // 作成メニューが
    case 0:                                     // 0:増パターン加作成
    case 1:                                     // 1:減少パターン作成
        m = *arg++;                             // 始点Ixをセット
        n = *arg++;                             // 終点Ixをセット
        d = *arg;                               // 初期値データ をセット
        m = ( m < 0 ) ? 0 : m;                  // 始点省略時:LUT始点
        n = ( n < 0 ) ? size - 1 : n;           // 終点省略時:LUT終点
        if( n >= size ){                        // 終点が範囲外なら
            return( STI_FLG );                  // 引数検査違反を返す
        }                                       // 
        if( k == 0 ){                           // 増加なら
            d = ( d < 0 ) ? 0 : d;              // データ省略時:0
            return( Make0Lut( lut, m, n, d ) ); // そのPatternを作成する
        }else{                                  // 減少なら
            d = ( d < 0 ) ? 255 : d;            // データ省略時:255
            return( Make1Lut( lut, m, n, d ) ); // そのパターンを作成
        }                                       //
    case 2:                                     // 2:2値Pattern作成
        flg = STI_FLG;                          // エラーフラグ初期化
        while( ( l -= 3 ) >= 0 ){               // 組数(3)だけ以下を繰返
            m = *arg++;                         // 始点Ixをセット
            n = *arg++;                         // 終点Ixをセット
            d = *arg++;                         // 書き込みDataをセット
            if( n >= size ){                    // 終点が範囲外なら
                return( STI_FLG );              // 引数検査違反を返す
            }                                   // 
            flg = Make2Lut( lut, m, n, d );     // 2値Patternを作成する
            if( flg != END_STI ){               // 正常終了していなけれ
                break;                          // 抜ける
            }                                   //
        }                                       //
        return( flg );                          // フラグを返す
    case 3:                                     // 3:任意直線
    case 4:                                     // 4:任意曲線
        return( make_lut_xy( lut, k, arg, l,    // 直線/曲線Pattern作成
                                    size ) );   // 
    case 5:                                     // 5:Γ/log選択
        m = *arg++;                             // パターン選択値セット
        n = *arg;                               // 反転swをセット
        return( Make5Lut( lut, m, n ) );        // Γ/logを選択する
    case 6:                                     // 6:疑似カラー
        m = *arg++;                             // パターン選択値セット
        n = *arg;                               // 色選択子をセット
        return( Make6Lut( lut, m, n ) );        // 疑似ColPattern作成
    case 7:                                     // 7:ビットスライス
        m = *arg++;                             // ビット位置 0..7
        n = *arg;                               // 出力データ 1..255
        return( Make7Lut( lut, m, n ) );        // BitSlicePattern作成
    case 8:                                     // 8:任意Γ選択
        m = *arg++;                             // Γ係数セット
        n = *arg;                               // 反転swをセット
        return( Make8Lut( lut, m, n ) );        // 任意Γパターンを作成
    case 9:                                     // 8:任意Γ選択
        m = *arg++;                             // Γ係数セット
        return( Make9Lut( lut, m ) );           // 階調圧縮パターン作成
    default:                                    // 上記外なら
        return( STI_FLG );                      // 引数検査違反を返す
    }                                           //
}

(D-1)ローカル変数

){
    int         m;                              // Pattern書込始点Ix
    int         n;                              // Pattern書込終点Ix
    int         d;                              // パターン書込データ
    int         flg;                            // エラーフラッグ

「int m;」は、パターン書き込み始点
「int n;」は、パターン書き込み終点
「int d;」は、パターン書き込みデータ
「int flg;」は、エラーコード一時置き場

(D-2)アルゴリズムコード

    switch( k ){                                // 作成メニューが
    case 0:                                     // 0:増パターン加作成
    case 1:                                     // 1:減少パターン作成
        m = *arg++;                             // 始点Ixをセット
        n = *arg++;                             // 終点Ixをセット
        d = *arg;                               // 初期値データ をセット
        m = ( m < 0 ) ? 0 : m;                  // 始点省略時:LUT始点
        n = ( n < 0 ) ? size - 1 : n;           // 終点省略時:LUT終点
        if( n >= size ){                        // 終点が範囲外なら
            return( STI_FLG );                  // 引数検査違反を返す
        }                                       // 
        if( k == 0 ){                           // 増加なら
            d = ( d < 0 ) ? 0 : d;              // データ省略時:0
            return( Make0Lut( lut, m, n, d ) ); // そのPatternを作成する
        }else{                                  // 減少なら
            d = ( d < 0 ) ? 255 : d;            // データ省略時:255
            return( Make1Lut( lut, m, n, d ) ); // そのパターンを作成
        }                                       //
    case 2:                                     // 2:2値Pattern作成
        flg = STI_FLG;                          // エラーフラグ初期化
        while( ( l -= 3 ) >= 0 ){               // 組数(3)だけ以下を繰返
            m = *arg++;                         // 始点Ixをセット
            n = *arg++;                         // 終点Ixをセット
            d = *arg++;                         // 書き込みDataをセット
            if( n >= size ){                    // 終点が範囲外なら
                return( STI_FLG );              // 引数検査違反を返す
            }                                   // 
            flg = Make2Lut( lut, m, n, d );     // 2値Patternを作成する
            if( flg != END_STI ){               // 正常終了していなけれ
                break;                          // 抜ける
            }                                   //
        }                                       //
        return( flg );                          // フラグを返す
    case 3:                                     // 3:任意直線
    case 4:                                     // 4:任意曲線
        return( make_lut_xy( lut, k, arg, l,    // 直線/曲線Pattern作成
                                    size ) );   // 
    case 5:                                     // 5:Γ/log選択
        m = *arg++;                             // パターン選択値セット
        n = *arg;                               // 反転swをセット
        return( Make5Lut( lut, m, n ) );        // Γ/logを選択する
    case 6:                                     // 6:疑似カラー
        m = *arg++;                             // パターン選択値セット
        n = *arg;                               // 色選択子をセット
        return( Make6Lut( lut, m, n ) );        // 疑似ColPattern作成
    case 7:                                     // 7:ビットスライス
        m = *arg++;                             // ビット位置 0..7
        n = *arg;                               // 出力データ 1..255
        return( Make7Lut( lut, m, n ) );        // BitSlicePattern作成
    case 8:                                     // 8:任意Γ選択
        m = *arg++;                             // Γ係数セット
        n = *arg;                               // 反転swをセット
        return( Make8Lut( lut, m, n ) );        // 任意Γパターンを作成
    case 9:                                     // 8:任意Γ選択
        m = *arg++;                             // Γ係数セット
        return( Make9Lut( lut, m ) );           // 階調圧縮パターン作成
    default:                                    // 上記外なら
        return( STI_FLG );                      // 引数検査違反を返す
    }                                           //
}

「switch(k){・・case選択肢群・・
default:return(STI_FLG);}」は、switch構文での
多分岐選択し、選択肢「k」が、各caseラベルに一致し
無ければ、「return(STI_FLG);」でエラー
コード「STI_FLG」を返し、関数終了!
case選択肢群から、「case0:case1:」の場合、
「m=*arg++;n=*arg++;d=*arg;」でサブルーチン関数の
「int Make0Lut(BYTE lut[],int m,int n,int d)」・
「int Make1Lut(BYTE lut[],int m,int n,int d)」の
仮引数「int m,int n,int d」に相当するパラメータを
コノ関数の仮引数「int *arg,」から取り出します!
「m=(m<0)?0:m;n=(n<0)?size-1:n;if(n>=size){
return(STI_FLG);}」で取り出したパラメータを絶対値化
とか、設定値を負数が省略時設定に成るとか、パラメータの
エラーチェックとし不都合なら、エラーコード「STI_FLG」
を返し、関数終了!
「if(k==0){d=(d<0)?0:d;return(Make0Lut(lut,m,n,d));
}else{d=(d<0)?255:d;return(Make1Lut(lut,m,n,d));}」
は、条件「k==0」詰り、インクリメントパターンの場合、
初期値「d」が負数なら「0」に補正し、サブルーチン関数
として「return(Make0Lut(lut,m,n,d));」と処理し、その
関数値を関数の値として関数終了!そしてデクリメント
パターンの場合、初期値「d」が255を越える値なら
「255」に補正し、サブルーチン関数として
「return(Make1Lut(lut,m,n,d));」と処理し、
その関数返値を関数の値として関数終了!
「case2:」の場合、「flg=STI_FLG;」で初期値を入れて
置き、「while((l-=3)>=0){・・ループ中身・・}」で
引数のパラメタ数「l」を「(l-=3)>=0」と3づつ減算する
のは、「m=*arg++;n=*arg++;d=*arg++;」と
「int Make2Lut(BYTE lut[],int m,int n,int d)」の
仮引数「int m,int n,int d」に相当するパラメータを
コノ関数の仮引数「int *arg,」から取り出す為に3づつ
減算!そしてループ中身は、「m=*arg++;n=*arg++;
d=*arg++;」で簡単に先ほど説明した様にパラメータ取り
出し、「if(n>=size){return(STI_FLG);}」で終点が
LUTサイズを越えたらエラーとし、関数終了!
「flg=Make2Lut(lut,m,n,d);」でサブルーチン関数「
Make2Lut(lut,m,n,d);」で処理しと複数回パラメータが
3組み存在する場合実行し、
「if(flg!=END_STI){break;}」でサブルーチン関数が、
エラー時にswitch構文から抜けます!そして
whileループが終了したら、「return(flg);」で
サブルーチン関数の関数返値を関数の値として関数終了!
「case3:case4:」の場合、「return(make_lut_xy(
lut,k,arg,l,size));」でサブルーチン
関数「make_lut_xy(lut,k,arg,l,size)」で複数ポイントを
結ぶ、折れ線グラフ的にパターン書き込み!
「case5:」の場合、「m=*arg++;n=*arg;
return(Make5Lut(lut,m,n));」とサブルーチン関数
「Make5Lut()」に必要なパラメータ「m,n」を
「m=*arg++;n=*arg;」で取り出し、サブルーチン関数
「Make6Lut()」で処理し、この関数の辺値を関数自体の
辺値として返し関数終了!
「case6:」の場合、「m=*arg++;n=*arg;
return(Make6Lut(lut,m,n));」とサブルーチン関数
「Make6Lut()」に必要なパラメータ「m,n」を
「m=*arg++;n=*arg;」で取り出し、サブルーチン関数
「Make6Lut()」で処理し、この関数の辺値を関数自体の
辺値として返し関数終了!
「case7:」の場合、「m=*arg++;n=*arg;
return(Make7Lut(lut,m,n));」とサブルーチン関数
「Make7Lut()」に必要なパラメータ「m,n」を
「m=*arg++;n=*arg;」で取り出し、サブルーチン関数
「Make7Lut()」で処理し、この関数の辺値を関数自体の
辺値として返し関数終了!
「case8:」の場合、「m=*arg++;n=*arg;
return(Make8Lut(lut,m,n));」とサブルーチン関数
「Make8Lut()」に必要なパラメータ「m,n」を
「m=*arg++;n=*arg;」で取り出し、サブルーチン関数
「Make8Lut()」で処理し、この関数の辺値を関数自体の
辺値として返し関数終了!
「case9:」の場合、「m=*arg++;
return(Make9Lut(lut,m));」とサブルーチン関数
「Make9Lut()」に必要なパラメータ「m」を
「m=*arg++;」で取り出し、サブルーチン関数
「Make9Lut()」で処理し、この関数の辺値を関数自体の
辺値として返し関数終了!
「return(STI_FLG);」は、サブルーチン関数で正常終了し
無かったとしてエラーコード「STI_FLG」を返し関数終了!

(E)関数「MakeLut()」の【備考】

細かい、パターン書き込みの解説は、各サブルーチン関数
の解説を参考にして下さい!【例文】等は、各サブルーチン
関数で説明しています!但し、サブルーチン関数「
make_lut_xy(lut,k,arg,l,size)」は、「private:」属性
を付けていますので解説は「private:」属性関数を
後回しにしますので暫く、お待ちください!

(4-14-36)関数「int MakeLutToArray(TypeArray* lut,int k,int *arg,int l){・・・}」の説明

/************************************************************************/
/*****                  LUTデータの作成                          *****/
/*****          返し値:エラーチェックの値(END_STI,STI_FLG)       *****/
/************************************************************************/

int             CopyClear::MakeLutToArray(
    TypeArray   *lut,                               // 作成するLUT
    int         k,                                  // 作成メニュー
    int         *arg,                               // 引数へのポインタ
    int         l                                   // 上記の組の数
){
    BYTE        buf[ 65536 ];                       // LUTPatternBuf
    BYTE        *lutptr;                            // 上記の実ポインタ
    int         size;                               // LUTのサイズ

    size = lut->h;                                  // LUTSizeを取り出し
    if( size > 65536 ){                             // 65536を超えたら
        size = 65536;                               // 65536に補正する
    }                                               // 
    if( lut->w == 1 ){                              // 1Byteサイズなら
        lutptr = (BYTE*)lut->adr;                   // LUTのAdrを取出し
    }else{                                          // その他なら
        lutptr = buf;                               // Bufferをセットし
    }                                               // 
    if( MakeLut( lutptr, k, arg, l, size )          // LUTPatternを作成
                                    != END_STI ){   // 作成に失敗したら
        return( STI_FLG );                          // 不正を返す
    }                                               // 
    return( MoveByteArray( lutptr, lut, size ) );   // 配列array型へ格納
}

☆備考☆この関数はファイル「CopyClear040.cpp」に存在!
★注意★この関数は「public:」属性ですのでライブラリの
外から使用可能です!

(A)関数「MakeLutToArray()」の【関数名】説明

「Make」は、作成するで
「Lut」は、勿論、LUT変換用のLUTです!
「To」は、「○○から××」と「から」の意味です!
「Array」は、このライブラリで画像メモリを定義する
クラス「TypeArray」を意味します!
ココでは、「Make○○Lut」と枝番号○○で機能分けした
関数をサブルーチン関数として呼び出すとかでパターン発生
の親関数です!と関数「MakeLut()」に解説して居ましたが
この関数は、コノ関数「MakeLut()」をサブルーチン関数と
して呼び出す関数で関数「MakeLut()」は、
「BYTE lut[],」はLUTを一次元配列として使用しますが
この関数は、クラス「TypeArray」で定義した一次元配列に
値を格納する事で行う事が異なります!
★注意★何故、この様な関数が存在するかと言うと、
ADS社画像処理装置に簡易コマンド言語「PIPL」で
使用する為に開発当時は、構造体「TypeArray」でコマンド
の型で使用出来る様にあうる仕掛けで必要なだけでC言語で
ライブラリ関数を使用する人には知らなくても良い話ですが
私としては、画像処理言語「PIPL」をリニューアル作成
する心算ですので残して置いたのです!

(B)関数「int MakeLutToArray()」の【返値】説明

この関数の辺値は呼び出した関数の辺値及び、呼び出した
関数がエラーを起こしたら「return(STI_FLG);」と
エラーコードを返し終了します!

(C)関数「MakeLutToArray()」の【仮引数】説明

int             CopyClear::MakeLutToArray(
    TypeArray   *lut,                               // 作成するLUT
    int         k,                                  // 作成メニュー
    int         *arg,                               // 引数へのポインタ
    int         l                                   // 上記の組の数
){

「TypeArray* lut,」は、クラス「TypeArray」で定義
した一次元配列にLUTパターンを格納する為
「int k」は、枝番号「0..9」です!
「int *arg,」は、枝番号のサブルーチン関数へパラメータ
を渡す為のポインタ!
「int l,」は、枝番号のサブルーチン関数へパラメータの
個数!★注意★「int *arg,int l,」は、C言語処理系の
「int main(int argc,char*argv)」の「char*argv」が、
文字列へのポインタですが、ココでは数値の列に成ったと
考えて下さい!

(D)関数「MakeLutToArray()」の【アルゴリズム】説明

){
    BYTE        buf[ 65536 ];                       // LUTPatternBuf
    BYTE        *lutptr;                            // 上記の実ポインタ
    int         size;                               // LUTのサイズ

    size = lut->h;                                  // LUTSizeを取り出し
    if( size > 65536 ){                             // 65536を超えたら
        size = 65536;                               // 65536に補正する
    }                                               // 
    if( lut->w == 1 ){                              // 1Byteサイズなら
        lutptr = (BYTE*)lut->adr;                   // LUTのAdrを取出し
    }else{                                          // その他なら
        lutptr = buf;                               // Bufferをセットし
    }                                               // 
    if( MakeLut( lutptr, k, arg, l, size )          // LUTPatternを作成
                                    != END_STI ){   // 作成に失敗したら
        return( STI_FLG );                          // 不正を返す
    }                                               // 
    return( MoveByteArray( lutptr, lut, size ) );   // 配列array型へ格納
}

(D-1)ローカル変数

){
    BYTE        buf[ 65536 ];                       // LUTPatternBuf
    BYTE        *lutptr;                            // 上記の実ポインタ
    int         size;                               // LUTのサイズ

「BYTE buf[65536];」は、ローカルパターンバッファー!
「BYTE *lutptr;」は、最終的に格納する仮引数「
TypeArray lut,」の実格納ポインタです!
「int size;」は、LUTの格納サイズです!

(D-2)アルゴリズムコード

    size = lut->h;                                  // LUTSizeを取り出し
    if( size > 65536 ){                             // 65536を超えたら
        size = 65536;                               // 65536に補正する
    }                                               // 
    if( lut->w == 1 ){                              // 1Byteサイズなら
        lutptr = (BYTE*)lut->adr;                   // LUTのAdrを取出し
    }else{                                          // その他なら
        lutptr = buf;                               // Bufferをセットし
    }                                               // 
    if( MakeLut( lutptr, k, arg, l, size )          // LUTPatternを作成
                                    != END_STI ){   // 作成に失敗したら
        return( STI_FLG );                          // 不正を返す
    }                                               // 
    return( MoveByteArray( lutptr, lut, size ) );   // 配列array型へ格納
}

「size=lut->h;」は、仮引数「TypeArray* lut,」の格納
サイズを変数「size」にセット!
「if(size>65536){size=65536;}」は、サイズを最大値で
有る「65536」以内に補正!
「if(lut->w==1){lutptr=(BYTE )lut->adr;}else{
lutptr=buf;}」は、仮引数「TypeArray lut,」のデータ
単位が1バイト単位ならば、「lutptr=(BYTE *)lut->adr;」
と実格納ポインタをセット、異なる場合、「lutptr=buf;」
とローカルバッファーにセット!
「if(MakeLut(lutptr,k,arg,l,size)!=END_STI){
return(STI_FLG);}」は、分岐の条件内で
「MakeLut(lutptr,k,arg,l,size」とサブルーチン関数「
MakeLut()」を実行し、その関数辺値が正常終了で無ければ
「return(STI_FLG);」とエラーコード「STI_FLG」を返し、
関数終了!
「return(MoveBYTE Array(lutptr,lut,size));」は、
サブルーチン関数「MoveBYTE Array()」でパターン書き込み
コノ関数の辺値を関数の辺値として関数終了!

(E)関数「MakeLutToArray()」の【備考】

細かい、パターン書き込みの解説は、各サブルーチン関数
の解説を参考にして下さい!【例文】等は、各サブルーチン
関数で説明しています!
★注意★何故、この様な関数が存在するかと言うと、
ADS社画像処理装置に簡易コマンド言語「PIPL」で
使用する為に開発当時は、構造体「TypeArray」でコマンド
の型で使用出来る様に合う仕掛けで必要なだけでC言語で
ライブラリ関数を使用する人には知らなくても良い話ですが
私としては、画像処理言語「PIPL」をリニューアル作成
する心算ですので残して置いたのです!

次から、関数「MakePattern()」とLUTでは無く、画像の
パターンを作成する関数の解説に成ります!大分機能が、
変りますし、サイズも大きく成り、追記も正直、遣り難く
成ったので、今回の追記でこの講義は、
解説『解説クラスCopyClear(14)』を終わり
ます!引き続き関数「MakePattern()」以降を
新規解説『解説クラスCopyClear(15)』として
近々、始めますので宜しく、御贔屓の程、お願いします!

文末




いいなと思ったら応援しよう!