blob: 70f693711e2cdf7567e4afa98070af3f9932fd4d [file] [log] [blame]
Xavier Phane29cdaf2020-03-26 16:15:14 +00001/*
2 * Copyright 2019 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#include "experimental/svg/model/SkSVGText.h"
9
10#include "experimental/svg/model/SkSVGRenderContext.h"
Xavier Phane29cdaf2020-03-26 16:15:14 +000011#include "include/core/SkCanvas.h"
12
13SkSVGText::SkSVGText() : INHERITED(SkSVGTag::kText) {}
14
15void SkSVGText::setX(const SkSVGLength& x) { fX = x; }
16
17void SkSVGText::setY(const SkSVGLength& y) { fY = y; }
18
19void SkSVGText::setFontFamily(const SkSVGStringType& font_family) {
20 fTypeface =
Florin Malitaa3626692020-04-09 14:36:45 -040021 SkTypeface::MakeFromName(font_family.c_str(), SkFontStyle());
Xavier Phane29cdaf2020-03-26 16:15:14 +000022}
23
24void SkSVGText::setFontSize(const SkSVGLength& size) { fFontSize = size; }
25
26void SkSVGText::setText(const SkSVGStringType& text) { fText = text; }
27
28void SkSVGText::setTextAnchor(const SkSVGStringType& text_anchor) {
Florin Malitaa3626692020-04-09 14:36:45 -040029 if (strcmp(text_anchor.c_str(), "start") == 0) {
Xavier Phane29cdaf2020-03-26 16:15:14 +000030 fTextAlign = SkTextUtils::Align::kLeft_Align;
Florin Malitaa3626692020-04-09 14:36:45 -040031 } else if (strcmp(text_anchor.c_str(), "middle") == 0) {
Xavier Phane29cdaf2020-03-26 16:15:14 +000032 fTextAlign = SkTextUtils::Align::kCenter_Align;
Florin Malitaa3626692020-04-09 14:36:45 -040033 } else if (strcmp(text_anchor.c_str(), "end") == 0) {
Xavier Phane29cdaf2020-03-26 16:15:14 +000034 fTextAlign = SkTextUtils::Align::kRight_Align;
35 }
36}
37
38void SkSVGText::onDraw(SkCanvas* canvas, const SkSVGLengthContext& lctx,
39 const SkPaint& paint, SkPathFillType) const {
40 SkFont font(fTypeface, fFontSize.value());
Florin Malitaa3626692020-04-09 14:36:45 -040041 SkTextUtils::DrawString(canvas, fText.c_str(), fX.value(), fY.value(),
Xavier Phane29cdaf2020-03-26 16:15:14 +000042 font, paint, fTextAlign);
43}
44
45SkPath SkSVGText::onAsPath(const SkSVGRenderContext& ctx) const {
46 SkPath path;
47 return path;
48}
49
Florin Malita97e08612020-04-10 00:29:13 -040050void SkSVGText::onSetAttribute(SkSVGAttribute attr, const SkSVGAttributeValue& v) {
Xavier Phane29cdaf2020-03-26 16:15:14 +000051 switch (attr) {
52 case SkSVGAttribute::kX:
Florin Malita97e08612020-04-10 00:29:13 -040053 if (const auto* x = std::get_if<SkSVGLength>(&v)) {
Xavier Phane29cdaf2020-03-26 16:15:14 +000054 this->setX(*x);
55 }
56 break;
57 case SkSVGAttribute::kY:
Florin Malita97e08612020-04-10 00:29:13 -040058 if (const auto* y = std::get_if<SkSVGLength>(&v)) {
Xavier Phane29cdaf2020-03-26 16:15:14 +000059 this->setY(*y);
60 }
61 break;
62 case SkSVGAttribute::kText:
Florin Malita97e08612020-04-10 00:29:13 -040063 if (const auto* text = std::get_if<SkSVGStringType>(&v)) {
Xavier Phane29cdaf2020-03-26 16:15:14 +000064 this->setText(*text);
65 }
66 break;
67 case SkSVGAttribute::kTextAnchor:
Florin Malita97e08612020-04-10 00:29:13 -040068 if (const auto* text_anchor = std::get_if<SkSVGStringType>(&v)) {
Xavier Phane29cdaf2020-03-26 16:15:14 +000069 this->setTextAnchor(*text_anchor);
70 }
71 break;
72 case SkSVGAttribute::kFontFamily:
Florin Malita97e08612020-04-10 00:29:13 -040073 if (const auto* font_family = std::get_if<SkSVGStringType>(&v)) {
Xavier Phane29cdaf2020-03-26 16:15:14 +000074 this->setFontFamily(*font_family);
75 }
76 break;
77 case SkSVGAttribute::kFontSize:
Florin Malita97e08612020-04-10 00:29:13 -040078 if (const auto* font_size = std::get_if<SkSVGLength>(&v)) {
Xavier Phane29cdaf2020-03-26 16:15:14 +000079 this->setFontSize(*font_size);
80 }
81 break;
82 default:
83 this->INHERITED::onSetAttribute(attr, v);
84 }
85}