725 GetPrimitiveArrayCritical(env, glyphInfoPtrsArray, NULL)) == NULL)
726 {
727 free(xginfo);
728 free(gid);
729 return;
730 }
731
732 if ((pixelData = (unsigned char *)
733 (*env)->GetPrimitiveArrayCritical(env, pixelDataArray, NULL)) == NULL)
734 {
735 (*env)->ReleasePrimitiveArrayCritical(env,
736 glyphInfoPtrsArray, glyphInfoPtrs, JNI_ABORT);
737 free(xginfo);
738 free(gid);
739 return;
740 }
741
742 for (i=0; i < glyphCnt; i++) {
743 GlyphInfo *jginfo = (GlyphInfo *) jlong_to_ptr(glyphInfoPtrs[i]);
744
745 gid[i] = (Glyph) (0x0ffffffffL & ((unsigned long)(jginfo->cellInfo)));
746 xginfo[i].x = (-jginfo->topLeftX);
747 xginfo[i].y = (-jginfo->topLeftY);
748 xginfo[i].width = jginfo->width;
749 xginfo[i].height = jginfo->height;
750 xginfo[i].xOff = round(jginfo->advanceX);
751 xginfo[i].yOff = round(jginfo->advanceY);
752 }
753
754 XRenderAddGlyphs(awt_display, glyphSet, &gid[0], &xginfo[0], glyphCnt,
755 (const char*)pixelData, pixelDataLength);
756
757 (*env)->ReleasePrimitiveArrayCritical(env, glyphInfoPtrsArray, glyphInfoPtrs, JNI_ABORT);
758 (*env)->ReleasePrimitiveArrayCritical(env, pixelDataArray, pixelData, JNI_ABORT);
759
760 free(xginfo);
761 free(gid);
762 }
763
764 JNIEXPORT void JNICALL
765 Java_sun_java2d_xr_XRBackendNative_XRFreeGlyphsNative
|
725 GetPrimitiveArrayCritical(env, glyphInfoPtrsArray, NULL)) == NULL)
726 {
727 free(xginfo);
728 free(gid);
729 return;
730 }
731
732 if ((pixelData = (unsigned char *)
733 (*env)->GetPrimitiveArrayCritical(env, pixelDataArray, NULL)) == NULL)
734 {
735 (*env)->ReleasePrimitiveArrayCritical(env,
736 glyphInfoPtrsArray, glyphInfoPtrs, JNI_ABORT);
737 free(xginfo);
738 free(gid);
739 return;
740 }
741
742 for (i=0; i < glyphCnt; i++) {
743 GlyphInfo *jginfo = (GlyphInfo *) jlong_to_ptr(glyphInfoPtrs[i]);
744
745 // 'jginfo->cellInfo' is of type 'void*' (see definition of 'GlyphInfo' in fontscalerdefs.h)
746 // 'Glyph' is typedefed to 'unsigned long' (see http://www.x.org/releases/X11R7.7/doc/libXrender/libXrender.txt)
747 // Maybe we should assert that (sizeof(void*) == sizeof(Glyph)) ?
748 gid[i] = (Glyph) (jginfo->cellInfo);
749 xginfo[i].x = (-jginfo->topLeftX);
750 xginfo[i].y = (-jginfo->topLeftY);
751 xginfo[i].width = jginfo->width;
752 xginfo[i].height = jginfo->height;
753 xginfo[i].xOff = round(jginfo->advanceX);
754 xginfo[i].yOff = round(jginfo->advanceY);
755 }
756
757 XRenderAddGlyphs(awt_display, glyphSet, &gid[0], &xginfo[0], glyphCnt,
758 (const char*)pixelData, pixelDataLength);
759
760 (*env)->ReleasePrimitiveArrayCritical(env, glyphInfoPtrsArray, glyphInfoPtrs, JNI_ABORT);
761 (*env)->ReleasePrimitiveArrayCritical(env, pixelDataArray, pixelData, JNI_ABORT);
762
763 free(xginfo);
764 free(gid);
765 }
766
767 JNIEXPORT void JNICALL
768 Java_sun_java2d_xr_XRBackendNative_XRFreeGlyphsNative
|