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 201