
#include <stdio.h>
#include <string.h>
#include <glib.h>
#include <strlib.h>
#include "land.h"

/* #include "..\lib.h" */

void colbox(int x, int y, int col)
{
     line(x, y, x+15, y+15, PSET, col,  2, 0xffff);
     line(x, y, x+15, y+15, PSET, col0, 1, 0xffff);
}

void psmsgcls()
{
   line(80+1, 290+21, 560-1, 360-1, PSET, col7, 2, 0xffff);
}

void pseudemsg2(char *msg1, char *msg2)
{
   line( 80+1,290+21, 560-1, 360-1, PSET, col7, 2, 0xffff);
   msgset(96, 315, msg1, col0);
   msgset(96, 335, msg2, col0);
}

void pseudemsg(int com, int sw)
{
   char hmsg1[80], hmsg2[80];
   int col;

   hmsg1[0] = '\0'; hmsg2[0] = '\0';

   if (com == 1) {
      strcpy(hmsg1, "色数を設定してください。（２〜１６色）");
   }

   if (com == 2 || com == 3) {
      strcpy(hmsg1, "右側のウィンドウから色を選んでください。");
   }
   
   if (com == 8 || com == 9 || com == 10) {
      strcpy(hmsg1, "色､レベル､作業領域を設定してください。");
      strcpy(hmsg2, "設定は ○､□､数字の部分をそれぞれ指定してください。");
   }

   if (com == 12) {
      strcpy(hmsg1, "メイン･メニューにもどります。");
   }

   if (sw == 0) col = col7;
   else         col = col0;

   msgset(96, 315, hmsg1, col);
   msgset(96, 335, hmsg2, col);
}

void levelset(int coln, int th[17][2], int sw)
{
int i, col, cx, cy;
char swk[10];

      sprintf(swk, "< %3d", th[0][0]);
      symbol(118, 257, swk, 1,1, col10, 0 ,PSET);

      for (i = 0; i < coln;  i++) {
         if (i < coln-1) col = col0;
         else            col = col10;
         sprintf(swk, "< %3d", th[i+1][0]);
         if (i < 8) {
            if (sw == 1) colbox(100,  245-i*20, i);
            cx = 118; cy = 237-i*20;
         } else {
            if (sw == 1) colbox(180, 245+160-i*20, i);
            cx = 198; cy = 237+160-i*20;
         }
         line(cx-1, cy-1, cx+45, cy+9, PSET, col7, 2, 0xffff);
         symbol(cx, cy, swk, 1,1, col, 0 ,PSET);
      }
}


int colnset(int coln, int th[17][2])
{
int mosx = 270, mosy = 100, coln2, i;
double   wa;
   
   if (calc( &mosx, &mosy, &wa) == 0) coln2 = coln;
   else                               coln2 = wa;
   if (coln2 < 2) coln2 = 2;
   if (coln2 >16) coln2 = 16;
   if (coln != coln2) {
      for (i = 0; i < coln2; i++) {
         th[i][0] = 256*i/coln2; th[i][1] = 256*(i+1)/coln2-1;
      }
      th[coln2][0] = 256; th[coln2][1] = 0;
      line(90+1, 63+21, 250-1, 268-1, PSET, col7, 2, 0xffff);
      levelset(coln2, th, 1);
   }   
   return(coln2);
}

void colchg(int cx, int cy, int *cl)
{
unsigned  ddadr[2];
unsigned char page;
char      buf[11279]; /* (110*205+7)/8*4 */
int x, y;
int mx, my, i, j;
int cx2, cy2;

   x = 270; y = 80;
   page = 0;
   BSETDATAADR(ddadr,  buf);
   GDS_getBlock(ddadr[0],  ddadr[1],  page, x, y, x+109, y+204);

   helpbox( x, y, x+100, y+190, "色の種類");
   for (i = 0; i < 8;  i++) {
      colbox(x+20, y+195-23-i*20, i);
      colbox(x+60, y+195-23-i*20, i+8);
   }
   while(1) {
      while ((MOS_rdpos(&mx, &my) & 0x01) == 0);
      for (i = 0; i < 8;  i++) {
         cx2 = x+20; cy2 = y+195-23-i*20; j = 0;
         if (xychk16(mx, my, cx2, cy2) == 1) break;
         cx2 = x+60; j = 8;
         if (xychk16(mx, my, cx2, cy2) == 1) break;
         cx2 = 0;
      }
      if (cx2 != 0) {
         line(cx2-1, cy2-1, cx2+16, cy2+16, PSET, col14, 1, 0xffff);
         while ((MOS_rdpos(&mx, &my) & 0x01) == 1);
         if (xychk16(mx, my, cx2, cy2) == 1) {
            *cl = i + j;
            colbox(cx, cy, *cl);
            break;
         }
         line(cx2-1, cy2-1, cx2+16, cy2+16, PSET, col7,  1, 0xffff);
      }
   }
   GDS_putBlock(ddadr[0],  ddadr[1],  page, x,  y, x+109, y+204, PSET);
   return;
}

void levelchg(int cx, int cy, int coln, int th[17][2], int leveln)
{
int mosx = 260, mosy = 100, maxlv, minlv;
char    ws2[80];
double  wa = 0;
int     wi = 0, i;

   ws2[0] = '\0';
   while(1) {
      if (coln == 2) {
         maxlv = 255;
         minlv = 1;
         break;
      }
      if (leveln == 0) {
         maxlv = th[coln-1][0] - (coln-2);
         minlv = 1;
         break;
      }
      if (leveln == coln -2 ) {
         maxlv = 255;
         minlv = th[1][0] + (coln-2);
         break;
      }
      maxlv = th[leveln+2][0]-1;
      minlv = th[leveln][0]+1;
      break;
   }
   psmsgcls();
   sprintf(ws2, "レベル設定範囲 [%d〜%d]", minlv, maxlv);
   pseudemsg2("レベルを設定してください。", ws2);

   if (calc( &mosx, &mosy, &wa) == 1) {
      wi = wa;
      if (wi < minlv) wi = minlv;
      if (wi > maxlv) wi = maxlv;
      while(1) {
         if (coln == 2) {
            th[0][1] = wi - 1;
            th[1][0] = wi;
            break;
         }
         if (leveln == 0) {
            th[1][0] = wi;
            th[0][1] = th[1][0] - 1;
            for (i = 2; i < coln-1; i++) {
               th[i][0] = (th[coln-1][0]-th[1][0])*(i-1)/(coln-2)+th[1][0];
               th[i-1][1] = th[i][0] - 1;
            }
            th[coln-2][1] = th[coln-1][0]-1;
            break;
         }
         if (leveln == coln -2 ) {
            th[coln-1][0] = wi;
            for (i = 2; i < coln-1; i++) {
               th[i][0] = (th[coln-1][0]-th[1][0])*(i-1)/(coln-2)+th[1][0];
               th[i-1][1] = th[i][0] - 1;
            }
            th[coln-2][1] = th[coln-1][0]-1;
            break;
         }
         th[leveln+1][0] = wi;
         th[leveln][1] = th[leveln+1][0] - 1;
         break;
      }
      levelset(coln, th, 0);
      /* th level print for debug *
      Locate(0,0); Color(2);
      for (i = 0; i <= coln; i++) {
         printf("col= %d-%d    \n", th[i][0], th[i][1]);
      }
      Color(7);
      * end for denug */
   }
   psmsgcls();
   return;
}

int chgbox( int mx, int my, int *bx2, int *by2, int *xsiz2, int *ysiz2)
{
int  boxcom = -1;
int  x, y, xsiz, ysiz, wx, wy, x1, y1, x2, y2;
char buf1x[323], buf2x[323], buf1y[203], buf2y[203]; /* (640*1+7)/8*4,  (400*1+7)/8*4  */
unsigned  ddadr1x[2], ddadr2x[2], ddadr1y[2], ddadr2y[2];
unsigned char page = 0;

     x = *bx2; y = *by2; xsiz = *xsiz2; ysiz = *ysiz2;

     if (xychk( mx, my, x+xsiz-4, y+ysiz-4, x+xsiz+2, y+ysiz+2) == 1) { /* 枠変更 */
        MOS_horizon(x+5, 511);
        MOS_vertical(y+5, 399);
        boxcom = 0;
     }
     if (xychk( mx, my, x+xsiz-4, y-3, x+xsiz+2, y+3) == 1) { /* 枠変更 */
        MOS_horizon(x+5, 511);
        MOS_vertical(0, y+ysiz-5);
        boxcom = 1;
     }
     if (xychk( mx, my, x-3, y-3, x+3, y+3) == 1) { /* 枠変更 */
        MOS_horizon(0, x+xsiz-5);
        MOS_vertical(0, y+ysiz-5);
        boxcom = 2;
     }
     if (xychk( mx, my, x-3, y+ysiz-4, x+3, y+ysiz+2) == 1) { /* 枠変更 */
        MOS_horizon(0, x+xsiz-5);
        MOS_vertical(y+5, 399);
        boxcom = 3;
     }
     if (xychk( mx, my, x+xsiz-4, y+3, x+xsiz+2, y+ysiz-4) == 1) { /* 枠変更 */
        MOS_horizon(x+5, 511);
        MOS_vertical(my, my);
        boxcom = 10;
     }
     if (xychk( mx, my, x+3, y-3, x+xsiz-4, y+3) == 1) { /* 枠変更 */
        MOS_horizon(mx, mx);
        MOS_vertical(0, y+ysiz-5);
        boxcom = 11;
     }
     if (xychk( mx, my, x-3, y+3, x+3, y+ysiz-4) == 1) { /* 枠変更 */
        MOS_horizon(0, x+xsiz-5);
        MOS_vertical(my, my);
        boxcom = 12;
     }
     if (xychk( mx, my, x+3, y+ysiz-4, x+xsiz-4, y+ysiz+2) == 1) { /* 枠変更 */
        MOS_horizon(mx, mx);
        MOS_vertical(y+5, 399);
        boxcom = 13;
     }
     if (boxcom == -1) return(0);
     mcu2();
     /* ボックスサイズ変更 */
     BSETDATAADR(ddadr1x, buf1x);
     BSETDATAADR(ddadr2x, buf2x);
     BSETDATAADR(ddadr1y, buf1y);
     BSETDATAADR(ddadr2y, buf2y);

     GDS_getBlock(ddadr1x[0], ddadr1x[1], page, x, y, x+xsiz-1, y);
     GDS_getBlock(ddadr2x[0], ddadr2x[1], page, x, y+ysiz-1, x+xsiz-1, y+ysiz-1);
     GDS_getBlock(ddadr1y[0], ddadr1y[1], page, x, y+1, x, y+ysiz-2);
     GDS_getBlock(ddadr2y[0], ddadr2y[1], page, x+xsiz-1, y+1, x+xsiz-1, y+ysiz-2);
     line(x, y, x+xsiz-1, y+ysiz-1, PSET, col8, 1, 0xffff);
     
     x1 = x; y1 = y; x2 = x + xsiz - 1; y2 = y + ysiz - 1;
     while ((MOS_rdpos(&wx, &wy) & 0x01) == 1) {
        if (wx != mx || wy != my) {
           mx = wx; my = wy;
           switch (boxcom) {
           case  0 : x2 = wx; y2 = wy; break;
           case  1 : x2 = wx; y1 = wy; break;
           case  2 : x1 = wx; y1 = wy; break;
           case  3 : x1 = wx; y2 = wy; break;
           case 10 : x2 = wx; break;
           case 11 : y1 = wy; break;
           case 12 : x1 = wx; break;
           case 13 : y2 = wy; break;
           default : break;
           }
           GDS_putBlock(ddadr1x[0], ddadr1x[1], page, x, y, x+xsiz-1, y, PSET);
           GDS_putBlock(ddadr2x[0], ddadr2x[1], page, x, y+ysiz-1, x+xsiz-1, y+ysiz-1, PSET);
           GDS_putBlock(ddadr1y[0], ddadr1y[1], page, x, y+1, x, y+ysiz-2, PSET);
           GDS_putBlock(ddadr2y[0], ddadr2y[1], page, x+xsiz-1, y+1, x+xsiz-1, y+ysiz-2, PSET);
           x = x1; y = y1; xsiz = x2 - x1 + 1; ysiz = y2 - y1 + 1;
           GDS_getBlock(ddadr1x[0], ddadr1x[1], page, x, y, x+xsiz-1, y);
           GDS_getBlock(ddadr2x[0], ddadr2x[1], page, x, y+ysiz-1, x+xsiz-1, y+ysiz-1);
           GDS_getBlock(ddadr1y[0], ddadr1y[1], page, x, y+1, x, y+ysiz-2);
           GDS_getBlock(ddadr2y[0], ddadr2y[1], page, x+xsiz-1, y+1, x+xsiz-1, y+ysiz-2);
           line(x, y, x+xsiz-1, y+ysiz-1, PSET, col8, 1, 0xffff);
        }
     }
     GDS_putBlock(ddadr1x[0], ddadr1x[1], page, x, y, x+xsiz-1, y, PSET);
     GDS_putBlock(ddadr2x[0], ddadr2x[1], page, x, y+ysiz-1, x+xsiz-1, y+ysiz-1, PSET);
     GDS_putBlock(ddadr1y[0], ddadr1y[1], page, x, y+1, x, y+ysiz-2, PSET);
     GDS_putBlock(ddadr2y[0], ddadr2y[1], page, x+xsiz-1, y+1, x+xsiz-1, y+ysiz-2, PSET);
     /* ボックスサイズ変更終了 */
     MOS_horizon(0, 639);
     MOS_vertical(0, 399);
     mcu1();
     *bx2 = x; *by2 = y; *xsiz2 = xsiz; *ysiz2 = ysiz;
     return(1);
}

void areacalc( int typ, int warea, int lin, int pixel, int coln, int cl[], int th[][2])
{
char buf1x[323], buf2x[323], buf1y[203], buf2y[203]; /* (640*1+7)/8*4,  (400*1+7)/8*4  */
unsigned  ddadr1x[2], ddadr2x[2], ddadr1y[2], ddadr2y[2];
unsigned  char page, sPage, dPage;
unsigned  ddadr[2];
char      buf[18054]; /* (95*380+7)/8*4 */
int  mx, my, mosx=350, mosy=100;
int  mex=512, mey= 25; /* sub menu */
int  siz=2, ret;
char wstr[20];
double  wa;
int  bx=128, by=100, bx2, by2, xsiz=256, ysiz=200, xsiz2, ysiz2;
int  i, j, kx, ky, m, n, com = 1;
int  cx, cy, col;
unsigned char colcvt[256];
long          colcnt[16];
unsigned char huge *WPTR;

   BSETDATAADR(ddadr,  buf); /* address set */

   BSETDATAADR(ddadr1x, buf1x);
   BSETDATAADR(ddadr2x, buf2x);
   BSETDATAADR(ddadr1y, buf1y);
   BSETDATAADR(ddadr2y, buf2y);

   GDS_getBlock(ddadr1x[0], ddadr1x[1], page, bx, by, bx+xsiz-1, by);
   GDS_getBlock(ddadr2x[0], ddadr2x[1], page, bx, by+ysiz-1, bx+xsiz-1, by+ysiz-1);
   GDS_getBlock(ddadr1y[0], ddadr1y[1], page, bx, by+1, bx, by+ysiz-2);
   GDS_getBlock(ddadr2y[0], ddadr2y[1], page, bx+xsiz-1, by+1, bx+xsiz-1, by+ysiz-2);
   line(bx, by, bx+xsiz-1, by+ysiz-1, PSET, col15, 1, 0xffff);

   while(1) {
     if (com == 1) {
        com  = 0;
        page = 0;
        GDS_getBlock(ddadr[0],  ddadr[1],  page, mex,  mey, mex+127, mey+171);
        if (typ == 0) helpbox( mex, mey, mex+120, mey+160, "面積計算");
        else          helpbox( mex, mey, mex+120, mey+160, "ﾋｽﾄｸﾞﾗﾑ\x095\x05c示");
                                                                    /* 表 */
        msgset( mex+5, mey+30, "枠内ﾄﾞﾗｯｸﾞで", col0);
        msgset( mex+5, mey+50, "位置移動", col0);
        msgset( mex+5, mey+70, "枠ﾄﾞﾗｯｸﾞで", col0);
        msgset( mex+5, mey+90, "大きさ変更", col0);
        line(mex+1, mey+110, mex+119, mey+130, PSET, col7, 2, 0xffff);
        sprintf(wstr, "L%3d-P%3d/", lin+by/ypixel, pixel+bx/xpixel);
        msgset2(mex+16, mey+110, wstr, col0);
        sprintf(wstr, "L%3d-P%3d", lin+(by+ysiz-1)/ypixel, pixel+(bx+xsiz-1)/xpixel);
        msgset2(mex+16, mey+120, wstr, col0);
        recogmsg(mex+30,  mey+135, col0);
        mousemsg( mex+70, mey+135, "終了", col0);
     }
     
     while ((MOS_rdpos(&mx, &my) & 0x01) == 0);
     if (calchk(mx, my, 600, 355, &mosx, &mosy) == 1) { com = 0; continue; }

     bx2 = bx; by2 = by; xsiz2 = xsiz; ysiz2 = ysiz;
     if (chgbox( mx, my, &bx2, &by2, &xsiz2, &ysiz2) != 0) { /* ボックスの大きさ変更 */
        com = 0;
        GDS_putBlock(ddadr1x[0], ddadr1x[1], page, bx, by, bx+xsiz-1, by, PSET);
        GDS_putBlock(ddadr2x[0], ddadr2x[1], page, bx, by+ysiz-1, bx+xsiz-1, by+ysiz-1, PSET);
        GDS_putBlock(ddadr1y[0], ddadr1y[1], page, bx, by+1, bx, by+ysiz-2, PSET);
        GDS_putBlock(ddadr2y[0], ddadr2y[1], page, bx+xsiz-1, by+1, bx+xsiz-1, by+ysiz-2, PSET);
        bx = bx2; by = by2; xsiz = xsiz2; ysiz = ysiz2;
        GDS_getBlock(ddadr1x[0], ddadr1x[1], page, bx, by, bx+xsiz-1, by);
        GDS_getBlock(ddadr2x[0], ddadr2x[1], page, bx, by+ysiz-1, bx+xsiz-1, by+ysiz-1);
        GDS_getBlock(ddadr1y[0], ddadr1y[1], page, bx, by+1, bx, by+ysiz-2);
        GDS_getBlock(ddadr2y[0], ddadr2y[1], page, bx+xsiz-1, by+1, bx+xsiz-1, by+ysiz-2);
        line(bx, by, bx+xsiz-1, by+ysiz-1, PSET, col15, 1, 0xffff);
        mcu1();
        line(mex+1, mey+110, mex+119, mey+130, PSET, col7, 2, 0xffff);
        sprintf(wstr, "L%3d-P%3d/", lin+by/ypixel, pixel+bx/xpixel);
        msgset2(mex+16, mey+110, wstr, col0);
        sprintf(wstr, "L%3d-P%3d", lin+(by+ysiz-1)/ypixel, pixel+(bx+xsiz-1)/xpixel);
        msgset2(mex+16, mey+120, wstr, col0);
        continue;
     }
     if (xychk( mx, my, bx, by, bx+xsiz-1, by+ysiz-1) == 1) { /* ボックス移動 */
        com = 0;
        MOS_horizon(mx-bx, 511-((bx+xsiz-1)-mx));
        MOS_vertical(my-by, 399-((by+ysiz-1)-my));
        mcu3();
        bx2 = bx; by2 = by;
        movbox(&bx2, &by2, xsiz, ysiz, mx-bx, my-by);
        GDS_putBlock(ddadr1x[0], ddadr1x[1], page, bx, by, bx+xsiz-1, by, PSET);
        GDS_putBlock(ddadr2x[0], ddadr2x[1], page, bx, by+ysiz-1, bx+xsiz-1, by+ysiz-1, PSET);
        GDS_putBlock(ddadr1y[0], ddadr1y[1], page, bx, by+1, bx, by+ysiz-2, PSET);
        GDS_putBlock(ddadr2y[0], ddadr2y[1], page, bx+xsiz-1, by+1, bx+xsiz-1, by+ysiz-2, PSET);
        bx = bx2; by = by2;
        GDS_getBlock(ddadr1x[0], ddadr1x[1], page, bx, by, bx+xsiz-1, by);
        GDS_getBlock(ddadr2x[0], ddadr2x[1], page, bx, by+ysiz-1, bx+xsiz-1, by+ysiz-1);
        GDS_getBlock(ddadr1y[0], ddadr1y[1], page, bx, by+1, bx, by+ysiz-2);
        GDS_getBlock(ddadr2y[0], ddadr2y[1], page, bx+xsiz-1, by+1, bx+xsiz-1, by+ysiz-2);
        line(bx, by, bx+xsiz-1, by+ysiz-1, PSET, col15, 1, 0xffff);
        MOS_horizon(0, 639);
        MOS_vertical(0, 399);
        mcu1();
        line(mex+1, mey+110, mex+119, mey+130, PSET, col7, 2, 0xffff);
        sprintf(wstr, "L%3d-P%3d/", lin+by/ypixel, pixel+bx/xpixel);
        msgset2(mex+16, mey+110, wstr, col0);
        sprintf(wstr, "L%3d-P%3d", lin+(by+ysiz-1)/ypixel, pixel+(bx+xsiz-1)/xpixel);
        msgset2(mex+16, mey+120, wstr, col0);
        continue;
     }
     if (xychk(mx, my, mex+70, mey+135, mex+70+32, mey+135+16) == 1) {
        com = 0;
        mousemsg( mex+70, mey+135, "終了", -1);
        while ((MOS_rdpos(&mx, &my) & 0x01) == 1);
        if (xychk(mx, my, mex+70, mey+135, mex+70+32, mey+135+16) == 1) {
           break;
        }
        mousemsg( mex+70, mey+135, "終了", col0);
        continue;
     }
     if (recogin2( mx, my, mex+30, mey+135, 0) == 1) { /* 実行 */
      if(typ == 0) {
        com = 1;
        /* clear color counter */
        for (i = 0; i < 16; i++) colcnt[i] = 0;
        /* color table set */
        for (i = 0; i < coln; i++) {
           for (j = th[i][0]; j <= th[i][1]; j++) colcvt[j] = i;
        }
        /* color count */
        for (j = by; j < by+ysiz; j++) {
           /* printf("%d\n", j); デバッグ用 */
           WPTR = WAREA + 512L * j + bx;
           /*                                                           ここにバグがある？。               
           for (i = bx; i < bx+xsiz; i++) colcnt[colcvt[(unsigned char huge)*(WPTR++)]]++;
           */
           for (i = bx; i < bx+xsiz; i++) colcnt[colcvt[*WPTR]]++;
           WPTR++;

        }
        /* メニューの消去 */
        page = 0;
        GDS_putBlock(ddadr[0],  ddadr[1],  page, mex,  mey, mex+127, mey+171, PSET);

        GDS_getBlock(ddadr[0],  ddadr[1],  page, mex,  mey, mex+94, mey+379);
        helpbox( mex, mey, mex+88, mey+355, "面積計算");
        
        sprintf(wstr, "<%3d", th[0][0]);
        symbol(mex+23, mey+20-5+18*(coln+1), wstr, 1,1, col10, 0 ,PSET);
        for (i = 0; i < coln; i++) {
           colbox(mex+5, mey+20+18*(coln-i), cl[i]);
           if (i < coln-1) col = col0;
           else            col = col10;
           cx = mex+23; cy = mey+20-5+18*(coln-i);
           sprintf(wstr, "<%3d", th[i+1][0]);
           symbol(cx, cy, wstr, 1,1, col, 0 ,PSET);
           sprintf(wstr, "%6ld", colcnt[i]);
           symbol(mex+31, mey+20+4+18*(coln-i), wstr, 1, 1, col13, 0, PSET);
        }
        recogmsg(mex+30,  mey+335, col0);

        while (1) { 
           while ((MOS_rdpos(&mx, &my) & 0x01) == 0); /* 確認 */
           if (xychk(mx, my, mex+30, mey+335, mex+70+32, mey+335+16) == 1) {
              recogmsg(mex+30,  mey+335, -1);
              while ((MOS_rdpos(&mx, &my) & 0x01) == 1);
              if (xychk(mx, my, mex+30, mey+335, mex+30+32, mey+335+16) == 1) {
                 GDS_putBlock(ddadr[0],  ddadr[1],  page, mex,  mey, mex+94, mey+379, PSET);
                 break;
              }
              recogmsg(mex+30,  mey+335, col0);
              continue;
           }
        }
      } else {
         /* ヒストグラム表示 */
         histgram2( warea, lin+by/ypixel, pixel+bx/xpixel, ysiz/ypixel, xsiz/xpixel);
         recogmsg( mex+30, mey+135, col0);
         continue;
      }
     }
     /* 裏画面表示 */
     backexp(mx, my,  630, 0, 639, 20);
     continue;
   }
   /*
   while ((MOS_rdpos(&mx, &my) & 0x01) == 0);
   while ((MOS_rdpos(&mx, &my) & 0x01) == 1);
   */

   /* ボックスの消去 */
   GDS_putBlock(ddadr1x[0], ddadr1x[1], page, bx, by, bx+xsiz-1, by, PSET);
   GDS_putBlock(ddadr2x[0], ddadr2x[1], page, bx, by+ysiz-1, bx+xsiz-1, by+ysiz-1, PSET);
   GDS_putBlock(ddadr1y[0], ddadr1y[1], page, bx, by+1, bx, by+ysiz-2, PSET);
   GDS_putBlock(ddadr2y[0], ddadr2y[1], page, bx+xsiz-1, by+1, bx+xsiz-1, by+ysiz-2, PSET);
   /* メニューの消去 */
   GDS_putBlock(ddadr[0],  ddadr[1],  page, mex,  mey, mex+127, mey+171, PSET);
}


/* return( command ) */
int pseude2menu( int com)
{
unsigned  ddadr[2];
unsigned  char page;
char buf[30175]; /* (397*152+7)/8*4 */
int x, y, x2, y2;
int mx=0, my=0, time=0;

   x = 60; y = 65;
   page = 0;
   BSETDATAADR(ddadr,  buf);
   GDS_getBlock(ddadr[0],  ddadr[1],  page, x,  y, x+396, y+151);

   helpbox( x, y, x+390, y+120, "シュードカラー･メニュー");
   msgset(x, y+30, "　○　ポイント位置\x095\x05c示", col0);
                                      /* 表 */
   msgset(x, y+50, "　○　拡大\x095\x05c示", col0);
                              /* 表 */
   msgset(x, y+70, "　○　三次元\x095\x05c示", col0);
                                    /* 表 */
   msgset(x+190, y+30, "　○　色別面積計算", col0);
   msgset(x+190, y+50, "　○　ヒストグラム\x095\x05c示", col0);
                                          /* 表 */
   msgset(x+190, y+70, "　○　終　了", col0);
   execmsg(x+350, y+95, col0);

   while (1) {
      if (time != 0) while ((MOS_rdpos(&mx, &my) & 0x01) == 0);
      else time = 1;
      if (xychk(mx, my, x+350, y+95, x+350+33, y+95+18) == 1) {
         execmsg(x+350, y+95, -1);
         while((MOS_rdpos(&mx, &my) & 0x01) == 1);
         if (xychk(mx, my, x+350, y+95, x+350+33, y+95+18) == 0) {
            execmsg(x+350, y+95, col0);
            continue;
         } else {
            break;
         }
      }
      if (com == 1)  { msgset(x+16, y+30, "●", col7); msgset(x+16, y+30, "○", col0); }
      if (com == 2)  { msgset(x+16, y+50, "●", col7); msgset(x+16, y+50, "○", col0); }
      if (com == 3)  { msgset(x+16, y+70, "●", col7); msgset(x+16, y+70, "○", col0); }
      if (com == 4)  { msgset(x+16+190, y+30, "●", col7); msgset(x+16+190, y+30, "○", col0); }
      if (com == 5)  { msgset(x+16+190, y+50, "●", col7); msgset(x+16+190, y+50, "○", col0); }
      if (com == -1) { msgset(x+16+190, y+70, "●", col7); msgset(x+16+190, y+70, "○", col0); }
      line(x+1, y+95, x+345, y+112, PSET, col7, 2, 0xffff);
      if(xychk16(mx, my, x+16, y+30) == 1)     com = 1;
      if(xychk16(mx, my, x+16, y+50) == 1)     com = 2;
      if(xychk16(mx, my, x+16, y+70) == 1)     com = 3;
      if(xychk16(mx, my, x+16+190, y+30) == 1) com = 4;
      if(xychk16(mx, my, x+16+190, y+50) == 1) com = 5;
      if(xychk16(mx, my, x+16+190, y+70) == 1) com = -1;
      if (com == 1) {
         msgset(x+16, y+30, "●", col0);
         msgset(x+16, y+95, "カー\x083\x05cル位置\x095\x05c示をします。[5個所まで]", col0);
                                /*  ソ            表 */
      }
      if (com == 2) {
         msgset(x+16, y+50, "●", col0);
         msgset(x+16, y+95, "画像の拡大\x095\x05c示をします。[2〜64倍まで]", col0);
      }                                /* 表 */
      if (com == 3) {
         msgset(x+16, y+70, "●", col0);
         msgset(x+16, y+95, "三次元画像\x095\x05c示をします。", col0);
      }                                /* 表 */
      if (com == 4) {
         msgset(x+16+190, y+30, "●", col0);
         msgset(x+16, y+95, "枠内の色別面積計算をします。", col0);
      }
      if (com == 5) {
         msgset(x+16+190, y+50, "●", col0);
         msgset(x+16, y+95, "枠内のヒストグラム\x095\x05c示をします。", col0);
      }                                        /* 表 */
      if (com == -1) {
         msgset(x+16+190, y+70, "●", col0);
         msgset(x+16, y+95, "ディザカラー\x095\x05c示を終了します", col0);
                                         /* 表 */
      }
      while ((MOS_rdpos(&mx, &my) & 0x01) == 1);
   }
   GDS_putBlock(ddadr[0],  ddadr[1],  page, x,  y, x+396, y+151, PSET);
   return(com);
}

void pseudeerr(int warea)
{
char  msg[80];

   helpbox( 80, 150, 560, 220, "エラー");
   if ( warea != 0 ) sprintf( msg, "作業領域 %d にエラーが発生しました。", warea);
   else sprintf( msg, "作業領域にエラーが発生しました。");
   msgset(96, 175, msg, col10);
   msgset(96, 195, "確認ボタンを押してください。", col10);
   recogin( 435, 195, 0);
   return;
}

void pseude2(int warea, int coln, int cl[], int th[][2])
{
int lin, pixel;
int  mx, my, mosx=400, mosy=100, com;
int  i, j, x, y, col, cx, cy, colcvt[256];
unsigned char page;
char swk[80], swk2[80];
char wname[64];
FILE *fp;
unsigned char headblk[2][512], wblk[512];
size_t  bsize, bn;
unsigned gn, goffset;
unsigned char sPage, dPage;
unsigned char huge *WPTR;

   sprintf(wname, "%s\\warea%1d.lnd", workdir, warea);

   page = 1;
   GDS_displayPage(page);
   gout();
   page = 0;
   GDS_writePage(page);
   gout();

   Cls;
   helpbox2( 512, 0, 639, 399, "シュードカラー");
   
   sprintf(swk, "<%3d", th[0][0]);
   symbol(538, 336, swk, 1,1, col10, 0 ,PSET);

   for (i = 0; i < coln;  i++) {
      if (i < coln-1) col = col0;
      else            col = col10;
      sprintf(swk, "<%3d", th[i+1][0]);
      if (i < 8) {
         colbox(520, 324-i*20, cl[i]);
         cx = 538; cy = 316-i*20;
      } else {
         colbox( 580, 324+160-i*20, cl[i]);
         cx = 598; cy = 316+160-i*20;
      }
      symbol(cx, cy, swk, 1,1, col, 0 ,PSET);
   }

   /* work area open */
   if ((fp = fopen(wname, "rb")) == NULL) {
      page = 0;
      GDS_displayPage(page);
      gout();
      pseudeerr(warea);
      return;
   }
   bsize = 512; bn = 1;
   if (fread( headblk[0], bsize, bn, fp) != bn) {
      page = 0; GDS_displayPage(page); gout();
      fclose(fp); pseudeerr(warea); return;
   }
   if (fread( headblk[1], bsize, bn, fp) != bn) {
      page = 0; GDS_displayPage(page); gout();
      fclose(fp); pseudeerr(warea); return;
   }
   
   sprintf(swk, "作業領域 %d", warea);
   msgset(516,  25, swk, col0);
   strmid(swk, headblk[0], 17, 15);
   msgset2(516, 45, swk, col0);
   msgset2(516, 55, "L  1-P  1/", col0);
   msgset2(516, 65, "L400-P511", col0);
   strmid(swk, headblk[0],  33, 15); /* band num */
   msgset2(516, 75, swk, col0);
   strmid(swk, headblk[1],  89,  7); /* date */ 
   msgset2(516, 85, swk, col0);
   strmid(swk, headblk[1],  97,  9); /* wrs seen sentor n */
   msgset2(516, 95, swk, col0);
   strmid(swk, headblk[1], 106,  7); /* -s */
   msgset2(516+16, 105, swk, col0);
   strmid(swk, headblk[1], 114,  9); /* wrs 表示 */
   msgset2(516, 115, swk, col0);
   /* strmid(swk, headblk[1], 176, 13); nasda landsat */
   /* msgset2(516, 115, swk, col0); */
   strmid(swk, headblk[1], 189, 15); /* seen id */
   msgset2(516, 125, swk, col0);
   strmid(swk, headblk[1], 209,  8); /* sensor name */
   msgset2(516, 135, swk, col0);
   msgset2(516, 145, "---------------", col0);
   
   GDS_displayPage(page);
   gout();

   for (i = 0; i < coln; i++) {
      for (j = th[i][0]; j <= th[i][1]; j++) colcvt[j] = cl[i];
   }
   
   /* 表示 */
   GDS_drawMode(&GDS_data, PSET);
   WPTR = WAREA;
   bsize = 512; bn = 1;
   for (y = 0; y < 400; y++) {
      if (fread( wblk, bsize, bn, fp) != bn) {
         fclose(fp); pseudeerr(warea); return;
      }
      for (i = 0; i < 512; i+=32) {
         for (x = i; x < i+32; x++) {
            GDS_pointColor(&GDS_data, colcvt[ (*WPTR) = wblk[x] ]);
            WPTR++;
            GDS_pointFirst(&GDS_data, x, y);
        /* pset(x, y, colcvt[ wblk[x] ], PSET); */
         }
         GDS_outputGraph(&GDS_data, &gn, &goffset);
         GDS_resetData(&GDS_data);
      }
   }
      
   fclose(fp);
      
      /* initial set */
      xpixel = 1; ypixel = 1; /* global */
      lin = 1; pixel = 1;
      /*  裏画面表示  */
      sPage = 0; dPage = 1;
      GDS_copyBlock(sPage, 512, 0, 639, 399, dPage, 512, 0, PSET);

      com = 1;
      dith2exec(526, 355, col0);
      calcu(600, 355, 0);
      while (1) {
         while ((MOS_rdpos(&mx, &my) & 0x01) == 0);
         if (calchk(mx, my, 600, 355, &mosx, &mosy) == 1) continue;
         if (xychk(mx, my, 526, 355, 526+32, 355+16) == 1) {
           dith2exec(526, 355, -1);
           while ((MOS_rdpos(&mx, &my) & 0x01) == 1);
           if (xychk(mx, my, 526, 355, 526+32, 355+16) == 1) {
              if ((com = pseude2menu( com)) == -1) break;
              if (com == 1) {
                 pointset( lin, pixel);
              }
              if (com == 2) {
                 sizechg( lin, pixel);
              }

              if (com == 3) {
                 gr3d( lin, pixel);
              }
              if (com == 4 || com == 5) {
                 areacalc( com-4, warea, lin, pixel, coln, cl, th);
                 /* 裏画面修復(復帰) */
                   page = 1;
                   GDS_writePage(page);
                   gout();
                   Cls;
                   /* 裏画面転送 */
                   sPage = 0; dPage = 1;
                   GDS_copyBlock(sPage, 512, 0, 639, 399, dPage, 512, 0, PSET);
                   /* メニュー消去 */
                   line( 520, 350, 638, 379, PSET, col7, 2, 0xffff);
                   page = 0;
                   GDS_writePage(page);
                   gout();
              }
           }
           dith2exec(526, 355, col0);
           continue;
         }
      }

   /* tst prog
      fclose(fp1); fclose(fp2); fclose(fp3);
      while ((MOS_rdpos(&mx, &my) & 0x01) == 0);
      while ((MOS_rdpos(&mx, &my) & 0x01) == 1);
   */
   page = 1;
   GDS_writePage(page);
   gout();
   Cls;
   page = 0;
   GDS_writePage(page);
   gout();
   return;
}

void pseude()
{
int bcl[16];
int exec, com, com2, com3;
int mx, my, mosx=400, mosy=100;
unsigned char page;
int i, j, cx, cy;
int coln, cl[16], th[17][2];
double  wa = 0;

coln = 16;
for (i = 0; i <= 16; i++) {
   cl[i] = i;
   th[i][0] = 16*i; th[i][1] = 16*i+15;
} 
com  = com2 = 8;
com3 = 0;

start:
   page = 1;
   GDS_displayPage(page);
   gout();
   page = 0;
   GDS_writePage(page);
   gout();
      Cls;
      mttl();
      bcl[0] = col1;
      paint(1,30, 1, col7,  1, bcl);
      menubox( 80, 40, 560, 280, "シュードカラー画像\x095\x05c示条件設定");
                                                     /* 表 */
      helpbox( 80,290, 560, 360, "メッセージ");
     /* line(90, 103, 250, 278, PSET, col1,  1, 0xffff); */
      helpbox( 90, 63, 250, 268, "色､レベル設定");
      levelset(coln, th, 1);
      msgset(320, 70, "　○　色数変更", col0);
      msgset(320, 90, "　○　作業領域１", col0);
      msgset(320,110, "　○　作業領域２", col0);
      msgset(320,130, "　○　作業領域３", col0);
      msgset(320,170, "　○　終　了", col0);
      execmsg(480, 210, col0);
      calcu(600, 30, 0);
      wabot(600, 60, 0);

      GDS_displayPage(page);
      gout();
      locate(0,0,COFF);
      MOS_disp(0);
      exec = 0;

      while(1) {
start2:
         if (com  == 8) msgset(336, 90, "●", col0);
         if (com  == 9) msgset(336,110, "●", col0);
         if (com  ==10) msgset(336,130, "●", col0);
         if (com  ==12) msgset(336,170, "●", col0);
         pseudemsg(com, 1);

         if (exec == 1) {
            if (8 <= com && com <= 10) {
               pseude2(com-7, coln, cl, th);
               goto start;
            }
            if (com == 12) { return; }
         }
         while ((MOS_rdpos(&mx, &my) & 0x01) == 0);
         if (calchk(mx, my, 600, 30, &mosx, &mosy) == 1) continue;
         if (wabotchk(mx, my, 600, 60) == 1) continue;
         
         for (i = 0; i < coln;  i++) {
            if (i<8) {
               cx = 100; cy = 245-i*20;
               if (xychk16(mx, my,cx, cy) == 1) {
                  com3 = 2; break;
               }
               cx = 118; cy = 237-i*20;
               if (xychk(mx, my, cx-1, cy-1, cx+45, cy+9) == 1)  {
                  com3 = 3; break;
               }
            } else {
               cx = 180; cy = 245+160-i*20;
               if (xychk16(mx, my, cx, cy) == 1) {
                  com3 = 2; break;
               }
               cx = 198; cy = 237+160-i*20;
               if ((xychk(mx, my, cx-1, cy-1, cx+45, cy+9) == 1) && (i < coln-1)) {
                  com3 = 3; break;
               }
            }
         }
         if (com3 == 2) {
            line(cx-1, cy-1, cx+16, cy+16, PSET, col14,  1, 0xffff);
            colchg(cx, cy, &cl[i]);
            line(cx-1, cy-1, cx+16, cy+16, PSET, col7,  1, 0xffff);
            com3 = 0;
            continue;
         }
         if (com3 == 3) {
            line(cx-1, cy-1, cx+45, cy+9, PSET, col14,  1, 0xffff);
            levelchg(cx, cy, coln, th, i);
            line(cx-1, cy-1, cx+45, cy+9, PSET, col7,  1, 0xffff);
            com3 = 0;
            continue;
         }
         if (xychk16(mx, my, 336, 70) == 1) {
            msgset( 336, 70, "●", col0);
            helpcls( 80,290, 560, 360);
            pseudemsg(1, 1);
            coln = colnset(coln, th);
            pseudemsg(1, 0);
            msgset( 336, 70, "●", col7); msgset( 336, 70, "○", col0);
            continue;
         }
         if (xychk16(mx, my,336, 90) == 1) com = 8;
         if (xychk16(mx, my,336,110) == 1) com = 9;
         if (xychk16(mx, my,336,130) == 1) com =10;
         if (xychk16(mx, my,336,170) == 1) com =12;
         if (xychk(mx, my,480,210, 480+33, 210+18) == 1) {
            execmsg(480, 210, -1);
            while ((MOS_rdpos(&mx, &my) & 0x01) == 1);
            if (xychk(mx, my, 480, 210, 480+33, 210+18) == 1) {
               exec = 1;
               continue;
            } else {
               exec = 0;
               execmsg(480, 210, col0);
               continue;
            }
         }
         if (com != com2) {
            if (com2 == 8) { msgset(336, 90, "●", col7); msgset(336, 90, "○", col0); }
            if (com2 == 9) { msgset(336,110, "●", col7); msgset(336,110, "○", col0); }
            if (com2 ==10) { msgset(336,130, "●", col7); msgset(336,130, "○", col0); }
            if (com2 ==12) { msgset(336,170, "●", col7); msgset(336,170, "○", col0); }
            psmsgcls();
            com2 = com;
         }
      }
}

