+static boolean InClippedRectangle(Bitmap *bitmap, int *x, int *y,
+ int *width, int *height, boolean is_dest)
+{
+#if 1
+ int clip_x, clip_y, clip_width, clip_height;
+
+ if (gfx.clipping_enabled && is_dest) /* only clip destination bitmap */
+ {
+ clip_x = MIN(MAX(0, gfx.clip_x), bitmap->width);
+ clip_y = MIN(MAX(0, gfx.clip_y), bitmap->height);
+ clip_width = MIN(MAX(0, gfx.clip_width), bitmap->width - clip_x);
+ clip_height = MIN(MAX(0, gfx.clip_height), bitmap->height - clip_y);
+ }
+ else
+ {
+ clip_x = 0;
+ clip_y = 0;
+ clip_width = bitmap->width;
+ clip_height = bitmap->height;
+ }
+
+ /* skip if rectangle completely outside bitmap */
+
+ if (*x + *width <= clip_x ||
+ *y + *height <= clip_y ||
+ *x >= clip_x + clip_width ||
+ *y >= clip_y + clip_height)
+ return FALSE;
+
+ /* clip if rectangle overlaps bitmap */
+
+ if (*x < clip_x)
+ {
+ *width -= clip_x - *x;
+ *x = clip_x;
+ }
+ else if (*x + *width > clip_x + clip_width)
+ {
+ *width = clip_x + clip_width - *x;
+ }
+
+ if (*y < clip_y)
+ {
+ *height -= clip_y - *y;
+ *y = clip_y;
+ }
+ else if (*y + *height > clip_y + clip_height)
+ {
+ *height = clip_y + clip_height - *y;
+ }
+
+ return TRUE;
+
+#else
+
+ /* skip if rectangle completely outside bitmap */
+
+ if (*x + *width <= 0 ||
+ *y + *height <= 0 ||
+ *x >= bitmap->width ||
+ *y >= bitmap->height)
+ return FALSE;
+
+ /* clip if rectangle overlaps bitmap */
+
+ if (*x < 0)
+ {
+ *width += *x;
+ *x = 0;
+ }
+ else if (*x + *width > bitmap->width)
+ {
+ *width = bitmap->width - *x;
+ }
+
+ if (*y < 0)
+ {
+ *height += *y;
+ *y = 0;
+ }
+ else if (*y + *height > bitmap->height)
+ {
+ *height = bitmap->height - *y;
+ }
+
+ return TRUE;
+#endif
+}
+