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
|