Hi Java 2D team, I recently discovered that it is possible to enable subpixel antialiasing with Java2D OpenGL pipeline. Today I realised, that I cannot use cr.openjdk.java.net anymore, so I would like to propose a fix as a diff.
The current version consist of three parts. 1. We are rendering glyphs in offscreen images using Quartz functions. This does not work without kCGBitmapByteOrder32Host mask. 2. We assume that subpixel antialiasing should not be used on a non-opaque surface. As I understand the vImage in CGLVolatileSurfaceManager is not related directly to our window. For a start, I have hardcoded Transparency.OPAQUE, but it requires much better understanding of the architecture to make a more proper solution. 3. When I started using CGGI_CopyImageFromCanvasToRGBInfo as a rendering mode, I had found that the little endian mode should be undefined. Again, it might be an improper way to do this. Thank you, Denis. diff -r f87c5be90e01 src/macosx/classes/sun/java2d/opengl/CGLVolatileSurfaceManager.java --- a/src/macosx/classes/sun/java2d/opengl/CGLVolatileSurfaceManager.java Fri Jun 20 10:15:30 2014 -0700 +++ b/src/macosx/classes/sun/java2d/opengl/CGLVolatileSurfaceManager.java Wed Jul 09 14:50:09 2014 +0400 @@ -108,7 +108,7 @@ } else { CGLGraphicsConfig gc = (CGLGraphicsConfig)vImg.getGraphicsConfig(); - ColorModel cm = gc.getColorModel(vImg.getTransparency()); + ColorModel cm = gc.getColorModel(Transparency.OPAQUE); int type = vImg.getForcedAccelSurfaceType(); // if acceleration type is forced (type != UNDEFINED) then // use the forced type, otherwise choose one based on caps diff -r f87c5be90e01 src/macosx/native/sun/font/CGGlyphImages.m --- a/src/macosx/native/sun/font/CGGlyphImages.m Fri Jun 20 10:15:30 2014 -0700 +++ b/src/macosx/native/sun/font/CGGlyphImages.m Wed Jul 09 14:50:09 2014 +0400 @@ -196,6 +196,8 @@ #pragma mark --- Font Rendering Mode Descriptors --- +#undef __LITTLE_ENDIAN__ + static inline void CGGI_CopyARGBPixelToRGBPixel(const UInt32 p, UInt8 *dst) { @@ -366,7 +368,8 @@ canvas->context = CGBitmapContextCreate(canvas->image->data, width, height, 8, bytesPerRow, colorSpace, - kCGImageAlphaPremultipliedFirst); + kCGImageAlphaPremultipliedFirst + | kCGBitmapByteOrder32Host); CGContextSetRGBFillColor(canvas->context, 0.0f, 0.0f, 0.0f, 1.0f); CGContextSetFontSize(canvas->context, 1);