< prev index next >
src/java.desktop/macosx/native/libawt_lwawt/font/CGGlyphImages.m
Print this page
*** 197,215 ****
#pragma mark --- Font Rendering Mode Descriptors ---
static inline void
CGGI_CopyARGBPixelToRGBPixel(const UInt32 p, UInt8 *dst)
{
! #if __LITTLE_ENDIAN__
! *(dst + 2) = 0xFF - (p >> 24 & 0xFF);
! *(dst + 1) = 0xFF - (p >> 16 & 0xFF);
! *(dst) = 0xFF - (p >> 8 & 0xFF);
! #else
! *(dst) = 0xFF - (p >> 16 & 0xFF);
! *(dst + 1) = 0xFF - (p >> 8 & 0xFF);
! *(dst + 2) = 0xFF - (p & 0xFF);
! #endif
}
static void
CGGI_CopyImageFromCanvasToRGBInfo(CGGI_GlyphCanvas *canvas, GlyphInfo *info)
{
--- 197,209 ----
#pragma mark --- Font Rendering Mode Descriptors ---
static inline void
CGGI_CopyARGBPixelToRGBPixel(const UInt32 p, UInt8 *dst)
{
! *(dst + 0) = 0xFF - (p >> 16 & 0xFF); // red
! *(dst + 1) = 0xFF - (p >> 8 & 0xFF); // green
! *(dst + 2) = 0xFF - (p & 0xFF); // blue
}
static void
CGGI_CopyImageFromCanvasToRGBInfo(CGGI_GlyphCanvas *canvas, GlyphInfo *info)
{
*** 314,338 ****
static inline CGGI_RenderingMode
CGGI_GetRenderingMode(const AWTStrike *strike)
{
CGGI_RenderingMode mode;
mode.cgFontMode = strike->fStyle;
switch (strike->fAAStyle) {
- case sun_awt_SunHints_INTVAL_TEXT_ANTIALIAS_DEFAULT:
case sun_awt_SunHints_INTVAL_TEXT_ANTIALIAS_OFF:
case sun_awt_SunHints_INTVAL_TEXT_ANTIALIAS_ON:
- case sun_awt_SunHints_INTVAL_TEXT_ANTIALIAS_GASP:
- default:
mode.glyphDescriptor = &grey;
break;
case sun_awt_SunHints_INTVAL_TEXT_ANTIALIAS_LCD_HRGB:
case sun_awt_SunHints_INTVAL_TEXT_ANTIALIAS_LCD_HBGR:
case sun_awt_SunHints_INTVAL_TEXT_ANTIALIAS_LCD_VRGB:
case sun_awt_SunHints_INTVAL_TEXT_ANTIALIAS_LCD_VBGR:
mode.glyphDescriptor = &rgb;
break;
}
return mode;
}
--- 308,338 ----
static inline CGGI_RenderingMode
CGGI_GetRenderingMode(const AWTStrike *strike)
{
CGGI_RenderingMode mode;
mode.cgFontMode = strike->fStyle;
+ NSException *e = nil;
switch (strike->fAAStyle) {
case sun_awt_SunHints_INTVAL_TEXT_ANTIALIAS_OFF:
case sun_awt_SunHints_INTVAL_TEXT_ANTIALIAS_ON:
mode.glyphDescriptor = &grey;
break;
case sun_awt_SunHints_INTVAL_TEXT_ANTIALIAS_LCD_HRGB:
case sun_awt_SunHints_INTVAL_TEXT_ANTIALIAS_LCD_HBGR:
case sun_awt_SunHints_INTVAL_TEXT_ANTIALIAS_LCD_VRGB:
case sun_awt_SunHints_INTVAL_TEXT_ANTIALIAS_LCD_VBGR:
mode.glyphDescriptor = &rgb;
break;
+ case sun_awt_SunHints_INTVAL_TEXT_ANTIALIAS_GASP:
+ case sun_awt_SunHints_INTVAL_TEXT_ANTIALIAS_DEFAULT:
+ default:
+ e = [NSException
+ exceptionWithName:@"IllegalArgumentException"
+ reason:@"Invalid hint value"
+ userInfo:nil];
+ @throw e;
}
return mode;
}
*** 343,353 ****
* Creates a new canvas of a fixed size, and initializes the CGContext as
* an 32-bit ARGB BitmapContext with some generic RGB color space.
*/
static inline void
CGGI_InitCanvas(CGGI_GlyphCanvas *canvas,
! const vImagePixelCount width, const vImagePixelCount height)
{
// our canvas is *always* 4-byte ARGB
size_t bytesPerRow = width * sizeof(UInt32);
size_t byteCount = bytesPerRow * height;
--- 343,354 ----
* Creates a new canvas of a fixed size, and initializes the CGContext as
* an 32-bit ARGB BitmapContext with some generic RGB color space.
*/
static inline void
CGGI_InitCanvas(CGGI_GlyphCanvas *canvas,
! const vImagePixelCount width, const vImagePixelCount height,
! const CGGI_RenderingMode* mode)
{
// our canvas is *always* 4-byte ARGB
size_t bytesPerRow = width * sizeof(UInt32);
size_t byteCount = bytesPerRow * height;
*** 360,374 ****
if (canvas->image->data == NULL) {
[[NSException exceptionWithName:NSMallocException
reason:@"Failed to allocate memory for the buffer which backs the CGContext for glyph strikes." userInfo:nil] raise];
}
CGColorSpaceRef colorSpace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB);
canvas->context = CGBitmapContextCreate(canvas->image->data,
width, height, 8, bytesPerRow,
colorSpace,
! kCGImageAlphaPremultipliedFirst);
CGContextSetRGBFillColor(canvas->context, 0.0f, 0.0f, 0.0f, 1.0f);
CGContextSetFontSize(canvas->context, 1);
CGContextSaveGState(canvas->context);
--- 361,380 ----
if (canvas->image->data == NULL) {
[[NSException exceptionWithName:NSMallocException
reason:@"Failed to allocate memory for the buffer which backs the CGContext for glyph strikes." userInfo:nil] raise];
}
+ uint32_t bmpInfo = kCGImageAlphaPremultipliedFirst;
+ if (mode->glyphDescriptor == &rgb) {
+ bmpInfo |= kCGBitmapByteOrder32Host;
+ }
+
CGColorSpaceRef colorSpace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB);
canvas->context = CGBitmapContextCreate(canvas->image->data,
width, height, 8, bytesPerRow,
colorSpace,
! bmpInfo);
CGContextSetRGBFillColor(canvas->context, 0.0f, 0.0f, 0.0f, 1.0f);
CGContextSetFontSize(canvas->context, 1);
CGContextSaveGState(canvas->context);
*** 402,412 ****
/*
* Quick and easy inline to check if this canvas is big enough.
*/
static inline void
! CGGI_SizeCanvas(CGGI_GlyphCanvas *canvas, const vImagePixelCount width, const vImagePixelCount height, const JRSFontRenderingStyle style)
{
if (canvas->image != NULL &&
width < canvas->image->width &&
height < canvas->image->height)
{
--- 408,418 ----
/*
* Quick and easy inline to check if this canvas is big enough.
*/
static inline void
! CGGI_SizeCanvas(CGGI_GlyphCanvas *canvas, const vImagePixelCount width, const vImagePixelCount height, const CGGI_RenderingMode* mode)
{
if (canvas->image != NULL &&
width < canvas->image->width &&
height < canvas->image->height)
{
*** 416,427 ****
// if we don't have enough space to strike the largest glyph in the
// run, resize the canvas
CGGI_FreeCanvas(canvas);
CGGI_InitCanvas(canvas,
width * CGGI_GLYPH_CANVAS_SLACK,
! height * CGGI_GLYPH_CANVAS_SLACK);
! JRSFontSetRenderingStyleOnContext(canvas->context, style);
}
/*
* Clear the canvas by blitting white only into the region of interest
* (the rect which we will copy out of once the glyph is struck).
--- 422,434 ----
// if we don't have enough space to strike the largest glyph in the
// run, resize the canvas
CGGI_FreeCanvas(canvas);
CGGI_InitCanvas(canvas,
width * CGGI_GLYPH_CANVAS_SLACK,
! height * CGGI_GLYPH_CANVAS_SLACK,
! mode);
! JRSFontSetRenderingStyleOnContext(canvas->context, mode->cgFontMode);
}
/*
* Clear the canvas by blitting white only into the region of interest
* (the rect which we will copy out of once the glyph is struck).
*** 575,585 ****
// create the Sun2D GlyphInfo we are going to strike into
GlyphInfo *info = CGGI_CreateNewGlyphInfoFrom(advance, bbox, strike, mode);
// fix the context size, just in case the substituted character is unexpectedly large
! CGGI_SizeCanvas(canvas, info->width, info->height, mode->cgFontMode);
// align the transform for the real CoreText strike
CGContextSetTextMatrix(canvas->context, strike->fAltTx);
const CGFontRef cgFallback = CTFontCopyGraphicsFont(fallback, NULL);
--- 582,592 ----
// create the Sun2D GlyphInfo we are going to strike into
GlyphInfo *info = CGGI_CreateNewGlyphInfoFrom(advance, bbox, strike, mode);
// fix the context size, just in case the substituted character is unexpectedly large
! CGGI_SizeCanvas(canvas, info->width, info->height, mode);
// align the transform for the real CoreText strike
CGContextSetTextMatrix(canvas->context, strike->fAltTx);
const CGFontRef cgFallback = CTFontCopyGraphicsFont(fallback, NULL);
*** 651,662 ****
DUMP_IMG_PIXELS("CGGI Canvas", canvas->image);
PRINT_CGSTATES_INFO(canvas->context);
#endif
}
! static NSString *threadLocalCanvasKey =
! @"Java CoreGraphics Text Renderer Cached Canvas";
/*
* This is the maximum length and height times the above slack squared
* to determine if we go with the global canvas, or malloc one on the spot.
*/
--- 658,672 ----
DUMP_IMG_PIXELS("CGGI Canvas", canvas->image);
PRINT_CGSTATES_INFO(canvas->context);
#endif
}
! static NSString *threadLocalAACanvasKey =
! @"Java CoreGraphics Text Renderer Cached Canvas for AA";
!
! static NSString *threadLocalLCDCanvasKey =
! @"Java CoreGraphics Text Renderer Cached Canvas for LCD";
/*
* This is the maximum length and height times the above slack squared
* to determine if we go with the global canvas, or malloc one on the spot.
*/
*** 676,686 ****
{
if (maxWidth*maxHeight*CGGI_GLYPH_CANVAS_SLACK*CGGI_GLYPH_CANVAS_SLACK >
CGGI_GLYPH_CANVAS_MAX*CGGI_GLYPH_CANVAS_MAX*CGGI_GLYPH_CANVAS_SLACK*CGGI_GLYPH_CANVAS_SLACK)
{
CGGI_GlyphCanvas *tmpCanvas = [[CGGI_GlyphCanvas alloc] init];
! CGGI_InitCanvas(tmpCanvas, maxWidth, maxHeight);
CGGI_FillImagesForGlyphsWithSizedCanvas(tmpCanvas, strike,
mode, glyphInfos, uniChars,
glyphs, len);
CGGI_FreeCanvas(tmpCanvas);
--- 686,696 ----
{
if (maxWidth*maxHeight*CGGI_GLYPH_CANVAS_SLACK*CGGI_GLYPH_CANVAS_SLACK >
CGGI_GLYPH_CANVAS_MAX*CGGI_GLYPH_CANVAS_MAX*CGGI_GLYPH_CANVAS_SLACK*CGGI_GLYPH_CANVAS_SLACK)
{
CGGI_GlyphCanvas *tmpCanvas = [[CGGI_GlyphCanvas alloc] init];
! CGGI_InitCanvas(tmpCanvas, maxWidth, maxHeight, mode);
CGGI_FillImagesForGlyphsWithSizedCanvas(tmpCanvas, strike,
mode, glyphInfos, uniChars,
glyphs, len);
CGGI_FreeCanvas(tmpCanvas);
*** 688,704 ****
return;
}
NSMutableDictionary *threadDict =
[[NSThread currentThread] threadDictionary];
! CGGI_GlyphCanvas *canvas = [threadDict objectForKey:threadLocalCanvasKey];
if (canvas == nil) {
canvas = [[CGGI_GlyphCanvas alloc] init];
! [threadDict setObject:canvas forKey:threadLocalCanvasKey];
}
! CGGI_SizeCanvas(canvas, maxWidth, maxHeight, mode->cgFontMode);
CGGI_FillImagesForGlyphsWithSizedCanvas(canvas, strike, mode,
glyphInfos, uniChars, glyphs, len);
}
/*
--- 698,723 ----
return;
}
NSMutableDictionary *threadDict =
[[NSThread currentThread] threadDictionary];
!
! NSString* theKey;
!
! if (mode->glyphDescriptor == &rgb) {
! theKey = threadLocalLCDCanvasKey;
! } else {
! theKey = threadLocalAACanvasKey;
! }
!
! CGGI_GlyphCanvas *canvas = [threadDict objectForKey:theKey];
if (canvas == nil) {
canvas = [[CGGI_GlyphCanvas alloc] init];
! [threadDict setObject:canvas forKey:theKey];
}
! CGGI_SizeCanvas(canvas, maxWidth, maxHeight, mode);
CGGI_FillImagesForGlyphsWithSizedCanvas(canvas, strike, mode,
glyphInfos, uniChars, glyphs, len);
}
/*
< prev index next >