| /* | |
| * 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 */ |