Hello, Denis.
Thanks for this research!
On 09.07.2014 15:13, Denis Fokin wrote:
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.
I assume LCD hint does not work? this looks good.
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.
It is related to the CGLOffScreenSurfaceData, which is used as a surface
for VolatileImages. I check this code and looks like we ignore type of
the ColorModel and create a transparent native texture anyway.
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.
It seems __LITTLE_ENDIAN__usage in this file should be checked.
Thank you,
Denis.
diff -r f87c5be90e01
src/macosx/classes/sun/java2d/opengl/CGLVolatileSurfaceManager.java
---
a/src/macosx/classes/sun/java2d/opengl/CGLVolatileSurfaceManager.javaFri
Jun 20 10:15:30 2014 -0700
+++
b/src/macosx/classes/sun/java2d/opengl/CGLVolatileSurfaceManager.javaWed
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.mFri Jun 20 10:15:30
2014 -0700
+++ b/src/macosx/native/sun/font/ .mWed 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);
--
Best regards, Sergey.