OLD | NEW |
| (Empty) |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include "ppapi/cpp/dev/font_dev.h" | |
6 | |
7 #include <algorithm> | |
8 | |
9 #include "ppapi/cpp/image_data.h" | |
10 #include "ppapi/cpp/instance_handle.h" | |
11 #include "ppapi/cpp/point.h" | |
12 #include "ppapi/cpp/rect.h" | |
13 #include "ppapi/cpp/module_impl.h" | |
14 | |
15 namespace pp { | |
16 | |
17 namespace { | |
18 | |
19 template <> const char* interface_name<PPB_Font_Dev>() { | |
20 return PPB_FONT_DEV_INTERFACE; | |
21 } | |
22 | |
23 } // namespace | |
24 | |
25 // FontDescription_Dev --------------------------------------------------------- | |
26 | |
27 FontDescription_Dev::FontDescription_Dev() { | |
28 pp_font_description_.face = face_.pp_var(); | |
29 set_family(PP_FONTFAMILY_DEFAULT); | |
30 set_size(0); | |
31 set_weight(PP_FONTWEIGHT_NORMAL); | |
32 set_italic(false); | |
33 set_small_caps(false); | |
34 set_letter_spacing(0); | |
35 set_word_spacing(0); | |
36 } | |
37 | |
38 FontDescription_Dev::FontDescription_Dev(const FontDescription_Dev& other) { | |
39 set_face(other.face()); | |
40 set_family(other.family()); | |
41 set_size(other.size()); | |
42 set_weight(other.weight()); | |
43 set_italic(other.italic()); | |
44 set_small_caps(other.small_caps()); | |
45 set_letter_spacing(other.letter_spacing()); | |
46 set_word_spacing(other.word_spacing()); | |
47 } | |
48 | |
49 FontDescription_Dev::~FontDescription_Dev() { | |
50 } | |
51 | |
52 FontDescription_Dev& FontDescription_Dev::operator=( | |
53 const FontDescription_Dev& other) { | |
54 pp_font_description_ = other.pp_font_description_; | |
55 | |
56 // Be careful about the refcount of the string, the copy that operator= made | |
57 // above didn't copy a ref. | |
58 pp_font_description_.face = PP_MakeUndefined(); | |
59 set_face(other.face()); | |
60 | |
61 return *this; | |
62 } | |
63 | |
64 // TextRun_Dev ----------------------------------------------------------------- | |
65 | |
66 TextRun_Dev::TextRun_Dev() { | |
67 pp_text_run_.text = text_.pp_var(); | |
68 pp_text_run_.rtl = PP_FALSE; | |
69 pp_text_run_.override_direction = PP_FALSE; | |
70 } | |
71 | |
72 TextRun_Dev::TextRun_Dev(const std::string& text, | |
73 bool rtl, | |
74 bool override_direction) | |
75 : text_(text) { | |
76 pp_text_run_.text = text_.pp_var(); | |
77 pp_text_run_.rtl = PP_FromBool(rtl); | |
78 pp_text_run_.override_direction = PP_FromBool(override_direction); | |
79 } | |
80 | |
81 TextRun_Dev::TextRun_Dev(const TextRun_Dev& other) : text_(other.text_) { | |
82 pp_text_run_.text = text_.pp_var(); | |
83 pp_text_run_.rtl = other.pp_text_run_.rtl; | |
84 pp_text_run_.override_direction = other.pp_text_run_.override_direction; | |
85 } | |
86 | |
87 TextRun_Dev::~TextRun_Dev() { | |
88 } | |
89 | |
90 TextRun_Dev& TextRun_Dev::operator=(const TextRun_Dev& other) { | |
91 pp_text_run_ = other.pp_text_run_; | |
92 text_ = other.text_; | |
93 pp_text_run_.text = text_.pp_var(); | |
94 return *this; | |
95 } | |
96 | |
97 // Font ------------------------------------------------------------------------ | |
98 | |
99 Font_Dev::Font_Dev() : Resource() { | |
100 } | |
101 | |
102 Font_Dev::Font_Dev(PP_Resource resource) : Resource(resource) { | |
103 } | |
104 | |
105 Font_Dev::Font_Dev(const InstanceHandle& instance, | |
106 const FontDescription_Dev& description) { | |
107 if (!has_interface<PPB_Font_Dev>()) | |
108 return; | |
109 PassRefFromConstructor(get_interface<PPB_Font_Dev>()->Create( | |
110 instance.pp_instance(), &description.pp_font_description())); | |
111 } | |
112 | |
113 Font_Dev::Font_Dev(const Font_Dev& other) : Resource(other) { | |
114 } | |
115 | |
116 Font_Dev& Font_Dev::operator=(const Font_Dev& other) { | |
117 Resource::operator=(other); | |
118 return *this; | |
119 } | |
120 | |
121 // static | |
122 Var Font_Dev::GetFontFamilies(const InstanceHandle& instance) { | |
123 if (!has_interface<PPB_Font_Dev>()) | |
124 return Var(); | |
125 return Var(PASS_REF, get_interface<PPB_Font_Dev>()->GetFontFamilies( | |
126 instance.pp_instance())); | |
127 } | |
128 | |
129 bool Font_Dev::Describe(FontDescription_Dev* description, | |
130 PP_FontMetrics_Dev* metrics) const { | |
131 if (!has_interface<PPB_Font_Dev>()) | |
132 return false; | |
133 | |
134 // Be careful with ownership of the |face| string. It will come back with | |
135 // a ref of 1, which we want to assign to the |face_| member of the C++ class. | |
136 if (!get_interface<PPB_Font_Dev>()->Describe( | |
137 pp_resource(), &description->pp_font_description_, metrics)) | |
138 return false; | |
139 description->face_ = Var(PASS_REF, | |
140 description->pp_font_description_.face); | |
141 | |
142 return true; | |
143 } | |
144 | |
145 bool Font_Dev::DrawTextAt(ImageData* dest, | |
146 const TextRun_Dev& text, | |
147 const Point& position, | |
148 uint32_t color, | |
149 const Rect& clip, | |
150 bool image_data_is_opaque) const { | |
151 if (!has_interface<PPB_Font_Dev>()) | |
152 return false; | |
153 return PP_ToBool(get_interface<PPB_Font_Dev>()->DrawTextAt( | |
154 pp_resource(), | |
155 dest->pp_resource(), | |
156 &text.pp_text_run(), | |
157 &position.pp_point(), | |
158 color, | |
159 &clip.pp_rect(), | |
160 PP_FromBool(image_data_is_opaque))); | |
161 } | |
162 | |
163 int32_t Font_Dev::MeasureText(const TextRun_Dev& text) const { | |
164 if (!has_interface<PPB_Font_Dev>()) | |
165 return -1; | |
166 return get_interface<PPB_Font_Dev>()->MeasureText(pp_resource(), | |
167 &text.pp_text_run()); | |
168 } | |
169 | |
170 uint32_t Font_Dev::CharacterOffsetForPixel(const TextRun_Dev& text, | |
171 int32_t pixel_position) const { | |
172 if (!has_interface<PPB_Font_Dev>()) | |
173 return 0; | |
174 return get_interface<PPB_Font_Dev>()->CharacterOffsetForPixel( | |
175 pp_resource(), &text.pp_text_run(), pixel_position); | |
176 | |
177 } | |
178 | |
179 int32_t Font_Dev::PixelOffsetForCharacter(const TextRun_Dev& text, | |
180 uint32_t char_offset) const { | |
181 if (!has_interface<PPB_Font_Dev>()) | |
182 return 0; | |
183 return get_interface<PPB_Font_Dev>()->PixelOffsetForCharacter( | |
184 pp_resource(), &text.pp_text_run(), char_offset); | |
185 } | |
186 | |
187 bool Font_Dev::DrawSimpleText(ImageData* dest, | |
188 const std::string& text, | |
189 const Point& position, | |
190 uint32_t color, | |
191 bool image_data_is_opaque) const { | |
192 return DrawTextAt(dest, TextRun_Dev(text), position, color, | |
193 Rect(dest->size()), image_data_is_opaque); | |
194 } | |
195 | |
196 int32_t Font_Dev::MeasureSimpleText(const std::string& text) const { | |
197 return MeasureText(TextRun_Dev(text)); | |
198 } | |
199 | |
200 } // namespace pp | |
OLD | NEW |