- int dst_x_final = dst_x + x * (g->width + c->stacked_xoffset);
- int dst_y_final = dst_y + y * (g->height + c->stacked_yoffset);
+ int src_x = src_x0;
+ int src_y = src_y0;
+ int dst_x = part->x + x * (g->width + c->stacked_xoffset);
+ int dst_y = part->y + y * (g->height + c->stacked_yoffset);
+ int cut_x = 0;
+ int cut_y = 0;
+ int width = g->width;
+ int height = g->height;
+
+ if (dst_x < 0)
+ {
+ width += dst_x;
+ cut_x = -dst_x;
+ dst_x = 0;
+ }
+ else if (dst_x > part->viewport_width - g->width)
+ {
+ width -= (dst_x - (part->viewport_width - g->width));
+ }
+
+ if (dst_y < 0)
+ {
+ height += dst_y;
+ cut_y = -dst_y;
+ dst_y = 0;
+ }
+ else if (dst_y > part->viewport_height - g->height)
+ {
+ height -= (dst_y - (part->viewport_height - g->height));
+ }
+
+ if (width <= 0 || height <= 0)
+ continue;
+
+ src_x += cut_x;
+ src_y += cut_y;
+
+ dst_x += part->viewport_x;
+ dst_y += part->viewport_y;