aboutsummaryrefslogtreecommitdiff
path: root/generic/Rectangle.c
diff options
context:
space:
mode:
authorlecoanet2003-06-16 14:48:45 +0000
committerlecoanet2003-06-16 14:48:45 +0000
commitfb188f65b156389c5728e0927dbcf7a063ef57ee (patch)
tree8b1dbd66fd4f73e0f77644f57ff9b774996aa396 /generic/Rectangle.c
parent7296d27a04068d84d9e683b0b5dccfc4059f97a9 (diff)
downloadtkzinc-fb188f65b156389c5728e0927dbcf7a063ef57ee.zip
tkzinc-fb188f65b156389c5728e0927dbcf7a063ef57ee.tar.gz
tkzinc-fb188f65b156389c5728e0927dbcf7a063ef57ee.tar.bz2
tkzinc-fb188f65b156389c5728e0927dbcf7a063ef57ee.tar.xz
Simplified the grdient prep/drawing interface.
Use of the new ZnGetGradientPixel function in X. Added an optimized case for tile filed rectangles when they are aligned with the pixel matrix (openGL). This can dramatically boost performances on some applications.
Diffstat (limited to 'generic/Rectangle.c')
-rw-r--r--generic/Rectangle.c55
1 files changed, 25 insertions, 30 deletions
diff --git a/generic/Rectangle.c b/generic/Rectangle.c
index bcb7db5..ea0bb7b 100644
--- a/generic/Rectangle.c
+++ b/generic/Rectangle.c
@@ -356,49 +356,39 @@ ComputeCoordinates(ZnItem item,
delta = ABS(delta);
aligned |= delta < X_PRECISION_LIMIT;
ASSIGN(rect->flags, ALIGNED_BIT, aligned);
-
+
#ifdef GL
/*
* Compute the gradient geometry
*/
if (!ZnGradientFlat(rect->fill_color)) {
ZnPoly shape;
-
- if (rect->fill_color->type == ZN_AXIAL_GRADIENT) {
- int angle = rect->fill_color->g.angle;
-
+
+ if (rect->fill_color->type == ZN_AXIAL_GRADIENT) {
+ int angle = rect->fill_color->angle;
+
if ((angle != 0) && (angle != 90) && (angle != 180) && (angle != 270)) {
if (!rect->grad_geo) {
rect->grad_geo = ZnMalloc(6*sizeof(ZnPoint));
}
ZnPolyContour1(&shape, p, 4, False);
- ZnComputeAxialGradient(wi, &shape, (ZnReal) angle, rect->grad_geo);
+ ZnComputeGradient(rect->fill_color, wi, &shape, rect->grad_geo);
}
else {
goto free_ggeo;
}
-
}
- else if (rect->fill_color->type == ZN_RADIAL_GRADIENT) {
- ZnPoint pp[4];
+ else {
if (!rect->grad_geo) {
rect->grad_geo = ZnMalloc(6*sizeof(ZnPoint));
}
- pp[0] = rect->coords[0];
- pp[2] = rect->coords[1];
- pp[1].x = pp[2].x;
- pp[1].y = pp[0].y;
- pp[3].x = pp[0].x;
- pp[3].y = pp[2].y;
- ZnPolyContour1(&shape, pp, 4, False);
- ZnComputeRadialGradient(wi, &shape, False, &rect->fill_color->g.p, rect->grad_geo);
- }
- else if (rect->fill_color->type == ZN_PATH_GRADIENT) {
- if (!rect->grad_geo) {
- rect->grad_geo = ZnMalloc(6*sizeof(ZnPoint));
+ if (rect->fill_color->type == ZN_PATH_GRADIENT) {
+ ZnPolyContour1(&shape, rect->coords, 2, False);
}
- ZnPolyContour1(&shape, rect->coords, 2, False);
- ZnComputePathGradient(wi, &shape, &rect->fill_color->g.p, rect->grad_geo);
+ else {
+ ZnPolyContour1(&shape, p, 4, False);
+ }
+ ZnComputeGradient(rect->fill_color, wi, &shape, rect->grad_geo);
}
}
else {
@@ -497,7 +487,7 @@ Draw(ZnItem item)
* Fill if requested.
*/
if (ISSET(rect->flags, FILLED_BIT)) {
- values.foreground = ZnPixel(ZnGetGradientColor(rect->fill_color, 0.0, NULL));
+ values.foreground = ZnGetGradientPixel(rect->fill_color, 0.0);
if (rect->tile != ZnUnspecifiedImage) {
if (!ZnImageIsBitmap(rect->tile)) { /* Fill tiled */
values.fill_style = FillTiled;
@@ -563,7 +553,7 @@ Draw(ZnItem item)
else {
ZnSetLineStyle(wi, rect->line_style);
gc_mask = GCFillStyle|GCLineWidth|GCForeground|GCJoinStyle;
- values.foreground = ZnPixel(ZnGetGradientColor(rect->line_color, 0.0, NULL));
+ values.foreground = ZnGetGradientPixel(rect->line_color, 0.0);
values.line_width = (rect->line_width == 1) ? 0 : (int) rect->line_width;
values.join_style = JoinMiter;
if (ISCLEAR(rect->flags, ALIGNED_BIT)) {
@@ -621,8 +611,6 @@ Render(ZnItem item)
ZnWInfo *wi = item->wi;
RectangleItem rect = (RectangleItem) item;
int i;
- XColor *color;
- unsigned short alpha;
#ifdef GL_LIST
if (!item->gl_list) {
@@ -642,11 +630,18 @@ Render(ZnItem item)
fast ? rect->dev : rect->grad_geo, &poly);
}
else if (rect->tile != ZnUnspecifiedImage) { /* Fill tiled/patterned */
- ZnRenderTile(wi, rect->tile, rect->fill_color, RectRenderCB,
- rect, (ZnPoint *) &item->item_bounding_box);
+ if (ISSET(rect->flags, ALIGNED_BIT)) {
+ ZnRenderTile(wi, rect->tile, rect->fill_color, NULL, NULL,
+ (ZnPoint *) &item->item_bounding_box);
+ }
+ else {
+ ZnRenderTile(wi, rect->tile, rect->fill_color, RectRenderCB,
+ rect, (ZnPoint *) &item->item_bounding_box);
+ }
}
else {
- color = ZnGetGradientColor(rect->fill_color, 0.0, &alpha);
+ unsigned short alpha;
+ XColor *color = ZnGetGradientColor(rect->fill_color, 0.0, &alpha);
alpha = ZnComposeAlpha(alpha, wi->alpha);
glColor4us(color->red, color->green, color->blue, alpha);
RectRenderCB(rect);