This source file includes following definitions.
- BrowserFontDescToFontDesc
- BrowserFontDescToFontDesc
- BrowserFontMetricsToFontMetrics
- BrowserFontTextRunToFontTextRun
- GetFontFamilies
- Describe
- DrawTextAt
- MeasureText
- CharacterOffsetForPixel
- PixelOffsetForCharacter
- DrawSimpleText
- MeasureSimpleText
#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_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;
}
template <> const char* interface_name<PPB_Font_Dev_0_6>() {
return PPB_FONT_DEV_INTERFACE_0_6;
}
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);
}
}
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_;
pp_font_description_.face = PP_MakeUndefined();
set_face(other.face());
return *this;
}
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() : 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()));
} else if (!has_interface<PPB_Font_Dev_0_6>()) {
PassRefFromConstructor(get_interface<PPB_Font_Dev_0_6>()->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;
}
Var BrowserFont_Trusted::GetFontFamilies(const InstanceHandle& instance) {
if (!has_interface<PPB_Font_Dev_0_6>())
return Var();
return Var(PASS_REF,
get_interface<PPB_Font_Dev_0_6>()->GetFontFamilies(
instance.pp_instance()));
}
bool BrowserFont_Trusted::Describe(
BrowserFontDescription* description,
PP_BrowserFont_Trusted_Metrics* metrics) const {
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;
} else if (!has_interface<PPB_Font_Dev_0_6>()) {
if (!get_interface<PPB_Font_Dev_0_6>()->Describe(
pp_resource(),
BrowserFontDescToFontDesc(&description->pp_font_description_),
BrowserFontMetricsToFontMetrics(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)));
} else if (!has_interface<PPB_Font_Dev_0_6>()) {
return PP_ToBool(get_interface<PPB_Font_Dev_0_6>()->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_1_0>()) {
return get_interface<PPB_BrowserFont_Trusted_1_0>()->MeasureText(
pp_resource(),
&text.pp_text_run());
} else if (!has_interface<PPB_Font_Dev_0_6>()) {
return get_interface<PPB_Font_Dev_0_6>()->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_1_0>()) {
return get_interface<PPB_BrowserFont_Trusted_1_0>()->
CharacterOffsetForPixel(
pp_resource(),
&text.pp_text_run(),
pixel_position);
} else if (!has_interface<PPB_Font_Dev_0_6>()) {
return get_interface<PPB_Font_Dev_0_6>()->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_1_0>()) {
return get_interface<PPB_BrowserFont_Trusted_1_0>()->
PixelOffsetForCharacter(
pp_resource(),
&text.pp_text_run(),
char_offset);
} else if (!has_interface<PPB_Font_Dev_0_6>()) {
return get_interface<PPB_Font_Dev_0_6>()->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));
}
}