1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2018 Google Inc. 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#include "modules/sksg/include/SkSGImage.h" 9cb93a386Sopenharmony_ci 10cb93a386Sopenharmony_ci#include "include/core/SkCanvas.h" 11cb93a386Sopenharmony_ci#include "include/core/SkImage.h" 12cb93a386Sopenharmony_ci#include "src/core/SkPaintPriv.h" 13cb93a386Sopenharmony_ci 14cb93a386Sopenharmony_cinamespace sksg { 15cb93a386Sopenharmony_ci 16cb93a386Sopenharmony_ciImage::Image(sk_sp<SkImage> image) : fImage(std::move(image)) {} 17cb93a386Sopenharmony_ci 18cb93a386Sopenharmony_civoid Image::onRender(SkCanvas* canvas, const RenderContext* ctx) const { 19cb93a386Sopenharmony_ci if (!fImage) { 20cb93a386Sopenharmony_ci return; 21cb93a386Sopenharmony_ci } 22cb93a386Sopenharmony_ci 23cb93a386Sopenharmony_ci SkPaint paint; 24cb93a386Sopenharmony_ci paint.setAntiAlias(fAntiAlias); 25cb93a386Sopenharmony_ci 26cb93a386Sopenharmony_ci sksg::RenderNode::ScopedRenderContext local_ctx(canvas, ctx); 27cb93a386Sopenharmony_ci if (ctx) { 28cb93a386Sopenharmony_ci if (ctx->fMaskShader) { 29cb93a386Sopenharmony_ci // Mask shaders cannot be applied via drawImage - we need layer isolation. 30cb93a386Sopenharmony_ci // TODO: remove after clipShader conversion. 31cb93a386Sopenharmony_ci local_ctx.setIsolation(this->bounds(), canvas->getTotalMatrix(), true); 32cb93a386Sopenharmony_ci } 33cb93a386Sopenharmony_ci local_ctx->modulatePaint(canvas->getTotalMatrix(), &paint); 34cb93a386Sopenharmony_ci } 35cb93a386Sopenharmony_ci 36cb93a386Sopenharmony_ci canvas->drawImage(fImage, 0, 0, fSamplingOptions, &paint); 37cb93a386Sopenharmony_ci} 38cb93a386Sopenharmony_ci 39cb93a386Sopenharmony_ciconst RenderNode* Image::onNodeAt(const SkPoint& p) const { 40cb93a386Sopenharmony_ci SkASSERT(this->bounds().contains(p.x(), p.y())); 41cb93a386Sopenharmony_ci return this; 42cb93a386Sopenharmony_ci} 43cb93a386Sopenharmony_ci 44cb93a386Sopenharmony_ciSkRect Image::onRevalidate(InvalidationController*, const SkMatrix& ctm) { 45cb93a386Sopenharmony_ci return fImage ? SkRect::Make(fImage->bounds()) : SkRect::MakeEmpty(); 46cb93a386Sopenharmony_ci} 47cb93a386Sopenharmony_ci 48cb93a386Sopenharmony_ci} // namespace sksg 49