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 "SkColorPriv.h" | 10 #include "SkColorPriv.h" |
11 #include "SkErrorInternals.h" | 11 #include "SkErrorInternals.h" |
12 #include "SkPixelRef.h" | 12 #include "SkPixelRef.h" |
13 #include "SkReadBuffer.h" | 13 #include "SkReadBuffer.h" |
14 #include "SkWriteBuffer.h" | 14 #include "SkWriteBuffer.h" |
15 | 15 |
16 #if SK_SUPPORT_GPU | 16 #if SK_SUPPORT_GPU |
17 #include "effects/GrBicubicEffect.h" | 17 #include "effects/GrBicubicEffect.h" |
18 #include "effects/GrExtractAlphaFragmentProcessor.h" | |
19 #include "effects/GrSimpleTextureEffect.h" | 18 #include "effects/GrSimpleTextureEffect.h" |
20 #endif | 19 #endif |
21 | 20 |
22 SkBitmapProcShader::SkBitmapProcShader(const SkBitmap& src, TileMode tmx, TileMo
de tmy, | 21 SkBitmapProcShader::SkBitmapProcShader(const SkBitmap& src, TileMode tmx, TileMo
de tmy, |
23 const SkMatrix* localMatrix) | 22 const SkMatrix* localMatrix) |
24 : INHERITED(localMatrix) { | 23 : INHERITED(localMatrix) { |
25 fRawBitmap = src; | 24 fRawBitmap = src; |
26 fTileModeX = (uint8_t)tmx; | 25 fTileModeX = (uint8_t)tmx; |
27 fTileModeY = (uint8_t)tmy; | 26 fTileModeY = (uint8_t)tmy; |
28 } | 27 } |
(...skipping 318 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
347 #endif | 346 #endif |
348 | 347 |
349 /////////////////////////////////////////////////////////////////////////////// | 348 /////////////////////////////////////////////////////////////////////////////// |
350 | 349 |
351 #if SK_SUPPORT_GPU | 350 #if SK_SUPPORT_GPU |
352 | 351 |
353 #include "GrTextureAccess.h" | 352 #include "GrTextureAccess.h" |
354 #include "SkGr.h" | 353 #include "SkGr.h" |
355 #include "effects/GrSimpleTextureEffect.h" | 354 #include "effects/GrSimpleTextureEffect.h" |
356 | 355 |
357 const GrFragmentProcessor* SkBitmapProcShader::asFragmentProcessor(GrContext* co
ntext, | 356 bool SkBitmapProcShader::asFragmentProcessor(GrContext* context, const SkPaint&
paint, |
358 const SkMatrix& viewM, const SkMatr
ix* localMatrix, | 357 const SkMatrix& viewM, |
359 SkFilterQuality filterQuality, | 358 const SkMatrix* localMatrix, GrColo
r* paintColor, |
360 GrProcessorDataManager* procDataMan
ager) const { | 359 GrProcessorDataManager* procDataMan
ager, |
| 360 GrFragmentProcessor** fp) const { |
361 SkMatrix matrix; | 361 SkMatrix matrix; |
362 matrix.setIDiv(fRawBitmap.width(), fRawBitmap.height()); | 362 matrix.setIDiv(fRawBitmap.width(), fRawBitmap.height()); |
363 | 363 |
364 SkMatrix lmInverse; | 364 SkMatrix lmInverse; |
365 if (!this->getLocalMatrix().invert(&lmInverse)) { | 365 if (!this->getLocalMatrix().invert(&lmInverse)) { |
366 return nullptr; | 366 return false; |
367 } | 367 } |
368 if (localMatrix) { | 368 if (localMatrix) { |
369 SkMatrix inv; | 369 SkMatrix inv; |
370 if (!localMatrix->invert(&inv)) { | 370 if (!localMatrix->invert(&inv)) { |
371 return nullptr; | 371 return false; |
372 } | 372 } |
373 lmInverse.postConcat(inv); | 373 lmInverse.postConcat(inv); |
374 } | 374 } |
375 matrix.preConcat(lmInverse); | 375 matrix.preConcat(lmInverse); |
376 | 376 |
377 SkShader::TileMode tm[] = { | 377 SkShader::TileMode tm[] = { |
378 (TileMode)fTileModeX, | 378 (TileMode)fTileModeX, |
379 (TileMode)fTileModeY, | 379 (TileMode)fTileModeY, |
380 }; | 380 }; |
381 | 381 |
382 // Must set wrap and filter on the sampler before requesting a texture. In t
wo places below | 382 // Must set wrap and filter on the sampler before requesting a texture. In t
wo places below |
383 // we check the matrix scale factors to determine how to interpret the filte
r quality setting. | 383 // we check the matrix scale factors to determine how to interpret the filte
r quality setting. |
384 // This completely ignores the complexity of the drawVertices case where exp
licit local coords | 384 // This completely ignores the complexity of the drawVertices case where exp
licit local coords |
385 // are provided by the caller. | 385 // are provided by the caller. |
386 bool doBicubic; | 386 bool doBicubic; |
387 GrTextureParams::FilterMode textureFilterMode = | 387 GrTextureParams::FilterMode textureFilterMode = |
388 GrSkFilterQualityToGrFilterMode(filterQuality, viewM, this->getLocal
Matrix(), | 388 GrSkFilterQualityToGrFilterMode(paint.getFilterQuality(), viewM, thi
s->getLocalMatrix(), |
389 &doBicubic); | 389 &doBicubic); |
390 GrTextureParams params(tm, textureFilterMode); | 390 GrTextureParams params(tm, textureFilterMode); |
391 SkAutoTUnref<GrTexture> texture(GrRefCachedBitmapTexture(context, fRawBitmap
, ¶ms)); | 391 SkAutoTUnref<GrTexture> texture(GrRefCachedBitmapTexture(context, fRawBitmap
, ¶ms)); |
392 | 392 |
393 if (!texture) { | 393 if (!texture) { |
394 SkErrorInternals::SetError( kInternalError_SkError, | 394 SkErrorInternals::SetError( kInternalError_SkError, |
395 "Couldn't convert bitmap to texture."); | 395 "Couldn't convert bitmap to texture."); |
396 return nullptr; | 396 return false; |
397 } | 397 } |
398 | 398 |
399 SkAutoTUnref<GrFragmentProcessor> inner; | 399 *paintColor = (kAlpha_8_SkColorType == fRawBitmap.colorType()) ? |
| 400 SkColor2GrColor(paint.getColor()
) : |
| 401 SkColor2GrColorJustAlpha(paint.g
etColor()); |
| 402 |
400 if (doBicubic) { | 403 if (doBicubic) { |
401 inner.reset(GrBicubicEffect::Create(procDataManager, texture, matrix, tm
)); | 404 *fp = GrBicubicEffect::Create(procDataManager, texture, matrix, tm); |
402 } else { | 405 } else { |
403 inner.reset(GrSimpleTextureEffect::Create(procDataManager, texture, matr
ix, params)); | 406 *fp = GrSimpleTextureEffect::Create(procDataManager, texture, matrix, pa
rams); |
404 } | 407 } |
405 | 408 |
406 if (kAlpha_8_SkColorType == fRawBitmap.colorType()) { | 409 return true; |
407 return SkRef(inner.get()); | 410 } |
408 } | 411 |
409 return GrExtractAlphaFragmentProcessor::Create(inner); | 412 #else |
| 413 |
| 414 bool SkBitmapProcShader::asFragmentProcessor(GrContext*, const SkPaint&, const S
kMatrix&, |
| 415 const SkMatrix*, GrColor*, GrProces
sorDataManager*, |
| 416 GrFragmentProcessor**) const { |
| 417 SkDEBUGFAIL("Should not call in GPU-less build"); |
| 418 return false; |
410 } | 419 } |
411 | 420 |
412 #endif | 421 #endif |
OLD | NEW |