Index: src/gpu/SkGpuDevice.cpp |
diff --git a/src/gpu/SkGpuDevice.cpp b/src/gpu/SkGpuDevice.cpp |
index 6a317d5edc057a36aa9a090c26152a42bb4f25fb..c97d24809a2036c16d473437fd3b9bc56737e2f0 100644 |
--- a/src/gpu/SkGpuDevice.cpp |
+++ b/src/gpu/SkGpuDevice.cpp |
@@ -13,6 +13,7 @@ |
#include "GrFontScaler.h" |
#include "GrGpu.h" |
#include "GrGpuResourcePriv.h" |
+#include "GrImageIDTextureAdjuster.h" |
#include "GrLayerHoister.h" |
#include "GrRecordReplaceDraw.h" |
#include "GrStrokeInfo.h" |
@@ -841,13 +842,26 @@ void SkGpuDevice::drawBitmap(const SkDraw& origDraw, |
const SkBitmap& bitmap, |
const SkMatrix& m, |
const SkPaint& paint) { |
+ |
+ GrTexture* texture = bitmap.getTexture(); |
+ if (texture) { |
+ CHECK_SHOULD_DRAW(origDraw); |
+ bool alphaOnly = kAlpha_8_SkColorType == bitmap.colorType(); |
+ GrBitmapTextureAdjuster adjuster(&bitmap); |
+ SkMatrix viewMatrix; |
+ viewMatrix.setConcat(*origDraw.fMatrix, m); |
+ this->drawTextureAdjuster(&adjuster, alphaOnly, nullptr, nullptr, |
+ SkCanvas::kFast_SrcRectConstraint, viewMatrix, fClip, paint); |
+ return; |
+ } |
SkMatrix concat; |
SkTCopyOnFirstWrite<SkDraw> draw(origDraw); |
if (!m.isIdentity()) { |
concat.setConcat(*draw->fMatrix, m); |
draw.writable()->fMatrix = &concat; |
} |
- this->drawBitmapCommon(*draw, bitmap, nullptr, nullptr, paint, SkCanvas::kStrict_SrcRectConstraint); |
+ this->drawBitmapCommon(*draw, bitmap, nullptr, nullptr, paint, |
+ SkCanvas::kStrict_SrcRectConstraint); |
} |
// This method outsets 'iRect' by 'outset' all around and then clamps its extents to |
@@ -1184,7 +1198,7 @@ void SkGpuDevice::drawTiledBitmap(const SkBitmap& bitmap, |
const SkRect& srcRect, |
const SkIRect& clippedSrcIRect, |
const GrTextureParams& params, |
- const SkPaint& paint, |
+ const SkPaint& origPaint, |
SkCanvas::SrcRectConstraint constraint, |
int tileSize, |
bool bicubic) { |
@@ -1193,6 +1207,15 @@ void SkGpuDevice::drawTiledBitmap(const SkBitmap& bitmap, |
// at each tile in cases where 'bitmap' holds an SkDiscardablePixelRef that |
// is larger than the limit of the discardable memory pool. |
SkAutoLockPixels alp(bitmap); |
+ |
+ const SkPaint* paint = &origPaint; |
+ SkPaint tempPaint; |
+ if (origPaint.isAntiAlias() && !fRenderTarget->isUnifiedMultisampled()) { |
+ // Drop antialiasing to avoid seams at tile boundaries. |
+ tempPaint = origPaint; |
+ tempPaint.setAntiAlias(false); |
+ paint = &tempPaint; |
+ } |
SkRect clippedSrcRect = SkRect::Make(clippedSrcIRect); |
int nx = bitmap.width() / tileSize; |
@@ -1254,7 +1277,7 @@ void SkGpuDevice::drawTiledBitmap(const SkBitmap& bitmap, |
viewM, |
tileR, |
paramsTemp, |
- paint, |
+ *paint, |
constraint, |
bicubic, |
needsTextureDomain); |
@@ -1482,6 +1505,15 @@ void SkGpuDevice::drawSprite(const SkDraw& draw, const SkBitmap& bitmap, |
void SkGpuDevice::drawBitmapRect(const SkDraw& origDraw, const SkBitmap& bitmap, |
const SkRect* src, const SkRect& dst, |
const SkPaint& paint, SkCanvas::SrcRectConstraint constraint) { |
+ if (GrTexture* tex = bitmap.getTexture()) { |
+ CHECK_SHOULD_DRAW(origDraw); |
+ bool alphaOnly = GrPixelConfigIsAlphaOnly(tex->config()); |
+ GrBitmapTextureAdjuster adjuster(&bitmap); |
+ this->drawTextureAdjuster(&adjuster, alphaOnly, src, &dst, constraint, *origDraw.fMatrix, |
+ fClip, paint); |
+ return; |
+ } |
+ |
SkMatrix matrix; |
SkRect bitmapBounds, tmpSrc; |
@@ -1643,7 +1675,14 @@ void SkGpuDevice::drawImage(const SkDraw& draw, const SkImage* image, SkScalar x |
const SkPaint& paint) { |
SkBitmap bm; |
if (GrTexture* tex = as_IB(image)->peekTexture()) { |
- GrWrapTextureInBitmap(tex, image->width(), image->height(), image->isOpaque(), &bm); |
+ CHECK_SHOULD_DRAW(draw); |
+ SkMatrix viewMatrix = *draw.fMatrix; |
+ viewMatrix.preTranslate(x, y); |
+ bool alphaOnly = GrPixelConfigIsAlphaOnly(tex->config()); |
+ GrImageTextureAdjuster adjuster(as_IB(image)); |
+ this->drawTextureAdjuster(&adjuster, alphaOnly, nullptr, nullptr, |
+ SkCanvas::kFast_SrcRectConstraint, viewMatrix, fClip, paint); |
+ return; |
} else { |
if (this->shouldTileImage(image, nullptr, SkCanvas::kFast_SrcRectConstraint, |
paint.getFilterQuality(), *draw.fMatrix)) { |
@@ -1663,23 +1702,26 @@ void SkGpuDevice::drawImage(const SkDraw& draw, const SkImage* image, SkScalar x |
void SkGpuDevice::drawImageRect(const SkDraw& draw, const SkImage* image, const SkRect* src, |
const SkRect& dst, const SkPaint& paint, |
SkCanvas::SrcRectConstraint constraint) { |
- SkBitmap bm; |
if (GrTexture* tex = as_IB(image)->peekTexture()) { |
- GrWrapTextureInBitmap(tex, image->width(), image->height(), image->isOpaque(), &bm); |
+ CHECK_SHOULD_DRAW(draw); |
+ GrImageTextureAdjuster adjuster(as_IB(image)); |
+ bool alphaOnly = GrPixelConfigIsAlphaOnly(tex->config()); |
+ this->drawTextureAdjuster(&adjuster, alphaOnly, src, &dst, constraint, *draw.fMatrix, |
+ fClip, paint); |
+ return; |
+ } |
+ SkBitmap bm; |
+ SkMatrix viewMatrix = *draw.fMatrix; |
+ viewMatrix.preScale(dst.width() / (src ? src->width() : image->width()), |
+ dst.height() / (src ? src->height() : image->height())); |
+ if (this->shouldTileImage(image, src, constraint, paint.getFilterQuality(), viewMatrix)) { |
+ // only support tiling as bitmap at the moment, so force raster-version |
+ if (!as_IB(image)->getROPixels(&bm)) { |
+ return; |
+ } |
} else { |
- SkMatrix viewMatrix = *draw.fMatrix; |
- viewMatrix.preScale(dst.width() / (src ? src->width() : image->width()), |
- dst.height() / (src ? src->height() : image->height())); |
- |
- if (this->shouldTileImage(image, src, constraint, paint.getFilterQuality(), viewMatrix)) { |
- // only support tiling as bitmap at the moment, so force raster-version |
- if (!as_IB(image)->getROPixels(&bm)) { |
- return; |
- } |
- } else { |
- if (!wrap_as_bm(this->context(), image, &bm)) { |
- return; |
- } |
+ if (!wrap_as_bm(this->context(), image, &bm)) { |
+ return; |
} |
} |
this->drawBitmapRect(draw, bm, src, dst, paint, constraint); |