< prev index next >

src/java.desktop/unix/native/libawt_xawt/java2d/x11/XRBackendNative.c

Print this page
rev 52901 : 8233250: Better X11 rendering
Reviewed-by: prr, rhalade, mschoene, serb


 754  (JNIEnv *env, jclass cls, jint drawable, jlong gc, jbyteArray imageData,
 755   jint sx, jint sy, jint dx, jint dy, jint width, jint height,
 756   jint maskOff, jint maskScan, jfloat ea, jlong imgPtr) {
 757 
 758     int line, pix;
 759     char *mask;
 760     char *defaultData;
 761     XImage *defaultImg, *img;
 762     jboolean imageFits;
 763 
 764     if ((mask = (char *)
 765          (*env)->GetPrimitiveArrayCritical(env, imageData, NULL)) == NULL) {
 766         return;
 767      }
 768 
 769     defaultImg = (XImage *) jlong_to_ptr(imgPtr);
 770 
 771     if (ea != 1.0f) {
 772         for (line=0; line < height; line++) {
 773             for (pix=0; pix < width; pix++) {
 774                 int index = maskScan*line + pix + maskOff;
 775                 mask[index] = (((unsigned char) mask[index])*ea);
 776             }
 777         }
 778     }
 779 
 780     /*
 781     * 1. If existing XImage and supplied buffer match, only adjust the data pointer
 782     * 2. If existing XImage is large enough to hold the data but does not match in
 783     *    scan the data is copied to fit the XImage.
 784     * 3. If data is larger than the existing XImage a new temporary XImage is
 785     *    allocated.
 786     * The default XImage is optimized for the AA tiles, which are currently 32x32.
 787     */
 788     defaultData = defaultImg->data;
 789     img = defaultImg;
 790     imageFits = defaultImg->width >= width && defaultImg->height >= height;
 791 
 792     if (imageFits &&
 793         maskOff == defaultImg->xoffset && maskScan == defaultImg->bytes_per_line) {
 794         defaultImg->data = mask;
 795     } else {
 796         if (imageFits) {
 797             for (line=0; line < height; line++) {
 798                 for (pix=0; pix < width; pix++) {
 799                     img->data[line*img->bytes_per_line + pix] =
 800                         (unsigned char) (mask[maskScan*line + pix + maskOff]);
 801                 }
 802             }
 803         } else {
 804             img = XCreateImage(awt_display, NULL, 8, ZPixmap,
 805                                maskOff, mask, maskScan, height, 8, 0);
 806         }
 807     }
 808 
 809     XPutImage(awt_display, (Pixmap) drawable, (GC) jlong_to_ptr(gc),
 810               img, 0, 0, 0, 0, width, height);
 811     (*env)->ReleasePrimitiveArrayCritical(env, imageData, mask, JNI_ABORT);
 812 
 813     if (img != defaultImg) {
 814         img->data = NULL;
 815         XDestroyImage(img);
 816     }
 817     defaultImg->data = defaultData;
 818 }
 819 
 820 JNIEXPORT void JNICALL




 754  (JNIEnv *env, jclass cls, jint drawable, jlong gc, jbyteArray imageData,
 755   jint sx, jint sy, jint dx, jint dy, jint width, jint height,
 756   jint maskOff, jint maskScan, jfloat ea, jlong imgPtr) {
 757 
 758     int line, pix;
 759     char *mask;
 760     char *defaultData;
 761     XImage *defaultImg, *img;
 762     jboolean imageFits;
 763 
 764     if ((mask = (char *)
 765          (*env)->GetPrimitiveArrayCritical(env, imageData, NULL)) == NULL) {
 766         return;
 767      }
 768 
 769     defaultImg = (XImage *) jlong_to_ptr(imgPtr);
 770 
 771     if (ea != 1.0f) {
 772         for (line=0; line < height; line++) {
 773             for (pix=0; pix < width; pix++) {
 774                 size_t index = (size_t) maskScan * line + pix + maskOff;
 775                 mask[index] = (((unsigned char) mask[index])*ea);
 776             }
 777         }
 778     }
 779 
 780     /*
 781     * 1. If existing XImage and supplied buffer match, only adjust the data pointer
 782     * 2. If existing XImage is large enough to hold the data but does not match in
 783     *    scan the data is copied to fit the XImage.
 784     * 3. If data is larger than the existing XImage a new temporary XImage is
 785     *    allocated.
 786     * The default XImage is optimized for the AA tiles, which are currently 32x32.
 787     */
 788     defaultData = defaultImg->data;
 789     img = defaultImg;
 790     imageFits = defaultImg->width >= width && defaultImg->height >= height;
 791 
 792     if (imageFits &&
 793         maskOff == defaultImg->xoffset && maskScan == defaultImg->bytes_per_line) {
 794         defaultImg->data = mask;
 795     } else {
 796         if (imageFits) {
 797             for (line=0; line < height; line++) {
 798                 for (pix=0; pix < width; pix++) {
 799                     img->data[(size_t) line * img->bytes_per_line + pix] =
 800                         (unsigned char) (mask[(size_t) maskScan * line + pix + maskOff]);
 801                 }
 802             }
 803         } else {
 804             img = XCreateImage(awt_display, NULL, 8, ZPixmap,
 805                                maskOff, mask, maskScan, height, 8, 0);
 806         }
 807     }
 808 
 809     XPutImage(awt_display, (Pixmap) drawable, (GC) jlong_to_ptr(gc),
 810               img, 0, 0, 0, 0, width, height);
 811     (*env)->ReleasePrimitiveArrayCritical(env, imageData, mask, JNI_ABORT);
 812 
 813     if (img != defaultImg) {
 814         img->data = NULL;
 815         XDestroyImage(img);
 816     }
 817     defaultImg->data = defaultData;
 818 }
 819 
 820 JNIEXPORT void JNICALL


< prev index next >