Merge "Revert "Simplify calling loopers"" into sc-dev
This commit is contained in:
@@ -194,6 +194,25 @@ SkiaCanvas::PaintCoW&& SkiaRecordingCanvas::filterBitmap(PaintCoW&& paint) {
|
|||||||
return filterPaint(std::move(paint));
|
return filterPaint(std::move(paint));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static BlurDrawLooper* get_looper(const Paint* paint) {
|
||||||
|
return paint ? paint->getLooper() : nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename Proc>
|
||||||
|
void applyLooper(BlurDrawLooper* looper, const SkPaint* paint, Proc proc) {
|
||||||
|
if (looper) {
|
||||||
|
SkPaint p;
|
||||||
|
if (paint) {
|
||||||
|
p = *paint;
|
||||||
|
}
|
||||||
|
looper->apply(p, [&](SkPoint offset, const SkPaint& modifiedPaint) {
|
||||||
|
proc(offset.fX, offset.fY, &modifiedPaint);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
proc(0, 0, paint);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static SkFilterMode Paint_to_filter(const SkPaint* paint) {
|
static SkFilterMode Paint_to_filter(const SkPaint* paint) {
|
||||||
return paint && paint->getFilterQuality() != kNone_SkFilterQuality ? SkFilterMode::kLinear
|
return paint && paint->getFilterQuality() != kNone_SkFilterQuality ? SkFilterMode::kLinear
|
||||||
: SkFilterMode::kNearest;
|
: SkFilterMode::kNearest;
|
||||||
@@ -207,7 +226,8 @@ static SkSamplingOptions Paint_to_sampling(const SkPaint* paint) {
|
|||||||
void SkiaRecordingCanvas::drawBitmap(Bitmap& bitmap, float left, float top, const Paint* paint) {
|
void SkiaRecordingCanvas::drawBitmap(Bitmap& bitmap, float left, float top, const Paint* paint) {
|
||||||
sk_sp<SkImage> image = bitmap.makeImage();
|
sk_sp<SkImage> image = bitmap.makeImage();
|
||||||
|
|
||||||
applyLooper(paint, [&](SkScalar x, SkScalar y, const SkPaint* p) {
|
applyLooper(get_looper(paint), filterBitmap(paint), [&](SkScalar x, SkScalar y,
|
||||||
|
const SkPaint* p) {
|
||||||
mRecorder.drawImage(image, left + x, top + y, Paint_to_sampling(p), p, bitmap.palette());
|
mRecorder.drawImage(image, left + x, top + y, Paint_to_sampling(p), p, bitmap.palette());
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -225,7 +245,8 @@ void SkiaRecordingCanvas::drawBitmap(Bitmap& bitmap, const SkMatrix& matrix, con
|
|||||||
|
|
||||||
sk_sp<SkImage> image = bitmap.makeImage();
|
sk_sp<SkImage> image = bitmap.makeImage();
|
||||||
|
|
||||||
applyLooper(paint, [&](SkScalar x, SkScalar y, const SkPaint* p) {
|
applyLooper(get_looper(paint), filterBitmap(paint), [&](SkScalar x, SkScalar y,
|
||||||
|
const SkPaint* p) {
|
||||||
mRecorder.drawImage(image, x, y, Paint_to_sampling(p), p, bitmap.palette());
|
mRecorder.drawImage(image, x, y, Paint_to_sampling(p), p, bitmap.palette());
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -242,7 +263,8 @@ void SkiaRecordingCanvas::drawBitmap(Bitmap& bitmap, float srcLeft, float srcTop
|
|||||||
|
|
||||||
sk_sp<SkImage> image = bitmap.makeImage();
|
sk_sp<SkImage> image = bitmap.makeImage();
|
||||||
|
|
||||||
applyLooper(paint, [&](SkScalar x, SkScalar y, const SkPaint* p) {
|
applyLooper(get_looper(paint), filterBitmap(paint), [&](SkScalar x, SkScalar y,
|
||||||
|
const SkPaint* p) {
|
||||||
mRecorder.drawImageRect(image, srcRect, dstRect.makeOffset(x, y), Paint_to_sampling(p),
|
mRecorder.drawImageRect(image, srcRect, dstRect.makeOffset(x, y), Paint_to_sampling(p),
|
||||||
p, SkCanvas::kFast_SrcRectConstraint, bitmap.palette());
|
p, SkCanvas::kFast_SrcRectConstraint, bitmap.palette());
|
||||||
});
|
});
|
||||||
@@ -281,7 +303,8 @@ void SkiaRecordingCanvas::drawNinePatch(Bitmap& bitmap, const Res_png_9patch& ch
|
|||||||
// HWUI always draws 9-patches with linear filtering, regardless of the Paint.
|
// HWUI always draws 9-patches with linear filtering, regardless of the Paint.
|
||||||
const SkFilterMode filter = SkFilterMode::kLinear;
|
const SkFilterMode filter = SkFilterMode::kLinear;
|
||||||
|
|
||||||
applyLooper(paint, [&](SkScalar x, SkScalar y, const SkPaint* p) {
|
applyLooper(get_looper(paint), filterBitmap(paint), [&](SkScalar x, SkScalar y,
|
||||||
|
const SkPaint* p) {
|
||||||
mRecorder.drawImageLattice(image, lattice, dst.makeOffset(x, y), filter, p,
|
mRecorder.drawImageLattice(image, lattice, dst.makeOffset(x, y), filter, p,
|
||||||
bitmap.palette());
|
bitmap.palette());
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -87,19 +87,6 @@ private:
|
|||||||
std::unique_ptr<SkiaDisplayList> mDisplayList;
|
std::unique_ptr<SkiaDisplayList> mDisplayList;
|
||||||
StartReorderBarrierDrawable* mCurrentBarrier;
|
StartReorderBarrierDrawable* mCurrentBarrier;
|
||||||
|
|
||||||
template <typename Proc>
|
|
||||||
void applyLooper(const Paint* paint, Proc proc) {
|
|
||||||
const SkPaint* sk_paint = filterBitmap(paint);
|
|
||||||
const BlurDrawLooper* looper = paint ? paint->getLooper() : nullptr;
|
|
||||||
if (looper) {
|
|
||||||
looper->apply(*sk_paint, [&](SkPoint offset, const SkPaint& modifiedPaint) {
|
|
||||||
proc(offset.fX, offset.fY, &modifiedPaint);
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
proc(0, 0, sk_paint);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A new SkiaDisplayList is created or recycled if available.
|
* A new SkiaDisplayList is created or recycled if available.
|
||||||
*
|
*
|
||||||
|
|||||||
Reference in New Issue
Block a user