コード例 #1
0
ファイル: cdgl.c プロジェクト: pulkomandy/cd-haiku
static void cdfbox(cdCtxCanvas *ctxcanvas, double xmin, double xmax, double ymin, double ymax)
{
  if(ctxcanvas->canvas->back_opacity == CD_OPAQUE && glIsEnabled(GL_POLYGON_STIPPLE))
  {
    /* draw twice, one with background color only, and one with foreground color */
    glDisable(GL_POLYGON_STIPPLE);
    glColor4ub(cdRed(ctxcanvas->canvas->background), 
               cdGreen(ctxcanvas->canvas->background), 
               cdBlue(ctxcanvas->canvas->background), 
               cdAlpha(ctxcanvas->canvas->background));

    glBegin(GL_QUADS);
      glVertex2d(xmin, ymin);
      glVertex2d(xmax, ymin);
      glVertex2d(xmax, ymax);
      glVertex2d(xmin, ymax);
    glEnd();

    /* restore the foreground color */
    glColor4ub(cdRed(ctxcanvas->canvas->foreground), 
               cdGreen(ctxcanvas->canvas->foreground), 
               cdBlue(ctxcanvas->canvas->foreground), 
               cdAlpha(ctxcanvas->canvas->foreground));
    glEnable(GL_POLYGON_STIPPLE);
  }

  glBegin(GL_QUADS);
    glVertex2d(xmin, ymin);
    glVertex2d(xmax, ymin);
    glVertex2d(xmax, ymax);
    glVertex2d(xmin, ymax);
  glEnd();

  (void)ctxcanvas;
}
コード例 #2
0
static int iColorBrowserDlgColorCnvButton_CB(Ihandle* ih, int b, int press, int x, int y)
{
  IcolorDlgData* colordlg_data = (IcolorDlgData*)iupAttribGetInherit(ih, "_IUP_GC_DATA");
  int width;
  (void)y;

  if (b != IUP_BUTTON1 || !press || !colordlg_data->cd_canvas_color)
    return IUP_DEFAULT;

  cdCanvasGetSize(colordlg_data->cd_canvas_color, &width, NULL, NULL, NULL);

  if (x < width/2)
  {
    /* reset color to previous */
    colordlg_data->red = cdRed(colordlg_data->previous_color);
    colordlg_data->green = cdGreen(colordlg_data->previous_color);
    colordlg_data->blue = cdBlue(colordlg_data->previous_color);
    colordlg_data->alpha = cdAlpha(colordlg_data->previous_color);

    IupSetInt(colordlg_data->alpha_txt, "VALUE", (int)colordlg_data->alpha);
    IupSetInt(colordlg_data->alpha_val, "VALUE", (int)colordlg_data->alpha);

    iColorBrowserDlgRGB_TXT_Update(colordlg_data);
    iColorBrowserDlgRGBChanged(colordlg_data);
  }

  return IUP_DEFAULT;
}
コード例 #3
0
ファイル: cdgl.c プロジェクト: pulkomandy/cd-haiku
static void cdclear(cdCtxCanvas* ctxcanvas)
{
  GLclampf r = (GLclampf)cdRed(ctxcanvas->canvas->background)/255.0f; 
  GLclampf g = (GLclampf)cdGreen(ctxcanvas->canvas->background)/255.0f;
  GLclampf b = (GLclampf)cdBlue(ctxcanvas->canvas->background)/255.0f;
  GLclampf a = (GLclampf)cdAlpha(ctxcanvas->canvas->background)/255.0f;

  glClearColor(r, g, b, a);

  glClear(GL_COLOR_BUFFER_BIT);

  /* restore the foreground color */
  glColor4ub(cdRed(ctxcanvas->canvas->foreground), 
             cdGreen(ctxcanvas->canvas->foreground), 
             cdBlue(ctxcanvas->canvas->foreground), 
             cdAlpha(ctxcanvas->canvas->foreground));
}
コード例 #4
0
ファイル: cdgl.c プロジェクト: pulkomandy/cd-haiku
static long int cdforeground(cdCtxCanvas *ctxcanvas, long int color)
{
  (void)ctxcanvas;

  glColor4ub(cdRed(color), 
             cdGreen(color), 
             cdBlue(color), 
             cdAlpha(color));

  return color;
}
コード例 #5
0
ファイル: cdgl.c プロジェクト: pulkomandy/cd-haiku
static void cdpixel(cdCtxCanvas *ctxcanvas, int x, int y, long int color)
{
  glColor4ub(cdRed(color), 
             cdGreen(color), 
             cdBlue(color), 
             cdAlpha(color));

  /* Draw pixel */
  glPointSize(1);
  glBegin(GL_POINTS);
    glVertex2i(x, y);
  glEnd();

  /* restore the foreground color */
  glColor4ub(cdRed(ctxcanvas->canvas->foreground), 
             cdGreen(ctxcanvas->canvas->foreground), 
             cdBlue(ctxcanvas->canvas->foreground), 
             cdAlpha(ctxcanvas->canvas->foreground));

  (void)ctxcanvas;
}
コード例 #6
0
ファイル: sim.c プロジェクト: Vulcanior/IUP
void simFillDrawAAPixel(cdCanvas *canvas, int x, int y, unsigned short alpha_weight)
{
  unsigned char aa_alpha;
  long color, aa_color;

  switch(canvas->interior_style)                                             
  {                                                                                    
  default: /* CD_SOLID */
    {
      color = canvas->foreground;
      break;
    }
  case CD_PATTERN:                                      
    {
      long *pattern = canvas->pattern;
      int yp = CalcYPat(y, canvas->pattern_h);
      int xp = x % canvas->pattern_w;
      color = pattern[canvas->pattern_w*yp + xp];
      break;                                                                           
    }
  case CD_HATCH: 
    {
      unsigned char hatch = SimHatchBits[canvas->hatch_style][CalcYHatch(y, 7)];
      unsigned char n = (unsigned char)(x&7);
      simRotateHatchN(hatch, n);
      if (hatch & 0x80)
        color = canvas->foreground;
      else if (canvas->back_opacity == CD_OPAQUE)
        color = canvas->background;
      else
        return;
      break;                                                                           
    }
  case CD_STIPPLE:                                                                   
    {
      unsigned char *stipple = canvas->stipple;
      int yp = CalcYPat(y, canvas->stipple_h);
      int xp = x % canvas->stipple_w;
      if(stipple[canvas->stipple_w*yp + xp])
        color = canvas->foreground;
      else if (canvas->back_opacity == CD_OPAQUE)
        color = canvas->background;
      else
        return;
      break;                                                                           
    }
  }

  aa_alpha = (unsigned char)((alpha_weight * cdAlpha(color)) / 255);
  aa_color = cdEncodeAlpha(color, aa_alpha);
  canvas->cxPixel(canvas->ctxcanvas, x, y, aa_color);
}
コード例 #7
0
ファイル: cdgl.c プロジェクト: pulkomandy/cd-haiku
static void cdfpoly(cdCtxCanvas *ctxcanvas, int mode, cdfPoint* poly, int n)
{
  int i;

  if (mode == CD_CLIP)
    return;

  if (mode == CD_BEZIER)
  {
    int i, prec = 100;
    double (*points)[3] = malloc(n * sizeof(*points));

    for(i = 0; i < n; i++)
    {
      points[i][0] = poly[i].x;
      points[i][1] = poly[i].y;
      points[i][2] = 0;
    }

    glMap1d(GL_MAP1_VERTEX_3, 0.0, 1.0, 3, n, &points[0][0]);
    glEnable(GL_MAP1_VERTEX_3);
    glMapGrid1d(prec, 0.0, 1.0);
    glEvalMesh1(GL_LINE, 0, prec);
    glDisable(GL_MAP1_VERTEX_3);

    free(points);
    return;
  }

  if (mode == CD_PATH)
  {
    cdfSimPolyPath(ctxcanvas->canvas, poly, n);
    return;
  }

  switch (mode)
  {
  case CD_CLOSED_LINES :
    glBegin(GL_LINE_LOOP);
    break;
  case CD_OPEN_LINES :
    glBegin(GL_LINE_STRIP);
    break;
  case CD_FILL :
    if(ctxcanvas->canvas->back_opacity == CD_OPAQUE && glIsEnabled(GL_POLYGON_STIPPLE))
    {
      glDisable(GL_POLYGON_STIPPLE);
      glColor4ub(cdRed(ctxcanvas->canvas->background), 
                 cdGreen(ctxcanvas->canvas->background), 
                 cdBlue(ctxcanvas->canvas->background), 
                 cdAlpha(ctxcanvas->canvas->background));

      glBegin(GL_POLYGON);
      for(i = 0; i < n; i++)
        glVertex2d(poly[i].x, poly[i].y);
      glEnd();

      /* restore the foreground color */
      glColor4ub(cdRed(ctxcanvas->canvas->foreground), 
                 cdGreen(ctxcanvas->canvas->foreground), 
                 cdBlue(ctxcanvas->canvas->foreground), 
                 cdAlpha(ctxcanvas->canvas->foreground));
      glEnable(GL_POLYGON_STIPPLE);
    }

    glBegin(GL_POLYGON);
    break;
  }

  for(i = 0; i < n; i++)
    glVertex2d(poly[i].x, poly[i].y);
  glEnd();

  (void)ctxcanvas;
}
コード例 #8
0
ファイル: sim_text.c プロジェクト: LuaDist/cd
static void simDrawTextBitmap(cdSimulation* simulation, FT_Bitmap* bitmap, int x, int y)
{
  unsigned char *red, *green, *blue, *alpha, *bitmap_data;
  int width = bitmap->width;
  int height = bitmap->rows;
  int size = width*height;
  int rgba_data_size = size*4;
  int old_use_matrix = simulation->canvas->use_matrix;

  /* avoid spaces */
  if (width == 0 || height == 0)
    return;

  if (!simulation->tt_text->rgba_data)
    simulation->tt_text->rgba_data = malloc(rgba_data_size);
  else if (rgba_data_size > simulation->tt_text->rgba_data_size)
  {
    simulation->tt_text->rgba_data = realloc(simulation->tt_text->rgba_data, rgba_data_size);
    simulation->tt_text->rgba_data_size = rgba_data_size;
  }

  /* disable image transformation */
  simulation->canvas->use_matrix = 0;

  /* this is the char bitmap, contains an alpha map of the char 
     to be combined with the foreground color */
  bitmap_data = bitmap->buffer + (height-1)*width;  /* bitmap is top down. */

  /* this is the image used to draw the char with the foreground color */ 
  red   = simulation->tt_text->rgba_data;
  green = red   + size;
  blue  = green + size;
  alpha = blue  + size;

  if (!simulation->canvas->cxPutImageRectRGBA && !simulation->canvas->cxGetImageRGB)
  {
    int i, j;
    unsigned char bg_red, bg_green, bg_blue, 
                  fg_red, fg_green, fg_blue, fg_alpha, calpha;
    long int c;

    /* must manually combine using only the background color, ignore canvas contents */

    c = simulation->canvas->background;
    bg_red   = cdRed(c);
    bg_green = cdGreen(c);
    bg_blue  = cdBlue(c);
    c = simulation->canvas->foreground;
    fg_red   = cdRed(c);
    fg_green = cdGreen(c);
    fg_blue  = cdBlue(c);
    fg_alpha = cdAlpha(c);

    for (i = 0; i < height; i++)
    {
      for (j = 0; j < width; j++)
      {
        if (simulation->antialias)
        {
          if (fg_alpha == 255)
            calpha = bitmap_data[j];
          else
            calpha = (fg_alpha*bitmap_data[j])/255;
        }
        else
        {
          if (bitmap_data[j] > 128)  /* behave as 255 */
            calpha = fg_alpha;
          else
            calpha = 0;
        }

        *red++ = CD_ALPHA_BLEND(fg_red, bg_red, calpha);
        *green++ = CD_ALPHA_BLEND(fg_green, bg_green, calpha);
        *blue++ = CD_ALPHA_BLEND(fg_blue, bg_blue, calpha);
      }

      bitmap_data -= width;
    }

    /* reset pointers */
    red   = simulation->tt_text->rgba_data;
    green = red   + size;
    blue  = green + size;

    /* draw the char */
    simulation->canvas->cxPutImageRectRGB(simulation->canvas->ctxcanvas, width,height,red,green,blue,x,y,width,height,0,width-1,0,height-1);
  }
  else
  {
    int i, j;
    long int fg = simulation->canvas->foreground;
    unsigned char fg_alpha = cdAlpha(fg);
    memset(red,   cdRed(fg), size);
    memset(green, cdGreen(fg), size);
    memset(blue,  cdBlue(fg), size);

    /* alpha is the bitmap_data itself 
       if the foreground color does not contains alpha.
       Also must invert since it is top-down. */

    for (i = 0; i < height; i++)
    {
      if (simulation->antialias)
      {
        if (fg_alpha == 255)
        {
          memcpy(alpha,  bitmap_data, width);
          alpha += width;
        }
        else
        {
          for (j = 0; j < width; j++)
          {
            *alpha++ = (fg_alpha*bitmap_data[j])/255;
          }
        }
      }
      else
      {
        for (j = 0; j < width; j++)
        {
          if (bitmap_data[j] > 128)  /* behave as 255 */
            *alpha++ = fg_alpha;
          else
            *alpha++ = 0;
        }
      }

      bitmap_data -= width;
    }

    /* reset alpha pointer */
    alpha = blue + size;

    /* draw the char */
    simulation->canvas->cxPutImageRectRGBA(simulation->canvas->ctxcanvas, width,height,red,green,blue,alpha,x,y,width,height,0,width-1,0,height-1);
  }

  simulation->canvas->use_matrix = old_use_matrix;
}