1 // Copyright (c) 2012 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/trusted/browser_font_trusted.h" 6 7 #include <algorithm> 8 9 #include "ppapi/c/dev/ppb_font_dev.h" 10 #include "ppapi/cpp/image_data.h" 11 #include "ppapi/cpp/instance_handle.h" 12 #include "ppapi/cpp/point.h" 13 #include "ppapi/cpp/rect.h" 14 #include "ppapi/cpp/module_impl.h" 15 16 namespace pp { 17 18 namespace { 19 20 template <> const char* interface_name<PPB_BrowserFont_Trusted_1_0>() { 21 return PPB_BROWSERFONT_TRUSTED_INTERFACE_1_0; 22 } 23 template <> const char* interface_name<PPB_Font_Dev_0_6>() { 24 return PPB_FONT_DEV_INTERFACE_0_6; 25 } 26 27 // This class provides backwards compat for PPB_Font, which is binary 28 // compatible with the BrowserFont interface. 29 // TODO(brettw) remove PPB_Font altogether when Flash is updated. 30 const PP_FontDescription_Dev* BrowserFontDescToFontDesc( 31 const PP_BrowserFont_Trusted_Description* desc) { 32 return reinterpret_cast<const PP_FontDescription_Dev*>(desc); 33 } 34 PP_FontDescription_Dev* BrowserFontDescToFontDesc( 35 PP_BrowserFont_Trusted_Description* desc) { 36 return reinterpret_cast<PP_FontDescription_Dev*>(desc); 37 } 38 PP_FontMetrics_Dev* BrowserFontMetricsToFontMetrics( 39 PP_BrowserFont_Trusted_Metrics* metrics) { 40 return reinterpret_cast<PP_FontMetrics_Dev*>(metrics); 41 } 42 const PP_TextRun_Dev* BrowserFontTextRunToFontTextRun( 43 const PP_BrowserFont_Trusted_TextRun* run) { 44 return reinterpret_cast<const PP_TextRun_Dev*>(run); 45 } 46 47 } // namespace 48 49 // BrowserFontDescription ------------------------------------------------------ 50 51 BrowserFontDescription::BrowserFontDescription() { 52 pp_font_description_.face = face_.pp_var(); 53 set_family(PP_BROWSERFONT_TRUSTED_FAMILY_DEFAULT); 54 set_size(0); 55 set_weight(PP_BROWSERFONT_TRUSTED_WEIGHT_NORMAL); 56 set_italic(false); 57 set_small_caps(false); 58 set_letter_spacing(0); 59 set_word_spacing(0); 60 } 61 62 BrowserFontDescription::BrowserFontDescription( 63 const BrowserFontDescription& other) { 64 set_face(other.face()); 65 set_family(other.family()); 66 set_size(other.size()); 67 set_weight(other.weight()); 68 set_italic(other.italic()); 69 set_small_caps(other.small_caps()); 70 set_letter_spacing(other.letter_spacing()); 71 set_word_spacing(other.word_spacing()); 72 } 73 74 BrowserFontDescription::~BrowserFontDescription() { 75 } 76 77 BrowserFontDescription& BrowserFontDescription::operator=( 78 const BrowserFontDescription& other) { 79 pp_font_description_ = other.pp_font_description_; 80 81 // Be careful about the refcount of the string, the copy that operator= made 82 // above didn't copy a ref. 83 pp_font_description_.face = PP_MakeUndefined(); 84 set_face(other.face()); 85 86 return *this; 87 } 88 89 // BrowserFontTextRun ---------------------------------------------------------- 90 91 BrowserFontTextRun::BrowserFontTextRun() { 92 pp_text_run_.text = text_.pp_var(); 93 pp_text_run_.rtl = PP_FALSE; 94 pp_text_run_.override_direction = PP_FALSE; 95 } 96 97 BrowserFontTextRun::BrowserFontTextRun(const std::string& text, 98 bool rtl, 99 bool override_direction) 100 : text_(text) { 101 pp_text_run_.text = text_.pp_var(); 102 pp_text_run_.rtl = PP_FromBool(rtl); 103 pp_text_run_.override_direction = PP_FromBool(override_direction); 104 } 105 106 BrowserFontTextRun::BrowserFontTextRun(const BrowserFontTextRun& other) 107 : text_(other.text_) { 108 pp_text_run_.text = text_.pp_var(); 109 pp_text_run_.rtl = other.pp_text_run_.rtl; 110 pp_text_run_.override_direction = other.pp_text_run_.override_direction; 111 } 112 113 BrowserFontTextRun::~BrowserFontTextRun() { 114 } 115 116 BrowserFontTextRun& BrowserFontTextRun::operator=( 117 const BrowserFontTextRun& other) { 118 pp_text_run_ = other.pp_text_run_; 119 text_ = other.text_; 120 pp_text_run_.text = text_.pp_var(); 121 return *this; 122 } 123 124 // BrowserFont_Trusted --------------------------------------------------------- 125 126 BrowserFont_Trusted::BrowserFont_Trusted() : Resource() { 127 } 128 129 BrowserFont_Trusted::BrowserFont_Trusted(PP_Resource resource) 130 : Resource(resource) { 131 } 132 133 BrowserFont_Trusted::BrowserFont_Trusted( 134 const InstanceHandle& instance, 135 const BrowserFontDescription& description) { 136 if (has_interface<PPB_BrowserFont_Trusted_1_0>()) { 137 PassRefFromConstructor(get_interface<PPB_BrowserFont_Trusted_1_0>()->Create( 138 instance.pp_instance(), 139 &description.pp_font_description())); 140 } else if (!has_interface<PPB_Font_Dev_0_6>()) { 141 PassRefFromConstructor(get_interface<PPB_Font_Dev_0_6>()->Create( 142 instance.pp_instance(), 143 BrowserFontDescToFontDesc(&description.pp_font_description()))); 144 } 145 } 146 147 BrowserFont_Trusted::BrowserFont_Trusted(const BrowserFont_Trusted& other) 148 : Resource(other) { 149 } 150 151 BrowserFont_Trusted& BrowserFont_Trusted::operator=( 152 const BrowserFont_Trusted& other) { 153 Resource::operator=(other); 154 return *this; 155 } 156 157 // static 158 Var BrowserFont_Trusted::GetFontFamilies(const InstanceHandle& instance) { 159 if (!has_interface<PPB_Font_Dev_0_6>()) 160 return Var(); 161 return Var(PASS_REF, 162 get_interface<PPB_Font_Dev_0_6>()->GetFontFamilies( 163 instance.pp_instance())); 164 } 165 166 bool BrowserFont_Trusted::Describe( 167 BrowserFontDescription* description, 168 PP_BrowserFont_Trusted_Metrics* metrics) const { 169 // Be careful with ownership of the |face| string. It will come back with 170 // a ref of 1, which we want to assign to the |face_| member of the C++ class. 171 if (has_interface<PPB_BrowserFont_Trusted_1_0>()) { 172 if (!get_interface<PPB_BrowserFont_Trusted_1_0>()->Describe( 173 pp_resource(), &description->pp_font_description_, metrics)) 174 return false; 175 } else if (!has_interface<PPB_Font_Dev_0_6>()) { 176 if (!get_interface<PPB_Font_Dev_0_6>()->Describe( 177 pp_resource(), 178 BrowserFontDescToFontDesc(&description->pp_font_description_), 179 BrowserFontMetricsToFontMetrics(metrics))) 180 return false; 181 } 182 description->face_ = Var(PASS_REF, 183 description->pp_font_description_.face); 184 return true; 185 } 186 187 bool BrowserFont_Trusted::DrawTextAt(ImageData* dest, 188 const BrowserFontTextRun& text, 189 const Point& position, 190 uint32_t color, 191 const Rect& clip, 192 bool image_data_is_opaque) const { 193 if (has_interface<PPB_BrowserFont_Trusted_1_0>()) { 194 return PP_ToBool(get_interface<PPB_BrowserFont_Trusted_1_0>()->DrawTextAt( 195 pp_resource(), 196 dest->pp_resource(), 197 &text.pp_text_run(), 198 &position.pp_point(), 199 color, 200 &clip.pp_rect(), 201 PP_FromBool(image_data_is_opaque))); 202 } else if (!has_interface<PPB_Font_Dev_0_6>()) { 203 return PP_ToBool(get_interface<PPB_Font_Dev_0_6>()->DrawTextAt( 204 pp_resource(), 205 dest->pp_resource(), 206 BrowserFontTextRunToFontTextRun(&text.pp_text_run()), 207 &position.pp_point(), 208 color, 209 &clip.pp_rect(), 210 PP_FromBool(image_data_is_opaque))); 211 } 212 return false; 213 } 214 215 int32_t BrowserFont_Trusted::MeasureText(const BrowserFontTextRun& text) const { 216 if (has_interface<PPB_BrowserFont_Trusted_1_0>()) { 217 return get_interface<PPB_BrowserFont_Trusted_1_0>()->MeasureText( 218 pp_resource(), 219 &text.pp_text_run()); 220 } else if (!has_interface<PPB_Font_Dev_0_6>()) { 221 return get_interface<PPB_Font_Dev_0_6>()->MeasureText( 222 pp_resource(), 223 BrowserFontTextRunToFontTextRun(&text.pp_text_run())); 224 } 225 return -1; 226 } 227 228 uint32_t BrowserFont_Trusted::CharacterOffsetForPixel( 229 const BrowserFontTextRun& text, 230 int32_t pixel_position) const { 231 if (has_interface<PPB_BrowserFont_Trusted_1_0>()) { 232 return get_interface<PPB_BrowserFont_Trusted_1_0>()-> 233 CharacterOffsetForPixel( 234 pp_resource(), 235 &text.pp_text_run(), 236 pixel_position); 237 } else if (!has_interface<PPB_Font_Dev_0_6>()) { 238 return get_interface<PPB_Font_Dev_0_6>()->CharacterOffsetForPixel( 239 pp_resource(), 240 BrowserFontTextRunToFontTextRun(&text.pp_text_run()), 241 pixel_position); 242 } 243 return 0; 244 } 245 246 int32_t BrowserFont_Trusted::PixelOffsetForCharacter( 247 const BrowserFontTextRun& text, 248 uint32_t char_offset) const { 249 if (has_interface<PPB_BrowserFont_Trusted_1_0>()) { 250 return get_interface<PPB_BrowserFont_Trusted_1_0>()-> 251 PixelOffsetForCharacter( 252 pp_resource(), 253 &text.pp_text_run(), 254 char_offset); 255 } else if (!has_interface<PPB_Font_Dev_0_6>()) { 256 return get_interface<PPB_Font_Dev_0_6>()->PixelOffsetForCharacter( 257 pp_resource(), 258 BrowserFontTextRunToFontTextRun(&text.pp_text_run()), 259 char_offset); 260 } 261 return 0; 262 } 263 264 bool BrowserFont_Trusted::DrawSimpleText( 265 ImageData* dest, 266 const std::string& text, 267 const Point& position, 268 uint32_t color, 269 bool image_data_is_opaque) const { 270 return DrawTextAt(dest, BrowserFontTextRun(text), position, color, 271 Rect(dest->size()), image_data_is_opaque); 272 } 273 274 int32_t BrowserFont_Trusted::MeasureSimpleText(const std::string& text) const { 275 return MeasureText(BrowserFontTextRun(text)); 276 } 277 278 } // namespace pp 279