| Index: src/gpu/SkGpuDevice.cpp | 
| diff --git a/src/gpu/SkGpuDevice.cpp b/src/gpu/SkGpuDevice.cpp | 
| index ce02f2c55fc97fa76beba1068cc36ae9277b44c6..27c98efb8bccb46fe4692eec789f02d42af116e7 100644 | 
| --- a/src/gpu/SkGpuDevice.cpp | 
| +++ b/src/gpu/SkGpuDevice.cpp | 
| @@ -1196,8 +1196,7 @@ void SkGpuDevice::drawBitmapCommon(const SkDraw& draw, | 
| break; | 
| case SkPaint::kHigh_FilterLevel: { | 
| // Minification can look bad with the bicubic effect. | 
| -            if (fContext->getMatrix().getMinStretch() >= SK_Scalar1 && | 
| -                (flags & SkCanvas::kBleed_DrawBitmapRectFlag)) { | 
| +            if (fContext->getMatrix().getMinStretch() >= SK_Scalar1) { | 
| // We will install an effect that does the filtering in the shader. | 
| textureFilterMode = GrTextureParams::kNone_FilterMode; | 
| tileFilterPad = GrBicubicEffect::kFilterTexelPad; | 
| @@ -1280,8 +1279,6 @@ void SkGpuDevice::drawTiledBitmap(const SkBitmap& bitmap, | 
| // but stay within the bitmap bounds | 
| iClampRect = SkIRect::MakeWH(bitmap.width(), bitmap.height()); | 
| } else { | 
| -                    SkASSERT(!bicubic); // Bicubic is not supported with non-bleed yet. | 
| - | 
| // In texture-domain/clamp mode we only want to expand the | 
| // tile on edges interior to "srcRect" (i.e., we want to | 
| // not bleed across the original clamped edges) | 
| @@ -1379,12 +1376,11 @@ void SkGpuDevice::internalDrawBitmap(const SkBitmap& bitmap, | 
|  | 
| bool needsTextureDomain = false; | 
| if (!(flags & SkCanvas::kBleed_DrawBitmapRectFlag) && | 
| -        params.filterMode() != GrTextureParams::kNone_FilterMode) { | 
| -        SkASSERT(!bicubic); | 
| -        // Need texture domain if drawing a sub rect. | 
| +        (bicubic || params.filterMode() != GrTextureParams::kNone_FilterMode)) { | 
| +        // Need texture domain if drawing a sub rect | 
| needsTextureDomain = srcRect.width() < bitmap.width() || | 
| srcRect.height() < bitmap.height(); | 
| -        if (needsTextureDomain && fContext->getMatrix().rectStaysRect()) { | 
| +        if (!bicubic && needsTextureDomain && fContext->getMatrix().rectStaysRect()) { | 
| const SkMatrix& matrix = fContext->getMatrix(); | 
| // sampling is axis-aligned | 
| SkRect transformedRect; | 
| @@ -1420,11 +1416,15 @@ void SkGpuDevice::internalDrawBitmap(const SkBitmap& bitmap, | 
| top = bottom = SkScalarHalf(paintRect.top() + paintRect.bottom()); | 
| } | 
| textureDomain.setLTRB(left, top, right, bottom); | 
| -        effect.reset(GrTextureDomainEffect::Create(texture, | 
| -                                                   SkMatrix::I(), | 
| -                                                   textureDomain, | 
| -                                                   GrTextureDomain::kClamp_Mode, | 
| -                                                   params.filterMode())); | 
| +        if (bicubic) { | 
| +            effect.reset(GrBicubicEffect::Create(texture, SkMatrix::I(), textureDomain)); | 
| +        } else { | 
| +            effect.reset(GrTextureDomainEffect::Create(texture, | 
| +                                                       SkMatrix::I(), | 
| +                                                       textureDomain, | 
| +                                                       GrTextureDomain::kClamp_Mode, | 
| +                                                       params.filterMode())); | 
| +        } | 
| } else if (bicubic) { | 
| SkASSERT(GrTextureParams::kNone_FilterMode == params.filterMode()); | 
| SkShader::TileMode tileModes[2] = { params.getTileModeX(), params.getTileModeY() }; | 
|  |