blob: bf50ff1a3733213c356c403f2ce0088a1b9a49e5 [file] [log] [blame]
/*
* Copyright (c) 2000, 2013, Oracle and/or its affiliates. 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. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
#ifndef AnyByteBinary_h_Included
#define AnyByteBinary_h_Included
#include <string.h>
#include "AlphaMacros.h"
#include "GraphicsPrimitiveMgr.h"
#include "LoopMacros.h"
#include "LineUtils.h"
/*
* This file contains macros that are similar to those found in LoopMacros.h
* and AlphaMacros.h, yet have been specialized to manipulate any one of the
* surfaces in the "ByteBinary" family. It also contains generalized versions
* of some macros that are used by the more specific ByteBinary surfaces.
*/
/* REMIND: the ByteBinary store macros should probably do ordered dithering */
#define DeclareByteBinaryLoadVars(PREFIX) \
jint *PREFIX ## Lut;
#define DeclareByteBinaryStoreVars(PREFIX) \
unsigned char *PREFIX ## InvLut;
#define SetByteBinaryStoreVarsYPos(PREFIX, pRasInfo, LOC)
#define SetByteBinaryStoreVarsXPos(PREFIX, pRasInfo, LOC)
#define InitByteBinaryLoadVars(PREFIX, pRasInfo) \
PREFIX ## Lut = (pRasInfo)->lutBase
#define InitByteBinaryStoreVarsY(PREFIX, pRasInfo) \
PREFIX ## InvLut = (pRasInfo)->invColorTable
#define InitByteBinaryStoreVarsX(PREFIX, pRasInfo)
#define NextByteBinaryStoreVarsX(PREFIX)
#define NextByteBinaryStoreVarsY(PREFIX)
#define DeclareByteBinaryInitialLoadVars(TYPE, INFO, pRas, PREFIX, x) \
int PREFIX ## adjx = (x) + (INFO)->pixelBitOffset / TYPE ## BitsPerPixel; \
int PREFIX ## index = (PREFIX ## adjx) / TYPE ## PixelsPerByte; \
int PREFIX ## bits = TYPE ## MaxBitOffset - \
(((PREFIX ## adjx) % TYPE ## PixelsPerByte) * \
TYPE ## BitsPerPixel); \
int PREFIX ## bbpix = (pRas)[PREFIX ## index];
#define InitialLoadByteBinary(TYPE, pRas, PREFIX) \
do { \
if (PREFIX ## bits < 0) { \
(pRas)[PREFIX ## index] = (jubyte) PREFIX ## bbpix; \
PREFIX ## bbpix = (pRas)[++(PREFIX ## index)]; \
PREFIX ## bits = TYPE ## MaxBitOffset; \
} \
} while (0)
#define ShiftBitsByteBinary(TYPE, PREFIX) \
PREFIX ## bits -= TYPE ## BitsPerPixel
#define FinalStoreByteBinary(TYPE, pRas, PREFIX) \
(pRas)[PREFIX ## index] = (jubyte) PREFIX ## bbpix
#define CurrentPixelByteBinary(TYPE, PREFIX) \
((PREFIX ## bbpix >> PREFIX ## bits) & TYPE ## PixelMask)
#define StoreByteBinaryPixel(TYPE, pRas, x, pixel)
#define StoreByteBinaryPixelData(TYPE, pPix, x, pixel, PREFIX) \
do { \
PREFIX ## bbpix &= ~(TYPE ## PixelMask << PREFIX ## bits); \
PREFIX ## bbpix |= (pixel << PREFIX ## bits); \
} while (0)
#define ByteBinaryPixelFromArgb(TYPE, pixel, rgb, pRasInfo) \
do { \
jint r, g, b; \
ExtractIntDcmComponentsX123(rgb, r, g, b); \
(pixel) = SurfaceData_InvColorMap((pRasInfo)->invColorTable, \
r, g, b); \
} while (0)
#define XorByteBinaryPixelData(TYPE, pDst, x, PREFIX, \
srcpixel, xorpixel, mask) \
PREFIX ## bbpix ^= ((((srcpixel) ^ (xorpixel)) & TYPE ## PixelMask) \
<< PREFIX ## bits)
#define LoadByteBinaryTo1IntRgb(TYPE, pRas, PREFIX, x, rgb) \
(rgb) = PREFIX ## Lut[CurrentPixelByteBinary(TYPE, PREFIX)]
#define LoadByteBinaryTo1IntArgb(TYPE, pRas, PREFIX, x, argb) \
(argb) = PREFIX ## Lut[CurrentPixelByteBinary(TYPE, PREFIX)]
#define LoadByteBinaryTo3ByteRgb(TYPE, pRas, PREFIX, x, r, g, b) \
do { \
jint rgb = PREFIX ## Lut[CurrentPixelByteBinary(TYPE, PREFIX)]; \
ExtractIntDcmComponentsX123(rgb, r, g, b); \
} while (0)
#define LoadByteBinaryTo4ByteArgb(TYPE, pRas, PREFIX, x, a, r, g, b) \
do { \
jint argb = PREFIX ## Lut[CurrentPixelByteBinary(TYPE, PREFIX)]; \
ExtractIntDcmComponents1234(argb, a, r, g, b); \
} while (0)
#define StoreByteBinaryFrom1IntRgb(TYPE, pRas, PREFIX, x, rgb) \
do { \
int r, g, b; \
ExtractIntDcmComponentsX123(rgb, r, g, b); \
StoreByteBinaryFrom3ByteRgb(TYPE, pRas, PREFIX, x, r, g, b); \
} while (0)
#define StoreByteBinaryFrom1IntArgb(TYPE, pRas, PREFIX, x, argb) \
StoreByteBinaryFrom1IntRgb(TYPE, pRas, PREFIX, x, argb)
#define StoreByteBinaryFrom3ByteRgb(TYPE, pRas, PREFIX, x, r, g, b) \
StoreByteBinaryPixelData(TYPE, pRas, x, \
SurfaceData_InvColorMap(PREFIX ## InvLut, \
r, g, b), \
PREFIX)
#define StoreByteBinaryFrom4ByteArgb(TYPE, pRas, PREFIX, x, a, r, g, b) \
StoreByteBinaryFrom3ByteRgb(TYPE, pRas, PREFIX, x, r, g, b)
#define DeclareByteBinaryAlphaLoadData(TYPE, PREFIX) \
jint *PREFIX ## Lut; \
jint PREFIX ## rgb;
#define InitByteBinaryAlphaLoadData(TYPE, PREFIX, pRasInfo) \
do { \
PREFIX ## Lut = (pRasInfo)->lutBase; \
PREFIX ## rgb = 0; \
} while (0)
#define LoadAlphaFromByteBinaryFor4ByteArgb(TYPE, pRas, PREFIX, COMP_PREFIX) \
do { \
PREFIX ## rgb = PREFIX ## Lut[CurrentPixelByteBinary(TYPE, PREFIX)]; \
COMP_PREFIX ## A = ((juint) PREFIX ## rgb) >> 24; \
} while (0)
#define Postload4ByteArgbFromByteBinary(TYPE, pRas, PREFIX, COMP_PREFIX) \
do { \
COMP_PREFIX ## R = (PREFIX ## rgb >> 16) & 0xff; \
COMP_PREFIX ## G = (PREFIX ## rgb >> 8) & 0xff; \
COMP_PREFIX ## B = (PREFIX ## rgb >> 0) & 0xff; \
} while (0)
#define ByteBinaryIsPremultiplied 0
#define StoreByteBinaryFrom4ByteArgbComps(TYPE, pRas, PREFIX, x, COMP_PREFIX)\
StoreByteBinaryFrom4ByteArgb(TYPE, pRas, PREFIX, x, \
COMP_PREFIX ## A, COMP_PREFIX ## R, \
COMP_PREFIX ## G, COMP_PREFIX ## B)
#define BBBlitLoopWidthHeight(SRCTYPE, SRCPTR, SRCBASE, SRCINFO, SRCPREFIX, \
DSTTYPE, DSTPTR, DSTBASE, DSTINFO, DSTPREFIX, \
WIDTH, HEIGHT, BODY) \
do { \
SRCTYPE ## DataType *SRCPTR = (SRCTYPE ## DataType *) (SRCBASE); \
DSTTYPE ## DataType *DSTPTR = (DSTTYPE ## DataType *) (DSTBASE); \
jint srcScan = (SRCINFO)->scanStride; \
jint dstScan = (DSTINFO)->scanStride; \
jint srcx1 = (SRCINFO)->bounds.x1; \
jint dstx1 = (DSTINFO)->bounds.x1; \
Init ## DSTTYPE ## StoreVarsY(DSTPREFIX, DSTINFO); \
srcScan -= (WIDTH) * SRCTYPE ## PixelStride; \
dstScan -= (WIDTH) * DSTTYPE ## PixelStride; \
do { \
Declare ## SRCTYPE ## InitialLoadVars(SRCINFO, SRCPTR, SRCPREFIX, \
srcx1) \
Declare ## DSTTYPE ## InitialLoadVars(DSTINFO, DSTPTR, DSTPREFIX, \
dstx1) \
juint w = WIDTH; \
Init ## DSTTYPE ## StoreVarsX(DSTPREFIX, DSTINFO); \
do { \
InitialLoad ## SRCTYPE(SRCPTR, SRCPREFIX); \
InitialLoad ## DSTTYPE(DSTPTR, DSTPREFIX); \
BODY; \
ShiftBits ## SRCTYPE(SRCPREFIX); \
ShiftBits ## DSTTYPE(DSTPREFIX); \
SRCPTR = PtrAddBytes(SRCPTR, SRCTYPE ## PixelStride); \
DSTPTR = PtrAddBytes(DSTPTR, DSTTYPE ## PixelStride); \
Next ## DSTTYPE ## StoreVarsX(DSTPREFIX); \
} while (--w > 0); \
FinalStore ## DSTTYPE(DSTPTR, DSTPREFIX); \
SRCPTR = PtrAddBytes(SRCPTR, srcScan); \
DSTPTR = PtrAddBytes(DSTPTR, dstScan); \
Next ## DSTTYPE ## StoreVarsY(DSTPREFIX); \
} while (--HEIGHT > 0); \
} while (0)
#define BBXorVia1IntArgb(SRCPTR, SRCTYPE, SRCPREFIX, \
DSTPTR, DSTTYPE, DSTPREFIX, \
XVAR, XORPIXEL, MASK, DSTINFOPTR) \
do { \
jint srcpixel; \
Load ## SRCTYPE ## To1IntArgb(SRCPTR, SRCPREFIX, XVAR, srcpixel); \
\
if (IsArgbTransparent(srcpixel)) { \
break; \
} \
\
DSTTYPE ## PixelFromArgb(srcpixel, srcpixel, DSTINFOPTR); \
\
Xor ## DSTTYPE ## PixelData(DSTPTR, XVAR, DSTPREFIX, srcpixel, \
XORPIXEL, MASK); \
} while (0)
#define DEFINE_BYTE_BINARY_CONVERT_BLIT(SRC, DST, STRATEGY) \
void NAME_CONVERT_BLIT(SRC, DST)(void *srcBase, void *dstBase, \
juint width, juint height, \
SurfaceDataRasInfo *pSrcInfo, \
SurfaceDataRasInfo *pDstInfo, \
NativePrimitive *pPrim, \
CompositeInfo *pCompInfo) \
{ \
Declare ## SRC ## LoadVars(SrcRead) \
Declare ## DST ## StoreVars(DstWrite) \
\
Init ## SRC ## LoadVars(SrcRead, pSrcInfo); \
BBBlitLoopWidthHeight(SRC, pSrc, srcBase, pSrcInfo, SrcRead, \
DST, pDst, dstBase, pDstInfo, DstWrite, \
width, height, \
ConvertVia ## STRATEGY(pSrc, SRC, SrcRead, \
pDst, DST, DstWrite, \
0, 0)); \
}
#define DEFINE_BYTE_BINARY_XOR_BLIT(SRC, DST) \
void NAME_XOR_BLIT(SRC, DST)(void *srcBase, void *dstBase, \
juint width, juint height, \
SurfaceDataRasInfo *pSrcInfo, \
SurfaceDataRasInfo *pDstInfo, \
NativePrimitive *pPrim, \
CompositeInfo *pCompInfo) \
{ \
jint xorpixel = pCompInfo->details.xorPixel; \
juint alphamask = pCompInfo->alphaMask; \
Declare ## SRC ## LoadVars(SrcRead) \
Declare ## DST ## StoreVars(DstWrite) \
\
Init ## SRC ## LoadVars(SrcRead, pSrcInfo); \
BBBlitLoopWidthHeight(SRC, pSrc, srcBase, pSrcInfo, SrcRead, \
DST, pDst, dstBase, pDstInfo, DstWrite, \
width, height, \
BBXorVia1IntArgb(pSrc, SRC, SrcRead, \
pDst, DST, DstWrite, \
0, xorpixel, \
alphamask, pDstInfo)); \
}
#define DEFINE_BYTE_BINARY_SOLID_FILLRECT(DST) \
void NAME_SOLID_FILLRECT(DST)(SurfaceDataRasInfo *pRasInfo, \
jint lox, jint loy, \
jint hix, jint hiy, \
jint pixel, \
NativePrimitive *pPrim, \
CompositeInfo *pCompInfo) \
{ \
DST ## DataType *pPix; \
jint scan = pRasInfo->scanStride; \
juint height = hiy - loy; \
juint width = hix - lox; \
\
pPix = PtrCoord(pRasInfo->rasBase, lox, DST ## PixelStride, loy, scan); \
do { \
Declare ## DST ## InitialLoadVars(pRasInfo, pPix, DstPix, lox) \
jint w = width; \
do { \
InitialLoad ## DST(pPix, DstPix); \
Store ## DST ## PixelData(pPix, 0, pixel, DstPix); \
ShiftBits ## DST(DstPix); \
} while (--w > 0); \
FinalStore ## DST(pPix, DstPix); \
pPix = PtrAddBytes(pPix, scan); \
} while (--height > 0); \
}
#define DEFINE_BYTE_BINARY_SOLID_FILLSPANS(DST) \
void NAME_SOLID_FILLSPANS(DST)(SurfaceDataRasInfo *pRasInfo, \
SpanIteratorFuncs *pSpanFuncs, void *siData, \
jint pixel, NativePrimitive *pPrim, \
CompositeInfo *pCompInfo) \
{ \
void *pBase = pRasInfo->rasBase; \
jint scan = pRasInfo->scanStride; \
jint bbox[4]; \
\
while ((*pSpanFuncs->nextSpan)(siData, bbox)) { \
jint x = bbox[0]; \
jint y = bbox[1]; \
juint w = bbox[2] - x; \
juint h = bbox[3] - y; \
DST ## DataType *pPix = PtrCoord(pBase, \
x, DST ## PixelStride, \
y, scan); \
do { \
Declare ## DST ## InitialLoadVars(pRasInfo, pPix, DstPix, x) \
jint relx = w; \
do { \
InitialLoad ## DST(pPix, DstPix); \
Store ## DST ## PixelData(pPix, 0, pixel, DstPix); \
ShiftBits ## DST(DstPix); \
} while (--relx > 0); \
FinalStore ## DST(pPix, DstPix); \
pPix = PtrAddBytes(pPix, scan); \
} while (--h > 0); \
} \
}
#define DEFINE_BYTE_BINARY_SOLID_DRAWLINE(DST) \
void NAME_SOLID_DRAWLINE(DST)(SurfaceDataRasInfo *pRasInfo, \
jint x1, jint y1, jint pixel, \
jint steps, jint error, \
jint bumpmajormask, jint errmajor, \
jint bumpminormask, jint errminor, \
NativePrimitive *pPrim, \
CompositeInfo *pCompInfo) \
{ \
jint scan = pRasInfo->scanStride; \
DST ## DataType *pPix = PtrCoord(pRasInfo->rasBase, \
x1, DST ## PixelStride, \
y1, scan); \
DeclareBumps(bumpmajor, bumpminor) \
\
scan *= DST ## PixelsPerByte; \
InitBumps(bumpmajor, bumpminor, bumpmajormask, bumpminormask, 1, scan); \
if (errmajor == 0) { \
do { \
Declare ## DST ## InitialLoadVars(pRasInfo, pPix, DstPix, x1) \
Store ## DST ## PixelData(pPix, 0, pixel, DstPix); \
FinalStore ## DST(pPix, DstPix); \
x1 += bumpmajor; \
} while (--steps > 0); \
} else { \
do { \
Declare ## DST ## InitialLoadVars(pRasInfo, pPix, DstPix, x1) \
Store ## DST ## PixelData(pPix, 0, pixel, DstPix); \
FinalStore ## DST(pPix, DstPix); \
if (error < 0) { \
x1 += bumpmajor; \
error += errmajor; \
} else { \
x1 += bumpminor; \
error -= errminor; \
} \
} while (--steps > 0); \
} \
}
#define DEFINE_BYTE_BINARY_XOR_FILLRECT(DST) \
void NAME_XOR_FILLRECT(DST)(SurfaceDataRasInfo *pRasInfo, \
jint lox, jint loy, \
jint hix, jint hiy, \
jint pixel, \
NativePrimitive *pPrim, \
CompositeInfo *pCompInfo) \
{ \
jint xorpixel = pCompInfo->details.xorPixel; \
juint alphamask = pCompInfo->alphaMask; \
DST ## DataType *pPix; \
jint scan = pRasInfo->scanStride; \
juint height = hiy - loy; \
juint width = hix - lox; \
\
pPix = PtrCoord(pRasInfo->rasBase, lox, DST ## PixelStride, loy, scan); \
do { \
Declare ## DST ## InitialLoadVars(pRasInfo, pPix, DstPix, lox) \
jint w = width; \
do { \
InitialLoad ## DST(pPix, DstPix); \
Xor ## DST ## PixelData(pPix, 0, DstPix, \
pixel, xorpixel, alphamask); \
ShiftBits ## DST(DstPix); \
} while (--w > 0); \
FinalStore ## DST(pPix, DstPix); \
pPix = PtrAddBytes(pPix, scan); \
} while (--height > 0); \
}
#define DEFINE_BYTE_BINARY_XOR_FILLSPANS(DST) \
void NAME_XOR_FILLSPANS(DST)(SurfaceDataRasInfo *pRasInfo, \
SpanIteratorFuncs *pSpanFuncs, \
void *siData, jint pixel, \
NativePrimitive *pPrim, \
CompositeInfo *pCompInfo) \
{ \
void *pBase = pRasInfo->rasBase; \
jint xorpixel = pCompInfo->details.xorPixel; \
juint alphamask = pCompInfo->alphaMask; \
jint scan = pRasInfo->scanStride; \
jint bbox[4]; \
\
while ((*pSpanFuncs->nextSpan)(siData, bbox)) { \
jint x = bbox[0]; \
jint y = bbox[1]; \
juint w = bbox[2] - x; \
juint h = bbox[3] - y; \
DST ## DataType *pPix = PtrCoord(pBase, \
x, DST ## PixelStride, \
y, scan); \
do { \
Declare ## DST ## InitialLoadVars(pRasInfo, pPix, DstPix, x) \
jint relx = w; \
do { \
InitialLoad ## DST(pPix, DstPix); \
Xor ## DST ## PixelData(pPix, 0, DstPix, \
pixel, xorpixel, alphamask); \
ShiftBits ## DST(DstPix); \
} while (--relx > 0); \
FinalStore ## DST(pPix, DstPix); \
pPix = PtrAddBytes(pPix, scan); \
} while (--h > 0); \
} \
}
#define DEFINE_BYTE_BINARY_XOR_DRAWLINE(DST) \
void NAME_XOR_DRAWLINE(DST)(SurfaceDataRasInfo *pRasInfo, \
jint x1, jint y1, jint pixel, \
jint steps, jint error, \
jint bumpmajormask, jint errmajor, \
jint bumpminormask, jint errminor, \
NativePrimitive *pPrim, \
CompositeInfo *pCompInfo) \
{ \
jint xorpixel = pCompInfo->details.xorPixel; \
juint alphamask = pCompInfo->alphaMask; \
jint scan = pRasInfo->scanStride; \
DST ## DataType *pPix = PtrCoord(pRasInfo->rasBase, \
x1, DST ## PixelStride, \
y1, scan); \
DeclareBumps(bumpmajor, bumpminor) \
\
scan *= DST ## PixelsPerByte; \
InitBumps(bumpmajor, bumpminor, bumpmajormask, bumpminormask, 1, scan); \
\
if (errmajor == 0) { \
do { \
Declare ## DST ## InitialLoadVars(pRasInfo, pPix, DstPix, x1) \
Xor ## DST ## PixelData(pPix, 0, DstPix, \
pixel, xorpixel, alphamask); \
FinalStore ## DST(pPix, DstPix); \
x1 += bumpmajor; \
} while (--steps > 0); \
} else { \
do { \
Declare ## DST ## InitialLoadVars(pRasInfo, pPix, DstPix, x1) \
Xor ## DST ## PixelData(pPix, 0, DstPix, \
pixel, xorpixel, alphamask); \
FinalStore ## DST(pPix, DstPix); \
if (error < 0) { \
x1 += bumpmajor; \
error += errmajor; \
} else { \
x1 += bumpminor; \
error -= errminor; \
} \
} while (--steps > 0); \
} \
}
#define DEFINE_BYTE_BINARY_SOLID_DRAWGLYPHLIST(DST) \
void NAME_SOLID_DRAWGLYPHLIST(DST)(SurfaceDataRasInfo *pRasInfo, \
ImageRef *glyphs, \
jint totalGlyphs, jint fgpixel, \
jint argbcolor, \
jint clipLeft, jint clipTop, \
jint clipRight, jint clipBottom, \
NativePrimitive *pPrim, \
CompositeInfo *pCompInfo) \
{ \
jint glyphCounter; \
jint scan = pRasInfo->scanStride; \
DST ## DataType *pPix; \
\
for (glyphCounter = 0; glyphCounter < totalGlyphs; glyphCounter++) { \
DeclareDrawGlyphListClipVars(pixels, rowBytes, width, height, \
left, top, right, bottom) \
ClipDrawGlyphList(DST, pixels, 1, rowBytes, width, height, \
left, top, right, bottom, \
clipLeft, clipTop, clipRight, clipBottom, \
glyphs, glyphCounter, continue) \
pPix = PtrCoord(pRasInfo->rasBase,left,DST ## PixelStride,top,scan); \
\
do { \
Declare ## DST ## InitialLoadVars(pRasInfo, pPix, DstPix, left) \
jint x = 0; \
do { \
InitialLoad ## DST(pPix, DstPix); \
if (pixels[x]) { \
Store ## DST ## PixelData(pPix, 0, fgpixel, DstPix); \
} \
ShiftBits ## DST(DstPix); \
} while (++x < width); \
FinalStore ## DST(pPix, DstPix); \
pPix = PtrAddBytes(pPix, scan); \
pixels += rowBytes; \
} while (--height > 0); \
} \
}
/*
* REMIND: we shouldn't be attempting to do antialiased text for the
* ByteBinary surfaces in the first place
*/
#define DEFINE_BYTE_BINARY_SOLID_DRAWGLYPHLISTAA(DST, STRATEGY) \
void NAME_SOLID_DRAWGLYPHLISTAA(DST)(SurfaceDataRasInfo *pRasInfo, \
ImageRef *glyphs, \
jint totalGlyphs, jint fgpixel, \
jint argbcolor, \
jint clipLeft, jint clipTop, \
jint clipRight, jint clipBottom, \
NativePrimitive *pPrim, \
CompositeInfo *pCompInfo) \
{ \
jint glyphCounter; \
jint scan = pRasInfo->scanStride; \
DST ## DataType *pPix; \
DeclareAlphaVarFor ## STRATEGY(srcA) \
DeclareCompVarsFor ## STRATEGY(src) \
\
Declare ## DST ## LoadVars(pix) \
Declare ## DST ## StoreVars(pix) \
\
Init ## DST ## LoadVars(pix, pRasInfo); \
Init ## DST ## StoreVarsY(pix, pRasInfo); \
Init ## DST ## StoreVarsX(pix, pRasInfo); \
Extract ## STRATEGY ## CompsAndAlphaFromArgb(argbcolor, src); \
\
for (glyphCounter = 0; glyphCounter < totalGlyphs; glyphCounter++) { \
DeclareDrawGlyphListClipVars(pixels, rowBytes, width, height, \
left, top, right, bottom) \
ClipDrawGlyphList(DST, pixels, 1, rowBytes, width, height, \
left, top, right, bottom, \
clipLeft, clipTop, clipRight, clipBottom, \
glyphs, glyphCounter, continue) \
pPix = PtrCoord(pRasInfo->rasBase,left,DST ## PixelStride,top,scan); \
\
Set ## DST ## StoreVarsYPos(pix, pRasInfo, top); \
do { \
Declare ## DST ## InitialLoadVars(pRasInfo, pPix, pix, left) \
int x = 0; \
Set ## DST ## StoreVarsXPos(pix, pRasInfo, left); \
do { \
InitialLoad ## DST(pPix, pix); \
GlyphListAABlend ## STRATEGY(DST, pixels, x, pPix, \
fgpixel, pix, src); \
ShiftBits ## DST(pix); \
Next ## DST ## StoreVarsX(pix); \
} while (++x < width); \
FinalStore ## DST(pPix, pix); \
pPix = PtrAddBytes(pPix, scan); \
pixels += rowBytes; \
Next ## DST ## StoreVarsY(pix); \
} while (--height > 0); \
} \
}
#define DEFINE_BYTE_BINARY_XOR_DRAWGLYPHLIST(DST) \
void NAME_XOR_DRAWGLYPHLIST(DST)(SurfaceDataRasInfo *pRasInfo, \
ImageRef *glyphs, \
jint totalGlyphs, jint fgpixel, \
jint argbcolor, \
jint clipLeft, jint clipTop, \
jint clipRight, jint clipBottom, \
NativePrimitive *pPrim, \
CompositeInfo *pCompInfo) \
{ \
jint glyphCounter; \
jint scan = pRasInfo->scanStride; \
jint xorpixel = pCompInfo->details.xorPixel; \
juint alphamask = pCompInfo->alphaMask; \
DST ## DataType *pPix; \
\
for (glyphCounter = 0; glyphCounter < totalGlyphs; glyphCounter++) { \
DeclareDrawGlyphListClipVars(pixels, rowBytes, width, height, \
left, top, right, bottom) \
ClipDrawGlyphList(DST, pixels, 1, rowBytes, width, height, \
left, top, right, bottom, \
clipLeft, clipTop, clipRight, clipBottom, \
glyphs, glyphCounter, continue) \
pPix = PtrCoord(pRasInfo->rasBase,left,DST ## PixelStride,top,scan); \
\
do { \
Declare ## DST ## InitialLoadVars(pRasInfo, pPix, DstPix, left) \
jint x = 0; \
do { \
InitialLoad ## DST(pPix, DstPix); \
if (pixels[x]) { \
Xor ## DST ## PixelData(pPix, 0, DstPix, \
fgpixel, xorpixel, alphamask); \
} \
ShiftBits ## DST(DstPix); \
} while (++x < width); \
FinalStore ## DST(pPix, DstPix); \
pPix = PtrAddBytes(pPix, scan); \
pixels += rowBytes; \
} while (--height > 0); \
} \
}
#define DEFINE_BYTE_BINARY_ALPHA_MASKBLIT(SRC, DST, STRATEGY) \
void NAME_ALPHA_MASKBLIT(SRC, DST) \
(void *dstBase, void *srcBase, \
jubyte *pMask, jint maskOff, jint maskScan, \
jint width, jint height, \
SurfaceDataRasInfo *pDstInfo, \
SurfaceDataRasInfo *pSrcInfo, \
NativePrimitive *pPrim, \
CompositeInfo *pCompInfo) \
{ \
DeclareAndSetOpaqueAlphaVarFor ## STRATEGY(pathA) \
DeclareAndClearAlphaVarFor ## STRATEGY(srcA) \
DeclareAndClearAlphaVarFor ## STRATEGY(dstA) \
DeclareAndInitExtraAlphaFor ## STRATEGY(extraA) \
jint srcScan = pSrcInfo->scanStride; \
jint dstScan = pDstInfo->scanStride; \
jboolean loadsrc, loaddst; \
jint srcx1 = pSrcInfo->bounds.x1; \
jint dstx1 = pDstInfo->bounds.x1; \
SRC ## DataType *pSrc = (SRC ## DataType *) (srcBase); \
DST ## DataType *pDst = (DST ## DataType *) (dstBase); \
Declare ## SRC ## AlphaLoadData(SrcRead) \
Declare ## DST ## AlphaLoadData(DstWrite) \
Declare ## DST ## StoreVars(DstWrite) \
DeclareAlphaOperands(SrcOp) \
DeclareAlphaOperands(DstOp) \
\
ExtractAlphaOperandsFor ## STRATEGY(AlphaRules[pCompInfo->rule].srcOps, \
SrcOp); \
ExtractAlphaOperandsFor ## STRATEGY(AlphaRules[pCompInfo->rule].dstOps, \
DstOp); \
loadsrc = !FuncIsZero(SrcOp) || FuncNeedsAlpha(DstOp); \
loaddst = pMask || !FuncIsZero(DstOp) || FuncNeedsAlpha(SrcOp); \
\
Init ## SRC ## AlphaLoadData(SrcRead, pSrcInfo); \
Init ## DST ## AlphaLoadData(DstWrite, pDstInfo); \
srcScan -= width * SRC ## PixelStride; \
dstScan -= width * DST ## PixelStride; \
maskScan -= width; \
if (pMask) { \
pMask += maskOff; \
} \
\
Init ## DST ## StoreVarsY(DstWrite, pDstInfo); \
do { \
Declare ## SRC ## InitialLoadVars(pSrcInfo, pSrc, SrcRead, srcx1) \
Declare ## DST ## InitialLoadVars(pDstInfo, pDst, DstWrite, dstx1) \
jint w = width; \
Init ## DST ## StoreVarsX(DstWrite, pDstInfo); \
do { \
DeclareAlphaVarFor ## STRATEGY(resA) \
DeclareCompVarsFor ## STRATEGY(res) \
DeclareAlphaVarFor ## STRATEGY(srcF) \
DeclareAlphaVarFor ## STRATEGY(dstF) \
\
InitialLoad ## SRC(pSrc, SrcRead); \
InitialLoad ## DST(pDst, DstWrite); \
if (pMask) { \
pathA = *pMask++; \
if (!pathA) { \
ShiftBits ## SRC(SrcRead); \
ShiftBits ## DST(DstWrite); \
pSrc = PtrAddBytes(pSrc, SRC ## PixelStride); \
pDst = PtrAddBytes(pDst, DST ## PixelStride); \
Next ## DST ## StoreVarsX(DstWrite); \
continue; \
} \
PromoteByteAlphaFor ## STRATEGY(pathA); \
} \
if (loadsrc) { \
LoadAlphaFrom ## SRC ## For ## STRATEGY(pSrc,SrcRead,src); \
srcA = MultiplyAlphaFor ## STRATEGY(extraA, srcA); \
} \
if (loaddst) { \
LoadAlphaFrom ## DST ## For ## STRATEGY(pDst,DstWrite,dst); \
} \
srcF = ApplyAlphaOperands(SrcOp, dstA); \
dstF = ApplyAlphaOperands(DstOp, srcA); \
if (pathA != MaxValFor ## STRATEGY) { \
srcF = MultiplyAlphaFor ## STRATEGY(pathA, srcF); \
dstF = MaxValFor ## STRATEGY - pathA + \
MultiplyAlphaFor ## STRATEGY(pathA, dstF); \
} \
if (srcF) { \
resA = MultiplyAlphaFor ## STRATEGY(srcF, srcA); \
if (!(SRC ## IsPremultiplied)) { \
srcF = resA; \
} else { \
srcF = MultiplyAlphaFor ## STRATEGY(srcF, extraA); \
} \
if (srcF) { \
/* assert(loadsrc); */ \
Postload ## STRATEGY ## From ## SRC(pSrc, SrcRead, res); \
if (srcF != MaxValFor ## STRATEGY) { \
MultiplyAndStore ## STRATEGY ## Comps(res, \
srcF, res); \
} \
} else { \
Set ## STRATEGY ## CompsToZero(res); \
} \
} else { \
if (dstF == MaxValFor ## STRATEGY) { \
ShiftBits ## SRC(SrcRead); \
ShiftBits ## DST(DstWrite); \
pSrc = PtrAddBytes(pSrc, SRC ## PixelStride); \
pDst = PtrAddBytes(pDst, DST ## PixelStride); \
Next ## DST ## StoreVarsX(DstWrite); \
continue; \
} \
resA = 0; \
Set ## STRATEGY ## CompsToZero(res); \
} \
if (dstF) { \
dstA = MultiplyAlphaFor ## STRATEGY(dstF, dstA); \
if (!(DST ## IsPremultiplied)) { \
dstF = dstA; \
} \
resA += dstA; \
if (dstF) { \
DeclareCompVarsFor ## STRATEGY(tmp) \
/* assert(loaddst); */ \
Postload ## STRATEGY ## From ## DST(pDst,DstWrite,tmp); \
if (dstF != MaxValFor ## STRATEGY) { \
MultiplyAndStore ## STRATEGY ## Comps(tmp, \
dstF, tmp); \
} \
Store ## STRATEGY ## CompsUsingOp(res, +=, tmp); \
} \
} \
if (!(DST ## IsPremultiplied) && resA && \
resA < MaxValFor ## STRATEGY) \
{ \
DivideAndStore ## STRATEGY ## Comps(res, res, resA); \
} \
Store ## DST ## From ## STRATEGY ## Comps(pDst, DstWrite, \
0, res); \
ShiftBits ## SRC(SrcRead); \
ShiftBits ## DST(DstWrite); \
pSrc = PtrAddBytes(pSrc, SRC ## PixelStride); \
pDst = PtrAddBytes(pDst, DST ## PixelStride); \
Next ## DST ## StoreVarsX(DstWrite); \
} while (--w > 0); \
FinalStore ## DST(pDst, DstWrite); \
pSrc = PtrAddBytes(pSrc, srcScan); \
pDst = PtrAddBytes(pDst, dstScan); \
Next ## DST ## StoreVarsY(DstWrite); \
if (pMask) { \
pMask = PtrAddBytes(pMask, maskScan); \
} \
} while (--height > 0); \
}
#define DEFINE_BYTE_BINARY_ALPHA_MASKFILL(TYPE, STRATEGY) \
void NAME_ALPHA_MASKFILL(TYPE) \
(void *rasBase, \
jubyte *pMask, jint maskOff, jint maskScan, \
jint width, jint height, \
jint fgColor, \
SurfaceDataRasInfo *pRasInfo, \
NativePrimitive *pPrim, \
CompositeInfo *pCompInfo) \
{ \
DeclareAndSetOpaqueAlphaVarFor ## STRATEGY(pathA) \
DeclareAlphaVarFor ## STRATEGY(srcA) \
DeclareCompVarsFor ## STRATEGY(src) \
DeclareAndClearAlphaVarFor ## STRATEGY(dstA) \
DeclareAlphaVarFor ## STRATEGY(dstF) \
DeclareAlphaVarFor ## STRATEGY(dstFbase) \
jint rasScan = pRasInfo->scanStride; \
jboolean loaddst; \
jint x1 = pRasInfo->bounds.x1; \
TYPE ## DataType *pRas = (TYPE ## DataType *) (rasBase); \
Declare ## TYPE ## AlphaLoadData(DstWrite) \
Declare ## TYPE ## StoreVars(DstWrite) \
DeclareAlphaOperands(SrcOp) \
DeclareAlphaOperands(DstOp) \
\
Extract ## STRATEGY ## CompsAndAlphaFromArgb(fgColor, src); \
if (srcA != MaxValFor ## STRATEGY) { \
MultiplyAndStore ## STRATEGY ## Comps(src, srcA, src); \
} \
\
ExtractAlphaOperandsFor ## STRATEGY(AlphaRules[pCompInfo->rule].srcOps, \
SrcOp); \
ExtractAlphaOperandsFor ## STRATEGY(AlphaRules[pCompInfo->rule].dstOps, \
DstOp); \
loaddst = pMask || !FuncIsZero(DstOp) || FuncNeedsAlpha(SrcOp); \
\
dstFbase = dstF = ApplyAlphaOperands(DstOp, srcA); \
\
Init ## TYPE ## AlphaLoadData(DstWrite, pRasInfo); \
maskScan -= width; \
if (pMask) { \
pMask += maskOff; \
} \
\
Init ## TYPE ## StoreVarsY(DstWrite, pRasInfo); \
do { \
Declare ## TYPE ## InitialLoadVars(pRasInfo, pRas, DstWrite, x1) \
jint w = width; \
Init ## TYPE ## StoreVarsX(DstWrite, pRasInfo); \
do { \
DeclareAlphaVarFor ## STRATEGY(resA) \
DeclareCompVarsFor ## STRATEGY(res) \
DeclareAlphaVarFor ## STRATEGY(srcF) \
\
InitialLoad ## TYPE(pRas, DstWrite); \
if (pMask) { \
pathA = *pMask++; \
if (!pathA) { \
ShiftBits ## TYPE(DstWrite); \
Next ## TYPE ## StoreVarsX(DstWrite); \
continue; \
} \
PromoteByteAlphaFor ## STRATEGY(pathA); \
dstF = dstFbase; \
} \
if (loaddst) { \
LoadAlphaFrom ## TYPE ## For ## STRATEGY(pRas,DstWrite,dst);\
} \
srcF = ApplyAlphaOperands(SrcOp, dstA); \
if (pathA != MaxValFor ## STRATEGY) { \
srcF = MultiplyAlphaFor ## STRATEGY(pathA, srcF); \
dstF = MaxValFor ## STRATEGY - pathA + \
MultiplyAlphaFor ## STRATEGY(pathA, dstF); \
} \
if (srcF) { \
if (srcF == MaxValFor ## STRATEGY) { \
resA = srcA; \
Store ## STRATEGY ## CompsUsingOp(res, =, src); \
} else { \
resA = MultiplyAlphaFor ## STRATEGY(srcF, srcA); \
MultiplyAndStore ## STRATEGY ## Comps(res, srcF, src); \
} \
} else { \
if (dstF == MaxValFor ## STRATEGY) { \
ShiftBits ## TYPE(DstWrite); \
Next ## TYPE ## StoreVarsX(DstWrite); \
continue; \
} \
resA = 0; \
Set ## STRATEGY ## CompsToZero(res); \
} \
if (dstF) { \
dstA = MultiplyAlphaFor ## STRATEGY(dstF, dstA); \
if (!(TYPE ## IsPremultiplied)) { \
dstF = dstA; \
} \
resA += dstA; \
if (dstF) { \
DeclareCompVarsFor ## STRATEGY(tmp) \
/* assert(loaddst); */ \
Postload ## STRATEGY ## From ## TYPE(pRas,DstWrite,tmp); \
if (dstF != MaxValFor ## STRATEGY) { \
MultiplyAndStore ## STRATEGY ## Comps(tmp, \
dstF, tmp); \
} \
Store ## STRATEGY ## CompsUsingOp(res, +=, tmp); \
} \
} \
if (!(TYPE ## IsPremultiplied) && resA && \
resA < MaxValFor ## STRATEGY) \
{ \
DivideAndStore ## STRATEGY ## Comps(res, res, resA); \
} \
Store ## TYPE ## From ## STRATEGY ## Comps(pRas, DstWrite, \
0, res); \
ShiftBits ## TYPE(DstWrite); \
Next ## TYPE ## StoreVarsX(DstWrite); \
} while (--w > 0); \
FinalStore ## TYPE(pRas, DstWrite); \
pRas = PtrAddBytes(pRas, rasScan); \
Next ## TYPE ## StoreVarsY(DstWrite); \
if (pMask) { \
pMask = PtrAddBytes(pMask, maskScan); \
} \
} while (--height > 0); \
}
/*
* The macros defined above use the following macro definitions supplied
* for the various ByteBinary-specific surface types to manipulate pixel data.
*
* In the macro names in the following definitions, the string <stype>
* is used as a place holder for the SurfaceType name (eg. ByteBinary2Bit).
* The macros above access these type specific macros using the ANSI
* CPP token concatenation operator "##".
*
* Declare<stype>InitialLoadVars Declare and initialize the variables used
* for managing byte/bit offsets
* InitialLoad<stype> Store the current byte, fetch the next
* byte, and reset the bit offset
* ShiftBits<stype> Advance to the next pixel by adjusting
* the bit offset (1, 2, or 4 bits)
* FinalStore<stype> Store the current byte
* CurrentPixel<stype> Represents the current pixel by shifting
* the value with the current bit offset and
* then masking the value to either 1, 2, or
* 4 bits
*/
#endif /* AnyByteBinary_h_Included */