1 /* 2 * Copyright 2021 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #ifndef SkSVGImage_DEFINED 9 #define SkSVGImage_DEFINED 10 11 #include "include/core/SkImage.h" 12 #include "include/core/SkPath.h" 13 #include "include/core/SkRect.h" 14 #include "include/core/SkRefCnt.h" 15 #include "include/private/base/SkAPI.h" 16 #include "include/private/base/SkDebug.h" 17 #include "modules/svg/include/SkSVGNode.h" 18 #include "modules/svg/include/SkSVGTransformableNode.h" 19 #include "modules/svg/include/SkSVGTypes.h" 20 21 class SkSVGRenderContext; 22 23 namespace skresources { 24 class ResourceProvider; 25 } 26 27 class SK_API SkSVGImage final : public SkSVGTransformableNode { 28 public: Make()29 static sk_sp<SkSVGImage> Make() { 30 return sk_sp<SkSVGImage>(new SkSVGImage()); 31 } 32 appendChild(sk_sp<SkSVGNode>)33 void appendChild(sk_sp<SkSVGNode>) override { 34 SkDEBUGF("cannot append child nodes to this element.\n"); 35 } 36 37 bool onPrepareToRender(SkSVGRenderContext*) const override; 38 void onRender(const SkSVGRenderContext&) const override; 39 SkPath onAsPath(const SkSVGRenderContext&) const override; 40 SkRect onObjectBoundingBox(const SkSVGRenderContext&) const override; 41 42 struct ImageInfo { 43 sk_sp<SkImage> fImage; 44 SkRect fDst; 45 }; 46 static ImageInfo LoadImage(const sk_sp<skresources::ResourceProvider>&, 47 const SkSVGIRI&, 48 const SkRect&, 49 SkSVGPreserveAspectRatio); 50 51 SVG_ATTR(X , SkSVGLength , SkSVGLength(0)) 52 SVG_ATTR(Y , SkSVGLength , SkSVGLength(0)) 53 SVG_ATTR(Width , SkSVGLength , SkSVGLength(0)) 54 SVG_ATTR(Height , SkSVGLength , SkSVGLength(0)) 55 SVG_ATTR(Href , SkSVGIRI , SkSVGIRI()) 56 SVG_ATTR(PreserveAspectRatio, SkSVGPreserveAspectRatio, SkSVGPreserveAspectRatio()) 57 58 protected: 59 bool parseAndSetAttribute(const char*, const char*) override; 60 61 private: SkSVGImage()62 SkSVGImage() : INHERITED(SkSVGTag::kImage) {} 63 64 using INHERITED = SkSVGTransformableNode; 65 }; 66 67 #endif // SkSVGImage_DEFINED 68