Index: src/gpu/SkGpuDevice.cpp |
=================================================================== |
--- src/gpu/SkGpuDevice.cpp (revision 10793) |
+++ src/gpu/SkGpuDevice.cpp (working copy) |
@@ -1178,6 +1178,32 @@ |
} |
} |
+// This method outsets 'iRect' by 1 all around and then clamps its extents to |
+// 'clamp'. 'offset' is adjusted to remain positioned over the top-left corner |
+// of 'iRect' despite the possible outsets/clamps. |
+static inline void clamped_unit_outset_with_offset(SkIRect* iRect, SkPoint* offset, |
+ const SkIRect& clamp) { |
+ iRect->outset(1, 1); |
+ |
+ if (iRect->fLeft < clamp.fLeft) { |
+ iRect->fLeft = clamp.fLeft; |
+ } else { |
+ offset->fX -= SK_Scalar1; |
+ } |
+ if (iRect->fTop < clamp.fTop) { |
+ iRect->fTop = clamp.fTop; |
+ } else { |
+ offset->fY -= SK_Scalar1; |
+ } |
+ |
+ if (iRect->fRight > clamp.fRight) { |
+ iRect->fRight = clamp.fRight; |
+ } |
+ if (iRect->fBottom > clamp.fBottom) { |
+ iRect->fBottom = clamp.fBottom; |
+ } |
+} |
+ |
// Break 'bitmap' into several tiles to draw it since it has already |
// been determined to be too large to fit in VRAM |
void SkGpuDevice::drawTiledBitmap(const SkBitmap& bitmap, |
@@ -1186,8 +1212,12 @@ |
const GrTextureParams& params, |
const SkPaint& paint, |
SkCanvas::DrawBitmapRectFlags flags) { |
- // TODO: this method needs to be updated to respect the bleed flag |
- const int maxTextureSize = fContext->getMaxTextureSize(); |
+ int maxTextureSize = fContext->getMaxTextureSize(); |
+ if (SkPaint::kNone_FilterLevel != paint.getFilterLevel()) { |
+ // We may need a skosh more room if we have to bump out the tile |
+ // by 1 pixel all around |
+ maxTextureSize -= 2; |
+ } |
int tileSize = determine_tile_size(bitmap, srcRect, maxTextureSize); |
@@ -1228,12 +1258,31 @@ |
SkBitmap tmpB; |
SkIRect iTileR; |
tileR.roundOut(&iTileR); |
+ SkPoint offset = SkPoint::Make(SkIntToScalar(iTileR.fLeft), |
+ SkIntToScalar(iTileR.fTop)); |
+ |
+ if (SkPaint::kNone_FilterLevel != paint.getFilterLevel()) { |
+ SkIRect iClampRect; |
+ |
+ if (SkCanvas::kBleed_DrawBitmapRectFlag & flags) { |
+ // In bleed mode we want to always expand the tile on all edges |
+ // but stay within the bitmap bounds |
+ iClampRect = SkIRect::MakeWH(bitmap.width(), bitmap.height()); |
+ } else { |
+ // 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) |
+ srcRect.roundOut(&iClampRect); |
+ } |
+ |
+ clamped_unit_outset_with_offset(&iTileR, &offset, iClampRect); |
+ } |
+ |
if (bitmap.extractSubset(&tmpB, iTileR)) { |
// now offset it to make it "local" to our tmp bitmap |
- tileR.offset(SkIntToScalar(-iTileR.fLeft), SkIntToScalar(-iTileR.fTop)); |
+ tileR.offset(-offset.fX, -offset.fY); |
SkMatrix tmpM(m); |
- tmpM.preTranslate(SkIntToScalar(iTileR.fLeft), |
- SkIntToScalar(iTileR.fTop)); |
+ tmpM.preTranslate(offset.fX, offset.fY); |
this->internalDrawBitmap(tmpB, tileR, tmpM, params, paint, flags); |
} |