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:
@@ -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()
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user