home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 3 / FREEWARE.BIN / towns_os / tvi / tvi_src.lzh / REC / REC_PAL.C < prev    next >
C/C++ Source or Header  |  1991-01-09  |  20KB  |  624 lines

  1. /*
  2. $Header: rec_pal.cv  1.20  91/01/09 16:13:24  Nam  Exp $
  3. */
  4. #include    <stdio.h>
  5. #include     <stdlib.h>
  6. #include     <string.h>
  7. #include    <math.h>    /* 演算関連のヘッダファイル */
  8. #include    <egb.h>        /* グラフィック関連のヘッダファイル */
  9. #include    <mos.h>        /* マウス関連のヘッダファイル         */
  10. #include    <n_win.h>    /* 自前のウィンドゥ関数ヘッダ        */
  11.  
  12. pragma    Include    ("rec_st.h");            /* 標準ヘッダ */
  13. pragma    Include    ("rec_opt.h");            /* オプション設定ヘッダ */
  14.  
  15. #define    max_256color    (256)
  16. #define    max_32Kcolor    (32767)
  17. #define    max_avr_step    (32767)
  18. #define    VRAMSIZE        (320*240*2)
  19. #define    VCTTBLSIZE        (32768*2)
  20.  
  21. extern char                *EGB_work;        /*** EGBワークエリア(disp.obj) ***/
  22. extern char                *EGB_para;        /*** EGBワークエリア(disp.obj) ***/
  23. extern N_WIN_WORK        WIN_work;        /*** ウィンドゥライブラリ用ワーク(n_win_1.obj) ***/
  24.  
  25. extern char                *VideoBufAdd;        /*** 画像データバッファ ***/
  26. extern unsigned short    *tbl_expand;        /*変換テーブル*/
  27.  
  28. extern unsigned short    btn_alart_YES,btn_alart_NO
  29.                         ,btn_alart_GO,btn_alart_ABORT;
  30. extern unsigned short    win_pal,txt_pal_mes,txt_pal_col,btn_pal_ABORT;
  31. extern unsigned long    imgsize;        /*** 画像データ1枚のサイズ ***/
  32. extern unsigned short    MaxVideoBuf;    /*** 画像データバッファ最大枚数 ***/
  33. extern unsigned short    StartPage;        /*** 画像データ指定開始ページ ***/
  34. extern unsigned short    EndPage;        /*** 画像データ指定終了ページ ***/
  35. extern unsigned short    NowPage;        /*** 画像データ現在ページ ***/
  36. extern unsigned short    LastPage;        /*** 画像データ最終ページ ***/
  37. extern unsigned short    sysflag;        /*** 設定状態フラグ ***/
  38. extern char                undomode[6];    /***  ***/
  39. extern unsigned char    sysopt[MAX_OPT_BTN];    /*** 各種オプション設定 ***/
  40.  
  41. extern char                startpath[80];    /*** 起動時パス(rec_main.obj) ***/
  42.  
  43.  
  44. extern void    calc_palet();        /*** 論理パレット算出(palcalc.obj) ***/
  45. extern void    N_Vget_ful_11();    /*** 32K全画面転送(vgetf11.obj) ***/
  46. extern void    N_Vput_ful_11();    /*** 32K全画面転送(vputf11.obj) ***/
  47. extern void    VC8get_ful();        /*** テーブル参照全画面転送(vc_get.obj) ***/
  48. extern void    VC8put_ful();        /*** テーブル参照全画面転送(vc_put.obj) ***/
  49. extern int    disp_alart();        /*** アラートボックス表示(rec_main.obj) ***/
  50. extern void    save_edit_page();    /*** ページ情報のセーブ(rec_edit.obj) ***/
  51. extern void    set_edit_page();    /*エディットウィンドゥの各カウンタの再設定(rec_main.obj)*/
  52. extern void    set_page_slider();    /*ページスライダの再設定(rec_main.obj)*/
  53. extern void    N_set_resolution();    /*** 画面解像度設定(rec_disp.obj) ***/
  54. extern char    *itoa();            /*** 整数>char変換(rec_disp.obj) ***/
  55. extern void    change_icon();        /*** マウスアイコン変更(rec_mos.obj) ***/
  56. extern int    mos_btn_wait();        /*** マウスクリック待ち(rec_mos.obj) ***/
  57. extern int    N_check_video();    /*** ビデオ信号の有無を調べる(video.obj) ***/
  58. extern void    N_wait_vsync();        /*** Vsync待ち(video.obj) ***/
  59.  
  60. unsigned short    *color_count;
  61. unsigned char    *color_ex;
  62. unsigned char    *color_check;
  63.  
  64. int        check_video();            /*** ビデオ信号の有無を調べる(rec_pal.obj) ***/
  65. void    dezitize();                /*** page1にデジタイズ(rec_pal.obj) ***/
  66. void    pallette();                /*** パレット演算(rec_pal.obj) ***/
  67. unsigned long    dezi_cut();        /*** 矩形カット取り込み ***/
  68. void    average_color_conv();        /*** 32k>256変換 ***/
  69. /*****************************************************************************/
  70. int  check_video()        /*** ビデオ信号の有無を調べる(無ければ0以外) ***/
  71. {
  72.     if (N_check_video()==0) {    /*** ビデオ信号の有無を調べる(video.obj) ***/
  73.         disp_alart(1,"映像信号が来てないよ","配線を確かめてネ");
  74.         return -1;
  75.     }
  76.     return 0;
  77. }
  78. /*****************************************************************************/
  79. void    dezitize()        /*page1にデジタイズ*/
  80. {
  81.     check_video();        /*** ビデオ信号の有無を調べる(無ければ0以外) ***/
  82.     N_set_resolution(11,11,1,1,0);            /*** 32K色,描画1・表示page1 ***/
  83.     EGB_displayPage(EGB_work,1,2);
  84.     EGB_clearScreen(EGB_work);
  85.     EGB_dezitize(EGB_work,1);
  86.     N_wait_vsync();        /*** Vsync待ち(video.obj) ***/
  87.     mos_btn_wait();
  88.     EGB_dezitize(EGB_work,0);
  89.     N_set_resolution(3,10,1,0,2);
  90.     EGB_displayStart(EGB_work,2,2,2);
  91.     EGB_displayStart(EGB_work,3,319,239);
  92.     EGB_writePage(EGB_work,0);
  93.     MOS_disp(TRUE);
  94.     sysflag|=_Dezi;
  95. }
  96. /*****************************************************************************/
  97. void    show256pal()        /*page1に256色パレット一覧を表示(内部)*/
  98. {
  99.     FRAME     pos=N_WIN_getWinPos(win_pal);
  100.     register short    i;
  101.  
  102.     MOS_disp(FALSE);
  103.     /*** 表示域設定 ***/
  104.     pos.lup.x=((pos.lup.x%2)==0)?pos.lup.x+10:pos.lup.x+11;
  105.     pos.lup.y=((pos.lup.y%2)==0)?pos.lup.y+76:pos.lup.y+77;
  106.     pos.rdw.x=pos.lup.x+256;
  107.     pos.rdw.y=pos.lup.y+(8*2);
  108.     EGB_writePage(EGB_work,0);        /*** 書き込みページ ***/
  109.     EGB_writeMode(EGB_work,0);        /*** pset ***/
  110.     __NboxRectangle(pos,8,8,0);    /*矩形を枠囲みし塗り潰し(N_WIN_9.obj)*/
  111.     EGB_writePage(EGB_work,1);        /*** 書き込みページ ***/
  112.     EGB_paintMode(EGB_work,0x02);
  113.     pos.lup.x/=2;
  114.     pos.lup.y/=2;
  115.     WORD(EGB_para+0)=2;
  116.     for (i=0; i<128; i++) {
  117.         WORD(EGB_para+2)=pos.lup.x+i;
  118.         WORD(EGB_para+4)=pos.lup.y;
  119.         WORD(EGB_para+6)=pos.lup.x+i;
  120.         WORD(EGB_para+8)=pos.lup.y+3;
  121.         EGB_color(EGB_work,0,tbl_expand[i]);
  122.         EGB_connect(EGB_work,EGB_para);
  123.         WORD(EGB_para+4)=pos.lup.y+4;
  124.         WORD(EGB_para+8)=pos.lup.y+7;
  125.         EGB_color(EGB_work,0,tbl_expand[i+128]);
  126.         EGB_connect(EGB_work,EGB_para);
  127.     }
  128.     EGB_writePage(EGB_work,0);        /*** 書き込みページ ***/
  129.     MOS_disp(TRUE);
  130. }
  131. /*****************************************************************************/
  132. int    load_vct(buf)    /*** ベクトル演算テーブルをロード(内部・失敗すればれば0以外) ***/
  133. char    *buf;
  134. {
  135.     FILE    *fp;
  136.     char    fname[160];
  137.     register unsigned long vctsize;
  138.  
  139.     strcpy(fname,startpath);
  140.     strcat(fname,"tvi_rec.vct");
  141.     fp=fopen(fname,"rb");                /*** ファイルをOpen ***/
  142.     if (fp==NULL) {
  143.         disp_alart(1,"ベクトル演算用テーブルがありません"
  144.                     ,"`tvi_rec.vct'のあるパスを指定してね");
  145.         return -1;
  146.     }
  147.     change_icon(1);            /*** マウスアイコンを砂時計に変更 ***/
  148.     vctsize=fread(buf,1,VCTTBLSIZE,fp);
  149.     fclose(fp);
  150.     change_icon(0);            /*** マウスアイコンを★型に復帰 ***/
  151.     if (vctsize!=VCTTBLSIZE){
  152.         disp_alart(1,"テーブルファイルが途中で切れてますよ"
  153.                     ,"パレットは作れませんでした");
  154.         return -1;
  155.     }
  156. }
  157. /*****************************************************************************/
  158. void    pallette()        /*パレット演算*/
  159. {
  160.     char    *add;
  161.     unsigned long dezisize;
  162.     unsigned short    optid=0;
  163.  
  164.     if (((sysflag & _Dezi)==0) && ((sysflag & _ExpandTable)==0)) {
  165.         disp_alart(1,"もとになる画像がないヨ"
  166.                     ,"デジタイズまたはロードしてちょ");
  167.         return;
  168.     }
  169.  
  170.     /*** メモリに余裕があるか? ***/
  171.     if ((sysflag & _TVI)==0) {
  172.         LastPage=0;
  173.     }
  174.     if (MaxVideoBuf<((LastPage+2)+
  175.         (((sizeof(short)*VRAMSIZE*3)+(sizeof(char)*(max_32Kcolor+1)*3))
  176.         /(sizeof(short)*imgsize)))){
  177.         optid=disp_alart(2,"演算用エリアが足りないので"
  178.                         ,"動画をクリアしちゃうゾ");
  179.         if (optid==btn_alart_NO) {
  180.             return;
  181.         }
  182.         sysflag^=_TVI;
  183.         StartPage=EndPage=0xffff;
  184.         NowPage=LastPage=0;
  185.         set_edit_page();
  186.         set_page_slider();
  187.     }
  188.     save_edit_page();    /*** ページ情報のセーブ ***/
  189.     strcpy(undomode,"mkpal");        /*** UNDO-MODE ***/
  190.     add=VideoBufAdd+(imgsize*(LastPage+1));
  191.     /*** 予備取り込み ***/
  192.     N_Vget_ful_11(0x40000,add);
  193.     /*** ★256色パレット作成 ***/
  194.     optid=0;
  195.     if ((sysflag & _ExpandTable)!=0) {
  196.         optid=disp_alart(2,"展開用パレットはあるけどつくる?","");
  197.     }
  198.     if ((optid==btn_alart_YES)||((sysflag & _ExpandTable)==0)) {
  199.         if (sysopt[OPTBTN_COLOR_GRAV]!=0){
  200.             /*** 優先色指定 ***/
  201.             disp_alart(1,"256→32K色パレットを演算します"
  202.                 ,"重要な色の部分を矩形指定してね");
  203.             while (optid!=btn_alart_GO) {
  204.                 N_Vput_ful_11(0x40000,add);
  205.                 dezisize=dezi_cut(add+VRAMSIZE);/*** 矩形取り込み ***/
  206.                 optid=disp_alart(3,"この範囲でいい?","");
  207.                 if (optid==btn_alart_ABORT) {
  208.                     N_Vput_ful_11(0x40000,add);
  209.                     return;
  210.                 }
  211.             }
  212.         } else {
  213.             dezisize=0;
  214.         }
  215.         average_color_conv(add,dezisize);
  216.         if (WIN_work.pointedOptId==btn_pal_ABORT) {    /*** アボートした ***/
  217.             N_Vput_ful_11(0x40000,add);
  218.             N_WIN_closeWin(win_pal);
  219.             return;
  220.         }
  221.         N_WIN_disappearOpt(btn_pal_ABORT);
  222.         sysflag|=_ExpandTable;
  223.         set_edit_page();
  224.         /*** 256色パレット表示 ***/
  225.         N_Vput_ful_11(0x40000,add);
  226.         show256pal();        /*page1に256色パレット一覧を表示(内部)*/
  227.     } else {
  228.         N_WIN_re_entryOptAdd(txt_pal_mes,"256→32K色展開パレット一覧");
  229.         N_WIN_re_copyOptTxt(txt_pal_col,"  256/-----");
  230.         N_WIN_disappearOpt(btn_pal_ABORT);
  231.         N_WIN_popupWin(win_pal);
  232.         show256pal();        /*page1に256色パレット一覧を表示(内部)*/
  233.         optid=disp_alart(2,"圧縮用パレットをつくります?"
  234.                             ,"(1分程かかるヨ)");
  235.         if (optid==btn_alart_NO) {
  236.             N_Vput_ful_11(0x40000,add);
  237.             N_WIN_closeWin(win_pal);
  238.             return;
  239.         }
  240.     }
  241.     /*** ★32K色パレット作成 ***/
  242.     /*** ベクトル演算テーブルをロード ***/
  243.     if (load_vct(add+VRAMSIZE)!=0) {
  244.         N_Vput_ful_11(0x40000,add);
  245.         N_WIN_closeWin(win_pal);
  246.         return;
  247.     }
  248.     /*** ベクトル演算 ***/
  249.     N_WIN_disappearOpt(txt_pal_mes);
  250.     N_WIN_re_entryOptAdd(txt_pal_mes,"32K→256色圧縮パレット作成中");
  251.     N_WIN_showOpt(txt_pal_mes);
  252.     MOS_disp(FALSE);
  253.     calc_palet(add+VRAMSIZE);    /*** パレット演算 ***/
  254.     MOS_disp(TRUE);
  255.     /*** 結果を表示 ***/
  256.     N_Vput_ful_11(0x40000,add);
  257.     VC8get_ful(0x40000,add+VRAMSIZE);
  258.     VC8put_ful(0x40000,add+VRAMSIZE);
  259.     EGB_displayPage(EGB_work,1,2);    /*** 32K画面のみ表示 ***/
  260.     N_WIN_closeWin(win_pal);
  261. /*
  262.     N_WIN_disappearOpt(txt_pal_mes);
  263.     N_WIN_re_entryOptAdd(txt_pal_mes,"変換後はこのようになるよ");
  264.     N_WIN_showOpt(txt_pal_mes);
  265.     mos_move_wait();
  266. */
  267.     EGB_displayPage(EGB_work,0,3);
  268.     sysflag|=_ComplessTable;
  269.     set_edit_page();
  270. }
  271. /*****************************************************************************/
  272. unsigned long    dezi_cut(dispdata)        /*** 矩形カット取り込み ***/
  273. unsigned short    *dispdata;
  274. {
  275.     FRAME    pos;
  276.     unsigned long ret=0;
  277.  
  278.     #define    xsize    639
  279.     #define    ysize    479
  280.  
  281.     EGB_displayPage(EGB_work,1,2);    /*** page1のみ表示 ***/
  282.     EGB_writePage(EGB_work,1);        /*** page1に書き込み ***/
  283.     MOS_disp(FALSE);
  284.     __NmosGet();                    /*** マウス位置補正 ***/
  285.     MOS_setpos(WIN_work.mx/2,WIN_work.my/2);
  286.     MOS_resolution(1,10);            /*** マウスをpage1に移動 ***/
  287.     MOS_writePage(1);                /*** page1に書き込み ***/
  288.     MOS_horizon(0,xsize/2);
  289.     MOS_vertical(0,ysize/2);
  290.     change_icon(1);                    /*** マウスアイコンを一度切り換えてから ***/
  291.     change_icon(0);                    /*** マウスアイコンを★型に ***/
  292.     MOS_disp(TRUE);
  293.     while ( ret==0 ) {
  294.         MOS_disp(TRUE);
  295.         while (WIN_work.mb!=_MosBtnLeft){    /*** マウスをおすまで移動 ***/
  296.             __NmosGet();            /*マウス読込み(n_win_9 /内部・エラーチェック無)*/
  297.         }
  298.         MOS_horizon(WIN_work.mx+1,xsize/2);
  299.         MOS_vertical(WIN_work.my+1,ysize/2);
  300.         pos.lup.x=WIN_work.mx;
  301.         pos.lup.y=WIN_work.my;
  302.         pos.rdw.x=WIN_work.mx;
  303.         pos.rdw.y=WIN_work.my;
  304.         MOS_disp(FALSE);
  305.         __NxorRectangleFull(pos);
  306.         while (WIN_work.mb==_MosBtnLeft){    /*** マウスを放すまで移動 ***/
  307.             __NmosGet();            /*マウス読込み(n_win_9 /内部・エラーチェック無)*/
  308.             __NxorRectangleFull(pos);
  309.             pos.rdw.x=WIN_work.mx;
  310.             pos.rdw.y=WIN_work.my;
  311.             __NxorRectangleFull(pos);
  312.         }
  313.         __NxorRectangleFull(pos);
  314.         if (WIN_work.mb!=_MosBtnRight) {
  315.             ret=(((pos.rdw.x-pos.lup.x+1)*2)*(pos.rdw.y-pos.lup.y+1));
  316.         }
  317.     }
  318.     MOS_resolution(0,3);            /*** マウスをpage0に復帰 ***/
  319.     MOS_writePage(0);                /*** page0に書き込み ***/
  320.     MOS_horizon(0,xsize);
  321.     MOS_vertical(0,ysize);
  322.     MOS_setpos(WIN_work.mx*2,WIN_work.my*2);            /*** マウス位置補正 ***/
  323.     change_icon(1);                    /*** マウスアイコンを一度切り換えてから ***/
  324.     change_icon(0);                    /*** マウスアイコンを★型に復帰 ***/
  325.     MOS_disp(TRUE);
  326.     __NgetImgRectangle((unsigned int)dispdata,pos);
  327.     /*** 矩形内塗り潰し ***/
  328.     __NxorRectangleFull(pos);
  329.     EGB_writePage(EGB_work,0);
  330.     EGB_displayPage(EGB_work,0,3);
  331.     return    ret;
  332. }
  333. /*****************************************************************************/
  334. unsigned short    search_first_color()    /*最初の平均色を捜す(内部)*/
  335. {
  336.     register unsigned short    i;
  337.  
  338.     for ( i=0 ; i<=max_32Kcolor ; i++ ) {
  339.         if ( color_count[i]!=0 ) {
  340.             break;
  341.         }
  342.     }
  343.     i=(i>max_32Kcolor)?max_32Kcolor:i;
  344.     return    i;
  345. }
  346. /*****************************************************************************/
  347. unsigned short    search_next_color(col)    /*次の平均色を捜す(内部)*/
  348. unsigned short    col;
  349. {
  350.     register unsigned long    i;
  351.  
  352.     for ( i=col+1 ; i<=max_32Kcolor ; i++ ) {
  353.         if ( color_count[i]!=0 ) {
  354.             break;
  355.         }
  356.     }
  357.     i=(i>max_32Kcolor)?max_32Kcolor:i;
  358.     return    i;
  359. }
  360. /*****************************************************************************/
  361. void    exchange_pal(pal,col)        /*正当なパレット位置に入れ換える(内部)*/
  362. unsigned char    pal;
  363. unsigned short    col;
  364. {
  365.     register unsigned long    i,tmp;
  366.  
  367.     if (tbl_expand[pal]!=col) {
  368.         for (i=1; i<255; i++) {
  369.             if (tbl_expand[i]==col) {
  370.                 tmp=tbl_expand[pal];
  371.                 tbl_expand[pal]=col;
  372.                 tbl_expand[i]=tmp;
  373.                 break;
  374.             }
  375.         }
  376.     }
  377. }
  378. /*****************************************************************************/
  379. void    average_color_conv(add,dezisize)    /*32k>256変換*/
  380. char    *add;
  381. unsigned long dezisize;
  382. {
  383.     #define    COL_BRACK    (0x000)
  384.     #define    COL_GRAY    (0x0b6)
  385.     #define    COL_WHITE    (0x0ff)
  386.  
  387.     static unsigned short    grav[16]={
  388.          0x0000,0x000f,0x010e,0x01ef,0x3c00,0x3c0f,0x3de0,0x3def
  389.         ,0x1ce7,0x001f,0x03e0,0x03ff,0x7c00,0x7c1f,0x7fe0,0x7fff
  390.     };
  391.     static unsigned short    step[4]={ 0x0421,0x0020,0x0400,0x0001 };/*W.R.G.B*/
  392.     unsigned short    *Vadd;
  393.     char            tmp[16];    /*** 色数表示用ワーク ***/
  394.     register long    pa,pb;
  395.     register unsigned long    c,i,j,k,v,use_color,before_color,org_color;
  396.     register unsigned long    s,s1;        /*** ループカウンタ ***/
  397.     register unsigned short    cg,cr,cb;    /*** GRB比較用 ***/
  398.  
  399.     change_icon(1);            /*** マウスアイコンを砂時計に変更 ***/
  400.     /*** ワークエリア取得 ***/
  401.     Vadd=(unsigned short *)add;
  402.     color_count=(unsigned short *)Vadd+VRAMSIZE+dezisize;
  403.     color_ex=(unsigned char *)color_count+(max_32Kcolor+1)*2;
  404.     color_check=(unsigned char *)color_ex+(max_32Kcolor+1);
  405.     /*** ワークエリア初期化 ***/
  406.     for ( i=0 ; i<=max_32Kcolor ; i++ ) {
  407.         color_ex[i]=0;
  408.         color_count[i]=0;
  409.         color_check[i]=0;
  410.     }
  411.     /*** 優先色取得 ***/
  412.     if (dezisize>0) {
  413.         for ( i=(VRAMSIZE/2) ; i<((VRAMSIZE/2)+(dezisize/2)) ; i++ ) {
  414.             k=Vadd[i] & max_32Kcolor;
  415.             color_ex[k]=(color_ex[k]<255)?color_ex[k]+1:255;
  416.         }
  417.     }
  418.     /*** 使用色取得 ***/
  419.     for ( i=0 ; i<(VRAMSIZE/2) ; i++ ) {
  420.         k=Vadd[i] & max_32Kcolor;
  421.         color_count[k]=(color_count[k]<65535)?color_count[k]+1:65535;
  422.     }
  423.     /*** 最優先パレット指定 ***/
  424.     if (dezisize>0) {
  425.         for (i=0; i<16; i++) {
  426.             j=grav[i];
  427.             color_count[j]=(color_count[j]<(65535-100))?color_count[j]+100:65535;
  428.             color_ex[j]=255;
  429.         }
  430.     }
  431.     /*** 総使用色数取得 ***/
  432.     for ( use_color=0,i=0 ; i<=max_32Kcolor ; i++ ) {
  433.         if (color_count[i]>0) {
  434.             use_color++;
  435.             color_check[i]=1;
  436.             /*** 肌色優先指定 ***/
  437.             cg=(i & 0x7c00)>>10;
  438.             cr=(i & 0x03e0)>>5;
  439.             cb=(i & 0x001f);
  440.             if ((cr>cg)&&(cg<8)&&(cb<4)){
  441.                 /*赤>青>緑のとき肌色として優先*/
  442.                 color_count[i]=(color_count[i]<(65535-1000))
  443.                                 ?color_count[i]+1000:65535;
  444.             }
  445.         }
  446.     }
  447.     org_color=use_color;
  448.     strcpy(tmp,itoa(use_color,5));
  449.     strcat(tmp,"/");
  450.     strcat(tmp,itoa(org_color,5));
  451.     N_WIN_re_copyOptTxt(txt_pal_col,tmp);
  452.     N_WIN_re_entryOptAdd(txt_pal_mes,"256→32K色展開パレット作成中");
  453.     N_WIN_showOpt(btn_pal_ABORT);
  454.     N_WIN_popupWin(win_pal);
  455.     change_icon(1);            /*** マウスアイコンを砂時計に変更 ***/
  456.     /*** 減色開始 ***/
  457.     s=4; s1=0;
  458.     while ( use_color>max_256color ) {
  459.         before_color=use_color;
  460.         for (i=0; i<=max_32Kcolor; i++) {
  461.             if (use_color<=max_256color) {
  462.                 break;
  463.             }
  464.             if ((color_ex[i]<10)&&(color_check[i]!=0)) {
  465.                 for (j=0; j<(s<<2); j++) {
  466.                     v=((j>>2)*0x0421)+step[j%4];
  467.                     pa=((i-v)>=0)?(i-v):max_32Kcolor+1;
  468.                     pb=((i+v)<=max_32Kcolor)?(i+v):max_32Kcolor+1;
  469.                     if ( pb<=max_32Kcolor && color_check[pb]!=0) {
  470.                         if((color_ex[pb]>4)||(color_count[pb]>color_count[i])){
  471.                             color_count[i]=0;
  472.                             color_check[i]=0;
  473.                         } else {
  474.                             color_count[pb]=0;
  475.                             color_check[pb]=0;
  476.                         }
  477.                         /*i=pb;*/
  478.                         use_color--;
  479.                         break;
  480.                     }
  481.                     if ( pa<=max_32Kcolor && color_check[pa]!=0) {
  482.                         if((color_ex[pa]>4)||(color_count[pa]>color_count[i])){
  483.                             color_count[i]=0;
  484.                             color_check[i]=0;
  485.                         } else {
  486.                             color_count[pa]=0;
  487.                             color_check[pa]=0;
  488.                         }
  489.                         /*i=pa;*/
  490.                         use_color--;
  491.                         break;
  492.                     }
  493.                 }
  494.             }
  495.         }
  496.         if (s1>1) {
  497.             v=use_color;
  498.             for (i=1 ; i<max_32Kcolor ; i++) {
  499.                 color_ex[i]=(color_ex[i]>2)?color_ex[i]-3:0;
  500.                 if (color_count[i]>0) {
  501.                     color_count[i]=(color_count[i]>50)
  502.                         ?color_count[i]-50:color_count[i]-1;
  503.                     if (color_count[i]==0) {
  504.                         v--;
  505.                     }
  506.                     if (v<=max_256color) {
  507.                         break;
  508.                     }
  509.                 }
  510.             }
  511.             s1=0;
  512.             s-=4;
  513.         }
  514.         for ( use_color=0,i=0 ; i<=max_32Kcolor ; i++ ) {
  515.             if (color_count[i]!=0) {
  516.                 use_color++;
  517.                 color_check[i]=1;
  518.             } else {
  519.                 color_check[i]=0;
  520.             }
  521.         }
  522.         /*** 途中経過表示 ***/
  523.         if (before_color!=use_color) {
  524.             strcpy(tmp,itoa(use_color,5));
  525.             strcat(tmp,"/");
  526.             strcat(tmp,itoa(org_color,5));
  527.             N_WIN_re_copyOptTxt(txt_pal_col,tmp);
  528.         } else {
  529.             s1++;
  530.             s=((s+4)<max_avr_step)?s+4:max_avr_step;
  531.         }
  532.         /*** アボート処理 ***/
  533.         __NmosGet();            /*マウス読込み(n_win_9 /内部・エラーチェック無)*/
  534.         if (WIN_work.mb==_MosBtnLeft) {
  535.             doPoint(WIN_work.mx,WIN_work.my);
  536.             if (WIN_work.pointedOptId==btn_pal_ABORT) {
  537.                 break;
  538.             }
  539.         }
  540.     }
  541.     /*** 展開パレット設定 ***/
  542.     for ( use_color=0,i=0 ; i<=max_32Kcolor ; i++ ) {
  543.         if (color_count[i]!=0) {
  544.             use_color++;
  545.         }
  546.     }
  547.     if (use_color<=max_256color) {
  548.         s=search_first_color();
  549.         tbl_expand[0]=s;
  550.         for ( c=1 ; c<256 ; c++ ) {
  551.             s=search_next_color(s);
  552.             tbl_expand[c]=s;            /*** debug '90.11.1 ***/
  553.         }
  554.         /*** 正当なパレット位置に入れ換える(T_PAINT256対応) ***/
  555.         exchange_pal(COL_BRACK,grav[0]);    /*** 黒色位置再設定 ***/
  556.         exchange_pal(COL_GRAY,grav[7]);        /*** 灰色位置再設定 ***/
  557.         exchange_pal(COL_WHITE,grav[15]);    /*** 白色位置再設定 ***/
  558.         /*** システムフラグ設定 ***/
  559.         sysflag|=_ExpandTable;
  560.     }
  561.     change_icon(0);            /*** マウスアイコンを★型に復帰 ***/
  562. }
  563. /******************************************************************************
  564. $Log: RCS/rec_pal.cv $
  565.  * Revision 1.20  91/01/09 16:13:24  Nam
  566.  * V0.0 L19 (debug at 2MB's hung, when DATA had loaded.)
  567.  * 
  568.  * Revision 1.19  90/11/13 20:16:44  Nam
  569.  * renew MOS_getpos -> __mosGet
  570.  * 
  571.  * Revision 1.18  90/11/13 14:41:48  Nam
  572.  * Release at V0.0 L18d
  573.  * 
  574.  * Revision 1.17  90/11/12 17:14:50  Nam
  575.  * add optbtn operation
  576.  * 
  577.  * Revision 1.16  90/11/10 17:05:04  Nam
  578.  * add UNDO for make-pal
  579.  * 
  580.  * Revision 1.15  90/11/07 18:59:32  Nam
  581.  * renew at 'getdezisize' (work all page1)
  582.  * 
  583.  * Revision 1.14  90/11/05 16:50:38  Nam
  584.  * *** empty log message ***
  585.  * 
  586.  * Revision 1.13  90/11/01 17:55:12  Nam
  587.  * Rel V0.0L17 at '90.11.2 for FPICS.
  588.  * 
  589.  * Revision 1.12  90/11/01 17:55:12  Nam
  590.  * blush up of palette making routine
  591.  * 
  592.  * Revision 1.10  90/10/31 20:04:36  Nam
  593.  * separate loading vct from pal-calc
  594.  * 
  595.  * Revision 1.9  90/10/31 16:01:02  Nam
  596.  * renew make-pal (move GRAY <- for T_PAINT256)
  597.  * 
  598.  * Revision 1.8  90/10/30 14:15:16  Nam
  599.  * renew make-pal (disp 256pal)
  600.  * 
  601.  * Revision 1.7  90/10/29 13:09:10  Nam
  602.  * renew win_pal
  603.  * 
  604.  * Revision 1.6  90/10/28 21:47:40  Nam
  605.  * add win_pal (disp col-No and can abort)
  606.  * 
  607.  * Revision 1.5  90/10/27 15:03:42  Nam
  608.  * faster
  609.  * 
  610.  * Revision 1.4  90/10/25 19:19:22  Nam
  611.  * use 'rec_st.h' and brush-up make palette routine
  612.  * set priority for skin color
  613.  * 
  614.  * Revision 1.3  90/10/25 11:06:34  Nam
  615.  * make palette with non-clear
  616.  * 
  617.  * Revision 1.2  90/10/24 19:54:26  Nam
  618.  * separate a vector-table-object from main routine.
  619.  * 
  620.  * Revision 1.1  90/10/10 18:05:24  Nam
  621.  * Initial revision
  622.  * 
  623. ******************************************************************************/
  624.