| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2011 Google Inc. | 2 * Copyright 2011 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #include "SkBitmapProcShader.h" | 8 #include "SkBitmapProcShader.h" |
| 9 #include "SkBitmapProcState.h" | 9 #include "SkBitmapProcState.h" |
| 10 #include "SkBitmapProvider.h" | 10 #include "SkBitmapProvider.h" |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 61 return SkShader::CreateBitmapShader(bm, mx, my, &lm); | 61 return SkShader::CreateBitmapShader(bm, mx, my, &lm); |
| 62 } | 62 } |
| 63 | 63 |
| 64 void SkBitmapProcShader::flatten(SkWriteBuffer& buffer) const { | 64 void SkBitmapProcShader::flatten(SkWriteBuffer& buffer) const { |
| 65 buffer.writeMatrix(this->getLocalMatrix()); | 65 buffer.writeMatrix(this->getLocalMatrix()); |
| 66 buffer.writeBitmap(fRawBitmap); | 66 buffer.writeBitmap(fRawBitmap); |
| 67 buffer.writeUInt(fTileModeX); | 67 buffer.writeUInt(fTileModeX); |
| 68 buffer.writeUInt(fTileModeY); | 68 buffer.writeUInt(fTileModeY); |
| 69 } | 69 } |
| 70 | 70 |
| 71 static bool only_scale_and_translate(const SkMatrix& matrix) { | |
| 72 unsigned mask = SkMatrix::kTranslate_Mask | SkMatrix::kScale_Mask; | |
| 73 return (matrix.getType() & ~mask) == 0; | |
| 74 } | |
| 75 | |
| 76 bool SkBitmapProcShader::isOpaque() const { | 71 bool SkBitmapProcShader::isOpaque() const { |
| 77 return fRawBitmap.isOpaque(); | 72 return fRawBitmap.isOpaque(); |
| 78 } | 73 } |
| 79 | 74 |
| 80 SkShader::Context* SkBitmapProcShader::MakeContext(const SkShader& shader, | 75 SkShader::Context* SkBitmapProcShader::MakeContext(const SkShader& shader, |
| 81 TileMode tmx, TileMode tmy, | 76 TileMode tmx, TileMode tmy, |
| 82 const SkBitmapProvider& provi
der, | 77 const SkBitmapProvider& provi
der, |
| 83 const ContextRec& rec, void*
storage) { | 78 const ContextRec& rec, void*
storage) { |
| 84 SkMatrix totalInverse; | 79 SkMatrix totalInverse; |
| 85 // Do this first, so we know the matrix can be inverted. | 80 // Do this first, so we know the matrix can be inverted. |
| (...skipping 17 matching lines...) Expand all Loading... |
| 103 return MakeContext(*this, (TileMode)fTileModeX, (TileMode)fTileModeY, | 98 return MakeContext(*this, (TileMode)fTileModeX, (TileMode)fTileModeY, |
| 104 SkBitmapProvider(fRawBitmap), rec, storage); | 99 SkBitmapProvider(fRawBitmap), rec, storage); |
| 105 } | 100 } |
| 106 | 101 |
| 107 SkBitmapProcShader::BitmapProcShaderContext::BitmapProcShaderContext(const SkSha
der& shader, | 102 SkBitmapProcShader::BitmapProcShaderContext::BitmapProcShaderContext(const SkSha
der& shader, |
| 108 const Conte
xtRec& rec, | 103 const Conte
xtRec& rec, |
| 109 SkBitmapPro
cState* state) | 104 SkBitmapPro
cState* state) |
| 110 : INHERITED(shader, rec) | 105 : INHERITED(shader, rec) |
| 111 , fState(state) | 106 , fState(state) |
| 112 { | 107 { |
| 113 const SkPixmap& pixmap = fState->fPixmap; | 108 fFlags = 0; |
| 114 bool isOpaque = pixmap.isOpaque(); | 109 if (fState->fPixmap.isOpaque() && (255 == this->getPaintAlpha())) { |
| 115 | 110 fFlags |= kOpaqueAlpha_Flag; |
| 116 // update fFlags | |
| 117 uint32_t flags = 0; | |
| 118 if (isOpaque && (255 == this->getPaintAlpha())) { | |
| 119 flags |= kOpaqueAlpha_Flag; | |
| 120 } | 111 } |
| 121 | |
| 122 switch (pixmap.colorType()) { | |
| 123 case kRGB_565_SkColorType: | |
| 124 flags |= (kHasSpan16_Flag | kIntrinsicly16_Flag); | |
| 125 break; | |
| 126 case kIndex_8_SkColorType: | |
| 127 case kN32_SkColorType: | |
| 128 if (isOpaque) { | |
| 129 flags |= kHasSpan16_Flag; | |
| 130 } | |
| 131 break; | |
| 132 case kAlpha_8_SkColorType: | |
| 133 break; // never set kHasSpan16_Flag | |
| 134 default: | |
| 135 break; | |
| 136 } | |
| 137 | |
| 138 if (rec.fPaint->isDither() && pixmap.colorType() != kRGB_565_SkColorType) { | |
| 139 // gradients can auto-dither in their 16bit sampler, but we don't so | |
| 140 // we clear the flag here. | |
| 141 flags &= ~kHasSpan16_Flag; | |
| 142 } | |
| 143 | |
| 144 // if we're only 1-pixel high, and we don't rotate, then we can claim this | |
| 145 if (1 == pixmap.height() && | |
| 146 only_scale_and_translate(this->getTotalInverse())) { | |
| 147 flags |= kConstInY32_Flag; | |
| 148 if (flags & kHasSpan16_Flag) { | |
| 149 flags |= kConstInY16_Flag; | |
| 150 } | |
| 151 } | |
| 152 | |
| 153 fFlags = flags; | |
| 154 } | 112 } |
| 155 | 113 |
| 156 SkBitmapProcShader::BitmapProcShaderContext::~BitmapProcShaderContext() { | 114 SkBitmapProcShader::BitmapProcShaderContext::~BitmapProcShaderContext() { |
| 157 // The bitmap proc state has been created outside of the context on memory t
hat will be freed | 115 // The bitmap proc state has been created outside of the context on memory t
hat will be freed |
| 158 // elsewhere. Only call the destructor but leave the freeing of the memory t
o the caller. | 116 // elsewhere. Only call the destructor but leave the freeing of the memory t
o the caller. |
| 159 fState->~SkBitmapProcState(); | 117 fState->~SkBitmapProcState(); |
| 160 } | 118 } |
| 161 | 119 |
| 162 #define BUF_MAX 128 | 120 #define BUF_MAX 128 |
| 163 | 121 |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 214 } | 172 } |
| 215 | 173 |
| 216 SkShader::Context::ShadeProc SkBitmapProcShader::BitmapProcShaderContext::asASha
deProc(void** ctx) { | 174 SkShader::Context::ShadeProc SkBitmapProcShader::BitmapProcShaderContext::asASha
deProc(void** ctx) { |
| 217 if (fState->getShaderProc32()) { | 175 if (fState->getShaderProc32()) { |
| 218 *ctx = fState; | 176 *ctx = fState; |
| 219 return (ShadeProc)fState->getShaderProc32(); | 177 return (ShadeProc)fState->getShaderProc32(); |
| 220 } | 178 } |
| 221 return nullptr; | 179 return nullptr; |
| 222 } | 180 } |
| 223 | 181 |
| 224 void SkBitmapProcShader::BitmapProcShaderContext::shadeSpan16(int x, int y, uint
16_t dstC[], | |
| 225 int count) { | |
| 226 const SkBitmapProcState& state = *fState; | |
| 227 if (state.getShaderProc16()) { | |
| 228 state.getShaderProc16()(&state, x, y, dstC, count); | |
| 229 return; | |
| 230 } | |
| 231 | |
| 232 uint32_t buffer[BUF_MAX]; | |
| 233 SkBitmapProcState::MatrixProc mproc = state.getMatrixProc(); | |
| 234 SkBitmapProcState::SampleProc16 sproc = state.getSampleProc16(); | |
| 235 int max = state.maxCountForBufferSize(sizeof(buffer)); | |
| 236 | |
| 237 SkASSERT(state.fPixmap.addr()); | |
| 238 | |
| 239 for (;;) { | |
| 240 int n = count; | |
| 241 if (n > max) { | |
| 242 n = max; | |
| 243 } | |
| 244 mproc(state, buffer, n, x, y); | |
| 245 sproc(state, buffer, n, dstC); | |
| 246 | |
| 247 if ((count -= n) == 0) { | |
| 248 break; | |
| 249 } | |
| 250 x += n; | |
| 251 dstC += n; | |
| 252 } | |
| 253 } | |
| 254 | |
| 255 /////////////////////////////////////////////////////////////////////////////// | 182 /////////////////////////////////////////////////////////////////////////////// |
| 256 | 183 |
| 257 #include "SkUnPreMultiply.h" | 184 #include "SkUnPreMultiply.h" |
| 258 #include "SkColorShader.h" | 185 #include "SkColorShader.h" |
| 259 #include "SkEmptyShader.h" | 186 #include "SkEmptyShader.h" |
| 260 | 187 |
| 261 // returns true and set color if the bitmap can be drawn as a single color | 188 // returns true and set color if the bitmap can be drawn as a single color |
| 262 // (for efficiency) | 189 // (for efficiency) |
| 263 static bool can_use_color_shader(const SkBitmap& bm, SkColor* color) { | 190 static bool can_use_color_shader(const SkBitmap& bm, SkColor* color) { |
| 264 #ifdef SK_BUILD_FOR_ANDROID_FRAMEWORK | 191 #ifdef SK_BUILD_FOR_ANDROID_FRAMEWORK |
| (...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 407 inner.reset(GrSimpleTextureEffect::Create(texture, matrix, params)); | 334 inner.reset(GrSimpleTextureEffect::Create(texture, matrix, params)); |
| 408 } | 335 } |
| 409 | 336 |
| 410 if (kAlpha_8_SkColorType == fRawBitmap.colorType()) { | 337 if (kAlpha_8_SkColorType == fRawBitmap.colorType()) { |
| 411 return GrFragmentProcessor::MulOutputByInputUnpremulColor(inner); | 338 return GrFragmentProcessor::MulOutputByInputUnpremulColor(inner); |
| 412 } | 339 } |
| 413 return GrFragmentProcessor::MulOutputByInputAlpha(inner); | 340 return GrFragmentProcessor::MulOutputByInputAlpha(inner); |
| 414 } | 341 } |
| 415 | 342 |
| 416 #endif | 343 #endif |
| OLD | NEW |