Index: src/core/SkBitmapProcShader.cpp |
diff --git a/src/core/SkBitmapProcShader.cpp b/src/core/SkBitmapProcShader.cpp |
index ded1b7200938bb97a9d6dbe94d0eccc50f213408..fcfcdbf035875dbe1bfb11762df8a9472c8e6ec3 100644 |
--- a/src/core/SkBitmapProcShader.cpp |
+++ b/src/core/SkBitmapProcShader.cpp |
@@ -358,13 +358,12 @@ GrEffectRef* SkBitmapProcShader::asNewEffect(GrContext* context, const SkPaint& |
SkMatrix matrix; |
matrix.setIDiv(fRawBitmap.width(), fRawBitmap.height()); |
- if (this->hasLocalMatrix()) { |
- SkMatrix inverse; |
- if (!this->getLocalMatrix().invert(&inverse)) { |
- return NULL; |
- } |
- matrix.preConcat(inverse); |
+ SkMatrix inverse; |
+ if (!this->getLocalMatrix().invert(&inverse)) { |
+ return NULL; |
} |
+ matrix.preConcat(inverse); |
+ |
SkShader::TileMode tm[] = { |
(TileMode)fState.fTileModeX, |
(TileMode)fState.fTileModeY, |
@@ -384,9 +383,21 @@ GrEffectRef* SkBitmapProcShader::asNewEffect(GrContext* context, const SkPaint& |
textureFilterMode = GrTextureParams::kMipMap_FilterMode; |
break; |
case SkPaint::kHigh_FilterLevel: |
- // fall back to no filtering here; we will install another |
- // shader that will do the HQ filtering. |
- textureFilterMode = GrTextureParams::kNone_FilterMode; |
+ // Minification can look bad with the bicubic effect. This is an overly aggressive |
+ // check for MIP fallbacks. It doesn't consider the fact that minification in the local |
+ // matrix could be offset by the view matrix and vice versa. We also don't know whether |
+ // the draw has explicit local coords (e.g. drawVertices) where the scale factor is |
+ // unknown and varies. |
+ if (context->getMatrix().getMinStretch() >= SK_Scalar1 && |
+ this->getLocalMatrix().getMaxStretch() <= SK_Scalar1) { |
+ // fall back to no filtering here; we will install another |
+ // shader that will do the HQ filtering. |
+ textureFilterMode = GrTextureParams::kNone_FilterMode; |
+ } else { |
+ // Fall back to mip-mapping. |
+ paintFilterLevel = SkPaint::kMedium_FilterLevel; |
+ textureFilterMode = GrTextureParams::kMipMap_FilterMode; |
+ } |
break; |
default: |
SkErrorInternals::SetError( kInvalidPaint_SkError, |