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 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
173 SkXfermode::Mode mode; | 173 SkXfermode::Mode mode; |
174 if (!SkXfermode::AsMode(state->fXfer, &mode)) { return false; } | 174 if (!SkXfermode::AsMode(state->fXfer, &mode)) { return false; } |
175 | 175 |
176 // Need to ensure that our pipeline is created at a 16byte aligned addre
ss | 176 // Need to ensure that our pipeline is created at a 16byte aligned addre
ss |
177 fBlitterPipeline = (SkLinearBitmapPipeline*)SkAlign16((intptr_t)fBlitter
Storage); | 177 fBlitterPipeline = (SkLinearBitmapPipeline*)SkAlign16((intptr_t)fBlitter
Storage); |
178 if (SkLinearBitmapPipeline::ClonePipelineForBlitting( | 178 if (SkLinearBitmapPipeline::ClonePipelineForBlitting( |
179 fBlitterPipeline, *fShaderPipeline, | 179 fBlitterPipeline, *fShaderPipeline, |
180 fMatrixTypeMask, | 180 fMatrixTypeMask, |
181 fXMode, fYMode, | 181 fXMode, fYMode, |
182 fFilterQuality, fSrcPixmap, | 182 fFilterQuality, fSrcPixmap, |
183 fAlpha, mode, dstInfo)) { | 183 fAlpha, mode, dstInfo)) |
184 | 184 { |
185 state->fStorage[0] = fBlitterPipeline; | 185 state->fStorage[0] = fBlitterPipeline; |
186 state->fBlitBW = &LinearPipelineContext::ForwardToPipeline; | 186 state->fBlitBW = &LinearPipelineContext::ForwardToPipeline; |
187 | 187 |
188 return true; | 188 return true; |
189 } | 189 } |
190 | 190 |
191 // Did not successfully create a pipeline so don't destruct it. | 191 // Did not successfully create a pipeline so don't destruct it. |
192 fBlitterPipeline = nullptr; | 192 fBlitterPipeline = nullptr; |
193 return false; | 193 return false; |
194 } | 194 } |
(...skipping 30 matching lines...) Expand all Loading... |
225 static bool choose_linear_pipeline(const SkShader::ContextRec& rec, const SkImag
eInfo& srcInfo) { | 225 static bool choose_linear_pipeline(const SkShader::ContextRec& rec, const SkImag
eInfo& srcInfo) { |
226 // These src attributes are not supported in the new 4f context (yet) | 226 // These src attributes are not supported in the new 4f context (yet) |
227 // | 227 // |
228 if (srcInfo.colorType() != kRGBA_8888_SkColorType | 228 if (srcInfo.colorType() != kRGBA_8888_SkColorType |
229 && srcInfo.colorType() != kBGRA_8888_SkColorType | 229 && srcInfo.colorType() != kBGRA_8888_SkColorType |
230 && srcInfo.colorType() != kIndex_8_SkColorType | 230 && srcInfo.colorType() != kIndex_8_SkColorType |
231 && srcInfo.colorType() != kRGBA_F16_SkColorType) { | 231 && srcInfo.colorType() != kRGBA_F16_SkColorType) { |
232 return false; | 232 return false; |
233 } | 233 } |
234 | 234 |
235 #if 0 // later we may opt-in to the new code even if the client hasn't request
ed it... | |
236 // These src attributes are only supported in the new 4f context | |
237 // | |
238 if (srcInfo.isSRGB() || | |
239 kUnpremul_SkAlphaType == srcInfo.alphaType() || | |
240 (4 == srcInfo.bytesPerPixel() && kN32_SkColorType != srcInfo.colorType()
)) | |
241 { | |
242 return true; | |
243 } | |
244 #endif | |
245 | |
246 // If we get here, we can reasonably use either context, respect the caller'
s preference | 235 // If we get here, we can reasonably use either context, respect the caller'
s preference |
247 // | 236 // |
248 return SkShader::ContextRec::kPM4f_DstType == rec.fPreferredDstType; | 237 return SkShader::ContextRec::kPM4f_DstType == rec.fPreferredDstType; |
249 } | 238 } |
250 | 239 |
251 size_t SkBitmapProcShader::ContextSize(const ContextRec& rec, const SkImageInfo&
srcInfo) { | 240 size_t SkBitmapProcShader::ContextSize(const ContextRec& rec, const SkImageInfo&
srcInfo) { |
252 size_t size0 = sizeof(BitmapProcShaderContext) + sizeof(SkBitmapProcState); | 241 size_t size0 = sizeof(BitmapProcShaderContext) + sizeof(SkBitmapProcState); |
253 size_t size1 = sizeof(LinearPipelineContext) + sizeof(SkBitmapProcInfo); | 242 size_t size1 = sizeof(LinearPipelineContext) + sizeof(SkBitmapProcInfo); |
254 return SkTMax(size0, size1); | 243 return SkTMax(size0, size1); |
255 } | 244 } |
256 | 245 |
257 SkShader::Context* SkBitmapProcShader::MakeContext(const SkShader& shader, | 246 SkShader::Context* SkBitmapProcShader::MakeContext(const SkShader& shader, |
258 TileMode tmx, TileMode tmy, | 247 TileMode tmx, TileMode tmy, |
259 const SkBitmapProvider& provi
der, | 248 const SkBitmapProvider& provi
der, |
260 const ContextRec& rec, void*
storage) { | 249 const ContextRec& rec, void*
storage) { |
261 SkMatrix totalInverse; | 250 SkMatrix totalInverse; |
262 // Do this first, so we know the matrix can be inverted. | 251 // Do this first, so we know the matrix can be inverted. |
263 if (!shader.computeTotalInverse(rec, &totalInverse)) { | 252 if (!shader.computeTotalInverse(rec, &totalInverse)) { |
264 return nullptr; | 253 return nullptr; |
265 } | 254 } |
266 | 255 |
267 // Decide if we can/want to use the new linear pipeline | 256 // Decide if we can/want to use the new linear pipeline |
268 bool useLinearPipeline = choose_linear_pipeline(rec, provider.info()); | 257 bool useLinearPipeline = choose_linear_pipeline(rec, provider.info()); |
269 | 258 |
270 // | |
271 // For now, only enable locally since we are hitting some crashers on the te
st bots | |
272 // | |
273 //useLinearPipeline = false; | |
274 | |
275 if (useLinearPipeline) { | 259 if (useLinearPipeline) { |
276 void* infoStorage = (char*)storage + sizeof(LinearPipelineContext); | 260 void* infoStorage = (char*)storage + sizeof(LinearPipelineContext); |
277 SkBitmapProcInfo* info = new (infoStorage) SkBitmapProcInfo(provider, tm
x, tmy); | 261 SkBitmapProcInfo* info = new (infoStorage) SkBitmapProcInfo(provider, tm
x, tmy); |
278 if (!info->init(totalInverse, *rec.fPaint)) { | 262 if (!info->init(totalInverse, *rec.fPaint)) { |
279 info->~SkBitmapProcInfo(); | 263 info->~SkBitmapProcInfo(); |
280 return nullptr; | 264 return nullptr; |
281 } | 265 } |
282 if (info->fPixmap.colorType() != kRGBA_8888_SkColorType | 266 if (info->fPixmap.colorType() != kRGBA_8888_SkColorType |
283 && info->fPixmap.colorType() != kBGRA_8888_SkColorType | 267 && info->fPixmap.colorType() != kBGRA_8888_SkColorType |
284 && info->fPixmap.colorType() != kIndex_8_SkColorType | 268 && info->fPixmap.colorType() != kIndex_8_SkColorType |
(...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
505 inner.reset(GrSimpleTextureEffect::Create(texture, matrix, params)); | 489 inner.reset(GrSimpleTextureEffect::Create(texture, matrix, params)); |
506 } | 490 } |
507 | 491 |
508 if (kAlpha_8_SkColorType == fRawBitmap.colorType()) { | 492 if (kAlpha_8_SkColorType == fRawBitmap.colorType()) { |
509 return GrFragmentProcessor::MulOutputByInputUnpremulColor(inner); | 493 return GrFragmentProcessor::MulOutputByInputUnpremulColor(inner); |
510 } | 494 } |
511 return GrFragmentProcessor::MulOutputByInputAlpha(inner); | 495 return GrFragmentProcessor::MulOutputByInputAlpha(inner); |
512 } | 496 } |
513 | 497 |
514 #endif | 498 #endif |
OLD | NEW |