OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "webkit/plugins/ppapi/ppb_flash_impl.h" | 5 #include "webkit/plugins/ppapi/ppb_flash_impl.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 #include <vector> | |
9 | 8 |
10 #include "googleurl/src/gurl.h" | 9 #include "googleurl/src/gurl.h" |
11 #include "ppapi/c/private/ppb_flash.h" | 10 #include "ppapi/c/private/ppb_flash.h" |
12 #include "ppapi/c/trusted/ppb_browser_font_trusted.h" | 11 #include "ppapi/c/trusted/ppb_browser_font_trusted.h" |
yzshen1
2012/12/12 19:09:31
I notice that some includes/using's/forward declar
raymes
2012/12/12 22:01:21
Thanks - yeh I wasn't very careful here since it w
| |
13 #include "ppapi/shared_impl/time_conversion.h" | 12 #include "ppapi/shared_impl/time_conversion.h" |
14 #include "ppapi/shared_impl/var.h" | 13 #include "ppapi/shared_impl/var.h" |
15 #include "ppapi/thunk/enter.h" | 14 #include "ppapi/thunk/enter.h" |
16 #include "ppapi/thunk/ppb_image_data_api.h" | |
17 #include "ppapi/thunk/ppb_url_request_info_api.h" | |
18 #include "skia/ext/platform_canvas.h" | |
19 #include "third_party/skia/include/core/SkCanvas.h" | |
20 #include "third_party/skia/include/core/SkMatrix.h" | |
21 #include "third_party/skia/include/core/SkPaint.h" | |
22 #include "third_party/skia/include/core/SkPoint.h" | |
23 #include "third_party/skia/include/core/SkTemplates.h" | |
24 #include "third_party/skia/include/core/SkTypeface.h" | |
25 #include "third_party/WebKit/Source/WebKit/chromium/public/WebDocument.h" | 15 #include "third_party/WebKit/Source/WebKit/chromium/public/WebDocument.h" |
26 #include "third_party/WebKit/Source/WebKit/chromium/public/WebElement.h" | 16 #include "third_party/WebKit/Source/WebKit/chromium/public/WebElement.h" |
27 #include "third_party/WebKit/Source/WebKit/chromium/public/WebPluginContainer.h" | 17 #include "third_party/WebKit/Source/WebKit/chromium/public/WebPluginContainer.h" |
28 #include "ui/gfx/rect.h" | |
29 #include "webkit/plugins/ppapi/common.h" | 18 #include "webkit/plugins/ppapi/common.h" |
30 #include "webkit/plugins/ppapi/host_globals.h" | 19 #include "webkit/plugins/ppapi/host_globals.h" |
31 #include "webkit/plugins/ppapi/plugin_delegate.h" | 20 #include "webkit/plugins/ppapi/plugin_delegate.h" |
32 #include "webkit/plugins/ppapi/plugin_module.h" | 21 #include "webkit/plugins/ppapi/plugin_module.h" |
33 #include "webkit/plugins/ppapi/ppapi_plugin_instance.h" | 22 #include "webkit/plugins/ppapi/ppapi_plugin_instance.h" |
34 #include "webkit/plugins/ppapi/resource_helper.h" | 23 #include "webkit/plugins/ppapi/resource_helper.h" |
35 #include "webkit/plugins/ppapi/ppb_image_data_impl.h" | |
36 | 24 |
37 using ppapi::PPTimeToTime; | 25 using ppapi::PPTimeToTime; |
38 using ppapi::StringVar; | 26 using ppapi::StringVar; |
39 using ppapi::thunk::EnterResourceNoLock; | 27 using ppapi::thunk::EnterResourceNoLock; |
40 using ppapi::thunk::PPB_ImageData_API; | |
41 using ppapi::thunk::PPB_URLRequestInfo_API; | |
42 | 28 |
43 namespace webkit { | 29 namespace webkit { |
44 namespace ppapi { | 30 namespace ppapi { |
45 | 31 |
46 PPB_Flash_Impl::PPB_Flash_Impl(PluginInstance* instance) | 32 PPB_Flash_Impl::PPB_Flash_Impl(PluginInstance* instance) |
47 : instance_(instance) { | 33 : instance_(instance) { |
48 } | 34 } |
49 | 35 |
50 PPB_Flash_Impl::~PPB_Flash_Impl() { | 36 PPB_Flash_Impl::~PPB_Flash_Impl() { |
51 } | 37 } |
52 | 38 |
53 void PPB_Flash_Impl::SetInstanceAlwaysOnTop(PP_Instance instance, | |
54 PP_Bool on_top) { | |
55 instance_->set_always_on_top(PP_ToBool(on_top)); | |
56 } | |
57 | |
58 PP_Bool PPB_Flash_Impl::DrawGlyphs( | |
59 PP_Instance instance, | |
60 PP_Resource pp_image_data, | |
61 const PP_BrowserFont_Trusted_Description* font_desc, | |
62 uint32_t color, | |
63 const PP_Point* position, | |
64 const PP_Rect* clip, | |
65 const float transformation[3][3], | |
66 PP_Bool allow_subpixel_aa, | |
67 uint32_t glyph_count, | |
68 const uint16_t glyph_indices[], | |
69 const PP_Point glyph_advances[]) { | |
70 EnterResourceNoLock<PPB_ImageData_API> enter(pp_image_data, true); | |
71 if (enter.failed()) | |
72 return PP_FALSE; | |
73 PPB_ImageData_Impl* image_resource = | |
74 static_cast<PPB_ImageData_Impl*>(enter.object()); | |
75 | |
76 ImageDataAutoMapper mapper(image_resource); | |
77 if (!mapper.is_valid()) | |
78 return PP_FALSE; | |
79 | |
80 // Set up the typeface. | |
81 StringVar* face_name = StringVar::FromPPVar(font_desc->face); | |
82 if (!face_name) | |
83 return PP_FALSE; | |
84 int style = SkTypeface::kNormal; | |
85 if (font_desc->weight >= PP_BROWSERFONT_TRUSTED_WEIGHT_BOLD) | |
86 style |= SkTypeface::kBold; | |
87 if (font_desc->italic) | |
88 style |= SkTypeface::kItalic; | |
89 skia::RefPtr<SkTypeface> typeface = skia::AdoptRef( | |
90 SkTypeface::CreateFromName(face_name->value().c_str(), | |
91 static_cast<SkTypeface::Style>(style))); | |
92 if (!typeface) | |
93 return PP_FALSE; | |
94 | |
95 // Set up the canvas. | |
96 SkCanvas* canvas = image_resource->GetPlatformCanvas(); | |
97 SkAutoCanvasRestore acr(canvas, true); | |
98 | |
99 // Clip is applied in pixels before the transform. | |
100 SkRect clip_rect = { SkIntToScalar(clip->point.x), | |
101 SkIntToScalar(clip->point.y), | |
102 SkIntToScalar(clip->point.x + clip->size.width), | |
103 SkIntToScalar(clip->point.y + clip->size.height) }; | |
104 canvas->clipRect(clip_rect); | |
105 | |
106 // Convert & set the matrix. | |
107 SkMatrix matrix; | |
108 matrix.set(SkMatrix::kMScaleX, SkFloatToScalar(transformation[0][0])); | |
109 matrix.set(SkMatrix::kMSkewX, SkFloatToScalar(transformation[0][1])); | |
110 matrix.set(SkMatrix::kMTransX, SkFloatToScalar(transformation[0][2])); | |
111 matrix.set(SkMatrix::kMSkewY, SkFloatToScalar(transformation[1][0])); | |
112 matrix.set(SkMatrix::kMScaleY, SkFloatToScalar(transformation[1][1])); | |
113 matrix.set(SkMatrix::kMTransY, SkFloatToScalar(transformation[1][2])); | |
114 matrix.set(SkMatrix::kMPersp0, SkFloatToScalar(transformation[2][0])); | |
115 matrix.set(SkMatrix::kMPersp1, SkFloatToScalar(transformation[2][1])); | |
116 matrix.set(SkMatrix::kMPersp2, SkFloatToScalar(transformation[2][2])); | |
117 canvas->concat(matrix); | |
118 | |
119 SkPaint paint; | |
120 paint.setColor(color); | |
121 paint.setTextEncoding(SkPaint::kGlyphID_TextEncoding); | |
122 paint.setAntiAlias(true); | |
123 paint.setHinting(SkPaint::kFull_Hinting); | |
124 paint.setTextSize(SkIntToScalar(font_desc->size)); | |
125 paint.setTypeface(typeface.get()); // Takes a ref and manages lifetime. | |
126 if (allow_subpixel_aa) { | |
127 paint.setSubpixelText(true); | |
128 paint.setLCDRenderText(true); | |
129 } | |
130 | |
131 SkScalar x = SkIntToScalar(position->x); | |
132 SkScalar y = SkIntToScalar(position->y); | |
133 | |
134 // Build up the skia advances. | |
135 if (glyph_count == 0) | |
136 return PP_TRUE; | |
137 std::vector<SkPoint> storage; | |
138 storage.resize(glyph_count); | |
139 SkPoint* sk_positions = &storage[0]; | |
140 for (uint32_t i = 0; i < glyph_count; i++) { | |
141 sk_positions[i].set(x, y); | |
142 x += SkFloatToScalar(glyph_advances[i].x); | |
143 y += SkFloatToScalar(glyph_advances[i].y); | |
144 } | |
145 | |
146 canvas->drawPosText(glyph_indices, glyph_count * 2, sk_positions, paint); | |
147 | |
148 return PP_TRUE; | |
149 } | |
150 | |
151 int32_t PPB_Flash_Impl::Navigate(PP_Instance instance, | |
152 PP_Resource request_info, | |
153 const char* target, | |
154 PP_Bool from_user_action) { | |
155 EnterResourceNoLock<PPB_URLRequestInfo_API> enter(request_info, true); | |
156 if (enter.failed()) | |
157 return PP_ERROR_BADRESOURCE; | |
158 return Navigate(instance, enter.object()->GetData(), target, | |
159 from_user_action); | |
160 } | |
161 | |
162 int32_t PPB_Flash_Impl::Navigate(PP_Instance instance, | |
163 const ::ppapi::URLRequestInfoData& data, | |
164 const char* target, | |
165 PP_Bool from_user_action) { | |
166 if (!target) | |
167 return PP_ERROR_BADARGUMENT; | |
168 return instance_->Navigate(data, target, PP_ToBool(from_user_action)); | |
169 } | |
170 | |
171 double PPB_Flash_Impl::GetLocalTimeZoneOffset(PP_Instance instance, | 39 double PPB_Flash_Impl::GetLocalTimeZoneOffset(PP_Instance instance, |
172 PP_Time t) { | 40 PP_Time t) { |
173 // Evil hack. The time code handles exact "0" values as special, and produces | 41 // Evil hack. The time code handles exact "0" values as special, and produces |
174 // a "null" Time object. This will represent some date hundreds of years ago | 42 // a "null" Time object. This will represent some date hundreds of years ago |
175 // and will give us funny results at 1970 (there are some tests where this | 43 // and will give us funny results at 1970 (there are some tests where this |
176 // comes up, but it shouldn't happen in real life). To work around this | 44 // comes up, but it shouldn't happen in real life). To work around this |
177 // special handling, we just need to give it some nonzero value. | 45 // special handling, we just need to give it some nonzero value. |
178 if (t == 0.0) | 46 if (t == 0.0) |
179 t = 0.0000000001; | 47 t = 0.0000000001; |
180 | 48 |
181 // We can't do the conversion here because on Linux, the localtime calls | 49 // We can't do the conversion here because on Linux, the localtime calls |
182 // require filesystem access prohibited by the sandbox. | 50 // require filesystem access prohibited by the sandbox. |
183 return instance_->delegate()->GetLocalTimeZoneOffset(PPTimeToTime(t)); | 51 return instance_->delegate()->GetLocalTimeZoneOffset(PPTimeToTime(t)); |
184 } | 52 } |
185 | 53 |
186 PP_Bool PPB_Flash_Impl::IsRectTopmost(PP_Instance instance, | |
187 const PP_Rect* rect) { | |
188 return PP_FromBool(instance_->IsRectTopmost( | |
189 gfx::Rect(rect->point.x, rect->point.y, | |
190 rect->size.width, rect->size.height))); | |
191 } | |
192 | |
193 PP_Var PPB_Flash_Impl::GetSetting(PP_Instance instance, | 54 PP_Var PPB_Flash_Impl::GetSetting(PP_Instance instance, |
194 PP_FlashSetting setting) { | 55 PP_FlashSetting setting) { |
195 switch(setting) { | 56 switch(setting) { |
196 case PP_FLASHSETTING_LSORESTRICTIONS: { | 57 case PP_FLASHSETTING_LSORESTRICTIONS: { |
197 return PP_MakeInt32( | 58 return PP_MakeInt32( |
198 instance_->delegate()->GetLocalDataRestrictions( | 59 instance_->delegate()->GetLocalDataRestrictions( |
199 instance_->container()->element().document().url(), | 60 instance_->container()->element().document().url(), |
200 instance_->plugin_url())); | 61 instance_->plugin_url())); |
201 } | 62 } |
202 default: | 63 default: |
203 // No other settings are supported in-process. | 64 // No other settings are supported in-process. |
204 return PP_MakeUndefined(); | 65 return PP_MakeUndefined(); |
205 } | 66 } |
206 } | 67 } |
207 | 68 |
208 } // namespace ppapi | 69 } // namespace ppapi |
209 } // namespace webkit | 70 } // namespace webkit |
OLD | NEW |