summaryrefslogtreecommitdiffstats
path: root/generic
diff options
context:
space:
mode:
Diffstat (limited to 'generic')
-rw-r--r--generic/tkCanvArc.c32
-rw-r--r--generic/tkCanvBmap.c13
-rw-r--r--generic/tkCanvImg.c13
-rw-r--r--generic/tkCanvLine.c19
-rw-r--r--generic/tkCanvPoly.c6
-rw-r--r--generic/tkCanvText.c7
-rw-r--r--generic/tkCanvUtil.c38
-rw-r--r--generic/tkCanvWind.c7
-rw-r--r--generic/tkInt.h3
-rw-r--r--generic/tkRectOval.c29
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);
}