mirror of
https://github.com/openjdk/jdk.git
synced 2025-09-21 11:34:38 +02:00
6679308: Poor text rendering on translucent image
Reviewed-by: flar, campbell
This commit is contained in:
parent
cb5a8e47fb
commit
c672506f95
24 changed files with 209 additions and 17 deletions
|
@ -416,7 +416,8 @@ void NAME_SRCOVER_MASKBLIT(SRC, DST) \
|
||||||
MultiplyAndStore ## STRATEGY ## Comps(res, \
|
MultiplyAndStore ## STRATEGY ## Comps(res, \
|
||||||
srcF, res);\
|
srcF, res);\
|
||||||
} \
|
} \
|
||||||
if (!(DST ## IsPremultiplied) && resA && \
|
if (!(DST ## IsOpaque) && \
|
||||||
|
!(DST ## IsPremultiplied) && resA && \
|
||||||
resA < MaxValFor ## STRATEGY) \
|
resA < MaxValFor ## STRATEGY) \
|
||||||
{ \
|
{ \
|
||||||
DivideAndStore ## STRATEGY ## Comps(res, \
|
DivideAndStore ## STRATEGY ## Comps(res, \
|
||||||
|
@ -475,7 +476,8 @@ void NAME_SRCOVER_MASKBLIT(SRC, DST) \
|
||||||
MultiplyAndStore ## STRATEGY ## Comps(res, \
|
MultiplyAndStore ## STRATEGY ## Comps(res, \
|
||||||
srcF, res); \
|
srcF, res); \
|
||||||
} \
|
} \
|
||||||
if (!(DST ## IsPremultiplied) && resA && \
|
if (!(DST ## IsOpaque) && \
|
||||||
|
!(DST ## IsPremultiplied) && resA && \
|
||||||
resA < MaxValFor ## STRATEGY) \
|
resA < MaxValFor ## STRATEGY) \
|
||||||
{ \
|
{ \
|
||||||
DivideAndStore ## STRATEGY ## Comps(res, res, resA); \
|
DivideAndStore ## STRATEGY ## Comps(res, res, resA); \
|
||||||
|
@ -797,7 +799,8 @@ void NAME_SRCOVER_MASKFILL(TYPE) \
|
||||||
Store ## STRATEGY ## CompsUsingOp(res, +=, tmp); \
|
Store ## STRATEGY ## CompsUsingOp(res, +=, tmp); \
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
if (!(TYPE ## IsPremultiplied) && resA && \
|
if (!(TYPE ## IsOpaque) && \
|
||||||
|
!(TYPE ## IsPremultiplied) && resA && \
|
||||||
resA < MaxValFor ## STRATEGY) \
|
resA < MaxValFor ## STRATEGY) \
|
||||||
{ \
|
{ \
|
||||||
DivideAndStore ## STRATEGY ## Comps(res, res, resA); \
|
DivideAndStore ## STRATEGY ## Comps(res, res, resA); \
|
||||||
|
@ -831,7 +834,8 @@ void NAME_SRCOVER_MASKFILL(TYPE) \
|
||||||
Postload ## STRATEGY ## From ## TYPE(pRas, DstPix, res); \
|
Postload ## STRATEGY ## From ## TYPE(pRas, DstPix, res); \
|
||||||
MultiplyAddAndStore ## STRATEGY ## Comps(res, \
|
MultiplyAddAndStore ## STRATEGY ## Comps(res, \
|
||||||
dstF, res, src); \
|
dstF, res, src); \
|
||||||
if (!(TYPE ## IsPremultiplied) && resA && \
|
if (!(TYPE ## IsOpaque) && \
|
||||||
|
!(TYPE ## IsPremultiplied) && resA && \
|
||||||
resA < MaxValFor ## STRATEGY) \
|
resA < MaxValFor ## STRATEGY) \
|
||||||
{ \
|
{ \
|
||||||
DivideAndStore ## STRATEGY ## Comps(res, res, resA); \
|
DivideAndStore ## STRATEGY ## Comps(res, res, resA); \
|
||||||
|
|
|
@ -36,6 +36,8 @@
|
||||||
typedef jubyte ByteGrayPixelType;
|
typedef jubyte ByteGrayPixelType;
|
||||||
typedef jubyte ByteGrayDataType;
|
typedef jubyte ByteGrayDataType;
|
||||||
|
|
||||||
|
#define ByteGrayIsOpaque 1
|
||||||
|
|
||||||
#define ByteGrayPixelStride 1
|
#define ByteGrayPixelStride 1
|
||||||
#define ByteGrayBitsPerPixel 8
|
#define ByteGrayBitsPerPixel 8
|
||||||
|
|
||||||
|
|
|
@ -34,6 +34,8 @@
|
||||||
typedef jint FourByteAbgrPixelType;
|
typedef jint FourByteAbgrPixelType;
|
||||||
typedef jubyte FourByteAbgrDataType;
|
typedef jubyte FourByteAbgrDataType;
|
||||||
|
|
||||||
|
#define FourByteAbgrIsOpaque 0
|
||||||
|
|
||||||
#define FourByteAbgrPixelStride 4
|
#define FourByteAbgrPixelStride 4
|
||||||
|
|
||||||
#define DeclareFourByteAbgrLoadVars(PREFIX)
|
#define DeclareFourByteAbgrLoadVars(PREFIX)
|
||||||
|
|
|
@ -34,6 +34,8 @@
|
||||||
typedef jint FourByteAbgrPrePixelType;
|
typedef jint FourByteAbgrPrePixelType;
|
||||||
typedef jubyte FourByteAbgrPreDataType;
|
typedef jubyte FourByteAbgrPreDataType;
|
||||||
|
|
||||||
|
#define FourByteAbgrPreIsOpaque 0
|
||||||
|
|
||||||
#define FourByteAbgrPrePixelStride 4
|
#define FourByteAbgrPrePixelStride 4
|
||||||
|
|
||||||
#define DeclareFourByteAbgrPreLoadVars(PREFIX)
|
#define DeclareFourByteAbgrPreLoadVars(PREFIX)
|
||||||
|
|
|
@ -37,6 +37,8 @@
|
||||||
typedef jushort Index12GrayPixelType;
|
typedef jushort Index12GrayPixelType;
|
||||||
typedef jushort Index12GrayDataType;
|
typedef jushort Index12GrayDataType;
|
||||||
|
|
||||||
|
#define Index12GrayIsOpaque 1
|
||||||
|
|
||||||
#define Index12GrayPixelStride 2
|
#define Index12GrayPixelStride 2
|
||||||
#define Index12GrayBitsPerPixel 12
|
#define Index12GrayBitsPerPixel 12
|
||||||
|
|
||||||
|
|
|
@ -37,6 +37,8 @@
|
||||||
typedef jubyte Index8GrayPixelType;
|
typedef jubyte Index8GrayPixelType;
|
||||||
typedef jubyte Index8GrayDataType;
|
typedef jubyte Index8GrayDataType;
|
||||||
|
|
||||||
|
#define Index8GrayIsOpaque 1
|
||||||
|
|
||||||
#define Index8GrayPixelStride 1
|
#define Index8GrayPixelStride 1
|
||||||
#define Index8GrayBitsPerPixel 8
|
#define Index8GrayBitsPerPixel 8
|
||||||
|
|
||||||
|
|
|
@ -38,6 +38,8 @@
|
||||||
typedef jint IntArgbPixelType;
|
typedef jint IntArgbPixelType;
|
||||||
typedef jint IntArgbDataType;
|
typedef jint IntArgbDataType;
|
||||||
|
|
||||||
|
#define IntArgbIsOpaque 0
|
||||||
|
|
||||||
#define IntArgbPixelStride 4
|
#define IntArgbPixelStride 4
|
||||||
|
|
||||||
#define DeclareIntArgbLoadVars(PREFIX)
|
#define DeclareIntArgbLoadVars(PREFIX)
|
||||||
|
|
|
@ -38,6 +38,8 @@
|
||||||
typedef jint IntArgbBmPixelType;
|
typedef jint IntArgbBmPixelType;
|
||||||
typedef jint IntArgbBmDataType;
|
typedef jint IntArgbBmDataType;
|
||||||
|
|
||||||
|
#define IntArgbBmIsOpaque 0
|
||||||
|
|
||||||
#define IntArgbBmPixelStride 4
|
#define IntArgbBmPixelStride 4
|
||||||
|
|
||||||
#define DeclareIntArgbBmLoadVars(PREFIX)
|
#define DeclareIntArgbBmLoadVars(PREFIX)
|
||||||
|
|
|
@ -36,6 +36,8 @@
|
||||||
typedef jint IntArgbPrePixelType;
|
typedef jint IntArgbPrePixelType;
|
||||||
typedef jint IntArgbPreDataType;
|
typedef jint IntArgbPreDataType;
|
||||||
|
|
||||||
|
#define IntArgbPreIsOpaque 0
|
||||||
|
|
||||||
#define IntArgbPrePixelStride 4
|
#define IntArgbPrePixelStride 4
|
||||||
|
|
||||||
#define DeclareIntArgbPreLoadVars(PREFIX)
|
#define DeclareIntArgbPreLoadVars(PREFIX)
|
||||||
|
|
|
@ -38,6 +38,8 @@
|
||||||
typedef jint IntBgrPixelType;
|
typedef jint IntBgrPixelType;
|
||||||
typedef jint IntBgrDataType;
|
typedef jint IntBgrDataType;
|
||||||
|
|
||||||
|
#define IntBgrIsOpaque 1
|
||||||
|
|
||||||
#define IntBgrPixelStride 4
|
#define IntBgrPixelStride 4
|
||||||
|
|
||||||
#define DeclareIntBgrLoadVars(PREFIX)
|
#define DeclareIntBgrLoadVars(PREFIX)
|
||||||
|
|
|
@ -38,6 +38,8 @@
|
||||||
typedef jint IntRgbPixelType;
|
typedef jint IntRgbPixelType;
|
||||||
typedef jint IntRgbDataType;
|
typedef jint IntRgbDataType;
|
||||||
|
|
||||||
|
#define IntRgbIsOpaque 1
|
||||||
|
|
||||||
#define IntRgbPixelStride 4
|
#define IntRgbPixelStride 4
|
||||||
|
|
||||||
#define DeclareIntRgbLoadVars(PREFIX)
|
#define DeclareIntRgbLoadVars(PREFIX)
|
||||||
|
|
|
@ -36,6 +36,8 @@
|
||||||
typedef jint IntRgbxPixelType;
|
typedef jint IntRgbxPixelType;
|
||||||
typedef jint IntRgbxDataType;
|
typedef jint IntRgbxDataType;
|
||||||
|
|
||||||
|
#define IntRgbxIsOpaque 1
|
||||||
|
|
||||||
#define IntRgbxPixelStride 4
|
#define IntRgbxPixelStride 4
|
||||||
|
|
||||||
#define DeclareIntRgbxLoadVars(PREFIX)
|
#define DeclareIntRgbxLoadVars(PREFIX)
|
||||||
|
|
|
@ -1610,8 +1610,12 @@ void NAME_SOLID_DRAWGLYPHLIST(DST)(SurfaceDataRasInfo *pRasInfo, \
|
||||||
MUL8(SRC_PREFIX ## A, mixValSrc); \
|
MUL8(SRC_PREFIX ## A, mixValSrc); \
|
||||||
MultMultAddAndStore4ByteArgbComps(dst, mixValDst, dst, \
|
MultMultAddAndStore4ByteArgbComps(dst, mixValDst, dst, \
|
||||||
mixValSrc, SRC_PREFIX); \
|
mixValSrc, SRC_PREFIX); \
|
||||||
Store ## DST ## From4ByteArgb(DST_PTR, pix, PIXEL_INDEX, \
|
if (!(DST ## IsOpaque) && \
|
||||||
dstA, dstR, dstG, dstB); \
|
!(DST ## IsPremultiplied) && dstA && dstA < 255) { \
|
||||||
|
DivideAndStore4ByteArgbComps(dst, dst, dstA); \
|
||||||
|
} \
|
||||||
|
Store ## DST ## From4ByteArgbComps(DST_PTR, pix, \
|
||||||
|
PIXEL_INDEX, dst); \
|
||||||
} else { \
|
} else { \
|
||||||
Store ## DST ## PixelData(DST_PTR, PIXEL_INDEX, \
|
Store ## DST ## PixelData(DST_PTR, PIXEL_INDEX, \
|
||||||
FG_PIXEL, PREFIX); \
|
FG_PIXEL, PREFIX); \
|
||||||
|
@ -1793,8 +1797,12 @@ void NAME_SOLID_DRAWGLYPHLISTAA(DST)(SurfaceDataRasInfo *pRasInfo, \
|
||||||
dstR = gammaLut[dstR]; \
|
dstR = gammaLut[dstR]; \
|
||||||
dstG = gammaLut[dstG]; \
|
dstG = gammaLut[dstG]; \
|
||||||
dstB = gammaLut[dstB]; \
|
dstB = gammaLut[dstB]; \
|
||||||
Store ## DST ## From4ByteArgb(DST_PTR, pix, PIXEL_INDEX, \
|
if (!(DST ## IsOpaque) && \
|
||||||
dstA, dstR, dstG, dstB); \
|
!(DST ## IsPremultiplied) && dstA && dstA < 255) { \
|
||||||
|
DivideAndStore4ByteArgbComps(dst, dst, dstA); \
|
||||||
|
} \
|
||||||
|
Store ## DST ## From4ByteArgbComps(DST_PTR, pix, \
|
||||||
|
PIXEL_INDEX, dst); \
|
||||||
} else { \
|
} else { \
|
||||||
Store ## DST ## PixelData(DST_PTR, PIXEL_INDEX, \
|
Store ## DST ## PixelData(DST_PTR, PIXEL_INDEX, \
|
||||||
FG_PIXEL, PREFIX); \
|
FG_PIXEL, PREFIX); \
|
||||||
|
|
|
@ -34,6 +34,8 @@
|
||||||
typedef jint ThreeByteBgrPixelType;
|
typedef jint ThreeByteBgrPixelType;
|
||||||
typedef jubyte ThreeByteBgrDataType;
|
typedef jubyte ThreeByteBgrDataType;
|
||||||
|
|
||||||
|
#define ThreeByteBgrIsOpaque 1
|
||||||
|
|
||||||
#define ThreeByteBgrPixelStride 3
|
#define ThreeByteBgrPixelStride 3
|
||||||
|
|
||||||
#define DeclareThreeByteBgrLoadVars(PREFIX)
|
#define DeclareThreeByteBgrLoadVars(PREFIX)
|
||||||
|
|
|
@ -34,6 +34,8 @@
|
||||||
typedef jushort Ushort4444ArgbPixelType;
|
typedef jushort Ushort4444ArgbPixelType;
|
||||||
typedef jushort Ushort4444ArgbDataType;
|
typedef jushort Ushort4444ArgbDataType;
|
||||||
|
|
||||||
|
#define Ushort4444ArgbIsOpaque 0
|
||||||
|
|
||||||
#define Ushort4444ArgbPixelStride 2
|
#define Ushort4444ArgbPixelStride 2
|
||||||
|
|
||||||
#define DeclareUshort4444ArgbLoadVars(PREFIX)
|
#define DeclareUshort4444ArgbLoadVars(PREFIX)
|
||||||
|
|
|
@ -34,6 +34,8 @@
|
||||||
typedef jushort Ushort555RgbPixelType;
|
typedef jushort Ushort555RgbPixelType;
|
||||||
typedef jushort Ushort555RgbDataType;
|
typedef jushort Ushort555RgbDataType;
|
||||||
|
|
||||||
|
#define Ushort555RgbIsOpaque 1
|
||||||
|
|
||||||
#define Ushort555RgbPixelStride 2
|
#define Ushort555RgbPixelStride 2
|
||||||
|
|
||||||
#define DeclareUshort555RgbLoadVars(PREFIX)
|
#define DeclareUshort555RgbLoadVars(PREFIX)
|
||||||
|
|
|
@ -34,6 +34,8 @@
|
||||||
typedef jushort Ushort555RgbxPixelType;
|
typedef jushort Ushort555RgbxPixelType;
|
||||||
typedef jushort Ushort555RgbxDataType;
|
typedef jushort Ushort555RgbxDataType;
|
||||||
|
|
||||||
|
#define Ushort555RgbxIsOpaque 1
|
||||||
|
|
||||||
#define Ushort555RgbxPixelStride 2
|
#define Ushort555RgbxPixelStride 2
|
||||||
|
|
||||||
#define DeclareUshort555RgbxLoadVars(PREFIX)
|
#define DeclareUshort555RgbxLoadVars(PREFIX)
|
||||||
|
|
|
@ -34,6 +34,8 @@
|
||||||
typedef jushort Ushort565RgbPixelType;
|
typedef jushort Ushort565RgbPixelType;
|
||||||
typedef jushort Ushort565RgbDataType;
|
typedef jushort Ushort565RgbDataType;
|
||||||
|
|
||||||
|
#define Ushort565RgbIsOpaque 1
|
||||||
|
|
||||||
#define Ushort565RgbPixelStride 2
|
#define Ushort565RgbPixelStride 2
|
||||||
|
|
||||||
#define DeclareUshort565RgbLoadVars(PREFIX)
|
#define DeclareUshort565RgbLoadVars(PREFIX)
|
||||||
|
|
|
@ -36,6 +36,8 @@
|
||||||
typedef jushort UshortGrayPixelType;
|
typedef jushort UshortGrayPixelType;
|
||||||
typedef jushort UshortGrayDataType;
|
typedef jushort UshortGrayDataType;
|
||||||
|
|
||||||
|
#define UshortGrayIsOpaque 1
|
||||||
|
|
||||||
#define UshortGrayPixelStride 2
|
#define UshortGrayPixelStride 2
|
||||||
#define UshortGrayBitsPerPixel 16
|
#define UshortGrayBitsPerPixel 16
|
||||||
|
|
||||||
|
|
|
@ -1936,6 +1936,7 @@ void ADD_SUFF(FourByteAbgrDrawGlyphListAA)(SurfaceDataRasInfo * pRasInfo,
|
||||||
for (j = 0; j < height; j++) {
|
for (j = 0; j < height; j++) {
|
||||||
mlib_u8 *src = (void*)pixels;
|
mlib_u8 *src = (void*)pixels;
|
||||||
mlib_s32 *dst, *dst_end;
|
mlib_s32 *dst, *dst_end;
|
||||||
|
mlib_u8 *dst_start;
|
||||||
|
|
||||||
if ((mlib_s32)dstBase & 3) {
|
if ((mlib_s32)dstBase & 3) {
|
||||||
COPY_NA(dstBase, pbuff, width*sizeof(mlib_s32));
|
COPY_NA(dstBase, pbuff, width*sizeof(mlib_s32));
|
||||||
|
@ -1943,8 +1944,14 @@ void ADD_SUFF(FourByteAbgrDrawGlyphListAA)(SurfaceDataRasInfo * pRasInfo,
|
||||||
} else {
|
} else {
|
||||||
dst = (void*)dstBase;
|
dst = (void*)dstBase;
|
||||||
}
|
}
|
||||||
|
dst_start = (void*)dst;
|
||||||
dst_end = dst + width;
|
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) {
|
if ((mlib_s32)dst & 7) {
|
||||||
pix = *src++;
|
pix = *src++;
|
||||||
dd = vis_fpadd16(MUL8_VIS(srcG_f, pix), d_half);
|
dd = vis_fpadd16(MUL8_VIS(srcG_f, pix), d_half);
|
||||||
|
@ -1984,8 +1991,13 @@ void ADD_SUFF(FourByteAbgrDrawGlyphListAA)(SurfaceDataRasInfo * pRasInfo,
|
||||||
dst++;
|
dst++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ADD_SUFF(IntArgbPreToIntArgbConvert)(dst_start, dst_start,
|
||||||
|
width, 1,
|
||||||
|
pRasInfo, pRasInfo,
|
||||||
|
pPrim, pCompInfo);
|
||||||
|
|
||||||
if ((mlib_s32)dstBase & 3) {
|
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);
|
PTR_ADD(dstBase, scan);
|
||||||
|
|
|
@ -181,6 +181,7 @@ void ADD_SUFF(FourByteAbgrPreDrawGlyphListAA)(SurfaceDataRasInfo * pRasInfo,
|
||||||
d_half = vis_to_double_dup((1 << (16 + 6)) | (1 << 6));
|
d_half = vis_to_double_dup((1 << (16 + 6)) | (1 << 6));
|
||||||
|
|
||||||
srcG_f = vis_to_float(argbcolor);
|
srcG_f = vis_to_float(argbcolor);
|
||||||
|
ARGB2ABGR_FL(srcG_f);
|
||||||
|
|
||||||
for (glyphCounter = 0; glyphCounter < totalGlyphs; glyphCounter++) {
|
for (glyphCounter = 0; glyphCounter < totalGlyphs; glyphCounter++) {
|
||||||
const jubyte *pixels;
|
const jubyte *pixels;
|
||||||
|
@ -238,8 +239,33 @@ void ADD_SUFF(FourByteAbgrPreDrawGlyphListAA)(SurfaceDataRasInfo * pRasInfo,
|
||||||
mlib_u8 *src = (void*)pixels;
|
mlib_u8 *src = (void*)pixels;
|
||||||
mlib_s32 *dst, *dst_end;
|
mlib_s32 *dst, *dst_end;
|
||||||
mlib_u8 *dst8;
|
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,
|
pRasInfo, pRasInfo,
|
||||||
pPrim, pCompInfo);
|
pPrim, pCompInfo);
|
||||||
|
|
||||||
|
@ -283,9 +309,7 @@ void ADD_SUFF(FourByteAbgrPreDrawGlyphListAA)(SurfaceDataRasInfo * pRasInfo,
|
||||||
dst++;
|
dst++;
|
||||||
}
|
}
|
||||||
|
|
||||||
ADD_SUFF(IntArgbToFourByteAbgrPreConvert)(pbuff, dstBase, width, 1,
|
COPY_NA(pbuff, dstBase, width*sizeof(mlib_s32));
|
||||||
pRasInfo, pRasInfo,
|
|
||||||
pPrim, pCompInfo);
|
|
||||||
|
|
||||||
src = (void*)pixels;
|
src = (void*)pixels;
|
||||||
dst8 = (void*)dstBase;
|
dst8 = (void*)dstBase;
|
||||||
|
|
|
@ -428,6 +428,11 @@ void ADD_SUFF(IntArgbDrawGlyphListAA)(GLYPH_LIST_PARAMS)
|
||||||
dst = (void*)dstBase;
|
dst = (void*)dstBase;
|
||||||
dst_end = dst + width;
|
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) {
|
if ((mlib_s32)dst & 7) {
|
||||||
pix = *src++;
|
pix = *src++;
|
||||||
dd = vis_fpadd16(MUL8_VIS(srcG_f, pix), d_half);
|
dd = vis_fpadd16(MUL8_VIS(srcG_f, pix), d_half);
|
||||||
|
@ -467,6 +472,9 @@ void ADD_SUFF(IntArgbDrawGlyphListAA)(GLYPH_LIST_PARAMS)
|
||||||
dst++;
|
dst++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ADD_SUFF(IntArgbPreToIntArgbConvert)(dstBase, dstBase, width, 1,
|
||||||
|
pRasInfo, pRasInfo,
|
||||||
|
pPrim, pCompInfo);
|
||||||
PTR_ADD(dstBase, scan);
|
PTR_ADD(dstBase, scan);
|
||||||
pixels += rowBytes;
|
pixels += rowBytes;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1193,10 +1193,6 @@ void ADD_SUFF(IntArgbPreDrawGlyphListAA)(SurfaceDataRasInfo * pRasInfo,
|
||||||
dst++;
|
dst++;
|
||||||
}
|
}
|
||||||
|
|
||||||
ADD_SUFF(IntArgbToIntArgbPreConvert)(dstBase, dstBase, width, 1,
|
|
||||||
pRasInfo, pRasInfo,
|
|
||||||
pPrim, pCompInfo);
|
|
||||||
|
|
||||||
PTR_ADD(dstBase, scan);
|
PTR_ADD(dstBase, scan);
|
||||||
pixels += rowBytes;
|
pixels += rowBytes;
|
||||||
}
|
}
|
||||||
|
|
106
jdk/test/java/awt/Graphics2D/DrawString/AlphaSurfaceText.java
Normal file
106
jdk/test/java/awt/Graphics2D/DrawString/AlphaSurfaceText.java
Normal file
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue