diff options
Diffstat (limited to 'generic')
-rw-r--r-- | generic/Draw.c | 337 |
1 files changed, 150 insertions, 187 deletions
diff --git a/generic/Draw.c b/generic/Draw.c index 078439e..ea93823 100644 --- a/generic/Draw.c +++ b/generic/Draw.c @@ -70,13 +70,13 @@ /* ********************************************************************************** * - * SetLineStyle -- + * ZnSetLineStyle -- * ********************************************************************************** */ void -SetLineStyle(WidgetInfo *wi, - LineStyle line_style) +ZnSetLineStyle(WidgetInfo *wi, + LineStyle line_style) { if (wi->render) { #ifdef GLX @@ -127,7 +127,7 @@ SetLineStyle(WidgetInfo *wi, /* ********************************************************************************** * - * GetLineShape -- + * ZnGetLineShape -- * Compute the points describing the given line shape between point p1 and p2. * If bbox is non null, it is filled with the bounding box of the shape. * @@ -162,12 +162,12 @@ SetLineStyle(WidgetInfo *wi, ********************************************************************************** */ void -GetLineShape(ZnPoint *p1, - ZnPoint *p2, - unsigned int line_width, - LineShape shape, - ZnBBox *bbox, - ZnList to_points) +ZnGetLineShape(ZnPoint *p1, + ZnPoint *p2, + unsigned int line_width, + LineShape shape, + ZnBBox *bbox, + ZnList to_points) { ZnPoint *points; int num_points, i; @@ -288,7 +288,7 @@ GetLineShape(ZnPoint *p1, /* ********************************************************************************** * - * DrawLineShape -- + * ZnDrawLineShape -- * Draw a line given the points describing its path. It is designed to work * with GetLineShape albeit it does fairly trivial things. In the future some * shapes might need cooperation between the two and the clients will be ready @@ -298,13 +298,13 @@ GetLineShape(ZnPoint *p1, ********************************************************************************** */ void -DrawLineShape(WidgetInfo *wi, - ZnPoint *p, - int num_p, - LineStyle line_style, - ZnColor foreground, - unsigned int line_width, - LineShape shape) +ZnDrawLineShape(WidgetInfo *wi, + ZnPoint *p, + int num_p, + LineStyle line_style, + ZnColor foreground, + unsigned int line_width, + LineShape shape) { XPoint *xpoints; int i; @@ -313,7 +313,7 @@ DrawLineShape(WidgetInfo *wi, /* * Setup GC. */ - SetLineStyle(wi, line_style); + ZnSetLineStyle(wi, line_style); values.foreground = ZnPixel(foreground); values.line_width = (line_width == 1) ? 0 : line_width; values.fill_style = FillSolid; @@ -388,17 +388,17 @@ ReliefColorOfSegment(ZnReal x1, /* ********************************************************************************** * - * DrawRectangleRelief -- + * ZnDrawRectangleRelief -- * Draw the bevels inside bbox. * ********************************************************************************** */ void -DrawRectangleRelief(WidgetInfo *wi, - ReliefStyle relief, - ZnGradient *gradient, - XRectangle *bbox, - unsigned int line_width) +ZnDrawRectangleRelief(WidgetInfo *wi, + ReliefStyle relief, + ZnGradient *gradient, + XRectangle *bbox, + unsigned int line_width) { XPoint bevel[4]; @@ -420,17 +420,17 @@ DrawRectangleRelief(WidgetInfo *wi, new_line_width = line_width/2; offset = line_width - new_line_width; - DrawRectangleRelief(wi, - (relief==RELIEF_GROOVE)?RELIEF_SUNKEN:RELIEF_RAISED, - gradient, bbox, new_line_width); + ZnDrawRectangleRelief(wi, + (relief==RELIEF_GROOVE)?RELIEF_SUNKEN:RELIEF_RAISED, + gradient, bbox, new_line_width); internal_bbox = *bbox; internal_bbox.x +=offset; internal_bbox.y += offset; internal_bbox.width -= offset*2; internal_bbox.height -= offset*2; - DrawRectangleRelief(wi, - (relief==RELIEF_GROOVE)?RELIEF_RAISED:RELIEF_SUNKEN, - gradient, &internal_bbox, new_line_width); + ZnDrawRectangleRelief(wi, + (relief==RELIEF_GROOVE)?RELIEF_RAISED:RELIEF_SUNKEN, + gradient, &internal_bbox, new_line_width); return; } @@ -688,7 +688,7 @@ DoPolygon(ZnPoint *p, /* ********************************************************************************** * - * GetPolygonReliefBBox -- + * ZnGetPolygonReliefBBox -- * Returns the bevelled polygon bounding box. * ********************************************************************************** @@ -706,10 +706,10 @@ PolygonBBoxCB(ZnPoint *bevels, } void -GetPolygonReliefBBox(ZnPoint *points, - int num_points, - int line_width, - ZnBBox *bbox) +ZnGetPolygonReliefBBox(ZnPoint *points, + int num_points, + int line_width, + ZnBBox *bbox) { PolygonData pd; @@ -722,7 +722,7 @@ GetPolygonReliefBBox(ZnPoint *points, /* ********************************************************************************** * - * PolygonReliefInBBox -- + * ZnPolygonReliefInBBox -- * Returns (-1) if the relief is entirely outside the bbox, (1) if it is * entirely inside or (0) if in between * @@ -749,10 +749,10 @@ PolygonInBBoxCB(ZnPoint *bevels, } int -PolygonReliefInBBox(ZnPoint *points, - int num_points, - int line_width, - ZnBBox *area) +ZnPolygonReliefInBBox(ZnPoint *points, + int num_points, + int line_width, + ZnBBox *area) { PolygonData pd; @@ -768,7 +768,7 @@ PolygonReliefInBBox(ZnPoint *points, /* ********************************************************************************** * - * PolygonReliefToPointDist -- + * ZnPolygonReliefToPointDist -- * Returns the distance between the given point and * the bevelled polygon. * @@ -791,10 +791,10 @@ PolygonDistCB(ZnPoint *bevels, } double -PolygonReliefToPointDist(ZnPoint *points, - int num_points, - int line_width, - ZnPoint *pp) +ZnPolygonReliefToPointDist(ZnPoint *points, + int num_points, + int line_width, + ZnPoint *pp) { PolygonData pd; @@ -809,7 +809,7 @@ PolygonReliefToPointDist(ZnPoint *points, /* ********************************************************************************** * - * DrawPolygonRelief -- + * ZnDrawPolygonRelief -- * Draw the bevels around path. * ********************************************************************************** @@ -842,12 +842,12 @@ PolygonDrawCB(ZnPoint *bevels, } void -DrawPolygonRelief(WidgetInfo *wi, - ReliefStyle relief, - ZnGradient *gradient, - ZnPoint *points, - int num_points, - int line_width) +ZnDrawPolygonRelief(WidgetInfo *wi, + ReliefStyle relief, + ZnGradient *gradient, + ZnPoint *points, + int num_points, + int line_width) { PolygonData pd; @@ -873,7 +873,7 @@ DrawPolygonRelief(WidgetInfo *wi, /* ********************************************************************************** * - * RenderPolygonRelief -- + * ZnRenderPolygonRelief -- * Draw the bevels around path using alpha enabled rendering. * ********************************************************************************** @@ -987,13 +987,13 @@ PolygonRenderCB(ZnPoint *bevels, } void -RenderPolygonRelief(WidgetInfo *wi, - ReliefStyle relief, - ZnGradient *gradient, - ZnBool smooth, - ZnPoint *points, - int num_points, - int line_width) +ZnRenderPolygonRelief(WidgetInfo *wi, + ReliefStyle relief, + ZnGradient *gradient, + ZnBool smooth, + ZnPoint *points, + int num_points, + int line_width) { PolygonData pd; @@ -1010,16 +1010,16 @@ RenderPolygonRelief(WidgetInfo *wi, } void -RenderPolyline(WidgetInfo *wi, - ZnPoint *points, - int num_points, - int line_width, - LineStyle line_style, - int cap_style, - int join_style, - ZnLineEnd first_end, - ZnLineEnd last_end, - ZnGradient *gradient) +ZnRenderPolyline(WidgetInfo *wi, + ZnPoint *points, + int num_points, + int line_width, + LineStyle line_style, + int cap_style, + int join_style, + ZnLineEnd first_end, + ZnLineEnd last_end, + ZnGradient *gradient) { int num_clips = ZnListSize(wi->clip_stack); ZnPoint end_points[LINE_END_POINTS]; @@ -1043,7 +1043,7 @@ RenderPolyline(WidgetInfo *wi, color = ZnGetGradientColor(gradient, 0, &alpha); alpha = ZnComposeAlpha(alpha, wi->alpha); glColor4us(color->red, color->green, color->blue, alpha); - SetLineStyle(wi, line_style); + ZnSetLineStyle(wi, line_style); glLineWidth(line_width); glPointSize(line_width); @@ -1122,7 +1122,7 @@ RenderPolyline(WidgetInfo *wi, int num_cpoints; ZnReal lw_2 = line_width / 2.0; ZnPoint *cpoints = GetCirclePoints(3, ZN_CIRCLE_COARSE, - 0, 360, &num_cpoints, NULL); + 0, 2*M_PI, &num_cpoints, NULL); for ( ; i < k; i++) { glBegin(GL_TRIANGLE_FAN); @@ -1139,24 +1139,28 @@ RenderPolyline(WidgetInfo *wi, void -RenderImage(WidgetInfo *wi, - ImageBits *image, /* ImageBits or BitmapBits */ - ZnGradient *gradient, - ZnPoint *origin, - ZnBool modulate) +ZnRenderImage(WidgetInfo *wi, + ZnImage image, + ZnGradient *gradient, + ZnPoint *origin, + ZnBool modulate) { ZnReal nx, ny; XColor *color; - int alpha; - + int alpha, width, height; + ZnReal t, s; + GLuint texobj; + color = ZnGetGradientColor(gradient, 0, &alpha); alpha = ZnComposeAlpha(alpha, wi->alpha); - nx = origin->x + image->width; - ny = origin->y + image->height; + ZnSizeOfImage(image, &width, &height); + texobj = ZnImageTex(image, &t, &s); + nx = origin->x + width; + ny = origin->y + height; glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); glEnable(GL_TEXTURE_2D); - glBindTexture(GL_TEXTURE_2D, image->texture); + glBindTexture(GL_TEXTURE_2D, texobj); if (modulate) { glColor4us(color->red, color->green, color->blue, alpha); } @@ -1166,26 +1170,27 @@ RenderImage(WidgetInfo *wi, glBegin(GL_QUADS); glTexCoord2f(0.0, 0.0); glVertex2f(origin->x, origin->y); - glTexCoord2f(0.0, image->t); + glTexCoord2f(0.0, t); glVertex2f(origin->x, ny); - glTexCoord2f(image->s, image->t); + glTexCoord2f(s, t); glVertex2f(nx, ny); - glTexCoord2f(image->s, 0.0); + glTexCoord2f(s, 0.0); glVertex2f(nx, origin->y); glEnd(); glDisable(GL_TEXTURE_2D); } void -RenderTile(struct _WidgetInfo *wi, - ImageBits *tile, - ZnGradient *gradient, - void cb(void *), - void *closure, - ZnPoint *quad) /* Right now it's a ZnBBox */ +ZnRenderTile(WidgetInfo *wi, + ZnImage tile, + ZnGradient *gradient, + void cb(void *), + void *closure, + ZnPoint *quad) /* Right now it's a ZnBBox */ { - ZnReal x, y, nx, ny, lx, ly, s, t; - int alpha, num_clips = ZnListSize(wi->clip_stack); + ZnReal x, y, nx, ny, lx, ly, s, t, tiles, tilet; + int width, height, alpha, num_clips = ZnListSize(wi->clip_stack); + GLuint texobj; if (gradient) { ZnGetGradientColor(gradient, 0.0, &alpha); @@ -1210,10 +1215,12 @@ RenderTile(struct _WidgetInfo *wi, * The rectangle is drawn using quads, each * quad matching the size of the texture tile. */ + ZnSizeOfImage(tile, &width, &height); + texobj = ZnImageTex(tile, &tilet, &tiles); glEnable(GL_TEXTURE_2D); glColor4us(65535, 65535, 65535, alpha); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); - glBindTexture(GL_TEXTURE_2D, tile->texture); + glBindTexture(GL_TEXTURE_2D, texobj); y = quad[0].y; lx = quad[1].x; @@ -1222,20 +1229,20 @@ RenderTile(struct _WidgetInfo *wi, do { x = quad[0].x; t = 1.0; - ny = y + tile->height; + ny = y + height; if (ny > ly) { ny = ly; - t = (ly - y) / (ZnReal) tile->height; + t = (ly - y) / (ZnReal) height; } - t *= tile->t; + t *= tilet; do { s = 1.0; - nx = x + tile->width; + nx = x + width; if (nx > lx) { nx = lx; - s = (lx - x) / (ZnReal) tile->width; + s = (lx - x) / (ZnReal) width; } - s *= tile->s; + s *= tiles; glTexCoord2f(0.0, 0.0); glVertex2f(x, y); glTexCoord2f(0.0, t); @@ -1259,10 +1266,10 @@ RenderTile(struct _WidgetInfo *wi, } void -ComputeAxialGradient(WidgetInfo *wi, - ZnPoly *shape, - int angle, - ZnPoint *grad_geo) +ZnComputeAxialGradient(WidgetInfo *wi, + ZnPoly *shape, + int angle, + ZnPoint *grad_geo) { ZnTransfo *transfo1, *transfo2; ZnBool *holes; @@ -1301,11 +1308,11 @@ ComputeAxialGradient(WidgetInfo *wi, } void -ComputeRadialGradient(WidgetInfo *wi, - ZnPoly *shape, - ZnBBox *bbox, - ZnPoint *center, - ZnPoint *grad_geo) +ZnComputeRadialGradient(WidgetInfo *wi, + ZnPoly *shape, + ZnBBox *bbox, + ZnPoint *center, + ZnPoint *grad_geo) { ZnReal dist, new, x, y, fact; ZnBool *holes; @@ -1344,16 +1351,16 @@ ComputeRadialGradient(WidgetInfo *wi, } void -RenderGradient(struct _WidgetInfo *wi, - ZnGradient *gradient, /* The grdient to be drawn (static - * parameters). */ - void cb(void *), /* A callback called to clip the shape - * containing the gradient. */ - void *closure, /* The callback parameter. */ - ZnPoint *quad, /* The gradient geometric parameters - * (dynamic). */ - ZnPoly *poly /* Used only by ZN_PATH_GRADIENT */ - ) +ZnRenderGradient(WidgetInfo *wi, + ZnGradient *gradient, /* The grdient to be drawn (static + * parameters). */ + void cb(void *), /* A callback called to clip the shape + * containing the gradient. */ + void *closure, /* The callback parameter. */ + ZnPoint *quad, /* The gradient geometric parameters + * (dynamic). */ + ZnPoly *poly /* Used only by ZN_PATH_GRADIENT */ + ) { int alpha, angle, i, j; int type = gradient->type; @@ -1466,7 +1473,7 @@ RenderGradient(struct _WidgetInfo *wi, ZnPoint *genarc; XColor *color2; - genarc = GetCirclePoints(3, ZN_CIRCLE_FINE, 0, 360, &num_p, NULL); + genarc = GetCirclePoints(3, ZN_CIRCLE_FINE, 0, 2*M_PI, &num_p, NULL); radiusx = 0; radiusy = 0; color = gradient->colors[0].rgb; @@ -1589,9 +1596,9 @@ RenderGradient(struct _WidgetInfo *wi, void -RenderHollowDot(struct _WidgetInfo *wi, - ZnPoint *p, - ZnReal size) +ZnRenderHollowDot(WidgetInfo *wi, + ZnPoint *p, + ZnReal size) { int num_clips = ZnListSize(wi->clip_stack); @@ -1629,46 +1636,13 @@ RenderHollowDot(struct _WidgetInfo *wi, #include <GL/glu.h> -static TexGlyphVertexInfo * -getTCVI(TexFont *txf, - int c) -{ - TexGlyphVertexInfo *tgvi; - - /* Automatically substitute uppercase letters with lowercase if not - uppercase available (and vice versa). */ - if ((c >= txf->min_glyph) && (c < txf->min_glyph + txf->range)) { - tgvi = txf->lut[c - txf->min_glyph]; - if (tgvi) { - return tgvi; - } - if (islower(c)) { - c = toupper(c); - if ((c >= txf->min_glyph) && (c < txf->min_glyph + txf->range)) { - return txf->lut[c - txf->min_glyph]; - } - } - if (isupper(c)) { - c = tolower(c); - if ((c >= txf->min_glyph) && (c < txf->min_glyph + txf->range)) { - return txf->lut[c - txf->min_glyph]; - } - } - } - fprintf(stderr, - "Tried to access unavailable texture font character '%c'(\\0%o)\n", - c, c); - return txf->lut[(int)'!' - txf->min_glyph]; -} - - void -txfRenderGlyph(TexFont *txf, - int c) +ZnRenderGlyph(ZnTexFontInfo *tfi, + int c) { - TexGlyphVertexInfo *tgvi; + ZnTexGVI *tgvi; - tgvi = getTCVI(txf, c); + tgvi = ZnTexFontGVI(tfi, c); glBegin(GL_QUADS); glTexCoord2fv(tgvi->t0); @@ -1684,14 +1658,14 @@ txfRenderGlyph(TexFont *txf, } void -txfRenderString(TexFont *txf, - unsigned char *string, - int len) +ZnRenderString(ZnTexFontInfo *tfi, + unsigned char *string, + int len) { int i; for (i = 0; i < len; i++) { - txfRenderGlyph(txf, string[i]); + ZnRenderGlyph(tfi, string[i]); } } @@ -1700,14 +1674,14 @@ enum { }; void -txfRenderFancyString(TexFont *txf, - unsigned char *string, - int len) +ZnRenderFancyString(ZnTexFontInfo *tfi, + unsigned char *string, + int len) { - TexGlyphVertexInfo *tgvi; - GLubyte c[4][3]; - int mode = MONO; - int i; + ZnTexGVI *tgvi; + GLubyte c[4][3]; + int mode = MONO; + int i; for (i = 0; i < len; i++) { if (string[i] == 27) { @@ -1736,10 +1710,10 @@ txfRenderFancyString(TexFont *txf, } else { switch (mode) { case MONO: - txfRenderGlyph(txf, string[i]); + ZnRenderGlyph(tfi, string[i]); break; case TOP_BOTTOM: - tgvi = getTCVI(txf, string[i]); + tgvi = ZnTexFontGVI(tfi, string[i]); glBegin(GL_QUADS); glColor3ubv(c[0]); glTexCoord2fv(tgvi->t0); @@ -1755,7 +1729,7 @@ txfRenderFancyString(TexFont *txf, glTranslatef(tgvi->advance, 0.0, 0.0); break; case LEFT_RIGHT: - tgvi = getTCVI(txf, string[i]); + tgvi = ZnTexFontGVI(tfi, string[i]); glBegin(GL_QUADS); glColor3ubv(c[0]); glTexCoord2fv(tgvi->t0); @@ -1773,7 +1747,7 @@ txfRenderFancyString(TexFont *txf, glTranslatef(tgvi->advance, 0.0, 0.0); break; case FOUR: - tgvi = getTCVI(txf, string[i]); + tgvi = ZnTexFontGVI(tfi, string[i]); glBegin(GL_QUADS); glColor3ubv(c[0]); glTexCoord2fv(tgvi->t0); @@ -1795,15 +1769,4 @@ txfRenderFancyString(TexFont *txf, } } -int -txfInFont(TexFont * txf, int c) -{ - /* NOTE: No uppercase/lowercase substituion. */ - if ((c >= txf->min_glyph) && (c < txf->min_glyph + txf->range)) { - if (txf->lut[c - txf->min_glyph]) { - return 1; - } - } - return 0; -} #endif |