Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(281)

Unified Diff: src/gpu/SkGpuDevice.cpp

Issue 1424313010: Separate out natively-texture image/bmp draws from cached-as-texture image/bmp draws (Closed) Base URL: https://skia.googlesource.com/skia.git@const
Patch Set: tiny Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/gpu/SkGpuDevice.cpp
diff --git a/src/gpu/SkGpuDevice.cpp b/src/gpu/SkGpuDevice.cpp
index 6a317d5edc057a36aa9a090c26152a42bb4f25fb..b6341335c945b435610c1aec93fb1158ca32559e 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"
@@ -847,6 +848,20 @@ void SkGpuDevice::drawBitmap(const SkDraw& origDraw,
concat.setConcat(*draw->fMatrix, m);
draw.writable()->fMatrix = &concat;
}
+
+ GrTexture* texture = bitmap.getTexture();
+ if (texture) {
+ CHECK_SHOULD_DRAW(*draw);
+ // src and dst rects are the same.
+ SkRect rect = SkRect::MakeWH(SkIntToScalar(bitmap.width()), SkIntToScalar(bitmap.height()));
+ // Since the src rect is the bitmap dimensions, no need to enforce a bleed constraint.
+ static const SkCanvas::SrcRectConstraint kSrcRectConstraint =
+ SkCanvas::kFast_SrcRectConstraint;
+ bool alphaBitmap = kAlpha_8_SkColorType == bitmap.colorType();
+ this->drawTextureRect(&GrBitmapTextureAdjuster(&bitmap), alphaBitmap, rect,
+ rect, *draw->fMatrix, fClip, paint, kSrcRectConstraint);
+ return;
+ }
this->drawBitmapCommon(*draw, bitmap, nullptr, nullptr, paint, SkCanvas::kStrict_SrcRectConstraint);
}
@@ -1184,7 +1199,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 +1208,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 +1278,7 @@ void SkGpuDevice::drawTiledBitmap(const SkBitmap& bitmap,
viewM,
tileR,
paramsTemp,
- paint,
+ *paint,
constraint,
bicubic,
needsTextureDomain);
@@ -1482,6 +1506,43 @@ 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) {
+ SkBitmap bm;
+ if (GrTexture* tex = bitmap.getTexture()) {
+ CHECK_SHOULD_DRAW(origDraw);
+ // Will hold the src dst rect after clipping against the image bounds.
+ SkRect clippedSrcRect;
+ SkRect clippedDstRect;
+ SkIRect contentArea = SkIRect::MakeWH(bitmap.width(), bitmap.height());
+ bool alphaBitmap = GrPixelConfigIsAlphaOnly(tex->config());
+ if (src) {
+ SkRect bmpSrcBounds = SkRect::MakeIWH(bitmap.width(), bitmap.height());
+ if (!bmpSrcBounds.contains(*src)) {
+ clippedSrcRect = *src;
+ if (!clippedSrcRect.intersect(bmpSrcBounds)) {
+ return;
+ }
+ SkMatrix srcToDstMatrix;
+ srcToDstMatrix.setRectToRect(*src, dst, SkMatrix::kFill_ScaleToFit);
+ srcToDstMatrix.mapRect(&clippedDstRect, clippedSrcRect);
+ // Since went through the trouble to compute the local matrix, call this version and
+ // return.
+ this->drawTextureRectPrecomputedLocalMatrix(
+ &GrBitmapTextureAdjuster(&bitmap), alphaBitmap, clippedSrcRect, clippedDstRect,
+ *origDraw.fMatrix, srcToDstMatrix, fClip, paint, constraint);
+ return;
+ } else {
+ clippedSrcRect = *src;
+ clippedDstRect = dst;
+ }
+ } else {
+ clippedSrcRect = SkRect::MakeWH(SkIntToScalar(bitmap.width()),
+ SkIntToScalar(bitmap.height()));
+ }
+ this->drawTextureRect(&GrBitmapTextureAdjuster(&bitmap), alphaBitmap, clippedSrcRect,
+ clippedDstRect, *origDraw.fMatrix, fClip, paint, constraint);
+ return;
+ }
+
SkMatrix matrix;
SkRect bitmapBounds, tmpSrc;
@@ -1643,7 +1704,17 @@ 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);
+ SkRect srcRect = SkRect::MakeIWH(image->width(), image->height());
+ SkRect dstRect = srcRect;
+ dstRect.offset(x, y);
+ bool alphaBitmap = GrPixelConfigIsAlphaOnly(tex->config());
+ // Since the src rect is the image dimensions, no need to enforce a bleed constraint.
+ static const SkCanvas::SrcRectConstraint kSrcRectConstraint =
+ SkCanvas::kFast_SrcRectConstraint;
+ this->drawTextureRect(&GrImageTextureAdjuster(as_IB(image)), alphaBitmap, srcRect, dstRect,
+ *draw.fMatrix, fClip, paint, kSrcRectConstraint);
+ return;
} else {
if (this->shouldTileImage(image, nullptr, SkCanvas::kFast_SrcRectConstraint,
paint.getFilterQuality(), *draw.fMatrix)) {
@@ -1665,21 +1736,51 @@ void SkGpuDevice::drawImageRect(const SkDraw& draw, const SkImage* image, const
SkCanvas::SrcRectConstraint constraint) {
SkBitmap bm;
if (GrTexture* tex = as_IB(image)->peekTexture()) {
- GrWrapTextureInBitmap(tex, image->width(), image->height(), image->isOpaque(), &bm);
- } 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)) {
+ CHECK_SHOULD_DRAW(draw);
+ // Will hold the src dst rect after clipping against the image bounds.
+ SkRect clippedSrcRect;
+ SkRect clippedDstRect;
+ bool alphaBitmap = GrPixelConfigIsAlphaOnly(tex->config());
+ if (src) {
+ SkRect imgSrcBounds = SkRect::MakeIWH(image->width(), image->height());
+ if (!imgSrcBounds.contains(*src)) {
+ clippedSrcRect = *src;
+ if (!clippedSrcRect.intersect(imgSrcBounds)) {
+ return;
+ }
+ SkMatrix srcToDstMatrix;
+ srcToDstMatrix.setRectToRect(*src, dst, SkMatrix::kFill_ScaleToFit);
+ srcToDstMatrix.mapRect(&clippedDstRect, clippedSrcRect);
+ // Since went through the trouble to compute the local matrix, call this version and
+ // return.
+ this->drawTextureRectPrecomputedLocalMatrix(
+ &GrImageTextureAdjuster(as_IB(image)), alphaBitmap, clippedSrcRect,
+ clippedDstRect, *draw.fMatrix, srcToDstMatrix, fClip, paint, constraint);
joshualitt 2015/11/05 19:53:12 can this be made a helper? or do we want it to be
bsalomon 2015/11/05 20:10:37 I'm not sure I understand what you're asking/sugge
bsalomon 2015/11/06 15:24:26 Done.
return;
+ } else {
+ clippedSrcRect = *src;
+ clippedDstRect = dst;
}
} else {
- if (!wrap_as_bm(this->context(), image, &bm)) {
- return;
- }
+ clippedSrcRect = SkRect::MakeWH(SkIntToScalar(image->width()),
+ SkIntToScalar(image->height()));
+ clippedDstRect = dst;
+ }
+ this->drawTextureRect(&GrImageTextureAdjuster(as_IB(image)), alphaBitmap, clippedSrcRect,
+ clippedDstRect, *draw.fMatrix, fClip, paint, constraint);
+ return;
+ }
+ 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;
}
}
this->drawBitmapRect(draw, bm, src, dst, paint, constraint);

Powered by Google App Engine
This is Rietveld 408576698