- add sources.
[platform/framework/web/crosswalk.git] / src / ppapi / cpp / dev / font_dev.cc
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