+
+ return nentries;
+}
+
+/*
+ * Rotation code by Carlos Moreno
+ */
+
+// GRG: I've removed wxRotationPoint - we already have wxRealPoint which
+// does exactly the same thing. And I also got rid of wxRotationPixel
+// bacause of potential problems in architectures where alignment
+// is an issue, so I had to rewrite parts of the code.
+
+static const double gs_Epsilon = 1e-10;
+
+static inline int wxCint (double x)
+{
+ return (x > 0) ? (int) (x + 0.5) : (int) (x - 0.5);
+}
+
+
+// Auxiliary function to rotate a point (x,y) with respect to point p0
+// make it inline and use a straight return to facilitate optimization
+// also, the function receives the sine and cosine of the angle to avoid
+// repeating the time-consuming calls to these functions -- sin/cos can
+// be computed and stored in the calling function.
+
+inline wxRealPoint rotated_point (const wxRealPoint & p, double cos_angle, double sin_angle, const wxRealPoint & p0)
+{
+ return wxRealPoint (p0.x + (p.x - p0.x) * cos_angle - (p.y - p0.y) * sin_angle,
+ p0.y + (p.y - p0.y) * cos_angle + (p.x - p0.x) * sin_angle);
+}
+
+inline wxRealPoint rotated_point (double x, double y, double cos_angle, double sin_angle, const wxRealPoint & p0)
+{
+ return rotated_point (wxRealPoint(x,y), cos_angle, sin_angle, p0);
+}
+
+wxImage wxImage::Rotate(double angle, const wxPoint & centre_of_rotation, bool interpolating, wxPoint * offset_after_rotation) const
+{
+ int i;
+ angle = -angle; // screen coordinates are a mirror image of "real" coordinates
+
+ // Create pointer-based array to accelerate access to wxImage's data
+ unsigned char ** data = new unsigned char * [GetHeight()];
+
+ data[0] = GetData();
+
+ for (i = 1; i < GetHeight(); i++)
+ data[i] = data[i - 1] + (3 * GetWidth());
+
+ // precompute coefficients for rotation formula
+ // (sine and cosine of the angle)
+ const double cos_angle = cos(angle);
+ const double sin_angle = sin(angle);
+
+ // Create new Image to store the result
+ // First, find rectangle that covers the rotated image; to do that,
+ // rotate the four corners
+
+ const wxRealPoint p0(centre_of_rotation.x, centre_of_rotation.y);
+
+ wxRealPoint p1 = rotated_point (0, 0, cos_angle, sin_angle, p0);
+ wxRealPoint p2 = rotated_point (0, GetHeight(), cos_angle, sin_angle, p0);
+ wxRealPoint p3 = rotated_point (GetWidth(), 0, cos_angle, sin_angle, p0);
+ wxRealPoint p4 = rotated_point (GetWidth(), GetHeight(), cos_angle, sin_angle, p0);
+
+ int x1 = (int) floor (wxMin (wxMin(p1.x, p2.x), wxMin(p3.x, p4.x)));
+ int y1 = (int) floor (wxMin (wxMin(p1.y, p2.y), wxMin(p3.y, p4.y)));
+ int x2 = (int) ceil (wxMax (wxMax(p1.x, p2.x), wxMax(p3.x, p4.x)));
+ int y2 = (int) ceil (wxMax (wxMax(p1.y, p2.y), wxMax(p3.y, p4.y)));
+
+ wxImage rotated (x2 - x1 + 1, y2 - y1 + 1);
+
+ if (offset_after_rotation != NULL)