}
void org::xwt::plat::X11$X11PixelBuffer::fastDrawPicture(org::xwt::Picture* s,
- jint dx1, jint dy1, jint dx2, jint dy2, jint sx1, jint sy1, jint sx2, jint sy2) {
+ jint dx, jint dy, jint cx1, jint cy1, jint cx2, jint cy2) {
org::xwt::plat::X11$X11Picture* source = (org::xwt::plat::X11$X11Picture*)s;
-
- // it's safe to clip manually since we no that no scaling will be done
- if (dx1 < clipx) { sx1 += ((clipx - dx1) * (sx2 - sx1)) / (dx2 - dx1); dx1 = clipx; }
- if (dy1 < clipy) { sy1 += ((clipy - dy1) * (sy2 - sy1)) / (dy2 - dy1); dy1 = clipy; }
- if (dx2 > clipx + clipw) { sx2 -= ((dx2 - clipx - clipw) * (sx2 - sx1)) / (dx2 - dx1); dx2 = clipx + clipw; }
- if (dy2 > clipy + cliph) { sy2 -= ((dy2 - clipy - cliph) * (sy2 - sy1)) / (dy2 - dy1); dy2 = clipy + cliph; }
- if (dx1 > clipx + clipw) return;
- if (dy1 > clipy + cliph) return;
- if (dx2 - dx1 <= 0 || dy2 - dy1 <= 0) return;
if (source->doublebuf->stipple != NULL) {
XSetClipMask(display, (*((GC*)clipped_gc)), *((Pixmap*)source->doublebuf->stipple));
- XSetClipOrigin(display, (*((GC*)clipped_gc)), dx1 - sx1, dy1 - sy1);
+ XSetClipOrigin(display, (*((GC*)clipped_gc)), cx1 - dx, cy1 - dy);
} else {
XSetClipMask(display, (*((GC*)clipped_gc)), None);
}
- XCopyArea(display, *((Pixmap*)source->doublebuf->pm), (*((Pixmap*)pm)), (*((GC*)clipped_gc)), sx1, sy1, sx2 - sx1, sy2 - sy1, dx1, dy1);
+ XCopyArea(display,
+ *((Pixmap*)source->doublebuf->pm), (*((Pixmap*)pm)), (*((GC*)clipped_gc)),
+ cx1 - dx, cy1 - dy, cx2 - cx1, cy2 - cy1, cx1, cy1);
}
void org::xwt::plat::X11$X11PixelBuffer::slowDrawPicture(org::xwt::Picture* s,
- jint dx1, jint dy1, jint dx2, jint dy2, jint sx1, jint sy1, jint sx2, jint sy2, int rgb, int alphaOnly) {
+ jint dx, jint dy, jint cx1, jint cy1, jint cx2, jint cy2,
+ jint rgb, jboolean alphaOnly) {
org::xwt::plat::X11$X11Picture* source = (org::xwt::plat::X11$X11Picture*)s;
XImage* xi;
// MEDIUM: write to a shared ximage, then ask the server to do the blit
} else if (shm_supported) {
- xi = XShmCreateImage(display, visual, colorDepth, ZPixmap, NULL, &shm_info, dx2 - dx1, dy2 - dy1);
+ xi = XShmCreateImage(display, visual, colorDepth, ZPixmap, NULL, &shm_info, cx2 - cx1, cy2 - cy1);
ensureShmSize(xi->bytes_per_line * xi->height);
xi->data = shm_info.shmaddr;
- XShmGetImage(display, (*((Pixmap*)pm)), xi, dx1, dy1, AllPlanes);
+ XShmGetImage(display, (*((Pixmap*)pm)), xi, cx1, cy1, AllPlanes);
// SLOWEST: write to an ximage, copy it through the TCP connection, ask the server to do the blit
} else {
- xi = XGetImage(display, (*((Pixmap*)pm)), dx1, dy1, dx2 - dx1, dy2 - dy1, AllPlanes, ZPixmap);
+ xi = XGetImage(display, (*((Pixmap*)pm)), cx1, cy1, cx2 - cx1, cy2 - cy1, AllPlanes, ZPixmap);
}
int* sourcedata = (int*)elements(source->data);
- for(int y=max(dy1, clipy); y<min(dy2, clipy + cliph); y++) {
-
+ for(int y=cy1; y < cy2; y++) {
+
char* current_pixel = (xi->data + y * xi->bytes_per_line) +
- (shared_pixmap ? max(dx1, clipx) * (xi->bits_per_pixel / 8) : - 1 * dy1 * xi->bytes_per_line);
+ (shared_pixmap ? cx1 * (xi->bits_per_pixel / 8) : - 1 * cy1 * xi->bytes_per_line);
- for(int x=max(dx1, clipx); x<min(dx2, clipx + clipw); x++, current_pixel += xi->bits_per_pixel / 8) {
- int source_x = ((x - dx1) * (sx2 - sx1)) / (dx2 - dx1) + sx1;
- int source_y = ((y - dy1) * (sy2 - sy1)) / (dy2 - dy1) + sy1;
-
- int sourcepixel = sourcedata[source_x + source_y * source->getWidth()];
- int alpha = (sourcepixel & 0xFF000000) >> 24;
+ for(int x=cx1; x < cx2; x++, current_pixel += xi->bits_per_pixel / 8) {
+ int source_x = x - dx;
+ int source_y = y - dy;
// FEATURE: be smarter here; can we do something better for the alphaonly case?
+ int sourcepixel = sourcedata[source_x + source_y * source->getWidth()];
+ int alpha = (sourcepixel & 0xFF000000) >> 24;
if (alphaOnly) sourcepixel = rgb;
int source_red = (sourcepixel & 0x00FF0000) >> 16;
int source_green = (sourcepixel & 0x0000FF00) >> 8;
// do nothing, we wrote directly to video memory
} else if (shm_supported) {
- XShmPutImage(display, (*((Pixmap*)pm)), (*((GC*)gc)), xi, 0, 0, dx1, dy1, dx2 - dx1, dy2 - dy1, False);
+ XShmPutImage(display, (*((Pixmap*)pm)), (*((GC*)gc)), xi, 0, 0, cx1, cy1, cx2 - cx1, cy2 - cy1, False);
XDestroyImage(xi);
} else {
- XPutImage(display, (*((Pixmap*)pm)), (*((GC*)gc)), xi, 0, 0, dx1, dy1, dx2 - dx1, dy2 - dy1);
+ XPutImage(display, (*((Pixmap*)pm)), (*((GC*)gc)), xi, 0, 0, cx1, cy1, cx2 - cx1, cy2 - cy1);
}
}
XSetWMNormalHints(display, (*((Window*)window)), &hints);
}
-void org::xwt::plat::X11$X11Surface::setSize (jint width, jint height) {
+void org::xwt::plat::X11$X11Surface::_setSize (jint width, jint height) {
if (width <= 0 || height <= 0) return;
XResizeWindow(display, (*((Window*)window)), width, height);
XFlush(display);