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