#include "flutter/flow/ohos_layers/mask_layer.h"
#include "include/core/SkCanvas.h"
#include "include/core/SkMaskFilter.h"
#include "include/effects/SkLumaColorFilter.h"
#include "flutter/flow/ohos_layers/paint_context.h"
namespace flutter::OHOS {
void MaskLayer::Paint(const PaintContext& paintContext) const
{
if (isSvgMask_ && !svgDom_) {
return;
}
SkAutoCanvasRestore save(paintContext.skCanvas, true);
SkRect maskBounds = GetPaintBounds();
auto& skCanvas_ = paintContext.skCanvas;
skCanvas_->saveLayer(maskBounds, nullptr);
int tmpLayer = skCanvas_->getSaveCount();
SkPaint mask_filter;
#ifdef USE_SYSTEM_SKIA
auto filter = SkColorFilter::MakeComposeFilter(SkLumaColorFilter::Make(),
SkColorFilter::MakeSRGBToLinearGamma());
#else
auto filter = SkColorFilters::Compose(SkLumaColorFilter::Make(),
SkColorFilters::SRGBToLinearGamma());
#endif
mask_filter.setColorFilter(filter);
skCanvas_->saveLayer(maskBounds, &mask_filter);
if (isSvgMask_) {
SkAutoCanvasRestore maskSave(paintContext.skCanvas, true);
skCanvas_->translate(maskBounds.fLeft + svgX_, maskBounds.fTop + svgY_);
skCanvas_->scale(scaleX_, scaleY_);
svgDom_->render(skCanvas_);
} else if (isGradientMask_) {
SkAutoCanvasRestore maskSave(paintContext.skCanvas, true);
skCanvas_->translate(maskBounds.fLeft, maskBounds.fTop);
SkRect skRect = SkRect::MakeIWH(maskBounds.fRight - maskBounds.fLeft, maskBounds.fBottom - maskBounds.fTop);
skCanvas_->drawRect(skRect, maskPaint_);
} else if (isPathMask_) {
SkAutoCanvasRestore maskSave(paintContext.skCanvas, true);
skCanvas_->translate(maskBounds.fLeft, maskBounds.fTop);
skCanvas_->drawPath(maskPath_, maskPaint_);
}
skCanvas_->restoreToCount(tmpLayer);
SkPaint maskPaint;
maskPaint.setBlendMode(SkBlendMode::kSrcIn);
skCanvas_->saveLayer(maskBounds, &maskPaint);
skCanvas_->clipRect(maskBounds, true);
PaintChildren(paintContext);
}
}