Merge "Move SkiaCanvas::Clip above SkiaCanvas::SkiaCanvas" am: 770e68977b am: d80d36a428 am: eda3dacc31

Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/2200075

Change-Id: I7d4ff5e9a322c36342307ab6e8bd26c5314164a7
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Ryan Prichard
2022-09-01 01:04:53 +00:00
committed by Automerger Merge Worker

View File

@@ -51,6 +51,49 @@ namespace android {
using uirenderer::PaintUtils; using uirenderer::PaintUtils;
class SkiaCanvas::Clip {
public:
Clip(const SkRect& rect, SkClipOp op, const SkMatrix& m)
: mType(Type::Rect), mOp(op), mMatrix(m), mRRect(SkRRect::MakeRect(rect)) {}
Clip(const SkRRect& rrect, SkClipOp op, const SkMatrix& m)
: mType(Type::RRect), mOp(op), mMatrix(m), mRRect(rrect) {}
Clip(const SkPath& path, SkClipOp op, const SkMatrix& m)
: mType(Type::Path), mOp(op), mMatrix(m), mPath(std::in_place, path) {}
void apply(SkCanvas* canvas) const {
canvas->setMatrix(mMatrix);
switch (mType) {
case Type::Rect:
// Don't anti-alias rectangular clips
canvas->clipRect(mRRect.rect(), mOp, false);
break;
case Type::RRect:
// Ensure rounded rectangular clips are anti-aliased
canvas->clipRRect(mRRect, mOp, true);
break;
case Type::Path:
// Ensure path clips are anti-aliased
canvas->clipPath(mPath.value(), mOp, true);
break;
}
}
private:
enum class Type {
Rect,
RRect,
Path,
};
Type mType;
SkClipOp mOp;
SkMatrix mMatrix;
// These are logically a union (tracked separately due to non-POD path).
std::optional<SkPath> mPath;
SkRRect mRRect;
};
Canvas* Canvas::create_canvas(const SkBitmap& bitmap) { Canvas* Canvas::create_canvas(const SkBitmap& bitmap) {
return new SkiaCanvas(bitmap); return new SkiaCanvas(bitmap);
} }
@@ -194,49 +237,6 @@ void SkiaCanvas::restoreUnclippedLayer(int restoreCount, const Paint& paint) {
} }
} }
class SkiaCanvas::Clip {
public:
Clip(const SkRect& rect, SkClipOp op, const SkMatrix& m)
: mType(Type::Rect), mOp(op), mMatrix(m), mRRect(SkRRect::MakeRect(rect)) {}
Clip(const SkRRect& rrect, SkClipOp op, const SkMatrix& m)
: mType(Type::RRect), mOp(op), mMatrix(m), mRRect(rrect) {}
Clip(const SkPath& path, SkClipOp op, const SkMatrix& m)
: mType(Type::Path), mOp(op), mMatrix(m), mPath(std::in_place, path) {}
void apply(SkCanvas* canvas) const {
canvas->setMatrix(mMatrix);
switch (mType) {
case Type::Rect:
// Don't anti-alias rectangular clips
canvas->clipRect(mRRect.rect(), mOp, false);
break;
case Type::RRect:
// Ensure rounded rectangular clips are anti-aliased
canvas->clipRRect(mRRect, mOp, true);
break;
case Type::Path:
// Ensure path clips are anti-aliased
canvas->clipPath(mPath.value(), mOp, true);
break;
}
}
private:
enum class Type {
Rect,
RRect,
Path,
};
Type mType;
SkClipOp mOp;
SkMatrix mMatrix;
// These are logically a union (tracked separately due to non-POD path).
std::optional<SkPath> mPath;
SkRRect mRRect;
};
const SkiaCanvas::SaveRec* SkiaCanvas::currentSaveRec() const { const SkiaCanvas::SaveRec* SkiaCanvas::currentSaveRec() const {
const SaveRec* rec = mSaveStack ? static_cast<const SaveRec*>(mSaveStack->back()) : nullptr; const SaveRec* rec = mSaveStack ? static_cast<const SaveRec*>(mSaveStack->back()) : nullptr;
int currentSaveCount = mCanvas->getSaveCount(); int currentSaveCount = mCanvas->getSaveCount();