Mercurial > hg > release > icedtea6-1.11
changeset 2631:73e0d37b9ec3
S6679308: Poor text rendering on translucent image
author | ptisnovs |
---|---|
date | Fri, 01 Jul 2011 14:41:45 +0200 |
parents | 643ec5879fdd |
children | bfbd7ccaa20c 5deef52b5a9c |
files | ChangeLog Makefile.am NEWS patches/openjdk/6679308-Poor_text_rendering_on_translucent_image.patch |
diffstat | 4 files changed, 545 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/ChangeLog Fri Jul 01 11:22:01 2011 +0200 +++ b/ChangeLog Fri Jul 01 14:41:45 2011 +0200 @@ -1,3 +1,10 @@ +2011-07-01 Pavel Tisnovsky <ptisnovs@redhat.com> + + * Makefile.am: added new patches + * NEWS: updated with backports + * patches/openjdk/6679308-Poor_text_rendering_on_translucent_image.patch: + Backport of 6679308. + 2011-07-01 Pavel Tisnovsky <ptisnovs@redhat.com> * Makefile.am: added new patch
--- a/Makefile.am Fri Jul 01 11:22:01 2011 +0200 +++ b/Makefile.am Fri Jul 01 14:41:45 2011 +0200 @@ -373,7 +373,8 @@ patches/openjdk/6785424-SecurityException_locating_physical_fonts.patch \ patches/openjdk/7047069-Array_can_dynamically_change_size.patch \ patches/openjdk/6796786-invalid_FP_identity_transform.patch \ - patches/openjdk/7042070-Typo_in_Test6796786.patch + patches/openjdk/7042070-Typo_in_Test6796786.patch \ + patches/openjdk/6679308-Poor_text_rendering_on_translucent_image.patch if WITH_ALT_HSBUILD ICEDTEA_PATCHES += \
--- a/NEWS Fri Jul 01 11:22:01 2011 +0200 +++ b/NEWS Fri Jul 01 14:41:45 2011 +0200 @@ -45,6 +45,7 @@ - S6796786: invalid FP identity transform - (a - b) -> b - a - S7042070: Typo in Test6796786.java - S7029152: Ideal nodes for String intrinsics miss memory edge optimization + - S6679308: Poor text rendering on translucent image * Bug fixes - PR637: make check should exit with an error code if any regression test failed. - G356743: Support libpng 1.5.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/patches/openjdk/6679308-Poor_text_rendering_on_translucent_image.patch Fri Jul 01 14:41:45 2011 +0200 @@ -0,0 +1,535 @@ +# HG changeset patch +# User prr +# Date 1209423466 25200 +# Node ID d7accc312aec0905bb1ad1685c8aa8f66cfd84cb +# Parent f50304904b8f181be07595be0e88416186001088 +6679308: Poor text rendering on translucent image. +Reviewed-by: flar, campbell + +diff -r f50304904b8f -r d7accc312aec src/share/native/sun/java2d/loops/AlphaMacros.h +--- openjdk.orig/jdk/src/share/native/sun/java2d/loops/AlphaMacros.h Mon Apr 28 11:06:18 2008 -0700 ++++ openjdk/jdk/src/share/native/sun/java2d/loops/AlphaMacros.h Mon Apr 28 15:57:46 2008 -0700 +@@ -416,7 +416,8 @@ + MultiplyAndStore ## STRATEGY ## Comps(res, \ + srcF, res);\ + } \ +- if (!(DST ## IsPremultiplied) && resA && \ ++ if (!(DST ## IsOpaque) && \ ++ !(DST ## IsPremultiplied) && resA && \ + resA < MaxValFor ## STRATEGY) \ + { \ + DivideAndStore ## STRATEGY ## Comps(res, \ +@@ -475,7 +476,8 @@ + MultiplyAndStore ## STRATEGY ## Comps(res, \ + srcF, res); \ + } \ +- if (!(DST ## IsPremultiplied) && resA && \ ++ if (!(DST ## IsOpaque) && \ ++ !(DST ## IsPremultiplied) && resA && \ + resA < MaxValFor ## STRATEGY) \ + { \ + DivideAndStore ## STRATEGY ## Comps(res, res, resA); \ +@@ -797,7 +799,8 @@ + Store ## STRATEGY ## CompsUsingOp(res, +=, tmp); \ + } \ + } \ +- if (!(TYPE ## IsPremultiplied) && resA && \ ++ if (!(TYPE ## IsOpaque) && \ ++ !(TYPE ## IsPremultiplied) && resA && \ + resA < MaxValFor ## STRATEGY) \ + { \ + DivideAndStore ## STRATEGY ## Comps(res, res, resA); \ +@@ -831,7 +834,8 @@ + Postload ## STRATEGY ## From ## TYPE(pRas, DstPix, res); \ + MultiplyAddAndStore ## STRATEGY ## Comps(res, \ + dstF, res, src); \ +- if (!(TYPE ## IsPremultiplied) && resA && \ ++ if (!(TYPE ## IsOpaque) && \ ++ !(TYPE ## IsPremultiplied) && resA && \ + resA < MaxValFor ## STRATEGY) \ + { \ + DivideAndStore ## STRATEGY ## Comps(res, res, resA); \ +diff -r f50304904b8f -r d7accc312aec src/share/native/sun/java2d/loops/ByteGray.h +--- openjdk.orig/jdk/src/share/native/sun/java2d/loops/ByteGray.h Mon Apr 28 11:06:18 2008 -0700 ++++ openjdk/jdk/src/share/native/sun/java2d/loops/ByteGray.h Mon Apr 28 15:57:46 2008 -0700 +@@ -36,6 +36,8 @@ + typedef jubyte ByteGrayPixelType; + typedef jubyte ByteGrayDataType; + ++#define ByteGrayIsOpaque 1 ++ + #define ByteGrayPixelStride 1 + #define ByteGrayBitsPerPixel 8 + +diff -r f50304904b8f -r d7accc312aec src/share/native/sun/java2d/loops/FourByteAbgr.h +--- openjdk.orig/jdk/src/share/native/sun/java2d/loops/FourByteAbgr.h Mon Apr 28 11:06:18 2008 -0700 ++++ openjdk/jdk/src/share/native/sun/java2d/loops/FourByteAbgr.h Mon Apr 28 15:57:46 2008 -0700 +@@ -34,6 +34,8 @@ + typedef jint FourByteAbgrPixelType; + typedef jubyte FourByteAbgrDataType; + ++#define FourByteAbgrIsOpaque 0 ++ + #define FourByteAbgrPixelStride 4 + + #define DeclareFourByteAbgrLoadVars(PREFIX) +diff -r f50304904b8f -r d7accc312aec src/share/native/sun/java2d/loops/FourByteAbgrPre.h +--- openjdk.orig/jdk/src/share/native/sun/java2d/loops/FourByteAbgrPre.h Mon Apr 28 11:06:18 2008 -0700 ++++ openjdk/jdk/src/share/native/sun/java2d/loops/FourByteAbgrPre.h Mon Apr 28 15:57:46 2008 -0700 +@@ -34,6 +34,8 @@ + typedef jint FourByteAbgrPrePixelType; + typedef jubyte FourByteAbgrPreDataType; + ++#define FourByteAbgrPreIsOpaque 0 ++ + #define FourByteAbgrPrePixelStride 4 + + #define DeclareFourByteAbgrPreLoadVars(PREFIX) +diff -r f50304904b8f -r d7accc312aec src/share/native/sun/java2d/loops/Index12Gray.h +--- openjdk.orig/jdk/src/share/native/sun/java2d/loops/Index12Gray.h Mon Apr 28 11:06:18 2008 -0700 ++++ openjdk/jdk/src/share/native/sun/java2d/loops/Index12Gray.h Mon Apr 28 15:57:46 2008 -0700 +@@ -37,6 +37,8 @@ + typedef jushort Index12GrayPixelType; + typedef jushort Index12GrayDataType; + ++#define Index12GrayIsOpaque 1 ++ + #define Index12GrayPixelStride 2 + #define Index12GrayBitsPerPixel 12 + +diff -r f50304904b8f -r d7accc312aec src/share/native/sun/java2d/loops/Index8Gray.h +--- openjdk.orig/jdk/src/share/native/sun/java2d/loops/Index8Gray.h Mon Apr 28 11:06:18 2008 -0700 ++++ openjdk/jdk/src/share/native/sun/java2d/loops/Index8Gray.h Mon Apr 28 15:57:46 2008 -0700 +@@ -37,6 +37,8 @@ + typedef jubyte Index8GrayPixelType; + typedef jubyte Index8GrayDataType; + ++#define Index8GrayIsOpaque 1 ++ + #define Index8GrayPixelStride 1 + #define Index8GrayBitsPerPixel 8 + +diff -r f50304904b8f -r d7accc312aec src/share/native/sun/java2d/loops/IntArgb.h +--- openjdk.orig/jdk/src/share/native/sun/java2d/loops/IntArgb.h Mon Apr 28 11:06:18 2008 -0700 ++++ openjdk/jdk/src/share/native/sun/java2d/loops/IntArgb.h Mon Apr 28 15:57:46 2008 -0700 +@@ -38,6 +38,8 @@ + typedef jint IntArgbPixelType; + typedef jint IntArgbDataType; + ++#define IntArgbIsOpaque 0 ++ + #define IntArgbPixelStride 4 + + #define DeclareIntArgbLoadVars(PREFIX) +diff -r f50304904b8f -r d7accc312aec src/share/native/sun/java2d/loops/IntArgbBm.h +--- openjdk.orig/jdk/src/share/native/sun/java2d/loops/IntArgbBm.h Mon Apr 28 11:06:18 2008 -0700 ++++ openjdk/jdk/src/share/native/sun/java2d/loops/IntArgbBm.h Mon Apr 28 15:57:46 2008 -0700 +@@ -38,6 +38,8 @@ + typedef jint IntArgbBmPixelType; + typedef jint IntArgbBmDataType; + ++#define IntArgbBmIsOpaque 0 ++ + #define IntArgbBmPixelStride 4 + + #define DeclareIntArgbBmLoadVars(PREFIX) +diff -r f50304904b8f -r d7accc312aec src/share/native/sun/java2d/loops/IntArgbPre.h +--- openjdk.orig/jdk/src/share/native/sun/java2d/loops/IntArgbPre.h Mon Apr 28 11:06:18 2008 -0700 ++++ openjdk/jdk/src/share/native/sun/java2d/loops/IntArgbPre.h Mon Apr 28 15:57:46 2008 -0700 +@@ -36,6 +36,8 @@ + typedef jint IntArgbPrePixelType; + typedef jint IntArgbPreDataType; + ++#define IntArgbPreIsOpaque 0 ++ + #define IntArgbPrePixelStride 4 + + #define DeclareIntArgbPreLoadVars(PREFIX) +diff -r f50304904b8f -r d7accc312aec src/share/native/sun/java2d/loops/IntBgr.h +--- openjdk.orig/jdk/src/share/native/sun/java2d/loops/IntBgr.h Mon Apr 28 11:06:18 2008 -0700 ++++ openjdk/jdk/src/share/native/sun/java2d/loops/IntBgr.h Mon Apr 28 15:57:46 2008 -0700 +@@ -38,6 +38,8 @@ + typedef jint IntBgrPixelType; + typedef jint IntBgrDataType; + ++#define IntBgrIsOpaque 1 ++ + #define IntBgrPixelStride 4 + + #define DeclareIntBgrLoadVars(PREFIX) +diff -r f50304904b8f -r d7accc312aec src/share/native/sun/java2d/loops/IntRgb.h +--- openjdk.orig/jdk/src/share/native/sun/java2d/loops/IntRgb.h Mon Apr 28 11:06:18 2008 -0700 ++++ openjdk/jdk/src/share/native/sun/java2d/loops/IntRgb.h Mon Apr 28 15:57:46 2008 -0700 +@@ -38,6 +38,8 @@ + typedef jint IntRgbPixelType; + typedef jint IntRgbDataType; + ++#define IntRgbIsOpaque 1 ++ + #define IntRgbPixelStride 4 + + #define DeclareIntRgbLoadVars(PREFIX) +diff -r f50304904b8f -r d7accc312aec src/share/native/sun/java2d/loops/IntRgbx.h +--- openjdk.orig/jdk/src/share/native/sun/java2d/loops/IntRgbx.h Mon Apr 28 11:06:18 2008 -0700 ++++ openjdk/jdk/src/share/native/sun/java2d/loops/IntRgbx.h Mon Apr 28 15:57:46 2008 -0700 +@@ -36,6 +36,8 @@ + typedef jint IntRgbxPixelType; + typedef jint IntRgbxDataType; + ++#define IntRgbxIsOpaque 1 ++ + #define IntRgbxPixelStride 4 + + #define DeclareIntRgbxLoadVars(PREFIX) +diff -r f50304904b8f -r d7accc312aec src/share/native/sun/java2d/loops/LoopMacros.h +--- openjdk.orig/jdk/src/share/native/sun/java2d/loops/LoopMacros.h Mon Apr 28 11:06:18 2008 -0700 ++++ openjdk/jdk/src/share/native/sun/java2d/loops/LoopMacros.h Mon Apr 28 15:57:46 2008 -0700 +@@ -1610,8 +1610,12 @@ + MUL8(SRC_PREFIX ## A, mixValSrc); \ + MultMultAddAndStore4ByteArgbComps(dst, mixValDst, dst, \ + mixValSrc, SRC_PREFIX); \ +- Store ## DST ## From4ByteArgb(DST_PTR, pix, PIXEL_INDEX, \ +- dstA, dstR, dstG, dstB); \ ++ if (!(DST ## IsOpaque) && \ ++ !(DST ## IsPremultiplied) && dstA && dstA < 255) { \ ++ DivideAndStore4ByteArgbComps(dst, dst, dstA); \ ++ } \ ++ Store ## DST ## From4ByteArgbComps(DST_PTR, pix, \ ++ PIXEL_INDEX, dst); \ + } else { \ + Store ## DST ## PixelData(DST_PTR, PIXEL_INDEX, \ + FG_PIXEL, PREFIX); \ +@@ -1793,8 +1797,12 @@ + dstR = gammaLut[dstR]; \ + dstG = gammaLut[dstG]; \ + dstB = gammaLut[dstB]; \ +- Store ## DST ## From4ByteArgb(DST_PTR, pix, PIXEL_INDEX, \ +- dstA, dstR, dstG, dstB); \ ++ if (!(DST ## IsOpaque) && \ ++ !(DST ## IsPremultiplied) && dstA && dstA < 255) { \ ++ DivideAndStore4ByteArgbComps(dst, dst, dstA); \ ++ } \ ++ Store ## DST ## From4ByteArgbComps(DST_PTR, pix, \ ++ PIXEL_INDEX, dst); \ + } else { \ + Store ## DST ## PixelData(DST_PTR, PIXEL_INDEX, \ + FG_PIXEL, PREFIX); \ +diff -r f50304904b8f -r d7accc312aec src/share/native/sun/java2d/loops/ThreeByteBgr.h +--- openjdk.orig/jdk/src/share/native/sun/java2d/loops/ThreeByteBgr.h Mon Apr 28 11:06:18 2008 -0700 ++++ openjdk/jdk/src/share/native/sun/java2d/loops/ThreeByteBgr.h Mon Apr 28 15:57:46 2008 -0700 +@@ -34,6 +34,8 @@ + typedef jint ThreeByteBgrPixelType; + typedef jubyte ThreeByteBgrDataType; + ++#define ThreeByteBgrIsOpaque 1 ++ + #define ThreeByteBgrPixelStride 3 + + #define DeclareThreeByteBgrLoadVars(PREFIX) +diff -r f50304904b8f -r d7accc312aec src/share/native/sun/java2d/loops/Ushort4444Argb.h +--- openjdk.orig/jdk/src/share/native/sun/java2d/loops/Ushort4444Argb.h Mon Apr 28 11:06:18 2008 -0700 ++++ openjdk/jdk/src/share/native/sun/java2d/loops/Ushort4444Argb.h Mon Apr 28 15:57:46 2008 -0700 +@@ -34,6 +34,8 @@ + typedef jushort Ushort4444ArgbPixelType; + typedef jushort Ushort4444ArgbDataType; + ++#define Ushort4444ArgbIsOpaque 0 ++ + #define Ushort4444ArgbPixelStride 2 + + #define DeclareUshort4444ArgbLoadVars(PREFIX) +diff -r f50304904b8f -r d7accc312aec src/share/native/sun/java2d/loops/Ushort555Rgb.h +--- openjdk.orig/jdk/src/share/native/sun/java2d/loops/Ushort555Rgb.h Mon Apr 28 11:06:18 2008 -0700 ++++ openjdk/jdk/src/share/native/sun/java2d/loops/Ushort555Rgb.h Mon Apr 28 15:57:46 2008 -0700 +@@ -34,6 +34,8 @@ + typedef jushort Ushort555RgbPixelType; + typedef jushort Ushort555RgbDataType; + ++#define Ushort555RgbIsOpaque 1 ++ + #define Ushort555RgbPixelStride 2 + + #define DeclareUshort555RgbLoadVars(PREFIX) +diff -r f50304904b8f -r d7accc312aec src/share/native/sun/java2d/loops/Ushort555Rgbx.h +--- openjdk.orig/jdk/src/share/native/sun/java2d/loops/Ushort555Rgbx.h Mon Apr 28 11:06:18 2008 -0700 ++++ openjdk/jdk/src/share/native/sun/java2d/loops/Ushort555Rgbx.h Mon Apr 28 15:57:46 2008 -0700 +@@ -34,6 +34,8 @@ + typedef jushort Ushort555RgbxPixelType; + typedef jushort Ushort555RgbxDataType; + ++#define Ushort555RgbxIsOpaque 1 ++ + #define Ushort555RgbxPixelStride 2 + + #define DeclareUshort555RgbxLoadVars(PREFIX) +diff -r f50304904b8f -r d7accc312aec src/share/native/sun/java2d/loops/Ushort565Rgb.h +--- openjdk.orig/jdk/src/share/native/sun/java2d/loops/Ushort565Rgb.h Mon Apr 28 11:06:18 2008 -0700 ++++ openjdk/jdk/src/share/native/sun/java2d/loops/Ushort565Rgb.h Mon Apr 28 15:57:46 2008 -0700 +@@ -34,6 +34,8 @@ + typedef jushort Ushort565RgbPixelType; + typedef jushort Ushort565RgbDataType; + ++#define Ushort565RgbIsOpaque 1 ++ + #define Ushort565RgbPixelStride 2 + + #define DeclareUshort565RgbLoadVars(PREFIX) +diff -r f50304904b8f -r d7accc312aec src/share/native/sun/java2d/loops/UshortGray.h +--- openjdk.orig/jdk/src/share/native/sun/java2d/loops/UshortGray.h Mon Apr 28 11:06:18 2008 -0700 ++++ openjdk/jdk/src/share/native/sun/java2d/loops/UshortGray.h Mon Apr 28 15:57:46 2008 -0700 +@@ -36,6 +36,8 @@ + typedef jushort UshortGrayPixelType; + typedef jushort UshortGrayDataType; + ++#define UshortGrayIsOpaque 1 ++ + #define UshortGrayPixelStride 2 + #define UshortGrayBitsPerPixel 16 + +diff -r f50304904b8f -r d7accc312aec src/solaris/native/sun/java2d/loops/vis_FourByteAbgr.c +--- openjdk.orig/jdk/src/solaris/native/sun/java2d/loops/vis_FourByteAbgr.c Mon Apr 28 11:06:18 2008 -0700 ++++ openjdk/jdk/src/solaris/native/sun/java2d/loops/vis_FourByteAbgr.c Mon Apr 28 15:57:46 2008 -0700 +@@ -1936,6 +1936,7 @@ + for (j = 0; j < height; j++) { + mlib_u8 *src = (void*)pixels; + mlib_s32 *dst, *dst_end; ++ mlib_u8 *dst_start; + + if ((mlib_s32)dstBase & 3) { + COPY_NA(dstBase, pbuff, width*sizeof(mlib_s32)); +@@ -1943,8 +1944,14 @@ + } else { + dst = (void*)dstBase; + } ++ dst_start = (void*)dst; + dst_end = dst + width; + ++ /* Need to reset the GSR from the values set by the ++ * convert call near the end of this loop. ++ */ ++ vis_write_gsr(7 << 0); ++ + if ((mlib_s32)dst & 7) { + pix = *src++; + dd = vis_fpadd16(MUL8_VIS(srcG_f, pix), d_half); +@@ -1984,8 +1991,13 @@ + dst++; + } + ++ ADD_SUFF(IntArgbPreToIntArgbConvert)(dst_start, dst_start, ++ width, 1, ++ pRasInfo, pRasInfo, ++ pPrim, pCompInfo); ++ + if ((mlib_s32)dstBase & 3) { +- COPY_NA(pbuff, dstBase, width*sizeof(mlib_s32)); ++ COPY_NA(dst_start, dstBase, width*sizeof(mlib_s32)); + } + + PTR_ADD(dstBase, scan); +diff -r f50304904b8f -r d7accc312aec src/solaris/native/sun/java2d/loops/vis_FourByteAbgrPre.c +--- openjdk.orig/jdk/src/solaris/native/sun/java2d/loops/vis_FourByteAbgrPre.c Mon Apr 28 11:06:18 2008 -0700 ++++ openjdk/jdk/src/solaris/native/sun/java2d/loops/vis_FourByteAbgrPre.c Mon Apr 28 15:57:46 2008 -0700 +@@ -181,6 +181,7 @@ + d_half = vis_to_double_dup((1 << (16 + 6)) | (1 << 6)); + + srcG_f = vis_to_float(argbcolor); ++ ARGB2ABGR_FL(srcG_f); + + for (glyphCounter = 0; glyphCounter < totalGlyphs; glyphCounter++) { + const jubyte *pixels; +@@ -238,8 +239,33 @@ + mlib_u8 *src = (void*)pixels; + mlib_s32 *dst, *dst_end; + mlib_u8 *dst8; ++ mlib_u8* dst_start = dstBase; + +- ADD_SUFF(FourByteAbgrPreToIntArgbConvert)(dstBase, pbuff, width, 1, ++ /* ++ * Typically the inner loop here works on Argb input data, an ++ * Argb color, and produces ArgbPre output data. To use that ++ * standard approach we would need a FourByteAbgrPre to IntArgb ++ * converter for the front end and an IntArgbPre to FourByteAbgrPre ++ * converter for the back end. The converter exists for the ++ * front end, but it is a workaround implementation that uses a 2 ++ * stage conversion and an intermediate buffer that is allocated ++ * on every call. The converter for the back end doesn't really ++ * exist, but we could reuse the IntArgb to FourByteAbgr converter ++ * to do the same work - at the cost of swapping the components as ++ * we copy the data back. All of this is more work than we really ++ * need so we use an alternate procedure: ++ * - Copy the data into an int-aligned temporary buffer (if needed) ++ * - Convert the data from FourByteAbgrPre to IntAbgr by using the ++ * IntArgbPre to IntArgb converter in the int-aligned buffer. ++ * - Swap the color data to Abgr so that the inner loop goes from ++ * IntAbgr data to IntAbgrPre data ++ * - Simply copy the IntAbgrPre data back into place. ++ */ ++ if (((mlib_s32)dstBase) & 3) { ++ COPY_NA(dstBase, pbuff, width*sizeof(mlib_s32)); ++ dst_start = pbuff; ++ } ++ ADD_SUFF(IntArgbPreToIntArgbConvert)(dst_start, pbuff, width, 1, + pRasInfo, pRasInfo, + pPrim, pCompInfo); + +@@ -283,9 +309,7 @@ + dst++; + } + +- ADD_SUFF(IntArgbToFourByteAbgrPreConvert)(pbuff, dstBase, width, 1, +- pRasInfo, pRasInfo, +- pPrim, pCompInfo); ++ COPY_NA(pbuff, dstBase, width*sizeof(mlib_s32)); + + src = (void*)pixels; + dst8 = (void*)dstBase; +diff -r f50304904b8f -r d7accc312aec src/solaris/native/sun/java2d/loops/vis_IntArgb.c +--- openjdk.orig/jdk/src/solaris/native/sun/java2d/loops/vis_IntArgb.c Mon Apr 28 11:06:18 2008 -0700 ++++ openjdk/jdk/src/solaris/native/sun/java2d/loops/vis_IntArgb.c Mon Apr 28 15:57:46 2008 -0700 +@@ -428,6 +428,11 @@ + dst = (void*)dstBase; + dst_end = dst + width; + ++ /* Clearing the Graphics Status Register is necessary otherwise ++ * left over scale settings affect the pack instructions. ++ */ ++ vis_write_gsr(0 << 3); ++ + if ((mlib_s32)dst & 7) { + pix = *src++; + dd = vis_fpadd16(MUL8_VIS(srcG_f, pix), d_half); +@@ -467,6 +472,9 @@ + dst++; + } + ++ ADD_SUFF(IntArgbPreToIntArgbConvert)(dstBase, dstBase, width, 1, ++ pRasInfo, pRasInfo, ++ pPrim, pCompInfo); + PTR_ADD(dstBase, scan); + pixels += rowBytes; + } +diff -r f50304904b8f -r d7accc312aec src/solaris/native/sun/java2d/loops/vis_IntArgbPre.c +--- openjdk.orig/jdk/src/solaris/native/sun/java2d/loops/vis_IntArgbPre.c Mon Apr 28 11:06:18 2008 -0700 ++++ openjdk/jdk/src/solaris/native/sun/java2d/loops/vis_IntArgbPre.c Mon Apr 28 15:57:46 2008 -0700 +@@ -1193,10 +1193,6 @@ + dst++; + } + +- ADD_SUFF(IntArgbToIntArgbPreConvert)(dstBase, dstBase, width, 1, +- pRasInfo, pRasInfo, +- pPrim, pCompInfo); +- + PTR_ADD(dstBase, scan); + pixels += rowBytes; + } +diff -r f50304904b8f -r d7accc312aec test/java/awt/Graphics2D/DrawString/AlphaSurfaceText.java +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ openjdk/test/java/awt/Graphics2D/DrawString/AlphaSurfaceText.java Mon Apr 28 15:57:46 2008 -0700 +@@ -0,0 +1,106 @@ ++/* ++ * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, ++ * CA 95054 USA or visit www.sun.com if you need additional information or ++ * have any questions. ++ */ ++ ++/** ++ * @test ++ * @bug 6679308 ++ * @summary test drawing to Alpha surfaces ++ */ ++ ++import java.awt.*; ++import java.awt.image.*; ++ ++public class AlphaSurfaceText { ++ ++ int wid=400, hgt=200; ++ ++ public AlphaSurfaceText(int biType, Color c) { ++ BufferedImage opaquebi0 = ++ new BufferedImage(wid, hgt, BufferedImage.TYPE_INT_RGB); ++ drawText(opaquebi0, c); ++ ++ BufferedImage alphabi = new BufferedImage(wid, hgt, biType); ++ drawText(alphabi, c); ++ BufferedImage opaquebi1 = ++ new BufferedImage(wid, hgt, BufferedImage.TYPE_INT_RGB); ++ Graphics2D g2d = opaquebi1.createGraphics(); ++ g2d.drawImage(alphabi, 0, 0, null); ++ compare(opaquebi0, opaquebi1, biType, c); ++ } ++ ++ private void drawText(BufferedImage bi, Color c) { ++ Graphics2D g = bi.createGraphics(); ++ g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, ++ RenderingHints.VALUE_TEXT_ANTIALIAS_ON); ++ g.setColor(c); ++ g.setFont(new Font("sansserif", Font.PLAIN, 70)); ++ g.drawString("Hello!", 20, 100); ++ g.setFont(new Font("sansserif", Font.PLAIN, 12)); ++ g.drawString("Hello!", 20, 130); ++ g.setFont(new Font("sansserif", Font.PLAIN, 10)); ++ g.drawString("Hello!", 20, 150); ++ } ++ ++ // Need to allow for minimal rounding error, so allow each component ++ // to differ by 1. ++ void compare(BufferedImage bi0, BufferedImage bi1, int biType, Color c) { ++ for (int x=0; x<wid; x++) { ++ for (int y=0; y<hgt; y++) { ++ int rgb0 = bi0.getRGB(x, y); ++ int rgb1 = bi1.getRGB(x, y); ++ if (rgb0 == rgb1) continue; ++ int r0 = (rgb0 & 0xff0000) >> 16; ++ int r1 = (rgb1 & 0xff0000) >> 16; ++ int rdiff = r0-r1; if (rdiff<0) rdiff = -rdiff; ++ int g0 = (rgb0 & 0x00ff00) >> 8; ++ int g1 = (rgb1 & 0x00ff00) >> 8; ++ int gdiff = g0-g1; if (gdiff<0) gdiff = -gdiff; ++ int b0 = (rgb0 & 0x0000ff); ++ int b1 = (rgb1 & 0x0000ff); ++ int bdiff = b0-b1; if (bdiff<0) bdiff = -bdiff; ++ if (rdiff > 1 || gdiff > 1 || bdiff > 1) { ++ throw new RuntimeException( ++ "Images differ for type "+biType + " col="+c + ++ " at x=" + x + " y="+ y + " " + ++ Integer.toHexString(rgb0) + " vs " + ++ Integer.toHexString(rgb1)); ++ } ++ } ++ } ++ ++ } ++ public static void main(String[] args) { ++ new AlphaSurfaceText(BufferedImage.TYPE_INT_ARGB, Color.white); ++ new AlphaSurfaceText(BufferedImage.TYPE_INT_ARGB, Color.red); ++ new AlphaSurfaceText(BufferedImage.TYPE_INT_ARGB, Color.blue); ++ new AlphaSurfaceText(BufferedImage.TYPE_INT_ARGB_PRE, Color.white); ++ new AlphaSurfaceText(BufferedImage.TYPE_INT_ARGB_PRE, Color.red); ++ new AlphaSurfaceText(BufferedImage.TYPE_INT_ARGB_PRE, Color.blue); ++ new AlphaSurfaceText(BufferedImage.TYPE_4BYTE_ABGR, Color.white); ++ new AlphaSurfaceText(BufferedImage.TYPE_4BYTE_ABGR, Color.red); ++ new AlphaSurfaceText(BufferedImage.TYPE_4BYTE_ABGR, Color.blue); ++ new AlphaSurfaceText(BufferedImage.TYPE_4BYTE_ABGR_PRE, Color.white); ++ new AlphaSurfaceText(BufferedImage.TYPE_4BYTE_ABGR_PRE, Color.red); ++ new AlphaSurfaceText(BufferedImage.TYPE_4BYTE_ABGR_PRE, Color.blue); ++ } ++}