Tk-Zinc

 view release on metacpan or  search on metacpan

tkZinc.c  view on Meta::CPAN

  ZnTriStrip    *tristrips = data;
  ZnPoint       p;
  int           size;

  p.x = ((GLdouble *) vertex_data)[0];
  p.y = ((GLdouble *) vertex_data)[1];
  //printf("Sommet en %g %g\n", p.x, p.y);
  size = ZnListSize(ZnWorkPoints);
  if ((ZnTesselator.type == GL_TRIANGLES) && (size == 3)) {
    tristrips->strips[tristrips->num_strips-1].num_points = size;
    tristrips->strips[tristrips->num_strips-1].points = ZnMalloc(size * sizeof(ZnPoint));
    memcpy(tristrips->strips[tristrips->num_strips-1].points,
           ZnListArray(ZnWorkPoints), size * sizeof(ZnPoint));
    //printf("Fin de fragment intermediaire %d, num points: %d\n", tristrips->num_strips-1, size);
    /* Allocate a new fragment */
    ZnListEmpty(ZnWorkPoints);
    tristrips->num_strips++;
    tristrips->strips = ZnRealloc(tristrips->strips,
                                    tristrips->num_strips * sizeof(ZnStrip));
    tristrips->strips[tristrips->num_strips-1].fan = False;
  }
  ZnListAdd(ZnWorkPoints, &p, ZnListTail);
}

static void CALLBACK
ZnTessEnd(void  *data)
{
  ZnPoly        *outlines = data;
  ZnTriStrip    *tristrips = data;
  unsigned int  size = ZnListSize(ZnWorkPoints);
  unsigned int  num;

  if (ZnTesselator.type == GL_LINE_LOOP) {
    /* Add the last point to close the outline */
    size++;
    num = outlines->num_contours;
    outlines->contours[num-1].num_points = size;
    outlines->contours[num-1].points = ZnMalloc(size * sizeof(ZnPoint));
    memcpy(outlines->contours[num-1].points,
           ZnListArray(ZnWorkPoints), size * sizeof(ZnPoint));
    outlines->contours[num-1].points[size-1] = outlines->contours[num-1].points[0];
    outlines->contours[num-1].cw = !ZnTestCCW(outlines->contours[num-1].points, size);
  }
  else {
    num = tristrips->num_strips;
    tristrips->strips[num-1].num_points = size;
    tristrips->strips[num-1].points = ZnMalloc(size * sizeof(ZnPoint));
    memcpy(tristrips->strips[num-1].points,
           ZnListArray(ZnWorkPoints), size * sizeof(ZnPoint));
  }
  //printf("Fin de fragment %d, num points: %d\n", num, size);
}

static void CALLBACK
ZnTessCombine(GLdouble  coords[3],
              void      *vertex_data[4],
              GLfloat   weight[4],
              void      **out_data,
              void      *data)
{
  ZnCombineData *cdata;
  
  cdata = ZnMalloc(sizeof(ZnCombineData));
  cdata->v[0] = coords[0];
  cdata->v[1] = coords[1];
  cdata->next = ZnTesselator.combine_list;
  ZnTesselator.combine_list = cdata;
  *out_data = &cdata->v;
        ZnTesselator.combine_length++;
  //printf("Création d'un nouveau sommet en %g %g\n",
    //cdata->v[0], cdata->v[1]);
}

static void CALLBACK
ZnTessError(GLenum      errno,
            void        *data)
{
  fprintf(stderr, "Tesselation error in curve item: %d\n", errno);
}


static void
InitZinc(Tcl_Interp *interp) {
  static ZnBool inited = False;
  unsigned int  i, x, y, bit;
  char          name[TCL_INTEGER_SPACE + 20];
  
  if (inited) {
    return;
  }
  
  /*
   * Add the specific bitmaps.
   */
  for (i = 0; i < sizeof(SYMBOLS_BITS)/(SYMBOL_WIDTH*SYMBOL_HEIGHT/8); i++) {
    sprintf(name, "AtcSymbol%d", i+1);
    Tk_DefineBitmap(interp, Tk_GetUid(name),
                    SYMBOLS_BITS[i], SYMBOL_WIDTH, SYMBOL_HEIGHT);
  }
  
  for (i = 0; i < ZN_NUM_ALPHA_STEPS; i++) {
    for (y = 0; y < 4; y++) {
      bitmaps[i][y][0] = 0;
      for (x = 0; x < 4; x++) {
        /*
         * Use the dither4x4 matrix to determine if this bit is on
         */
        bit = (i >= dither4x4[y][x]) ? 1 : 0;
        /*
         * set the bit in the array used to make the X Bitmap
         * mirror the pattern in x & y to make an 8x8 bitmap.
         */
        if (bit) {
          bitmaps[i][y][0] |= (1 << x);
          bitmaps[i][y][0] |= (1 << (4 + x));
        } 
      }
      bitmaps[i][y][1] = bitmaps[i][y][2] = bitmaps[i][y][3] = bitmaps[i][y][0];
      bitmaps[i][y+4][0] = bitmaps[i][y+4][1] = bitmaps[i][y][0];
      bitmaps[i][y+4][2] = bitmaps[i][y+4][3] = bitmaps[i][y][0];
      bitmaps[i][y+8][0] = bitmaps[i][y+8][1] = bitmaps[i][y][0];
      bitmaps[i][y+8][2] = bitmaps[i][y+8][3] = bitmaps[i][y][0];
      bitmaps[i][y+12][0] = bitmaps[i][y+12][1] = bitmaps[i][y][0];
      bitmaps[i][y+12][2] = bitmaps[i][y+12][3] = bitmaps[i][y][0];
      bitmaps[i][y+16][0] = bitmaps[i][y+16][1] = bitmaps[i][y][0];
      bitmaps[i][y+16][2] = bitmaps[i][y+16][3] = bitmaps[i][y][0];
      bitmaps[i][y+20][0] = bitmaps[i][y+20][1] = bitmaps[i][y][0];
      bitmaps[i][y+20][2] = bitmaps[i][y+20][3] = bitmaps[i][y][0];
      bitmaps[i][y+24][0] = bitmaps[i][y+24][1] = bitmaps[i][y][0];
      bitmaps[i][y+24][2] = bitmaps[i][y+24][3] = bitmaps[i][y][0];
      bitmaps[i][y+28][0] = bitmaps[i][y+28][1] = bitmaps[i][y][0];



( run in 1.164 second using v1.01-cache-2.11-cpan-d8267643d1d )