Merge "Move SkiaCanvas::Clip above SkiaCanvas::SkiaCanvas" am: 770e68977b am: d80d36a428
Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/2200075 Change-Id: I9a6f317496468a811e6173eecd4fc66eae77c2db Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
@@ -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();
|
||||||
|
|||||||
Reference in New Issue
Block a user