Mercurial > vba-clojure
view src/filters/pixel.cpp @ 513:3dbb863eb801
accuracy of displayed image is much improved, but there the palettes are still messed up.
author | Robert McIntyre <rlm@mit.edu> |
---|---|
date | Fri, 22 Jun 2012 18:58:47 -0500 |
parents | f9f4f1b99eed |
children |
line wrap: on
line source
1 #include "../Port.h"3 extern u32 RGB_LOW_BITS_MASK;5 void Pixelate2x16(u8 *srcPtr, u32 srcPitch, u8 *deltaPtr,6 u8 *dstPtr, u32 dstPitch, int width, int height)7 {8 u8 *nextLine, *finish;9 u32 colorMask = ~(RGB_LOW_BITS_MASK | (RGB_LOW_BITS_MASK << 16));10 colorMask = (colorMask >> 2) & (colorMask >> 1);12 nextLine = dstPtr + dstPitch;14 do15 {16 u32 *bP = (u32 *) srcPtr;17 u32 *xP = (u32 *) deltaPtr;18 u32 *dP = (u32 *) dstPtr;19 u32 *nL = (u32 *) nextLine;20 u32 currentPixel;21 u32 nextPixel;22 u32 currentDelta;23 u32 nextDelta;25 finish = (u8 *) bP + ((width+2) << 1);26 nextPixel = *bP++;27 nextDelta = *xP++;29 do30 {31 currentPixel = nextPixel;32 currentDelta = nextDelta;33 nextPixel = *bP++;34 nextDelta = *xP++;36 if ((nextPixel != nextDelta) || (currentPixel != currentDelta))37 {38 u32 colorA, colorB, product;40 *(xP - 2) = currentPixel;41 #ifdef WORDS_BIGENDIAN42 colorA = currentPixel >> 16;43 colorB = currentPixel & 0xffff;44 #else45 colorA = currentPixel & 0xffff;46 colorB = currentPixel >> 16;47 #endif48 product = (colorA >> 2) & colorMask;50 #ifdef WORDS_BIGENDIAN51 *(nL) = (product << 16) | (product);52 *(dP) = (colorA << 16) | product;53 #else54 *(nL) = product | (product << 16);55 *(dP) = colorA | (product << 16);56 #endif58 #ifdef WORDS_BIGENDIAN59 colorA = nextPixel >> 16;60 #else61 colorA = nextPixel & 0xffff;62 #endif63 product = (colorB >> 2) & colorMask;64 #ifdef WORDS_BIGENDIAN65 *(nL + 1) = (product << 16) | (product);66 *(dP + 1) = (colorB << 16) | (product);67 #else68 *(nL + 1) = (product) | (product << 16);69 *(dP + 1) = (colorB) | (product << 16);70 #endif71 }73 dP += 2;74 nL += 2;75 }76 while ((u8 *) bP < finish);78 deltaPtr += srcPitch;79 srcPtr += srcPitch;80 dstPtr += dstPitch << 1;81 nextLine += dstPitch << 1;82 }83 while (--height);84 }86 void Pixelate2x32(u8 *srcPtr, u32 srcPitch, u8 * /* deltaPtr */,87 u8 *dstPtr, u32 dstPitch, int width, int height)88 {89 u8 *nextLine, *finish;90 u32 colorMask = ((u32)~RGB_LOW_BITS_MASK >> 2) & ((u32)~RGB_LOW_BITS_MASK >> 1);92 nextLine = dstPtr + dstPitch;94 do95 {96 u32 *bP = (u32 *) srcPtr;97 // u32 *xP = (u32 *) deltaPtr;98 u32 *dP = (u32 *) dstPtr;99 u32 *nL = (u32 *) nextLine;100 u32 currentPixel;101 u32 nextPixel;103 finish = (u8 *) bP + ((width+1) << 2);104 nextPixel = *bP++;106 do107 {108 u32 product;110 currentPixel = nextPixel;111 nextPixel = *bP++;112 product = (currentPixel >> 2) & colorMask;113 *(nL) = product;114 *(nL+1) = product;115 *(dP) = currentPixel;116 *(dP+1) = product;118 currentPixel = nextPixel;119 nextPixel = *bP++;120 product = (currentPixel >> 2) & colorMask;121 *(nL + 2) = product;122 *(nL + 3) = product;123 *(dP + 2) = currentPixel;124 *(dP + 3) = product;126 dP += 4;127 nL += 4;128 }129 while ((u8 *) bP < finish);131 srcPtr += srcPitch;132 dstPtr += dstPitch << 1;133 nextLine += dstPitch << 1;134 }135 while (--height);136 }138 // generic Pixelate Nx magnification filter139 template <int magnification, typename ColorType>140 void PixelateNx(u8 *srcPtr, u32 srcPitch, u8 * /* deltaPtr */,141 u8 *dstPtr, u32 dstPitch, int width, int height)142 {143 ColorType colorMask = ((ColorType)~RGB_LOW_BITS_MASK >> 2) & ((ColorType)~RGB_LOW_BITS_MASK >> 1);145 srcPitch = srcPitch / sizeof(ColorType) - width;146 u32 dstNextP = dstPitch / sizeof(ColorType);147 u32 dstNextL = (dstNextP - width) * magnification; // skip to the next magnificated 'line'148 dstNextP -= magnification;150 u32 offset = (dstPitch + sizeof(ColorType)) * magnification - dstPitch;152 ColorType *src = (ColorType *)srcPtr;153 ColorType *dst = (ColorType *)dstPtr;155 do // per src line156 {157 u8 *finishP = (u8 *)dst + offset;158 for (int x = 0; x < width; ++x) // per pixel in line159 {160 ColorType col = *src;161 ColorType *dst2 = dst;162 u8 *finishM = (u8 *)(dst + magnification);164 ColorType product = (col >> 2) & colorMask;165 do166 {167 *dst2 = product;168 } while ((u8 *)++dst2 < finishM);169 dst2 += dstNextP;170 finishM += dstPitch;171 do // dst magnificated pixel172 {173 *dst2++ = product;174 do175 {176 *dst2 = col;177 } while ((u8 *)++dst2 < finishM);178 dst2 += dstNextP;179 finishM += dstPitch;180 } while ((u8 *)dst2 < finishP);182 ++src;183 dst += magnification;184 finishP += magnification * sizeof(ColorType);185 }186 src += srcPitch;187 dst += dstNextL;188 } while (--height);189 }191 typedef void (*PixelateNxFP)(u8*, u32, u8*, u8*, u32, int, int);193 PixelateNxFP Pixelate3x16 = PixelateNx<3, u16>;194 PixelateNxFP Pixelate3x32 = PixelateNx<3, u32>;195 PixelateNxFP Pixelate4x16 = PixelateNx<4, u16>;196 PixelateNxFP Pixelate4x32 = PixelateNx<4, u32>;