optimize fast/simple case in raster tiling
1. We want to avoid as much overhead as possible in the tiler setup, so do a quick check before handling bounds 2. Compare against current clipbounds instead of devicesize, which may eliminate looping sometimes Follow-on to https://skia-review.googlesource.com/c/skia/+/119570 Bug: 818693 Bug: 820245 Bug: 820470 Change-Id: If34721c7e467d1ab9e879f25e7b86af6732ca384 Reviewed-on: https://skia-review.googlesource.com/121329 Commit-Queue: Mike Reed <reed@google.com> Reviewed-by: Yuqian Li <liyuqian@google.com>
This commit is contained in:
parent
945918714b
commit
888fc05ef0
@ -72,21 +72,26 @@ public:
|
|||||||
fRootPixmap.reset(dev->imageInfo(), nullptr, 0);
|
fRootPixmap.reset(dev->imageInfo(), nullptr, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bounds) {
|
// do a quick check, so we don't even have to process "bounds" if there is no need
|
||||||
SkRect devBounds;
|
const SkIRect clipR = dev->fRCStack.rc().getBounds();
|
||||||
dev->ctm().mapRect(&devBounds, *bounds);
|
fNeedsTiling = clipR.right() > kMaxDim || clipR.bottom() > kMaxDim;
|
||||||
if (devBounds.intersect(SkRect::MakeIWH(fRootPixmap.width(), fRootPixmap.height()))) {
|
if (fNeedsTiling) {
|
||||||
fSrcBounds = devBounds.roundOut();
|
if (bounds) {
|
||||||
|
SkRect devBounds;
|
||||||
|
dev->ctm().mapRect(&devBounds, *bounds);
|
||||||
|
if (devBounds.intersect(SkRect::Make(clipR))) {
|
||||||
|
fSrcBounds = devBounds.roundOut();
|
||||||
|
} else {
|
||||||
|
fNeedsTiling = false;
|
||||||
|
fDone = true;
|
||||||
|
}
|
||||||
|
// Check again, now that we have computed srcbounds.
|
||||||
|
fNeedsTiling = fSrcBounds.right() > kMaxDim || fSrcBounds.bottom() > kMaxDim;
|
||||||
} else {
|
} else {
|
||||||
fDone = true;
|
fSrcBounds = clipR;
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
fSrcBounds = SkIRect::MakeWH(fRootPixmap.width(), fRootPixmap.height());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fNeedsTiling = !fRootPixmap.bounds().isEmpty() && // empty pixmap map fail extractSubset?
|
|
||||||
(fRootPixmap.width() > kMaxDim || fRootPixmap.height() > kMaxDim);
|
|
||||||
|
|
||||||
if (fNeedsTiling) {
|
if (fNeedsTiling) {
|
||||||
// fDraw.fDst is reset each time in setupTileDraw()
|
// fDraw.fDst is reset each time in setupTileDraw()
|
||||||
fDraw.fMatrix = &fTileMatrix;
|
fDraw.fMatrix = &fTileMatrix;
|
||||||
@ -94,6 +99,7 @@ public:
|
|||||||
// we'll step/increase it before using it
|
// we'll step/increase it before using it
|
||||||
fOrigin.set(fSrcBounds.fLeft - kMaxDim, fSrcBounds.fTop);
|
fOrigin.set(fSrcBounds.fLeft - kMaxDim, fSrcBounds.fTop);
|
||||||
} else {
|
} else {
|
||||||
|
// don't reference fSrcBounds, as it may not have been set
|
||||||
fDraw.fDst = fRootPixmap;
|
fDraw.fDst = fRootPixmap;
|
||||||
fDraw.fMatrix = &dev->ctm();
|
fDraw.fMatrix = &dev->ctm();
|
||||||
fDraw.fRC = &dev->fRCStack.rc();
|
fDraw.fRC = &dev->fRCStack.rc();
|
||||||
@ -123,9 +129,6 @@ public:
|
|||||||
return &fDraw;
|
return &fDraw;
|
||||||
}
|
}
|
||||||
|
|
||||||
int curr_x() const { return fOrigin.x(); }
|
|
||||||
int curr_y() const { return fOrigin.y(); }
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void stepAndSetupTileDraw() {
|
void stepAndSetupTileDraw() {
|
||||||
SkASSERT(!fDone);
|
SkASSERT(!fDone);
|
||||||
@ -165,8 +168,6 @@ private:
|
|||||||
while (const SkDraw* priv_draw = priv_tiler.next()) { \
|
while (const SkDraw* priv_draw = priv_tiler.next()) { \
|
||||||
priv_draw->code; \
|
priv_draw->code; \
|
||||||
}
|
}
|
||||||
#define TILER_X(x) (x) - priv_tiler.curr_x()
|
|
||||||
#define TILER_Y(y) (y) - priv_tiler.curr_y()
|
|
||||||
|
|
||||||
// Helper to create an SkDraw from a device
|
// Helper to create an SkDraw from a device
|
||||||
class SkBitmapDevice::BDDraw : public SkDraw {
|
class SkBitmapDevice::BDDraw : public SkDraw {
|
||||||
|
Loading…
Reference in New Issue
Block a user