Change behavior of setBitmap to cleanly reset the canvas

- identity matrix
 - no save stack
 - wide-open clip

This reverts commit 4f641d1e45

Test: bit CtsGraphicsTestCases:.CanvasTest
Bug: 36218535
Change-Id: Id11deb06e37d6df61f1f171d424ab150d812a7a8
This commit is contained in:
Derek Sollenberger
2017-04-11 13:58:45 -04:00
parent 2d008a5fc1
commit eb69cbbe22
2 changed files with 4 additions and 28 deletions

View File

@@ -157,10 +157,12 @@ public class Canvas extends BaseCanvas {
/**
* Specify a bitmap for the canvas to draw into. All canvas state such as
* layers, filters, and the save/restore stack are reset with the exception
* of the current matrix and clip stack. Additionally, as a side-effect
* layers, filters, and the save/restore stack are reset. Additionally,
* the canvas' target density is updated to match that of the bitmap.
*
* Prior to API level {@value Build.VERSION_CODES#O} the current matrix and
* clip stack were preserved.
*
* @param bitmap Specifies a mutable bitmap for the canvas to draw into.
* @see #setDensity(int)
* @see #getDensity()

View File

@@ -80,38 +80,12 @@ void SkiaCanvas::reset(SkCanvas* skiaCanvas) {
// Canvas state operations: Replace Bitmap
// ----------------------------------------------------------------------------
class ClipCopier : public SkCanvas::ClipVisitor {
public:
explicit ClipCopier(SkCanvas* dstCanvas) : m_dstCanvas(dstCanvas) {}
virtual void clipRect(const SkRect& rect, SkClipOp op, bool antialias) {
m_dstCanvas->clipRect(rect, op, antialias);
}
virtual void clipRRect(const SkRRect& rrect, SkClipOp op, bool antialias) {
m_dstCanvas->clipRRect(rrect, op, antialias);
}
virtual void clipPath(const SkPath& path, SkClipOp op, bool antialias) {
m_dstCanvas->clipPath(path, op, antialias);
}
private:
SkCanvas* m_dstCanvas;
};
void SkiaCanvas::setBitmap(const SkBitmap& bitmap) {
sk_sp<SkColorSpace> cs = bitmap.refColorSpace();
std::unique_ptr<SkCanvas> newCanvas = std::unique_ptr<SkCanvas>(new SkCanvas(bitmap));
std::unique_ptr<SkCanvas> newCanvasWrapper = SkCreateColorSpaceXformCanvas(newCanvas.get(),
cs == nullptr ? SkColorSpace::MakeSRGB() : std::move(cs));
if (!bitmap.isNull()) {
// Copy the canvas matrix & clip state.
newCanvasWrapper->setMatrix(mCanvas->getTotalMatrix());
ClipCopier copier(newCanvasWrapper.get());
mCanvas->replayClips(&copier);
}
// deletes the previously owned canvas (if any)
mCanvasOwned = std::move(newCanvas);
mCanvasWrapper = std::move(newCanvasWrapper);