| // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #include "ppapi/cpp/trusted/browser_font_trusted.h" | 
 |  | 
 | #include <algorithm> | 
 |  | 
 | #include "ppapi/cpp/image_data.h" | 
 | #include "ppapi/cpp/instance_handle.h" | 
 | #include "ppapi/cpp/point.h" | 
 | #include "ppapi/cpp/rect.h" | 
 | #include "ppapi/cpp/module_impl.h" | 
 |  | 
 | namespace pp { | 
 |  | 
 | namespace { | 
 |  | 
 | template <> const char* interface_name<PPB_BrowserFont_Trusted_1_0>() { | 
 |   return PPB_BROWSERFONT_TRUSTED_INTERFACE_1_0; | 
 | } | 
 |  | 
 | }  // namespace | 
 |  | 
 | // BrowserFontDescription ------------------------------------------------------ | 
 |  | 
 | BrowserFontDescription::BrowserFontDescription() { | 
 |   pp_font_description_.face = face_.pp_var(); | 
 |   set_family(PP_BROWSERFONT_TRUSTED_FAMILY_DEFAULT); | 
 |   set_size(0); | 
 |   set_weight(PP_BROWSERFONT_TRUSTED_WEIGHT_NORMAL); | 
 |   set_italic(false); | 
 |   set_small_caps(false); | 
 |   set_letter_spacing(0); | 
 |   set_word_spacing(0); | 
 | } | 
 |  | 
 | BrowserFontDescription::BrowserFontDescription( | 
 |     const BrowserFontDescription& other) { | 
 |   set_face(other.face()); | 
 |   set_family(other.family()); | 
 |   set_size(other.size()); | 
 |   set_weight(other.weight()); | 
 |   set_italic(other.italic()); | 
 |   set_small_caps(other.small_caps()); | 
 |   set_letter_spacing(other.letter_spacing()); | 
 |   set_word_spacing(other.word_spacing()); | 
 | } | 
 |  | 
 | BrowserFontDescription::~BrowserFontDescription() { | 
 | } | 
 |  | 
 | BrowserFontDescription& BrowserFontDescription::operator=( | 
 |     const BrowserFontDescription& other) { | 
 |   pp_font_description_ = other.pp_font_description_; | 
 |  | 
 |   // Be careful about the refcount of the string, the copy that operator= made | 
 |   // above didn't copy a ref. | 
 |   pp_font_description_.face = PP_MakeUndefined(); | 
 |   set_face(other.face()); | 
 |  | 
 |   return *this; | 
 | } | 
 |  | 
 | // BrowserFontTextRun ---------------------------------------------------------- | 
 |  | 
 | BrowserFontTextRun::BrowserFontTextRun() { | 
 |   pp_text_run_.text = text_.pp_var(); | 
 |   pp_text_run_.rtl = PP_FALSE; | 
 |   pp_text_run_.override_direction = PP_FALSE; | 
 | } | 
 |  | 
 | BrowserFontTextRun::BrowserFontTextRun(const std::string& text, | 
 |                                        bool rtl, | 
 |                                        bool override_direction) | 
 |     : text_(text) { | 
 |   pp_text_run_.text = text_.pp_var(); | 
 |   pp_text_run_.rtl = PP_FromBool(rtl); | 
 |   pp_text_run_.override_direction = PP_FromBool(override_direction); | 
 | } | 
 |  | 
 | BrowserFontTextRun::BrowserFontTextRun(const BrowserFontTextRun& other) | 
 |     : text_(other.text_) { | 
 |   pp_text_run_.text = text_.pp_var(); | 
 |   pp_text_run_.rtl = other.pp_text_run_.rtl; | 
 |   pp_text_run_.override_direction = other.pp_text_run_.override_direction; | 
 | } | 
 |  | 
 | BrowserFontTextRun::~BrowserFontTextRun() { | 
 | } | 
 |  | 
 | BrowserFontTextRun& BrowserFontTextRun::operator=( | 
 |     const BrowserFontTextRun& other) { | 
 |   pp_text_run_ = other.pp_text_run_; | 
 |   text_ = other.text_; | 
 |   pp_text_run_.text = text_.pp_var(); | 
 |   return *this; | 
 | } | 
 |  | 
 | // BrowserFont_Trusted --------------------------------------------------------- | 
 |  | 
 | BrowserFont_Trusted::BrowserFont_Trusted() : Resource() { | 
 | } | 
 |  | 
 | BrowserFont_Trusted::BrowserFont_Trusted(PP_Resource resource) | 
 |     : Resource(resource) { | 
 | } | 
 |  | 
 | BrowserFont_Trusted::BrowserFont_Trusted( | 
 |     const InstanceHandle& instance, | 
 |     const BrowserFontDescription& description) { | 
 |   if (has_interface<PPB_BrowserFont_Trusted_1_0>()) { | 
 |     PassRefFromConstructor(get_interface<PPB_BrowserFont_Trusted_1_0>()->Create( | 
 |         instance.pp_instance(), | 
 |         &description.pp_font_description())); | 
 |   } | 
 | } | 
 |  | 
 | BrowserFont_Trusted::BrowserFont_Trusted(const BrowserFont_Trusted& other) | 
 |     : Resource(other) { | 
 | } | 
 |  | 
 | BrowserFont_Trusted& BrowserFont_Trusted::operator=( | 
 |     const BrowserFont_Trusted& other) { | 
 |   Resource::operator=(other); | 
 |   return *this; | 
 | } | 
 |  | 
 | // static | 
 | Var BrowserFont_Trusted::GetFontFamilies(const InstanceHandle& instance) { | 
 |   if (!has_interface<PPB_BrowserFont_Trusted_1_0>()) | 
 |     return Var(); | 
 |  | 
 |   return Var(PASS_REF, | 
 |              get_interface<PPB_BrowserFont_Trusted_1_0>()->GetFontFamilies( | 
 |                  instance.pp_instance())); | 
 | } | 
 |  | 
 | bool BrowserFont_Trusted::Describe( | 
 |     BrowserFontDescription* description, | 
 |     PP_BrowserFont_Trusted_Metrics* metrics) const { | 
 |   // Be careful with ownership of the |face| string. It will come back with | 
 |   // a ref of 1, which we want to assign to the |face_| member of the C++ class. | 
 |   if (has_interface<PPB_BrowserFont_Trusted_1_0>()) { | 
 |     if (!get_interface<PPB_BrowserFont_Trusted_1_0>()->Describe( | 
 |         pp_resource(), &description->pp_font_description_, metrics)) | 
 |       return false; | 
 |   } | 
 |   description->face_ = Var(PASS_REF, | 
 |                            description->pp_font_description_.face); | 
 |   return true; | 
 | } | 
 |  | 
 | bool BrowserFont_Trusted::DrawTextAt(ImageData* dest, | 
 |                                      const BrowserFontTextRun& text, | 
 |                                      const Point& position, | 
 |                                      uint32_t color, | 
 |                                      const Rect& clip, | 
 |                                      bool image_data_is_opaque) const { | 
 |   if (has_interface<PPB_BrowserFont_Trusted_1_0>()) { | 
 |     return PP_ToBool(get_interface<PPB_BrowserFont_Trusted_1_0>()->DrawTextAt( | 
 |         pp_resource(), | 
 |         dest->pp_resource(), | 
 |         &text.pp_text_run(), | 
 |         &position.pp_point(), | 
 |         color, | 
 |         &clip.pp_rect(), | 
 |         PP_FromBool(image_data_is_opaque))); | 
 |   } | 
 |   return false; | 
 | } | 
 |  | 
 | int32_t BrowserFont_Trusted::MeasureText(const BrowserFontTextRun& text) const { | 
 |   if (has_interface<PPB_BrowserFont_Trusted_1_0>()) { | 
 |     return get_interface<PPB_BrowserFont_Trusted_1_0>()->MeasureText( | 
 |         pp_resource(), | 
 |         &text.pp_text_run()); | 
 |   } | 
 |   return -1; | 
 | } | 
 |  | 
 | uint32_t BrowserFont_Trusted::CharacterOffsetForPixel( | 
 |     const BrowserFontTextRun& text, | 
 |     int32_t pixel_position) const { | 
 |   if (has_interface<PPB_BrowserFont_Trusted_1_0>()) { | 
 |     return get_interface<PPB_BrowserFont_Trusted_1_0>()-> | 
 |         CharacterOffsetForPixel( | 
 |             pp_resource(), | 
 |             &text.pp_text_run(), | 
 |             pixel_position); | 
 |   } | 
 |   return 0; | 
 | } | 
 |  | 
 | int32_t BrowserFont_Trusted::PixelOffsetForCharacter( | 
 |     const BrowserFontTextRun& text, | 
 |     uint32_t char_offset) const { | 
 |   if (has_interface<PPB_BrowserFont_Trusted_1_0>()) { | 
 |     return get_interface<PPB_BrowserFont_Trusted_1_0>()-> | 
 |         PixelOffsetForCharacter( | 
 |            pp_resource(), | 
 |            &text.pp_text_run(), | 
 |            char_offset); | 
 |   } | 
 |   return 0; | 
 | } | 
 |  | 
 | bool BrowserFont_Trusted::DrawSimpleText( | 
 |     ImageData* dest, | 
 |     const std::string& text, | 
 |     const Point& position, | 
 |     uint32_t color, | 
 |     bool image_data_is_opaque) const { | 
 |   return DrawTextAt(dest, BrowserFontTextRun(text), position, color, | 
 |                     Rect(dest->size()), image_data_is_opaque); | 
 | } | 
 |  | 
 | int32_t BrowserFont_Trusted::MeasureSimpleText(const std::string& text) const { | 
 |   return MeasureText(BrowserFontTextRun(text)); | 
 | } | 
 |  | 
 | }  // namespace pp |