blob: b2d87045859bc54261d2dcfd5d248e45c3fddaea [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
Florin Malitab3418102020-10-15 18:10:29 -04008#include "modules/svg/include/SkSVGText.h"
Xavier Phane29cdaf2020-03-26 16:15:14 +00009
Xavier Phane29cdaf2020-03-26 16:15:14 +000010#include "include/core/SkCanvas.h"
Tyler Freemane9663db2020-04-14 14:37:13 -070011#include "include/core/SkFontStyle.h"
12#include "include/core/SkString.h"
Florin Malitab3418102020-10-15 18:10:29 -040013#include "modules/svg/include/SkSVGRenderContext.h"
14#include "modules/svg/include/SkSVGValue.h"
Xavier Phane29cdaf2020-03-26 16:15:14 +000015
16SkSVGText::SkSVGText() : INHERITED(SkSVGTag::kText) {}
17
18void SkSVGText::setX(const SkSVGLength& x) { fX = x; }
19
20void SkSVGText::setY(const SkSVGLength& y) { fY = y; }
21
22void SkSVGText::setFontFamily(const SkSVGStringType& font_family) {
Tyler Freemane9663db2020-04-14 14:37:13 -070023 if (fFontFamily != font_family) {
24 fFontFamily = font_family;
25
26 this->loadFont();
27 }
28}
29
30void SkSVGText::loadFont() {
31 SkFontStyle style;
32 if (fFontWeight.equals("bold")) {
33 if (fFontStyle.equals("italic")) {
34 style = SkFontStyle::BoldItalic();
35 } else {
36 style = SkFontStyle::Bold();
37 }
38 } else if (fFontStyle.equals("italic")) {
39 style = SkFontStyle::Italic();
40 }
41
42 fTypeface = SkTypeface::MakeFromName(fFontFamily.c_str(), style);
Xavier Phane29cdaf2020-03-26 16:15:14 +000043}
44
45void SkSVGText::setFontSize(const SkSVGLength& size) { fFontSize = size; }
46
Tyler Freemane9663db2020-04-14 14:37:13 -070047void SkSVGText::setFontStyle(const SkSVGStringType& font_style) {
48 if (fFontStyle != font_style) {
49 fFontStyle = font_style;
50
51 this->loadFont();
52 }
53}
54
55void SkSVGText::setFontWeight(const SkSVGStringType& font_weight) {
56 if (fFontWeight != font_weight) {
57 fFontWeight = font_weight;
58
59 this->loadFont();
60 }
61}
62
Xavier Phane29cdaf2020-03-26 16:15:14 +000063void SkSVGText::setText(const SkSVGStringType& text) { fText = text; }
64
65void SkSVGText::setTextAnchor(const SkSVGStringType& text_anchor) {
Florin Malitaa3626692020-04-09 14:36:45 -040066 if (strcmp(text_anchor.c_str(), "start") == 0) {
Xavier Phane29cdaf2020-03-26 16:15:14 +000067 fTextAlign = SkTextUtils::Align::kLeft_Align;
Florin Malitaa3626692020-04-09 14:36:45 -040068 } else if (strcmp(text_anchor.c_str(), "middle") == 0) {
Xavier Phane29cdaf2020-03-26 16:15:14 +000069 fTextAlign = SkTextUtils::Align::kCenter_Align;
Florin Malitaa3626692020-04-09 14:36:45 -040070 } else if (strcmp(text_anchor.c_str(), "end") == 0) {
Xavier Phane29cdaf2020-03-26 16:15:14 +000071 fTextAlign = SkTextUtils::Align::kRight_Align;
72 }
73}
74
75void SkSVGText::onDraw(SkCanvas* canvas, const SkSVGLengthContext& lctx,
76 const SkPaint& paint, SkPathFillType) const {
77 SkFont font(fTypeface, fFontSize.value());
Florin Malitaa3626692020-04-09 14:36:45 -040078 SkTextUtils::DrawString(canvas, fText.c_str(), fX.value(), fY.value(),
Xavier Phane29cdaf2020-03-26 16:15:14 +000079 font, paint, fTextAlign);
80}
81
82SkPath SkSVGText::onAsPath(const SkSVGRenderContext& ctx) const {
83 SkPath path;
84 return path;
85}
86
Florin Malitaf4403e72020-04-10 14:14:04 +000087void SkSVGText::onSetAttribute(SkSVGAttribute attr, const SkSVGValue& v) {
Xavier Phane29cdaf2020-03-26 16:15:14 +000088 switch (attr) {
89 case SkSVGAttribute::kX:
Florin Malitaf4403e72020-04-10 14:14:04 +000090 if (const auto* x = v.as<SkSVGLengthValue>()) {
Xavier Phane29cdaf2020-03-26 16:15:14 +000091 this->setX(*x);
92 }
93 break;
94 case SkSVGAttribute::kY:
Florin Malitaf4403e72020-04-10 14:14:04 +000095 if (const auto* y = v.as<SkSVGLengthValue>()) {
Xavier Phane29cdaf2020-03-26 16:15:14 +000096 this->setY(*y);
97 }
98 break;
99 case SkSVGAttribute::kText:
Florin Malitaf4403e72020-04-10 14:14:04 +0000100 if (const auto* text = v.as<SkSVGStringValue>()) {
Xavier Phane29cdaf2020-03-26 16:15:14 +0000101 this->setText(*text);
102 }
103 break;
104 case SkSVGAttribute::kTextAnchor:
Florin Malitaf4403e72020-04-10 14:14:04 +0000105 if (const auto* text_anchor = v.as<SkSVGStringValue>()) {
Xavier Phane29cdaf2020-03-26 16:15:14 +0000106 this->setTextAnchor(*text_anchor);
107 }
108 break;
109 case SkSVGAttribute::kFontFamily:
Florin Malitaf4403e72020-04-10 14:14:04 +0000110 if (const auto* font_family = v.as<SkSVGStringValue>()) {
Xavier Phane29cdaf2020-03-26 16:15:14 +0000111 this->setFontFamily(*font_family);
112 }
113 break;
Tyler Freemane9663db2020-04-14 14:37:13 -0700114 case SkSVGAttribute::kFontWeight:
115 if (const auto* font_weight = v.as<SkSVGStringValue>()) {
116 this->setFontWeight(*font_weight);
117 }
118 break;
Xavier Phane29cdaf2020-03-26 16:15:14 +0000119 case SkSVGAttribute::kFontSize:
Florin Malitaf4403e72020-04-10 14:14:04 +0000120 if (const auto* font_size = v.as<SkSVGLengthValue>()) {
Xavier Phane29cdaf2020-03-26 16:15:14 +0000121 this->setFontSize(*font_size);
122 }
123 break;
Tyler Freemane9663db2020-04-14 14:37:13 -0700124 case SkSVGAttribute::kFontStyle:
125 if (const auto* font_style = v.as<SkSVGStringValue>()) {
126 this->setFontStyle(*font_style);
127 }
128 break;
Xavier Phane29cdaf2020-03-26 16:15:14 +0000129 default:
130 this->INHERITED::onSetAttribute(attr, v);
131 }
132}