// Copyright 2021 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "flutter/flow/layers/mask_layer.h"

#include "include/core/SkMaskFilter.h"
#include "include/effects/SkLumaColorFilter.h"

namespace flutter {

void MaskLayer::Paint(PaintContext& context) const {
  TRACE_EVENT0("flutter", "MaskLayer::Paint");
  FML_DCHECK(needs_painting());

  if (isSvgMask_ && !svgDom_) {
    return;
  }

  auto& skCanvas = context.internal_nodes_canvas;
  SkAutoCanvasRestore save(skCanvas, true);
  SkRect maskBounds = paint_bounds();

  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(skCanvas, true);
    skCanvas->translate(maskBounds.fLeft + svgX_, maskBounds.fTop + svgY_);
    skCanvas->scale(scaleX_, scaleY_);
    svgDom_->render(skCanvas);
  } else if (isGradientMask_) {
    SkAutoCanvasRestore maskSave(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(skCanvas, true);
    skCanvas->translate(maskBounds.fLeft, maskBounds.fTop);
    skCanvas->drawPath(maskPath_, maskPaint_);
  }

  // back to mask layer
  skCanvas->restoreToCount(tmpLayer);
  // create content layer
  SkPaint maskPaint;
  maskPaint.setBlendMode(SkBlendMode::kSrcIn);
  skCanvas->saveLayer(maskBounds, &maskPaint);
  skCanvas->clipRect(maskBounds, true);
  PaintChildren(context);
}

}  // namespace flutter