| OLD | NEW |
| (Empty) |
| 1 | |
| 2 /* | |
| 3 * Copyright 2006 The Android Open Source Project | |
| 4 * | |
| 5 * Use of this source code is governed by a BSD-style license that can be | |
| 6 * found in the LICENSE file. | |
| 7 */ | |
| 8 | |
| 9 | |
| 10 | |
| 11 #ifndef NOFILTER_BITMAP_SHADER_PREAMBLE | |
| 12 #define NOFILTER_BITMAP_SHADER_PREAMBLE(bitmap, rb) | |
| 13 #endif | |
| 14 #ifndef NOFILTER_BITMAP_SHADER_POSTAMBLE | |
| 15 #define NOFILTER_BITMAP_SHADER_POSTAMBLE(bitmap) | |
| 16 #endif | |
| 17 #ifndef NOFILTER_BITMAP_SHADER_PREAMBLE16 | |
| 18 #define NOFILTER_BITMAP_SHADER_PREAMBLE16(bitmap, rb) | |
| 19 #endif | |
| 20 #ifndef NOFILTER_BITMAP_SHADER_POSTAMBLE16 | |
| 21 #define NOFILTER_BITMAP_SHADER_POSTAMBLE16(bitmap) | |
| 22 #endif | |
| 23 | |
| 24 class NOFILTER_BITMAP_SHADER_CLASS : public HasSpan16_Sampler_BitmapShader { | |
| 25 public: | |
| 26 NOFILTER_BITMAP_SHADER_CLASS(const SkBitmap& src) | |
| 27 : HasSpan16_Sampler_BitmapShader(src, false, | |
| 28 NOFILTER_BITMAP_SHADER_TILEMODE, | |
| 29 NOFILTER_BITMAP_SHADER_TILEMODE) | |
| 30 { | |
| 31 } | |
| 32 | |
| 33 virtual bool setContext(const SkBitmap& device, const SkPaint& paint, const
SkMatrix& matrix) | |
| 34 { | |
| 35 if (!this->INHERITED::setContext(device, paint, matrix)) | |
| 36 return false; | |
| 37 | |
| 38 #ifdef NOFILTER_BITMAP_SHADER_USE_UNITINVERSE | |
| 39 this->computeUnitInverse(); | |
| 40 #endif | |
| 41 return true; | |
| 42 } | |
| 43 | |
| 44 virtual void shadeSpan(int x, int y, SkPMColor dstC[], int count) | |
| 45 { | |
| 46 SkASSERT(count > 0); | |
| 47 | |
| 48 #ifdef NOFILTER_BITMAP_SHADER_SPRITEPROC32 | |
| 49 if ((this->getTotalInverse().getType() & ~SkMatrix::kTranslate_Mask) ==
0) | |
| 50 { | |
| 51 NOFILTER_BITMAP_SHADER_SPRITEPROC32(this, x, y, dstC, count); | |
| 52 return; | |
| 53 } | |
| 54 #endif | |
| 55 | |
| 56 unsigned scale = SkAlpha255To256(this->getPaintAlpha()); | |
| 57 #ifdef NOFILTER_BITMAP_SHADER_USE_UNITINVERSE | |
| 58 const SkMatrix& inv = this->getUnitInverse(); | |
| 59 SkMatrix::MapPtProc invProc = this->getUnitInverseProc(); | |
| 60 #else | |
| 61 const SkMatrix& inv = this->getTotalInverse(); | |
| 62 SkMatrix::MapPtProc invProc = this->getInverseMapPtProc(); | |
| 63 #endif | |
| 64 const SkBitmap& srcBitmap = this->getSrcBitmap(); | |
| 65 unsigned srcMaxX = srcBitmap.width() - 1; | |
| 66 unsigned srcMaxY = srcBitmap.height() - 1; | |
| 67 unsigned srcRB = srcBitmap.rowBytes(); | |
| 68 SkFixed fx, fy, dx, dy; | |
| 69 | |
| 70 const NOFILTER_BITMAP_SHADER_TYPE* srcPixels = (const NOFILTER_BITMAP_SH
ADER_TYPE*)srcBitmap.getPixels(); | |
| 71 NOFILTER_BITMAP_SHADER_PREAMBLE(srcBitmap, srcRB); | |
| 72 | |
| 73 if (this->getInverseClass() == kPerspective_MatrixClass) | |
| 74 { | |
| 75 SkPerspIter iter(inv, SkIntToScalar(x) + SK_ScalarHalf, | |
| 76 SkIntToScalar(y) + SK_ScalarHalf, count); | |
| 77 while ((count = iter.next()) != 0) | |
| 78 { | |
| 79 const SkFixed* srcXY = iter.getXY(); | |
| 80 | |
| 81 /* Do I need this? | |
| 82 #ifndef NOFILTER_BITMAP_SHADER_USE_UNITINVERSE | |
| 83 fx >>= level; | |
| 84 fy >>= level; | |
| 85 #endif | |
| 86 */ | |
| 87 if (256 == scale) | |
| 88 { | |
| 89 while (--count >= 0) | |
| 90 { | |
| 91 fx = *srcXY++; | |
| 92 fy = *srcXY++; | |
| 93 unsigned x = NOFILTER_BITMAP_SHADER_TILEPROC(fx, srcMaxX
); | |
| 94 unsigned y = NOFILTER_BITMAP_SHADER_TILEPROC(fy, srcMaxY
); | |
| 95 *dstC++ = NOFILTER_BITMAP_SHADER_SAMPLE_XY(srcPixels, x,
y, srcRB); | |
| 96 } | |
| 97 } | |
| 98 else | |
| 99 { | |
| 100 while (--count >= 0) | |
| 101 { | |
| 102 fx = *srcXY++; | |
| 103 fy = *srcXY++; | |
| 104 unsigned x = NOFILTER_BITMAP_SHADER_TILEPROC(fx, srcMaxX
); | |
| 105 unsigned y = NOFILTER_BITMAP_SHADER_TILEPROC(fy, srcMaxY
); | |
| 106 uint32_t c = NOFILTER_BITMAP_SHADER_SAMPLE_XY(srcPixels,
x, y, srcRB); | |
| 107 *dstC++ = SkAlphaMulQ(c, scale); | |
| 108 } | |
| 109 } | |
| 110 } | |
| 111 return; | |
| 112 } | |
| 113 | |
| 114 // now init fx, fy, dx, dy | |
| 115 { | |
| 116 SkPoint srcPt; | |
| 117 invProc(inv, SkIntToScalar(x) + SK_ScalarHalf, | |
| 118 SkIntToScalar(y) + SK_ScalarHalf, &srcPt); | |
| 119 | |
| 120 fx = SkScalarToFixed(srcPt.fX); | |
| 121 fy = SkScalarToFixed(srcPt.fY); | |
| 122 | |
| 123 if (this->getInverseClass() == kFixedStepInX_MatrixClass) | |
| 124 (void)inv.fixedStepInX(SkIntToScalar(y), &dx, &dy); | |
| 125 else | |
| 126 { | |
| 127 dx = SkScalarToFixed(inv.getScaleX()); | |
| 128 dy = SkScalarToFixed(inv.getSkewY()); | |
| 129 } | |
| 130 } | |
| 131 | |
| 132 #ifndef NOFILTER_BITMAP_SHADER_USE_UNITINVERSE | |
| 133 { int level = this->getMipLevel() >> 16; | |
| 134 fx >>= level; | |
| 135 fy >>= level; | |
| 136 dx >>= level; | |
| 137 dy >>= level; | |
| 138 } | |
| 139 #endif | |
| 140 | |
| 141 if (dy == 0) | |
| 142 { | |
| 143 int y_index = NOFILTER_BITMAP_SHADER_TILEPROC(fy, srcMaxY); | |
| 144 // SkDEBUGF(("fy = %g, srcMaxY = %d, y_index = %d\n", SkFixedToFloat(fy
), srcMaxY, y_index)); | |
| 145 srcPixels = (const NOFILTER_BITMAP_SHADER_TYPE*)((const char*)srcPix
els + y_index * srcRB); | |
| 146 if (scale == 256) | |
| 147 while (--count >= 0) | |
| 148 { | |
| 149 unsigned x = NOFILTER_BITMAP_SHADER_TILEPROC(fx, srcMaxX); | |
| 150 fx += dx; | |
| 151 *dstC++ = NOFILTER_BITMAP_SHADER_SAMPLE_X(srcPixels, x); | |
| 152 } | |
| 153 else | |
| 154 while (--count >= 0) | |
| 155 { | |
| 156 unsigned x = NOFILTER_BITMAP_SHADER_TILEPROC(fx, srcMaxX); | |
| 157 SkPMColor c = NOFILTER_BITMAP_SHADER_SAMPLE_X(srcPixels, x); | |
| 158 fx += dx; | |
| 159 *dstC++ = SkAlphaMulQ(c, scale); | |
| 160 } | |
| 161 } | |
| 162 else // dy != 0 | |
| 163 { | |
| 164 if (scale == 256) | |
| 165 while (--count >= 0) | |
| 166 { | |
| 167 unsigned x = NOFILTER_BITMAP_SHADER_TILEPROC(fx, srcMaxX); | |
| 168 unsigned y = NOFILTER_BITMAP_SHADER_TILEPROC(fy, srcMaxY); | |
| 169 fx += dx; | |
| 170 fy += dy; | |
| 171 *dstC++ = NOFILTER_BITMAP_SHADER_SAMPLE_XY(srcPixels, x, y,
srcRB); | |
| 172 } | |
| 173 else | |
| 174 while (--count >= 0) | |
| 175 { | |
| 176 unsigned x = NOFILTER_BITMAP_SHADER_TILEPROC(fx, srcMaxX); | |
| 177 unsigned y = NOFILTER_BITMAP_SHADER_TILEPROC(fy, srcMaxY); | |
| 178 SkPMColor c = NOFILTER_BITMAP_SHADER_SAMPLE_XY(srcPixels, x,
y, srcRB); | |
| 179 fx += dx; | |
| 180 fy += dy; | |
| 181 *dstC++ = SkAlphaMulQ(c, scale); | |
| 182 } | |
| 183 } | |
| 184 | |
| 185 NOFILTER_BITMAP_SHADER_POSTAMBLE(srcBitmap); | |
| 186 } | |
| 187 | |
| 188 virtual void shadeSpan16(int x, int y, uint16_t dstC[], int count) | |
| 189 { | |
| 190 SkASSERT(count > 0); | |
| 191 SkASSERT(this->getFlags() & SkShader::kHasSpan16_Flag); | |
| 192 | |
| 193 #ifdef NOFILTER_BITMAP_SHADER_SPRITEPROC16 | |
| 194 if ((this->getTotalInverse().getType() & ~SkMatrix::kTranslate_Mask) ==
0) | |
| 195 { | |
| 196 NOFILTER_BITMAP_SHADER_SPRITEPROC16(this, x, y, dstC, count); | |
| 197 return; | |
| 198 } | |
| 199 #endif | |
| 200 | |
| 201 #ifdef NOFILTER_BITMAP_SHADER_USE_UNITINVERSE | |
| 202 const SkMatrix& inv = this->getUnitInverse(); | |
| 203 SkMatrix::MapPtProc invProc = this->getUnitInverseProc(); | |
| 204 #else | |
| 205 const SkMatrix& inv = this->getTotalInverse(); | |
| 206 SkMatrix::MapPtProc invProc = this->getInverseMapPtProc(); | |
| 207 #endif | |
| 208 const SkBitmap& srcBitmap = this->getSrcBitmap(); | |
| 209 unsigned srcMaxX = srcBitmap.width() - 1; | |
| 210 unsigned srcMaxY = srcBitmap.height() - 1; | |
| 211 unsigned srcRB = srcBitmap.rowBytes(); | |
| 212 SkFixed fx, fy, dx, dy; | |
| 213 | |
| 214 const NOFILTER_BITMAP_SHADER_TYPE* srcPixels = (const NOFILTER_BITMAP_SH
ADER_TYPE*)srcBitmap.getPixels(); | |
| 215 NOFILTER_BITMAP_SHADER_PREAMBLE16(srcBitmap, srcRB); | |
| 216 | |
| 217 if (this->getInverseClass() == kPerspective_MatrixClass) | |
| 218 { | |
| 219 SkPerspIter iter(inv, SkIntToScalar(x) + SK_ScalarHalf, | |
| 220 SkIntToScalar(y) + SK_ScalarHalf, count); | |
| 221 while ((count = iter.next()) != 0) | |
| 222 { | |
| 223 const SkFixed* srcXY = iter.getXY(); | |
| 224 | |
| 225 while (--count >= 0) | |
| 226 { | |
| 227 fx = *srcXY++; | |
| 228 fy = *srcXY++; | |
| 229 unsigned x = NOFILTER_BITMAP_SHADER_TILEPROC(fx, srcMaxX); | |
| 230 unsigned y = NOFILTER_BITMAP_SHADER_TILEPROC(fy, srcMaxY); | |
| 231 *dstC++ = NOFILTER_BITMAP_SHADER_SAMPLE_XY16(srcPixels, x, y
, srcRB); | |
| 232 } | |
| 233 } | |
| 234 return; | |
| 235 } | |
| 236 | |
| 237 // now init fx, fy, dx, dy | |
| 238 { | |
| 239 SkPoint srcPt; | |
| 240 invProc(inv, SkIntToScalar(x) + SK_ScalarHalf, | |
| 241 SkIntToScalar(y) + SK_ScalarHalf, &srcPt); | |
| 242 | |
| 243 fx = SkScalarToFixed(srcPt.fX); | |
| 244 fy = SkScalarToFixed(srcPt.fY); | |
| 245 | |
| 246 if (this->getInverseClass() == kFixedStepInX_MatrixClass) | |
| 247 (void)inv.fixedStepInX(SkIntToScalar(y), &dx, &dy); | |
| 248 else | |
| 249 { | |
| 250 dx = SkScalarToFixed(inv.getScaleX()); | |
| 251 dy = SkScalarToFixed(inv.getSkewY()); | |
| 252 } | |
| 253 } | |
| 254 | |
| 255 #ifndef NOFILTER_BITMAP_SHADER_USE_UNITINVERSE | |
| 256 { int level = this->getMipLevel() >> 16; | |
| 257 fx >>= level; | |
| 258 fy >>= level; | |
| 259 dx >>= level; | |
| 260 dy >>= level; | |
| 261 } | |
| 262 #endif | |
| 263 | |
| 264 if (dy == 0) | |
| 265 { | |
| 266 srcPixels = (const NOFILTER_BITMAP_SHADER_TYPE*)((const char*)srcPix
els + NOFILTER_BITMAP_SHADER_TILEPROC(fy, srcMaxY) * srcRB); | |
| 267 do { | |
| 268 unsigned x = NOFILTER_BITMAP_SHADER_TILEPROC(fx, srcMaxX); | |
| 269 fx += dx; | |
| 270 *dstC++ = NOFILTER_BITMAP_SHADER_SAMPLE_X16(srcPixels, x); | |
| 271 } while (--count != 0); | |
| 272 } | |
| 273 else // dy != 0 | |
| 274 { | |
| 275 do { | |
| 276 unsigned x = NOFILTER_BITMAP_SHADER_TILEPROC(fx, srcMaxX); | |
| 277 unsigned y = NOFILTER_BITMAP_SHADER_TILEPROC(fy, srcMaxY); | |
| 278 fx += dx; | |
| 279 fy += dy; | |
| 280 *dstC++ = NOFILTER_BITMAP_SHADER_SAMPLE_XY16(srcPixels, x, y, sr
cRB); | |
| 281 } while (--count != 0); | |
| 282 } | |
| 283 | |
| 284 NOFILTER_BITMAP_SHADER_POSTAMBLE16(srcBitmap); | |
| 285 } | |
| 286 private: | |
| 287 typedef HasSpan16_Sampler_BitmapShader INHERITED; | |
| 288 }; | |
| 289 | |
| 290 #undef NOFILTER_BITMAP_SHADER_CLASS | |
| 291 #undef NOFILTER_BITMAP_SHADER_TYPE | |
| 292 #undef NOFILTER_BITMAP_SHADER_PREAMBLE | |
| 293 #undef NOFILTER_BITMAP_SHADER_POSTAMBLE | |
| 294 #undef NOFILTER_BITMAP_SHADER_SAMPLE_X //(x) | |
| 295 #undef NOFILTER_BITMAP_SHADER_SAMPLE_XY //(x, y, rowBytes) | |
| 296 #undef NOFILTER_BITMAP_SHADER_TILEMODE | |
| 297 #undef NOFILTER_BITMAP_SHADER_TILEPROC | |
| 298 | |
| 299 #undef NOFILTER_BITMAP_SHADER_PREAMBLE16 | |
| 300 #undef NOFILTER_BITMAP_SHADER_POSTAMBLE16 | |
| 301 #undef NOFILTER_BITMAP_SHADER_SAMPLE_X16 //(x) | |
| 302 #undef NOFILTER_BITMAP_SHADER_SAMPLE_XY16 //(x, y, rowBytes) | |
| 303 | |
| 304 #undef NOFILTER_BITMAP_SHADER_USE_UNITINVERSE | |
| 305 #undef NOFILTER_BITMAP_SHADER_SPRITEPROC16 | |
| 306 #undef NOFILTER_BITMAP_SHADER_SPRITEPROC32 | |
| OLD | NEW |