Mercurial > vba-clojure
diff src/filters/scanline.cpp @ 27:b970226568d2
brought in filters package
author | Robert McIntyre <rlm@mit.edu> |
---|---|
date | Sun, 04 Mar 2012 20:32:31 -0600 |
parents | f9f4f1b99eed |
children |
line wrap: on
line diff
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/src/filters/scanline.cpp Sun Mar 04 20:32:31 2012 -0600 1.3 @@ -0,0 +1,225 @@ 1.4 +#include "../Port.h" 1.5 + 1.6 +extern u32 RGB_LOW_BITS_MASK; 1.7 + 1.8 +void Scanlines(u8 *srcPtr, u32 srcPitch, u8 *, 1.9 + u8 *dstPtr, u32 dstPitch, int width, int height) 1.10 +{ 1.11 + u8 *nextLine, *finish; 1.12 + 1.13 + nextLine = dstPtr + dstPitch; 1.14 + 1.15 + do 1.16 + { 1.17 + u32 *bP = (u32 *) srcPtr; 1.18 + u32 *dP = (u32 *) dstPtr; 1.19 + u32 *nL = (u32 *) nextLine; 1.20 + u32 currentPixel; 1.21 + u32 nextPixel; 1.22 + 1.23 + finish = (u8 *) bP + ((width + 2) << 1); 1.24 + nextPixel = *bP++; 1.25 + 1.26 + do 1.27 + { 1.28 + currentPixel = nextPixel; 1.29 + nextPixel = *bP++; 1.30 + u32 colorA, colorB; 1.31 + 1.32 +#ifdef WORDS_BIGENDIAN 1.33 + colorA = currentPixel >> 16; 1.34 + colorB = currentPixel & 0xffff; 1.35 +#else 1.36 + colorA = currentPixel & 0xffff; 1.37 + colorB = currentPixel >> 16; 1.38 +#endif 1.39 + 1.40 + *(dP) = colorA | colorA << 16; 1.41 + *(nL) = 0; 1.42 + 1.43 +#ifdef WORDS_BIGENDIAN 1.44 + colorA = nextPixel >> 16; 1.45 +#else 1.46 + colorA = nextPixel & 0xffff; 1.47 +#endif 1.48 + 1.49 + *(dP + 1) = colorB | (colorB << 16); 1.50 + *(nL + 1) = 0; 1.51 + 1.52 + dP += 2; 1.53 + nL += 2; 1.54 + } 1.55 + while ((u8 *) bP < finish); 1.56 + 1.57 + srcPtr += srcPitch; 1.58 + dstPtr += dstPitch << 1; 1.59 + nextLine += dstPitch << 1; 1.60 + } 1.61 + while (--height); 1.62 +} 1.63 + 1.64 +void Scanlines32(u8 *srcPtr, u32 srcPitch, u8 * /* deltaPtr */, 1.65 + u8 *dstPtr, u32 dstPitch, int width, int height) 1.66 +{ 1.67 + u8 *nextLine, *finish; 1.68 + 1.69 + nextLine = dstPtr + dstPitch; 1.70 + 1.71 + do 1.72 + { 1.73 + u32 *bP = (u32 *) srcPtr; 1.74 + u32 *dP = (u32 *) dstPtr; 1.75 + u32 *nL = (u32 *) nextLine; 1.76 + u32 currentPixel; 1.77 + u32 nextPixel; 1.78 + 1.79 + finish = (u8 *) bP + ((width + 1) << 2); 1.80 + nextPixel = *bP++; 1.81 + 1.82 + do 1.83 + { 1.84 + currentPixel = nextPixel; 1.85 + nextPixel = *bP++; 1.86 + 1.87 + u32 colorA, colorB; 1.88 + 1.89 + colorA = currentPixel; 1.90 + colorB = nextPixel; 1.91 + 1.92 + *(dP) = colorA; 1.93 + *(dP + 1) = colorA; 1.94 + *(nL) = 0; 1.95 + *(nL + 1) = 0; 1.96 + 1.97 + *(dP + 2) = colorB; 1.98 + *(dP + 3) = colorB; 1.99 + *(nL + 2) = 0; 1.100 + *(nL + 3) = 0; 1.101 + 1.102 + nextPixel = *bP++; 1.103 + 1.104 + dP += 4; 1.105 + nL += 4; 1.106 + } 1.107 + while ((u8 *) bP < finish); 1.108 + 1.109 + srcPtr += srcPitch; 1.110 + dstPtr += dstPitch << 1; 1.111 + nextLine += dstPitch << 1; 1.112 + } 1.113 + while (--height); 1.114 +} 1.115 + 1.116 +void ScanlinesTV(u8 *srcPtr, u32 srcPitch, u8 * /* deltaPtr */, 1.117 + u8 *dstPtr, u32 dstPitch, int width, int height) 1.118 +{ 1.119 + u8 *nextLine, *finish; 1.120 + u32 colorMask = ~(RGB_LOW_BITS_MASK | (RGB_LOW_BITS_MASK << 16)); 1.121 + 1.122 + nextLine = dstPtr + dstPitch; 1.123 + 1.124 + do 1.125 + { 1.126 + u32 *bP = (u32 *) srcPtr; 1.127 + u32 *dP = (u32 *) dstPtr; 1.128 + u32 *nL = (u32 *) nextLine; 1.129 + u32 currentPixel; 1.130 + u32 nextPixel; 1.131 + 1.132 + finish = (u8 *) bP + ((width + 2) << 1); 1.133 + nextPixel = *bP++; 1.134 + 1.135 + do 1.136 + { 1.137 + currentPixel = nextPixel; 1.138 + nextPixel = *bP++; 1.139 + 1.140 + u32 colorA, colorB; 1.141 + 1.142 +#ifdef WORDS_BIGENDIAN 1.143 + colorA = currentPixel >> 16; 1.144 + colorB = currentPixel & 0xFFFF; 1.145 +#else 1.146 + colorA = currentPixel & 0xFFFF; 1.147 + colorB = currentPixel >> 16; 1.148 +#endif 1.149 + 1.150 + *(dP) = colorA = colorA | ((((colorA & colorMask) >> 1) + 1.151 + ((colorB & colorMask) >> 1))) << 16; 1.152 + colorA = ((colorA & colorMask) >> 1); 1.153 + colorA += ((colorA & colorMask) >> 1); 1.154 + *(nL) = colorA; 1.155 + 1.156 + colorA = nextPixel & 0xFFFF; 1.157 + 1.158 + *(dP + 1) = colorB = colorB | ((((colorA & colorMask) >> 1) + 1.159 + ((colorB & colorMask) >> 1))) << 16; 1.160 + colorB = ((colorB & colorMask) >> 1); 1.161 + colorB += ((colorB & colorMask) >> 1); 1.162 + 1.163 + *(nL + 1) = colorB; 1.164 + 1.165 + dP += 2; 1.166 + nL += 2; 1.167 + } 1.168 + while ((u8 *) bP < finish); 1.169 + 1.170 + srcPtr += srcPitch; 1.171 + dstPtr += dstPitch << 1; 1.172 + nextLine += dstPitch << 1; 1.173 + } 1.174 + while (--height); 1.175 +} 1.176 + 1.177 +void ScanlinesTV32(u8 *srcPtr, u32 srcPitch, u8 * /* deltaPtr */, 1.178 + u8 *dstPtr, u32 dstPitch, int width, int height) 1.179 +{ 1.180 + u8 *nextLine, *finish; 1.181 + u32 colorMask = ~RGB_LOW_BITS_MASK; 1.182 + 1.183 + nextLine = dstPtr + dstPitch; 1.184 + 1.185 + do 1.186 + { 1.187 + u32 *bP = (u32 *) srcPtr; 1.188 + u32 *dP = (u32 *) dstPtr; 1.189 + u32 *nL = (u32 *) nextLine; 1.190 + u32 currentPixel; 1.191 + u32 nextPixel; 1.192 + 1.193 + finish = (u8 *) bP + ((width + 1) << 2); 1.194 + nextPixel = *bP++; 1.195 + 1.196 + do 1.197 + { 1.198 + currentPixel = nextPixel; 1.199 + nextPixel = *bP++; 1.200 + 1.201 + u32 colorA, colorB, temp; 1.202 + 1.203 + colorA = currentPixel; 1.204 + colorB = nextPixel; 1.205 + 1.206 + *(dP) = colorA; 1.207 + *(dP + 1) = temp = ((colorA & colorMask) >> 1) + 1.208 + ((colorB & colorMask) >> 1); 1.209 + temp = ((temp & colorMask) >> 1); 1.210 + temp += ((temp & colorMask) >> 1); 1.211 + colorA = ((colorA & colorMask) >> 1); 1.212 + colorA += ((colorA & colorMask) >> 1); 1.213 + 1.214 + *(nL) = colorA; 1.215 + *(nL + 1) = temp; 1.216 + 1.217 + dP += 2; 1.218 + nL += 2; 1.219 + } 1.220 + while ((u8 *) bP < finish); 1.221 + 1.222 + srcPtr += srcPitch; 1.223 + dstPtr += dstPitch << 1; 1.224 + nextLine += dstPitch << 1; 1.225 + } 1.226 + while (--height); 1.227 +} 1.228 +