| Index: ppapi/cpp/trusted/browser_font_trusted.cc
|
| diff --git a/ppapi/cpp/trusted/browser_font_trusted.cc b/ppapi/cpp/trusted/browser_font_trusted.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..8bea86a8f4d45a3e54fa242be780b6d679127b89
|
| --- /dev/null
|
| +++ b/ppapi/cpp/trusted/browser_font_trusted.cc
|
| @@ -0,0 +1,276 @@
|
| +// Copyright (c) 2010 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/c/dev/ppb_font_dev.h"
|
| +#include "ppapi/cpp/image_data.h"
|
| +#include "ppapi/cpp/instance.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>() {
|
| + return PPB_BROWSERFONT_TRUSTED_INTERFACE;
|
| +}
|
| +template <> const char* interface_name<PPB_Font_Dev>() {
|
| + return PPB_FONT_DEV_INTERFACE;
|
| +}
|
| +
|
| +// This class provides backwards compat for PPB_Font, which is binary
|
| +// compatible with the BrowserFont interface.
|
| +// TODO(brettw) remove PPB_Font altogether when Flash is updated.
|
| +const PP_FontDescription_Dev* BrowserFontDescToFontDesc(
|
| + const PP_BrowserFont_Trusted_Description* desc) {
|
| + return reinterpret_cast<const PP_FontDescription_Dev*>(desc);
|
| +}
|
| +PP_FontDescription_Dev* BrowserFontDescToFontDesc(
|
| + PP_BrowserFont_Trusted_Description* desc) {
|
| + return reinterpret_cast<PP_FontDescription_Dev*>(desc);
|
| +}
|
| +PP_FontMetrics_Dev* BrowserFontMetricsToFontMetrics(
|
| + PP_BrowserFont_Trusted_Metrics* metrics) {
|
| + return reinterpret_cast<PP_FontMetrics_Dev*>(metrics);
|
| +}
|
| +const PP_TextRun_Dev* BrowserFontTextRunToFontTextRun(
|
| + const PP_BrowserFont_Trusted_TextRun* run) {
|
| + return reinterpret_cast<const PP_TextRun_Dev*>(run);
|
| +}
|
| +
|
| +} // 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(
|
| + Instance* instance,
|
| + const BrowserFontDescription& description) {
|
| + if (has_interface<PPB_BrowserFont_Trusted>()) {
|
| + PassRefFromConstructor(get_interface<PPB_BrowserFont_Trusted>()->Create(
|
| + instance->pp_instance(),
|
| + &description.pp_font_description()));
|
| + } else if (!has_interface<PPB_Font_Dev>()) {
|
| + PassRefFromConstructor(get_interface<PPB_Font_Dev>()->Create(
|
| + instance->pp_instance(),
|
| + BrowserFontDescToFontDesc(&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(Instance* instance) {
|
| + if (!has_interface<PPB_Font_Dev>())
|
| + return Var();
|
| + return Var(Var::PassRef(),
|
| + get_interface<PPB_Font_Dev>()->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>()) {
|
| + if (!get_interface<PPB_BrowserFont_Trusted>()->Describe(
|
| + pp_resource(), &description->pp_font_description_, metrics))
|
| + return false;
|
| + } else if (!has_interface<PPB_Font_Dev>()) {
|
| + if (!get_interface<PPB_Font_Dev>()->Describe(
|
| + pp_resource(),
|
| + BrowserFontDescToFontDesc(&description->pp_font_description_),
|
| + BrowserFontMetricsToFontMetrics(metrics)))
|
| + return false;
|
| + }
|
| + description->face_ = Var(Var::PassRef(),
|
| + 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>()) {
|
| + return PP_ToBool(get_interface<PPB_BrowserFont_Trusted>()->DrawTextAt(
|
| + pp_resource(),
|
| + dest->pp_resource(),
|
| + &text.pp_text_run(),
|
| + &position.pp_point(),
|
| + color,
|
| + &clip.pp_rect(),
|
| + PP_FromBool(image_data_is_opaque)));
|
| + } else if (!has_interface<PPB_Font_Dev>()) {
|
| + return PP_ToBool(get_interface<PPB_Font_Dev>()->DrawTextAt(
|
| + pp_resource(),
|
| + dest->pp_resource(),
|
| + BrowserFontTextRunToFontTextRun(&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>()) {
|
| + return get_interface<PPB_BrowserFont_Trusted>()->MeasureText(
|
| + pp_resource(),
|
| + &text.pp_text_run());
|
| + } else if (!has_interface<PPB_Font_Dev>()) {
|
| + return get_interface<PPB_Font_Dev>()->MeasureText(
|
| + pp_resource(),
|
| + BrowserFontTextRunToFontTextRun(&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>()) {
|
| + return get_interface<PPB_BrowserFont_Trusted>()->CharacterOffsetForPixel(
|
| + pp_resource(),
|
| + &text.pp_text_run(),
|
| + pixel_position);
|
| + } else if (!has_interface<PPB_Font_Dev>()) {
|
| + return get_interface<PPB_Font_Dev>()->CharacterOffsetForPixel(
|
| + pp_resource(),
|
| + BrowserFontTextRunToFontTextRun(&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>()) {
|
| + return get_interface<PPB_BrowserFont_Trusted>()->PixelOffsetForCharacter(
|
| + pp_resource(),
|
| + &text.pp_text_run(),
|
| + char_offset);
|
| + } else if (!has_interface<PPB_Font_Dev>()) {
|
| + return get_interface<PPB_Font_Dev>()->PixelOffsetForCharacter(
|
| + pp_resource(),
|
| + BrowserFontTextRunToFontTextRun(&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
|
|
|