diff options
Diffstat (limited to 'generic')
-rw-r--r-- | generic/tkCanvArc.c | 32 | ||||
-rw-r--r-- | generic/tkCanvBmap.c | 13 | ||||
-rw-r--r-- | generic/tkCanvImg.c | 13 | ||||
-rw-r--r-- | generic/tkCanvLine.c | 19 | ||||
-rw-r--r-- | generic/tkCanvPoly.c | 6 | ||||
-rw-r--r-- | generic/tkCanvText.c | 7 | ||||
-rw-r--r-- | generic/tkCanvUtil.c | 38 | ||||
-rw-r--r-- | generic/tkCanvWind.c | 7 | ||||
-rw-r--r-- | generic/tkInt.h | 3 | ||||
-rw-r--r-- | generic/tkRectOval.c | 29 |
10 files changed, 82 insertions, 85 deletions
diff --git a/generic/tkCanvArc.c b/generic/tkCanvArc.c index ca9ef34..3741829 100644 --- a/generic/tkCanvArc.c +++ b/generic/tkCanvArc.c @@ -1520,23 +1520,21 @@ RotateArc( double angleRad) { ArcItem *arcPtr = (ArcItem *) itemPtr; - double x, y, nx, ny; - double s = sin(angleRad); - double c = cos(angleRad); - - x = arcPtr->bbox[0] - originX; - y = arcPtr->bbox[1] - originY; - nx = x * c - y * s; - ny = x * s + y * c; - arcPtr->bbox[0] = nx + originX; - arcPtr->bbox[1] = ny + originY; - - x = arcPtr->bbox[2] - originX; - y = arcPtr->bbox[3] - originY; - nx = x * c - y * s; - ny = x * s + y * c; - arcPtr->bbox[2] = nx + originX; - arcPtr->bbox[3] = ny + originY; + double s = sin(angleRad), c = cos(angleRad); + double coords[4]; + + memcpy(coords, arcPtr->bbox, sizeof(coords)); + TkRotatePoint(originX, originY, s, c, &coords[0], &coords[1]); + TkRotatePoint(originX, originY, s, c, &coords[2], &coords[3]); + + /* + * Sort the points for the bounding box. + */ + + arcPtr->bbox[0] = (coords[0] < coords[2]) ? coords[0] : coords[2]; + arcPtr->bbox[1] = (coords[1] < coords[3]) ? coords[1] : coords[3]; + arcPtr->bbox[2] = (coords[0] < coords[2]) ? coords[2] : coords[0]; + arcPtr->bbox[3] = (coords[1] < coords[3]) ? coords[3] : coords[1]; /* * TODO: update the arc endpoints? diff --git a/generic/tkCanvBmap.c b/generic/tkCanvBmap.c index 948379d..34c74f3 100644 --- a/generic/tkCanvBmap.c +++ b/generic/tkCanvBmap.c @@ -817,16 +817,9 @@ RotateBitmap( double angleRad) { BitmapItem *bmapPtr = (BitmapItem *) itemPtr; - double x, y, nx, ny; - double s = sin(angleRad); - double c = cos(angleRad); - - x = bmapPtr->x - originX; - y = bmapPtr->y - originY; - nx = x * c - y * s; - ny = x * s + y * c; - bmapPtr->x = nx + originX; - bmapPtr->y = ny + originY; + + TkRotatePoint(originX, originY, sin(angleRad), cos(angleRad), + &bmapPtr->x, &bmapPtr->y); ComputeBitmapBbox(canvas, bmapPtr); } diff --git a/generic/tkCanvImg.c b/generic/tkCanvImg.c index 20fcd52..f2b73a6 100644 --- a/generic/tkCanvImg.c +++ b/generic/tkCanvImg.c @@ -789,16 +789,9 @@ RotateImage( double angleRad) { ImageItem *imgPtr = (ImageItem *) itemPtr; - double x, y, nx, ny; - double s = sin(angleRad); - double c = cos(angleRad); - - x = imgPtr->x - originX; - y = imgPtr->y - originY; - nx = x * c - y * s; - ny = x * s + y * c; - imgPtr->x = nx + originX; - imgPtr->y = ny + originY; + + TkRotatePoint(originX, originY, sin(angleRad), cos(angleRad), + &imgPtr->x, &imgPtr->y); ComputeImageBbox(canvas, imgPtr); } diff --git a/generic/tkCanvLine.c b/generic/tkCanvLine.c index ce4d40d..3f8f5c1 100644 --- a/generic/tkCanvLine.c +++ b/generic/tkCanvLine.c @@ -1875,19 +1875,6 @@ TranslateLine( *-------------------------------------------------------------- */ -static inline void -DoRotate( - double originX, double originY, - double sine, double cosine, - double *xPtr, double *yPtr) -{ - double x = *xPtr - originX; - double y = *yPtr - originY; - - *xPtr = originX + x * cosine - y * sine; - *yPtr = originY + x * sine + y * cosine; -} - static void RotateLine( Tk_Canvas canvas, /* Canvas containing item. */ @@ -1902,18 +1889,18 @@ RotateLine( for (i = 0, coordPtr = linePtr->coordPtr; i < linePtr->numPoints; i++, coordPtr += 2) { - DoRotate(originX, originY, s, c, &coordPtr[0], &coordPtr[1]); + TkRotatePoint(originX, originY, s, c, &coordPtr[0], &coordPtr[1]); } if (linePtr->firstArrowPtr != NULL) { for (i = 0, coordPtr = linePtr->firstArrowPtr; i < PTS_IN_ARROW; i++, coordPtr += 2) { - DoRotate(originX, originY, s, c, &coordPtr[0], &coordPtr[1]); + TkRotatePoint(originX, originY, s, c, &coordPtr[0], &coordPtr[1]); } } if (linePtr->lastArrowPtr != NULL) { for (i = 0, coordPtr = linePtr->lastArrowPtr; i < PTS_IN_ARROW; i++, coordPtr += 2) { - DoRotate(originX, originY, s, c, &coordPtr[0], &coordPtr[1]); + TkRotatePoint(originX, originY, s, c, &coordPtr[0], &coordPtr[1]); } } ComputeLineBbox(canvas, linePtr); diff --git a/generic/tkCanvPoly.c b/generic/tkCanvPoly.c index ae18067..1677bbb 100644 --- a/generic/tkCanvPoly.c +++ b/generic/tkCanvPoly.c @@ -1771,11 +1771,7 @@ RotatePolygon( for (i = 0, coordPtr = polyPtr->coordPtr; i < polyPtr->numPoints; i++, coordPtr += 2) { - double x = coordPtr[0] - originX; - double y = coordPtr[1] - originY; - - coordPtr[0] = originX + x * c - y * s; - coordPtr[1] = originY + x * s + y * c; + TkRotatePoint(originX, originY, s, c, &coordPtr[0], &coordPtr[1]); } ComputePolygonBbox(canvas, polyPtr); } diff --git a/generic/tkCanvText.c b/generic/tkCanvText.c index 22b6dea..4f446ec 100644 --- a/generic/tkCanvText.c +++ b/generic/tkCanvText.c @@ -1277,12 +1277,9 @@ RotateText( double angleRad) /* Amount by which item is to be rotated. */ { TextItem *textPtr = (TextItem *) itemPtr; - double s = sin(angleRad), c = cos(angleRad); - double x = textPtr->x - originX; - double y = textPtr->y - originY; - textPtr->x = originX + x * c - y * s; - textPtr->y = originY + x * s + y * c; + TkRotatePoint(originX, originY, sin(angleRad), cos(angleRad), + &textPtr->x, &textPtr->y); ComputeTextBbox(canvas, textPtr); } diff --git a/generic/tkCanvUtil.c b/generic/tkCanvUtil.c index 6ce671d..52d7bf6 100644 --- a/generic/tkCanvUtil.c +++ b/generic/tkCanvUtil.c @@ -1265,7 +1265,6 @@ Tk_ChangeOutlineGC( } return 0; } - /* *-------------------------------------------------------------- @@ -1865,6 +1864,43 @@ TkCanvTranslatePath( } /* + *-------------------------------------------------------------- + * + * TkRotatePoint -- + * + * Rotate a point about another point. The angle should be converted into + * its sine and cosine before calling this function. + * + * Results: + * None + * + * Side effects: + * The point in (*xPtr,*yPtr) is updated to be rotated about + * (originX,originY) by the amount given by the sine and cosine of the + * angle to rotate. + * + *-------------------------------------------------------------- + */ + +void +TkRotatePoint( + double originX, double originY, /* The point about which to rotate. */ + double sine, double cosine, /* How much to rotate? */ + double *xPtr, double *yPtr) /* The point to be rotated. (INOUT) */ +{ + double x = *xPtr - originX; + double y = *yPtr - originY; + + /* + * Beware! The canvas coordinate space is flipped vertically, so rotations + * go the "wrong" way with respect to mathematics. + */ + + *xPtr = originX + x * cosine + y * sine; + *yPtr = originY - x * sine + y * cosine; +} + +/* * Local Variables: * mode: c * c-basic-offset: 4 diff --git a/generic/tkCanvWind.c b/generic/tkCanvWind.c index 8c44a6c..9f38932 100644 --- a/generic/tkCanvWind.c +++ b/generic/tkCanvWind.c @@ -943,12 +943,9 @@ RotateWinItem( double angleRad) /* Amount by which item is to be rotated. */ { WindowItem *winItemPtr = (WindowItem *) itemPtr; - double s = sin(angleRad), c = cos(angleRad); - double x = winItemPtr->x - originX; - double y = winItemPtr->y - originY; - winItemPtr->x = originX + x * c - y * s; - winItemPtr->y = originY + x * s + y * c; + TkRotatePoint(originX, originY, sin(angleRad), cos(angleRad), + &winItemPtr->x, &winItemPtr->y); ComputeWindowBbox(canvas, winItemPtr); } diff --git a/generic/tkInt.h b/generic/tkInt.h index 767bbbb..9c6a28f 100644 --- a/generic/tkInt.h +++ b/generic/tkInt.h @@ -1259,6 +1259,9 @@ MODULE_SCOPE void TkpCancelWarp(TkDisplay *dispPtr); MODULE_SCOPE int TkListCreateFrame(ClientData clientData, Tcl_Interp *interp, Tcl_Obj *listObj, int toplevel, Tcl_Obj *nameObj); +MODULE_SCOPE void TkRotatePoint(double originX, double originY, + double sine, double cosine, double *xPtr, + double *yPtr); #ifdef _WIN32 #define TkParseColor XParseColor diff --git a/generic/tkRectOval.c b/generic/tkRectOval.c index b1bce7b..279e89e 100644 --- a/generic/tkRectOval.c +++ b/generic/tkRectOval.c @@ -1306,19 +1306,6 @@ OvalToArea( *-------------------------------------------------------------- */ -static inline void -DoRotate( - double originX, double originY, - double sine, double cosine, - double *xPtr, double *yPtr) -{ - double x = *xPtr - originX; - double y = *yPtr - originY; - - *xPtr = originX + x * cosine - y * sine; - *yPtr = originY + x * sine + y * cosine; -} - static void RotateRectOval( Tk_Canvas canvas, /* Canvas containing rectangle. */ @@ -1329,10 +1316,20 @@ RotateRectOval( { RectOvalItem *rectOvalPtr = (RectOvalItem *) itemPtr; double s = sin(angleRad), c = cos(angleRad); - double *coords = rectOvalPtr->bbox; + double coords[4]; + + memcpy(coords, rectOvalPtr->bbox, sizeof(coords)); + TkRotatePoint(originX, originY, s, c, &coords[0], &coords[1]); + TkRotatePoint(originX, originY, s, c, &coords[2], &coords[3]); + + /* + * Sort the points for the bounding box. + */ - DoRotate(originX, originY, s, c, &coords[0], &coords[1]); - DoRotate(originX, originY, s, c, &coords[2], &coords[3]); + rectOvalPtr->bbox[0] = (coords[0] < coords[2]) ? coords[0] : coords[2]; + rectOvalPtr->bbox[1] = (coords[1] < coords[3]) ? coords[1] : coords[3]; + rectOvalPtr->bbox[2] = (coords[0] < coords[2]) ? coords[2] : coords[0]; + rectOvalPtr->bbox[3] = (coords[1] < coords[3]) ? coords[3] : coords[1]; ComputeRectOvalBbox(canvas, rectOvalPtr); } |