Tk-Zinc
view release on metacpan or search on metacpan
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 )