| Index: src/core/SkMultiPictureDraw.cpp
|
| diff --git a/src/core/SkMultiPictureDraw.cpp b/src/core/SkMultiPictureDraw.cpp
|
| index 02855984138a6a5d2f3949e31c14c91570e5206d..51feae55d8f50795fd1f27d5edae73db72958a6d 100644
|
| --- a/src/core/SkMultiPictureDraw.cpp
|
| +++ b/src/core/SkMultiPictureDraw.cpp
|
| @@ -9,6 +9,7 @@
|
| // framework build, which gets its defines from SkTypes rather than a makefile,
|
| // has the definition before checking it.
|
| #include "SkCanvas.h"
|
| +#include "SkCanvasPriv.h"
|
| #include "SkMultiPictureDraw.h"
|
| #include "SkPicture.h"
|
| #include "SkTaskGroup.h"
|
| @@ -111,12 +112,15 @@ void SkMultiPictureDraw::draw() {
|
| // we only expect 1 context for all the canvases
|
| SkASSERT(data.fCanvas->getGrContext() == context);
|
|
|
| - if (!data.fPaint && data.fMatrix.isIdentity()) {
|
| + if (!data.fPaint) {
|
| SkRect clipBounds;
|
| if (!data.fCanvas->getClipBounds(&clipBounds)) {
|
| continue;
|
| }
|
|
|
| + SkMatrix initialMatrix = data.fCanvas->getTotalMatrix();
|
| + initialMatrix.preConcat(data.fMatrix);
|
| +
|
| GrRenderTarget* rt = data.fCanvas->internal_private_accessTopLayerRenderTarget();
|
| SkASSERT(rt);
|
|
|
| @@ -124,7 +128,7 @@ void SkMultiPictureDraw::draw() {
|
| // would improve the packing and reduce the number of swaps
|
| // TODO: another optimization would be to make a first pass to
|
| // lock any required layer that is already in the atlas
|
| - GrLayerHoister::FindLayersToAtlas(context, data.fPicture,
|
| + GrLayerHoister::FindLayersToAtlas(context, data.fPicture, initialMatrix,
|
| clipBounds,
|
| &atlasedNeedRendering, &atlasedRecycled,
|
| rt->numSamples());
|
| @@ -142,19 +146,23 @@ void SkMultiPictureDraw::draw() {
|
| const SkPicture* picture = data.fPicture;
|
|
|
| #if !defined(SK_IGNORE_GPU_LAYER_HOISTING) && SK_SUPPORT_GPU
|
| - if (!data.fPaint && data.fMatrix.isIdentity()) {
|
| + if (!data.fPaint) {
|
|
|
| SkRect clipBounds;
|
| if (!canvas->getClipBounds(&clipBounds)) {
|
| continue;
|
| }
|
|
|
| + SkAutoCanvasMatrixPaint acmp(canvas, &data.fMatrix, data.fPaint, picture->cullRect());
|
| +
|
| + const SkMatrix initialMatrix = canvas->getTotalMatrix();
|
| +
|
| GrRenderTarget* rt = data.fCanvas->internal_private_accessTopLayerRenderTarget();
|
| SkASSERT(rt);
|
|
|
| // Find the layers required by this canvas. It will return atlased
|
| // layers in the 'recycled' list since they have already been drawn.
|
| - GrLayerHoister::FindLayersToHoist(context, picture,
|
| + GrLayerHoister::FindLayersToHoist(context, picture, initialMatrix,
|
| clipBounds, &needRendering, &recycled,
|
| rt->numSamples());
|
|
|
| @@ -165,8 +173,6 @@ void SkMultiPictureDraw::draw() {
|
| GrLayerHoister::ConvertLayersToReplacements(needRendering, &replacements);
|
| GrLayerHoister::ConvertLayersToReplacements(recycled, &replacements);
|
|
|
| - const SkMatrix initialMatrix = canvas->getTotalMatrix();
|
| -
|
| // Render the entire picture using new layers
|
| GrRecordReplaceDraw(picture, canvas, &replacements, initialMatrix, NULL);
|
|
|
|
|