| 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 |