Exemplo n.º 1
0
void negexpr(void)
{
  if(tokeq("!"))
  {
    scan();
    compexpr(0);
    g_pop_ax();
    g_or_ax_ax();
    g_jz(+3);
    g_xor_ax_ax();
    g_dec_ax();
    g_label();
    g_inc_ax();
    g_push_ax();
  } else
  if(tokeq("?"))
  {
    scan();
    compexpr(0);
    g_pop_ax();
    g_xor_bx_bx();
    g_or_ax_ax();
    g_jz(+1);
    g_inc_bx();
    g_label();
    g_push_bx();
  } else
  {
    compexpr(0);
  }
}
Exemplo n.º 2
0
void g_label(int v, int join, int edge, queue<int>& outer) {
    if(v == join) return;
    if(label[v] == -1) outer.push(v);

    label[v] = edge;
    type[v] = 1;
    first[v] = join;

    g_label(first[label[mate[v]]], join, edge, outer);
}
Exemplo n.º 3
0
static void show_color(MBLOCK *mblk, int col_id)
{
    int  save_win_id;
    char *label;
    int  colornamecount;
    char **arraydata;
    int win_id   = mblk->info->colorwin_id; 
    int block_id = mblk->info->colorblock_id;
    int array_id = mblk->info->colorarray_id;
    
    g_push_gc();
    save_win_id=g_get_windownr();
    g_select_window(win_id);
    g_delete_object(mblk->spar[S_COLORMAP].obj_id+1);
    g_open_object(mblk->spar[S_COLORMAP].obj_id+1);
    g_select_viewport(mblk->spar[S_COLORMAP].vp_id);
    g_set_foreground(col_id);

    g_fillrectangle(0,MAXROW,MAXCOLUMN,MAXROW+1);
    g_moveto(0.2,MAXROW+0.2);
    if (col_id == G_WHITE )
        g_set_foreground(G_BLACK);
    else
        g_set_foreground(G_WHITE);

    g_set_font(G_FONT_HELVETICA_BOLD,G_RELATIVE_FONTSCALING);
    g_set_charsize(1.0);
    arraydata = psnd_get_colornames(&colornamecount);
    label = psnd_sprintf_temp("Block%d:%s:Color=%d", 
                    block_id+1, arraydata[array_id], col_id);
    g_label(label);
    g_close_object(mblk->spar[S_COLORMAP].obj_id+1);
    g_call_object(mblk->spar[S_COLORMAP].obj_id+1);
    g_flush();
    g_pop_gc();
    g_select_window(save_win_id);
}
Exemplo n.º 4
0
/*
* Integrate peaks
*/
void psnd_integrate1d(MBLOCK *mblk, float x1, float x2)
{
    int i;
    int i1 = round(x1);
    int i2 = round(x2);
    int lim1 = min(i1, i2);
    int lim2 = max(i1, i2);    
    int xmin, xmax;
    float sum0, sum1, sum, ymin, ymax, yrange,xx;
    char *label;
    POPUP_INFO *popinf = mblk->popinf + POP_INT1D;
    
    lim1 = max(1, lim1);
    lim2 = max(1, lim2);
    lim1 = min(DAT->isize, lim1);
    lim2 = min(DAT->isize, lim2);

    mblk->int1dinf->left  = min(lim1,lim2);
    mblk->int1dinf->right = max(lim1,lim2);
    update_labels(mblk);

    lim1 = mblk->int1dinf->left;
    lim2 = mblk->int1dinf->right;
    /*
     * ... determine integral over visible area (and min and max)
     */
    for (i=0,sum0=0;i<DAT->isize;i++)
        sum0 += DAT->xreal[i];
    if (sum0 == 0)
        sum0 = 1;
    /*        
     *
     * ... determine integral over selected area (and min and max)
     * ... and draw the intensity lines
     *
     */
    g_append_object(mblk->spar[S_REAL].obj_id);
    g_set_foreground(mblk->spar[S_REAL].color);
    
    for (i=lim1,sum=0,xmin=lim1,xmax=lim1;i<=lim2;i++) {
        sum += DAT->xreal[i-1];
        g_moveto((float) i, DAT->xreal[i-1]);
        g_lineto((float) i, 0.0);
    }
    /*
     *
     * ...  calc integral
     *
     */
    g_set_foreground(mblk->spar[S_REAL].color3);
    minmax(DAT->xreal,DAT->isize,&(DAT->ylimit[0]),&(DAT->ylimit[1]));
    sum1=0;
    yrange = (DAT->ylimit[1] - DAT->ylimit[0])/ sum0;
    for (i=lim1;i<lim2;i++) {
        sum1 += yrange * DAT->xreal[i-1];
        DAT->work1[i-1] = sum1;
    }
    /*
     * Try to move integral on top of peak
     */
    xx=DAT->ylimit[0];
    for (i=lim1;i<lim2;i++) {
        if (xx < (DAT->xreal[i-1]-DAT->work1[i-1]))
            xx = DAT->xreal[i-1]-DAT->work1[i-1];
    }
    /*
     * But not outside window
     */
    if (DAT->work1[lim2-2]+xx>DAT->ylimit[1])
        xx -= -DAT->ylimit[1] + (DAT->work1[lim2-2] + xx);
    xx += (DAT->ylimit[1] - DAT->ylimit[0])/100;
    for (i=lim1;i<lim2;i++) {
        DAT->work1[i-1] += xx;
    }
    /*
     * Draw integral
     */
    g_moveto((float) lim1, DAT->work1[lim1-1]);
    for (i=lim1;i<lim2;i++) {
        g_lineto((float)i, DAT->work1[i-1]);
    }
    /*
     * Print label
     */
    g_moveto((float) lim1, DAT->work1[lim1-1]+(DAT->work1[lim2-2]-DAT->work1[lim1-1])/2);
    label = psnd_sprintf_temp("%.2e", sum);
/*    g_set_motif_realtextrotation(1);
    g_set_textdirection(90);*/
    g_label(label);
/*    g_set_textdirection(0);*/
    g_set_foreground(mblk->spar[S_REAL].color);
    g_close_object(mblk->spar[S_REAL].obj_id);
    g_plotall();
/*    g_set_motif_realtext rotation(0);*/
    mblk->int1dinf->sum = sum;
    if (popinf->visible)
        add_integral(mblk);
    psnd_printf(mblk," Range: %6d%6d Area: %g\n", lim1, lim2, sum);
}
Exemplo n.º 5
0
void fullmoonfever(void)
{
  int ok = 1;
  while(ok)
  {
    if(tokeq("ILLGOL") || tokeq("Illgola2") || tokeq("Illberon") || tokeq("Illgol##"))
    {
      scan();
      block();
    }
    else if(tokeq("GO"))
    {
      scan();
      boolexpr();
      boolexpr();
      g_pop_ax();
      g_pop_dx();
      g_mov_dh_al();
      g_mov_ah(2);
      g_xor_bx_bx();
      g_int(0x10);
    }
    else if(tokeq("PRINT"))
    {
      scan();
      boolexpr();
      g_mov_ah(0x0e);
      g_pop_si();
      g_label(); g_mov_al_SI();
      g_or_al_al();
      g_jz(12);
      g_mov_bx_I(caddr(pencolor));
      g_xor_bh_bh();
      g_int(16);
      g_inc_si();
      g_jmp(-18);
      g_label();
    }
    else if(tokeq("CENTRE"))
    {
      int l = 0;
      scan();
      l = (80-(strlen(token)-1)) >> 1;
      boolexpr();
      boolexpr();
      g_pop_ax();
      g_mov_dx(l);
      g_mov_dh_al();
      g_mov_ah(2);
      g_xor_bx_bx();
      g_int(0x10);
      g_mov_ah(0x0e);
      g_pop_si();
      g_label(); g_mov_al_SI();
      g_or_al_al();
      g_jz(12);
      g_mov_bx_I(caddr(pencolor));
      g_xor_bh_bh();
      g_int(16);
      g_inc_si();
      g_jmp(-18);
      g_label();
    }
    else if(tokeq("PAUSE"))
Exemplo n.º 6
0
void compexpr(int findvar)
{
  char x, y;
  if (findvar)
  {
    if(tokeq("*"))
    {
      scan();
      shouldsym = name(1);
    } else
    {
      shouldsym = name(0);
    }
    g_pop_bx();
    g_push_BX();
  } else
  {
    addexpr();
  }
  while(tokeq("=") || tokeq("<>") || tokeq(">") ||
	tokeq(">=") || tokeq("<") || tokeq("<="))
  {
    x = token[0]; y = token[1];
    scan();
    addexpr();
    if(x == '=')
    {
      g_pop_ax();
      g_pop_dx();
      g_sub_ax_dx();
      g_jz(+3);
      g_xor_ax_ax();
      g_dec_ax();
      g_label(); g_inc_ax();
      g_push_ax();
    }
    if(x == '<' && y == '>')
    {
      g_pop_ax();
      g_pop_dx();
      g_xor_cx_cx();
      g_sub_ax_dx();
      g_jz(+1);
      g_inc_cx();
      g_label(); g_push_cx();
    }
    if(x == '<' && y == 0)
    {
      g_pop_dx();
      g_pop_ax();
      g_xor_cx_cx();
      g_cmp_ax_dx();
      g_jge(+1);
      g_inc_cx();
      g_label(); g_push_cx();
    }
    if(x == '>' && y == 0)
    {
      g_pop_dx();
      g_pop_ax();
      g_xor_cx_cx();
      g_cmp_ax_dx();
      g_jle(+1);
      g_inc_cx();
      g_label(); g_push_cx();
    }
    if(x == '<' && y == '=')
    {
      g_pop_dx();
      g_pop_ax();
      g_xor_cx_cx();
      g_cmp_ax_dx();
      g_jg(+1);
      g_inc_cx();
      g_label(); g_push_cx();
    }
    if(x == '>' && y == '=')
    {
      g_pop_dx();
      g_pop_ax();
      g_xor_cx_cx();
      g_cmp_ax_dx();
      g_jl(+1);
      g_inc_cx();
      g_label(); g_push_cx();
    }
  }
}
Exemplo n.º 7
0
void primitive(void)
{
  int ptr = 0;
  if(tokeq("call"))
  {
    byte * b = m; int l; int c; int v; int a = 0; int i;
    scan();
    boolexpr();
    if(tokeq("("))
    {
      scan();
      a++;
      boolexpr();
      g_pop_ax();
      g_pop_bx();
      g_push_ax();
      g_push_bx();
      while (tokeq(","))
      {
	scan();
	a++;
	boolexpr();
	g_pop_ax();
	g_pop_bx();
	g_push_ax();
	g_push_bx();
      }
      if(tokeq(")"))
      {
	scan();
      } else
      {
	error("Missing )");
      }
    }
    g_pop_bx();
    g_push_bp();
    g_mov_ax_sp();
    g_add_ax(a << 1);
    g_mov_bp_ax();
    g_call_bx();
    g_pop_dx();
    g_pop_bp();
    for(i=0;i<a;i++)
    {
      g_pop_ax();
    }
    g_push_dx();
    return;
  }

  if(tokeq("poll"))
  {
    scan();
    if(tokeq("tty"))
    {
      scan();
      g_mov_ah(11);
      g_int(0x21);
      g_xor_ah_ah();
      g_push_ax();
      return;
    }
    error("You can only poll the tty");
    return;
  }

  if(tokeq("Ypush"))
  {
    scan();
    if(tokeq("("))
    {
      scan();
      boolexpr();
      if(tokeq(")"))
      {
        g_xor_ax_ax();
        g_push_ax();
        scan();
        return;
      }
      if(tokeq(","))
      {
        scan();
        boolexpr();
        if(tokeq(")"))
        {
          scan();
          return;
        }
      }
    }
    error("Usage is Ypush(boolexpr[,boolexpr]) in function");
    return;
  }

  if(tokeq("Ypop"))
  {
    scan();
    if(tokeq("("))
    {
      scan();
      if(tokeq(")"))
      {
        scan();
        return;
      }
    }
    error("Usage would be Ypop() in function");
    return;
  }

  if(tokeq("eof"))
  {
    scan();
    g_mov_bx(caddr(eofflag));
    g_push_BX();
    g_xor_ax_ax();
    g_mov_BX_ax();
    return;
  }

  if(tokeq("gpos"))
  {
    scan();
    if(tokeq("("))
    {
      scan();
      boolexpr();
      if (tokeq(","))
      {
        scan();
        boolexpr();
	g_xor_cx_cx();
        g_pop_dx();
	g_mov_ax(0x4201);
        g_pop_bx();
        g_int(0x21);
        g_push_ax();
        if (tokeq(")"))
        {
          scan();
          return;
        }
      }
    }
    error("Malformed way to use 'gpos'");
  }

  if(tokeq("sin"))
  {
    runtime_trig();
    scan();
    boolexpr();
    g_pop_ax();
    g_mov_bx(caddr(sin_routine));
    g_call_bx();
    g_push_cx();
    return;
  }

  if(tokeq("cos"))
  {
    runtime_trig();
    scan();
    boolexpr();
    g_pop_ax();
    g_mov_bx(caddr(cos_routine));
    g_call_bx();
    g_push_cx();
    return;
  }

  if(tokeq("abs"))
  {
    scan();
    boolexpr();
    g_pop_ax();
    g_and_ax(0x7fff);
    g_push_ax();
    return;
  }

  if(tokeq("asc"))
  {
    scan();
    boolexpr();
    g_pop_ax();
    g_and_ax(0x007f);
    g_push_ax();
    return;
  }

  if(tokeq("low"))
  {
    scan();
    boolexpr();
    g_pop_ax();
    g_and_ax(0x00ff);
    g_push_ax();
    return;
  }

  if(tokeq("med"))
  {
    scan();
    boolexpr();
    g_pop_ax();
    g_mov_cl(4);
    g_shr_ax_cl();
    g_and_ax(0x00ff);
    g_push_ax();
    return;
  }

  if(tokeq("fix"))
  {
    scan();
    boolexpr();
    g_pop_ax();
    g_mov_ah_al();
    g_xor_al_al();
    g_push_ax();
    return;
  }

  if(tokeq("int") || tokeq("hig"))
  {
    scan();
    boolexpr();
    g_pop_ax();
    g_mov_al_ah();
    g_xor_ah_ah();
    g_push_ax();
    return;
  }

  if(tokeq("fre"))
  {
    scan();
    boolexpr();
    g_pop_ax();
    g_mov_ax_I(caddr(d)-2);
    g_neg_ax();
    g_push_ax();
    return;
  }

  if(tokeq("rnd"))
  {
    symbol * q = NULL;
    scan();
    if(tokeq("("))
    {
      scan();
      q = name(0);
      if(tokeq(")"))
      {
	scan();
      } else error("Missing )");
    } else
    {
      error("Need identifier in rnd()");
    }
    g_pop_bx();
    g_mov_ax_BX();
    g_mov_dx(58653U);
    g_imul_dx();
    g_mov_dx(13849U);
    g_add_ax_dx();
    g_mov_BX_ax();
    g_push_ax();
    if (q != NULL && q->hook_addr != NULL)
    {
      g_mov_ax(caddr(q->hook_addr));
      g_call_ax();
    }
    return;
  }

  if(tokeq("stu"))
  {
    scan();
    boolexpr();
    g_pop_ax();
    g_mov_bx(caddr(sbuffer + 14));
    g_label(); g_xor_dx_dx();
    g_mov_cx(10);
    g_idiv_cx();
    g_add_dx('0');
    g_mov_BX_dl();
    g_dec_bx();
    g_or_ax_ax();
    g_jnz(-18);
    g_inc_bx();
    g_push_bx();
    return;
  }

  if(tokeq("str"))
  {
    scan();
    boolexpr();
    g_pop_ax();
    g_push_ax();
    g_cmp_ax(0);
    g_jg(+2);
    g_neg_ax();
    g_label(); g_mov_bx(caddr(sbuffer + 14));
    g_label(); g_xor_dx_dx();
    g_mov_cx(10);
    g_idiv_cx();
    g_add_dx('0');
    g_mov_BX_dl();
    g_dec_bx();
    g_or_ax_ax();
    g_jnz(-18);
    g_pop_ax();
    g_cmp_ax(0);
    g_jge(+5);
    g_mov_al('-');
    g_mov_BX_al();
    g_dec_bx();
    g_label(); g_inc_bx();
    g_push_bx();
    return;
  }

  if(tokeq("sif"))
  {
    scan();
    boolexpr();

    g_pop_ax();
    g_push_ax();
    g_xor_ah_ah();
    g_mov_dx(39);
    g_imul_dx();
    /* g_mov_al_ah();
    g_mov_ah_dl(); */

    g_mov_bx(caddr(sbuffer + 14));
    g_mov_cx(10);
    g_label(); g_xor_dx_dx();
    g_idiv_cx();
    g_add_dx('0');
    g_mov_BX_dl();
    g_dec_bx();
    g_cmp_bx(caddr(sbuffer + 10));
    g_jnz(-17);

    g_mov_dx('.');
    g_mov_BX_dl();
    g_dec_bx();

    g_pop_ax();
    g_mov_al_ah();
    g_xor_ah_ah();

    g_label(); g_xor_dx_dx();
    g_idiv_cx();
    g_add_dx('0');
    g_mov_BX_dl();
    g_dec_bx();
    g_or_ax_ax();
    g_jnz(-15);
    g_inc_bx();

    g_push_bx();

    return;
  }

  if(tokeq("nameof"))
  {
    char * q;
    byte * b;
    scan();
    if(tokeq("("))
    {
      scan();
      q = (token+1);
      b = stalloc(strlen(q)+1);
      name(0);
      if(tokeq(")"))
      {
        scan();
        strcpy((char *)b, q);
        g_mov_ax(caddr(b));
        g_push_ax();
      } else error("Missing (");
    } else error("Missing )");
    return;
  }

  if(tokeq("^"))
  {
    scan(); ptr = 1;
  }
  if(tokeq("#"))
  {
    scan();
    if (tokeq("("))
    {
      scan();
      boolexpr();
      if (tokeq(")"))
      {
	scan();
	g_pop_ax();
	g_shl_ax_1();
	g_neg_ax();
	g_xchg_si_ax();
	g_mov_ax_BP_SI();
	g_push_ax();
	return;
      }
      error("Missing )");
      return;
    }
    g_mov_ax_BP(-2 * member());
    g_push_ax();
    return;
  }
  if(sym_exists(token))
  {
    symbol * q = NULL;
    q = name(0);
    if (!ptr)
    {
      g_pop_bx();
      g_push_BX();
      if (tokeq("++"))
      {
	scan();
	g_mov_ax_BX();
	g_inc_ax();
	g_mov_BX_ax();
	if (q != NULL && q->hook_addr != NULL)
	{
	  g_mov_ax(caddr(q->hook_addr));
	  g_call_ax();
	}
      }
      if (tokeq("--"))
      {
	scan();
	g_mov_ax_BX();
	g_dec_ax();
	g_mov_BX_ax();
	if (q != NULL && q->hook_addr != NULL)
	{
	  g_mov_ax(caddr(q->hook_addr));
	  g_call_ax();
	}
      }
    }
    return;
  }
  if (ptr)
  {
    error("Identifier should follow ^");
  }
  if(token[0] >= '0' && token[0] <= '9')
  {
    int v = atoi(token);
    g_mov_ax(v);
    g_push_ax();
    scan();
    if (tokeq("."))
    {
      scan();
      while(strlen(token) < 4)
      {
	strcat(token, "0");
      }
      v = atoi(token) / 39;
      scan();
      if (v > 255) v = 255;
      g_pop_ax();
      g_mov_ah_al();
      g_mov_al(v & 0xff);
      g_push_ax();
    }
    return;
  }
  if(token[0] == '"')
  {
    char * q = (token+1);
    byte * b = stalloc(strlen(q)+1);
    strcpy((char *)b, q);
    g_mov_ax(caddr(b));
    g_push_ax();
    scan();
    while(token[0] == '"')
    {
      char * q = (token+1);
      byte * b;
      stretract();
      b = stalloc(strlen(q)+1);
      strcpy((char *)b, q);
      scan();
    }
    return;
  }
  if(tokeq("{"))
  {
    byte * l; byte * q; int c=0; int v=0; int lc;
    scan();
    l = m;
    g_label();
    g_nop();
    assignments();
    if (tokeq("}"))
    {
      scan();
      g_ret();
      q = stalloc(m - l);
      memcpy(q, l, m - l);
      m = l;
      g_mov_ax(caddr(q));
      g_push_ax();
      return;
    }
    error("Missing }");
    return;
  }
  if(tokeq("INLINE"))
  {
    byte * l; byte * q; int c=0; int v=0; int lc;
    scan();
    if(tokeq("{")) scan();
    l = m;
    g_label();
    g_nop();
    while(tokne("}"))
    {
      GEN(atoi(token));
      scan();
    }
    scan();
    g_ret();
    q = stalloc(m - l);
    memcpy(q, l, m - l);
    m = l;
    g_mov_ax(caddr(q));
    g_push_ax();
    return;
  }
  if(tokeq("("))
  {
    scan();
    boolexpr();
    if (tokeq(")"))
    {
      scan();
      return;
    }
    error("Missing )");
    return;
  }
  if(tokeq("*"))
  {
    scan();
    boolexpr();
    g_mov_bx(260);
    g_mov_ax_BX();
    g_pop_dx();
    g_push_ax();
    g_add_ax_dx();
    g_mov_BX_ax();
    return;
  }
  error("Unrecognized primitive");
}
Exemplo n.º 8
0
int g_cmp_bx(word i)    { GEN(0x81); GEN(0xFB); GENW(i); g_label(); DID(4); }
Exemplo n.º 9
0
int g_mov_es_I(word i)   { GEN(142); GEN(6); GENW(i); g_label(); DID(4); }
Exemplo n.º 10
0
int g_mov_I_ax(word i)   { GEN(163); GENW(i); g_label(); DID(3); }
Exemplo n.º 11
0
int g_mov_ax_I(word i)   { GEN(161); GENW(i); g_label(); DID(3); }
Exemplo n.º 12
0
int g_mov_I_bx(sword w) { GEN(0x89); GEN(0x1E); GENW(w); g_label(); DID(4); }
Exemplo n.º 13
0
int g_mov_bx_I(sword w) { GEN(0x8B); GEN(0x1E); GENW(w); g_label(); DID(4); }
Exemplo n.º 14
0
int g_and_ax(sword w)   { GEN(0x25); GENW(w); g_label(); DID(3); }
Exemplo n.º 15
0
int g_add_bx(sword w)   { GEN(0x81); GEN(0xC3); GENW(w); g_label(); DID(4); }
Exemplo n.º 16
0
int g_cmp_ax(word i)    { GEN(0x3D); GENW(i); g_label(); DID(3); }
Exemplo n.º 17
0
int gabow(int n) {
    memset(mate, -1, sizeof mate);
    memset(first, -1, sizeof first);

    int ret = 0;
    for(int z = 0; z < n; ++z) {
        if(mate[z] != -1) continue;

        memset(label, -1, sizeof label);
        memset(type, -1, sizeof type);
        memset(g_souter, 0, sizeof g_souter);

        label[z] = -1; type[z] = 0;

        queue<int> outer;
        outer.push(z);

        bool done = false;
        while(!outer.empty()) {
            int x = outer.front(); outer.pop();

            if(g_souter[x]) continue;
            g_souter[x] = true;

            for(int i = last_edge[x]; i != -1; i = prev_edge[i]) {
                if(mate[w[i]] == -1 && w[i] != z) {
                    mate[w[i]] = x;
                    g_augment(x, w[i]);
                    ++ret;

                    done = true;
                    break;
                }

                if(type[w[i]] == -1) {
                    int v = mate[w[i]];
                    if(type[v] == -1) {
                        type[v] = 0;
                        label[v] = x;
                        outer.push(v);

                        first[v] = w[i];
                    }
                    continue;
                }

                int r = first[x], s = first[w[i]];
                if(r == s) continue;

                memset(g_flag, 0, sizeof g_flag);
                g_flag[r] = g_flag[s] = true;

                while(r != -1 || s != -1) {
                    if(s != -1) swap(r, s);
                    r = first[label[mate[r]]];
                    if(r == -1) continue;
                    if(g_flag[r]) break; g_flag[r] = true;
                }

                g_label(first[x], r, i, outer);
                g_label(first[w[i]], r, i, outer);

                for(int c = 0; c < n; ++c)
                    if(type[c] != -1 && first[c] != -1 && type[first[c]] != -1)
                        first[c] = r;
            }
            if(done) break;
        }
    }
    return ret;
}
Exemplo n.º 18
0
/*
 * Display the color map in a window
 */
void psnd_show_colormap(MBLOCK *mblk, int numcol)
{
    float x0,y0,dx,dy,box_height,box_width;
    int nx,ny,win_id, save_win_id,bar_id;
    char string[5];
    int i,ix,iy,color=0;
    int colornamecount;
    char **arraydata;

    if (mblk->info->colorwin_id) {
        g_raise_window(mblk->info->colorwin_id);
        return;
    }

    arraydata = psnd_get_colornames(&colornamecount);
    box_width  = 60.0;
    box_height = 30.0;
    nx = sqrt(numcol);
    if (nx>MAXCOLUMN) nx=MAXCOLUMN;
    ny = numcol/nx;
    if (nx*ny < numcol) ny++;
    
    x0 = 0.0;
    y0 = 0.0;
    dx = box_width*(nx);
    dy = box_height*(ny);
    g_push_gc();
    save_win_id=g_get_windownr();

    mblk->info->colorwin_id = 
        g_open_window(G_SCREEN, x0, y0, dx, dy, "Colormap",
                          G_WIN_BUFFER|
                          G_WIN_BUTTONBAR2);

/*    g_popup_follow_cursor(TRUE);    */
    g_delete_object(mblk->spar[S_COLORMAP].obj_id);
    g_open_object(mblk->spar[S_COLORMAP].obj_id);
    g_set_viewport(mblk->spar[S_COLORMAP].vp_id, 0, 0, 1, 1);
    g_set_world(mblk->spar[S_COLORMAP].vp_id, 0, 0, nx+0.01, 1+ny+0.01);
    g_select_viewport(mblk->spar[S_COLORMAP].vp_id);
    g_set_clipping(FALSE);
    g_set_font(G_FONT_HELVETICA_BOLD,G_RELATIVE_FONTSCALING);
    g_set_charsize(1.0);
    for (iy=0;iy<ny;iy++) {
        for(ix=0;ix<nx;ix++) {
            g_set_foreground(color);
            g_fillrectangle(ix,ny-iy-1,ix+1,ny-iy);
            g_moveto((float)ix+0.25,(float)(ny-iy-1)+0.25);
            if ((color%(numcol)) == G_WHITE )
                g_set_foreground(G_BLACK);
            else
                g_set_foreground(G_WHITE);
            sprintf(string,"%d",color);
            g_label(string);
            color++;
        }
    }
    g_close_object(mblk->spar[S_COLORMAP].obj_id);
    g_call_object(mblk->spar[S_COLORMAP].obj_id);

    bar_id = g_menu_create_buttonbox2(mblk->info->colorwin_id, 1);
    mblk->info->colorbar_id = bar_id;
    g_menu_append_button(bar_id, "Quit", COL_QUIT);
    g_menu_append_button(bar_id, "Reset", COL_DEF);
    g_menu_append_button(bar_id, "Save", COL_WRITE);
    g_menu_append_button(bar_id, "Retrieve", COL_READ);
#ifdef _WIN32
    g_menu_append_button(bar_id, "Item", COL_ITEM);
#else
    {
    char *data[MAX_BLOCK] = { "1", "2", "3", "4", 
                              "5", "6", "7", "8",
                              "9", "10", "11", "12" };
    assert(mblk->info->colorblock_id <= 12);
    g_menu_append_optionmenu(bar_id, "Block", 
           COL_BLOCK, MAXBLK, 
           mblk->info->colorblock_id, data);
    }
    g_menu_append_optionmenu(bar_id, "Item", 
                             COL_ARRAY, colornamecount, 
                             mblk->info->colorarray_id, 
                             arraydata);
#endif
    g_menu_create_buttonbox2(mblk->info->colorwin_id, -1);
    g_flush();
    g_pop_gc();
    g_select_window(save_win_id);

    color = psnd_get_colorvalue(mblk,mblk->info->colorarray_id, 
                                 mblk->info->colorblock_id);
            
    show_color(mblk, color);

}