diff options
-rw-r--r-- | generic/Curve.c | 139 |
1 files changed, 64 insertions, 75 deletions
diff --git a/generic/Curve.c b/generic/Curve.c index f1a836b..5942fda 100644 --- a/generic/Curve.c +++ b/generic/Curve.c @@ -70,7 +70,6 @@ static const char compile_id[]="$Compile: " __FILE__ " " __DATE__ " " __TIME__ " * ********************************************************************************** */ - typedef struct _CurveItemStruct { ItemStruct header; @@ -95,8 +94,6 @@ typedef struct _CurveItemStruct { /* Private data */ RadarImage tile; RadarList dev_points; - RadarList first_end_points; - RadarList last_end_points; RadarColorGradient gradient; } CurveItemStruct, *CurveItem; @@ -214,8 +211,6 @@ Init(Item item, #endif cv->dev_points = NULL; - cv->first_end_points = NULL; - cv->last_end_points = NULL; cv->gradient = NULL; /* Init attributes */ @@ -310,8 +305,6 @@ Clone(Item item) WidgetInfo *wi = item->wi; char *text; - cv->first_end_points = NULL; - cv->last_end_points = NULL; cv->dev_points = NULL; if (cv->gradient) { @@ -376,12 +369,6 @@ Destroy(Item item) if (cv->last_end) { LineEndDelete(cv->last_end); } - if (cv->first_end_points) { - RadarListFree(cv->first_end_points); - } - if (cv->last_end_points) { - RadarListFree(cv->last_end_points); - } if (cv->gradient) { RadarFreeColorGradient(cv->gradient); } @@ -611,13 +598,18 @@ ComputeCoordinates(Item item, * Process all points, skipping adjacent points that transform * to the same device location. */ - for (i = 0, j = 0; i < num_points; i++) { - /* Compute device coordinates */ + for (i = 0, j = 0; i < num_points; i++, j++) { + /* Compute device coordinates. + * Identical vertices are no longer skipped to allow a better control + * on Bezier curves and smoothing. + */ RadarTransformPoint(wi->current_transfo, &points[i], &dev_points[j]); - if ((j == 0) || (dev_points[j].x != dev_points[j-1].x) || + /* + if ((j == 0) || (dev_points[j].x != dev_points[j-1].x) || (dev_points[j].y != dev_points[j-1].y)) { j++; } + */ } /* @@ -746,7 +738,7 @@ ToArea(Item item, RadarBBox bbox; RadarPoint *points; RadarPoint end_points[LINE_END_POINTS]; - int num_points, result; + int num_points, result, result2; RadarList actual_points; if (cv->dev_points == NULL) { @@ -770,82 +762,80 @@ ToArea(Item item, if (ISSET(cv->flags, FILLED_OK)) { result = PolygonInBBox(points, num_points, area); - printf("filled = %d\n", result); if (result == 0) { return 0; } } - else { - result = -1; - } - printf("result1 = %d\n", result); + if (cv->line_width > 0) { if (ISCLEAR(cv->flags, RELIEF_OK)) { - if (PolylineInBBox(points, num_points, cv->line_width, - cv->cap_style, cv->join_style, area) != result) { - printf("overlap plain line\n"); - return 0; - } + result2 = PolylineInBBox(points, num_points, cv->line_width, + cv->cap_style, cv->join_style, area); } else { - if (PolygonReliefInBBox(actual_points, cv->line_width, area) != result) { - printf("overlap relief\n"); + result2 = PolygonReliefInBBox(actual_points, cv->line_width, area); + } + if (ISCLEAR(cv->flags, FILLED_OK)) { + if (result2 == 0) { return 0; } + result = result2; } - } - printf("result2 = %d\n", result); - - /* - * Check line ends. - */ - if (ISSET(cv->flags, FIRST_END_OK)) { - GetLineEnd(&points[0], &points[1], cv->line_width, cv->cap_style, - cv->first_end, end_points); - if (PolygonInBBox(end_points, LINE_END_POINTS, area) != result) { - return 0; - } - } - if (ISSET(cv->flags, LAST_END_OK)) { - GetLineEnd(&points[num_points-1], &points[num_points-2], cv->line_width, - cv->cap_style, cv->last_end, end_points); - if (PolygonInBBox(end_points, LINE_END_POINTS, area) != result) { + else if (result2 != result) { return 0; } - } - - /* - * Last, check markers - */ - if (ISSET(cv->flags, MARKER_OK)) { - int num_points, width, height; - RadarPoint *points; - - points = (RadarPoint *) RadarListArray(actual_points); - num_points = RadarListSize(actual_points); - + + /* + * Check line ends. + */ if (ISSET(cv->flags, FIRST_END_OK)) { - num_points--; - points++; - } - if (ISSET(cv->flags, LAST_END_OK) || - ((points[0].x == points[num_points-1].x) && - (points[0].y == points[num_points-1].y))) { - num_points--; + GetLineEnd(&points[0], &points[1], cv->line_width, cv->cap_style, + cv->first_end, end_points); + if (PolygonInBBox(end_points, LINE_END_POINTS, area) != result) { + return 0; + } } - - Tk_SizeOfBitmap(wi->dpy, cv->marker, &width, &height); - for (; num_points > 0; num_points--, points++) { - bbox.orig.x = points->x - (width+1)/2; - bbox.orig.y = points->y - (height+1)/2; - bbox.corner.x = bbox.orig.x + width; - bbox.corner.y = bbox.orig.y + height; - if (BBoxInBBox(&bbox, area) != result) { + if (ISSET(cv->flags, LAST_END_OK)) { + GetLineEnd(&points[num_points-1], &points[num_points-2], cv->line_width, + cv->cap_style, cv->last_end, end_points); + if (PolygonInBBox(end_points, LINE_END_POINTS, area) != result) { return 0; } } + + /* + * Last, check markers + */ + if (ISSET(cv->flags, MARKER_OK)) { + int num_points, width, height; + RadarPoint *points; + + points = (RadarPoint *) RadarListArray(actual_points); + num_points = RadarListSize(actual_points); + + if (ISSET(cv->flags, FIRST_END_OK)) { + num_points--; + points++; + } + if (ISSET(cv->flags, LAST_END_OK) || + ((points[0].x == points[num_points-1].x) && + (points[0].y == points[num_points-1].y))) { + num_points--; + } + + Tk_SizeOfBitmap(wi->dpy, cv->marker, &width, &height); + for (; num_points > 0; num_points--, points++) { + bbox.orig.x = points->x - (width+1)/2; + bbox.orig.y = points->y - (height+1)/2; + bbox.corner.x = bbox.orig.x + width; + bbox.corner.y = bbox.orig.y + height; + if (BBoxInBBox(&bbox, area) != result) { + return 0; + } + } + } } - + return result; } @@ -1128,7 +1118,6 @@ Pick(Item item, if (new_dist < dist) { dist = new_dist; } - if (dist <= 0.0) { return 0.0; } |