aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar robertphillips <robertphillips@google.com>2014-09-08 11:37:59 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2014-09-08 11:37:59 -0700
commit46625e06e23b65c05013fc686a8223d6d5b49050 (patch)
treebecbbe42d34f0b14e628236712121e3d1f30e0ff /src
parent858baf5b7da669f88ab8c8cf08b5230432a174a0 (diff)
Fix two SkRecord-backed layer hoisting bugs
The two bugs are/were: The old loop to draw the hoisted layers included the saveLayer call which caused double application of the layer's paint (This is the +1 change). The hoisted layer is intended to be drawn in device coordinates. The old code was drawing it in the coordinate space of the saveLayer thus it was misplaced (This is the setMatrix change). Committed: https://skia.googlesource.com/skia/+/7c0cfd4ff8f6db50a8731c886db732b106268937 R=bsalomon@google.com Author: robertphillips@google.com Review URL: https://codereview.chromium.org/551843002
Diffstat (limited to 'src')
-rw-r--r--src/gpu/GrLayerHoister.cpp4
-rw-r--r--src/gpu/GrRecordReplaceDraw.cpp14
2 files changed, 12 insertions, 6 deletions
diff --git a/src/gpu/GrLayerHoister.cpp b/src/gpu/GrLayerHoister.cpp
index ac09df825b..49ca338bb2 100644
--- a/src/gpu/GrLayerHoister.cpp
+++ b/src/gpu/GrLayerHoister.cpp
@@ -95,7 +95,7 @@ void GrLayerHoister::DrawLayers(const SkPicture* picture,
atlasCanvas->concat(layer->ctm());
SkRecordPartialDraw(*picture->fRecord.get(), atlasCanvas, bound,
- layer->start(), layer->stop());
+ layer->start()+1, layer->stop());
atlasCanvas->restore();
}
@@ -129,7 +129,7 @@ void GrLayerHoister::DrawLayers(const SkPicture* picture,
layerCanvas->concat(layer->ctm());
SkRecordPartialDraw(*picture->fRecord.get(), layerCanvas, bound,
- layer->start(), layer->stop());
+ layer->start()+1, layer->stop());
layerCanvas->flush();
}
diff --git a/src/gpu/GrRecordReplaceDraw.cpp b/src/gpu/GrRecordReplaceDraw.cpp
index f0abd6481e..b53f003904 100644
--- a/src/gpu/GrRecordReplaceDraw.cpp
+++ b/src/gpu/GrRecordReplaceDraw.cpp
@@ -51,13 +51,18 @@ GrReplacements::lookupByStart(size_t start, int* searchStart) const {
}
static inline void draw_replacement_bitmap(const GrReplacements::ReplacementInfo* ri,
- SkCanvas* canvas) {
+ SkCanvas* canvas,
+ const SkMatrix& initialMatrix) {
SkRect src = SkRect::Make(ri->fSrcRect);
SkRect dst = SkRect::MakeXYWH(SkIntToScalar(ri->fPos.fX),
SkIntToScalar(ri->fPos.fY),
SkIntToScalar(ri->fSrcRect.width()),
SkIntToScalar(ri->fSrcRect.height()));
+
+ canvas->save();
+ canvas->setMatrix(initialMatrix);
ri->fImage->draw(canvas, &src, dst, ri->fPaint);
+ canvas->restore();
}
void GrRecordReplaceDraw(const SkRecord& record,
@@ -71,6 +76,8 @@ void GrRecordReplaceDraw(const SkRecord& record,
const GrReplacements::ReplacementInfo* ri = NULL;
int searchStart = 0;
+ const SkMatrix initialMatrix = canvas->getTotalMatrix();
+
if (bbh) {
// Draw only ops that affect pixels in the canvas's current clip.
// The SkRecord and BBH were recorded in identity space. This canvas
@@ -89,7 +96,7 @@ void GrRecordReplaceDraw(const SkRecord& record,
}
ri = replacements->lookupByStart((uintptr_t)ops[i], &searchStart);
if (ri) {
- draw_replacement_bitmap(ri, canvas);
+ draw_replacement_bitmap(ri, canvas, initialMatrix);
while ((uintptr_t)ops[i] < ri->fStop) {
++i;
@@ -107,8 +114,7 @@ void GrRecordReplaceDraw(const SkRecord& record,
}
ri = replacements->lookupByStart(i, &searchStart);
if (ri) {
- draw_replacement_bitmap(ri, canvas);
-
+ draw_replacement_bitmap(ri, canvas, initialMatrix);
i = ri->fStop;
continue;
}