| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 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 | 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/glue/plugins/pepper_device_context_2d.h" | 5 #include "webkit/glue/plugins/pepper_device_context_2d.h" |
| 6 | 6 |
| 7 #include <iterator> | 7 #include <iterator> |
| 8 | 8 |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "base/message_loop.h" | 10 #include "base/message_loop.h" |
| 11 #include "base/task.h" | 11 #include "base/task.h" |
| 12 #include "gfx/point.h" | 12 #include "gfx/point.h" |
| 13 #include "gfx/rect.h" | 13 #include "gfx/rect.h" |
| 14 #include "skia/ext/platform_canvas.h" | 14 #include "skia/ext/platform_canvas.h" |
| 15 #include "third_party/ppapi/c/pp_errors.h" | 15 #include "third_party/ppapi/c/pp_errors.h" |
| 16 #include "third_party/ppapi/c/pp_module.h" | 16 #include "third_party/ppapi/c/pp_module.h" |
| 17 #include "third_party/ppapi/c/pp_rect.h" | 17 #include "third_party/ppapi/c/pp_rect.h" |
| 18 #include "third_party/ppapi/c/pp_resource.h" | 18 #include "third_party/ppapi/c/pp_resource.h" |
| 19 #include "third_party/ppapi/c/ppb_device_context_2d.h" | 19 #include "third_party/ppapi/c/ppb_device_context_2d.h" |
| 20 #include "third_party/skia/include/core/SkBitmap.h" | 20 #include "third_party/skia/include/core/SkBitmap.h" |
| 21 #include "webkit/glue/plugins/pepper_image_data.h" | 21 #include "webkit/glue/plugins/pepper_image_data.h" |
| 22 #include "webkit/glue/plugins/pepper_plugin_instance.h" | 22 #include "webkit/glue/plugins/pepper_plugin_instance.h" |
| 23 #include "webkit/glue/plugins/pepper_plugin_module.h" | 23 #include "webkit/glue/plugins/pepper_plugin_module.h" |
| 24 #include "webkit/glue/plugins/pepper_resource_tracker.h" | |
| 25 | 24 |
| 26 #if defined(OS_MACOSX) | 25 #if defined(OS_MACOSX) |
| 27 #include "base/mac_util.h" | 26 #include "base/mac_util.h" |
| 28 #include "base/scoped_cftyperef.h" | 27 #include "base/scoped_cftyperef.h" |
| 29 #endif | 28 #endif |
| 30 | 29 |
| 31 namespace pepper { | 30 namespace pepper { |
| 32 | 31 |
| 33 namespace { | 32 namespace { |
| 34 | 33 |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 71 | 70 |
| 72 scoped_refptr<DeviceContext2D> context(new DeviceContext2D(module)); | 71 scoped_refptr<DeviceContext2D> context(new DeviceContext2D(module)); |
| 73 if (!context->Init(width, height, is_always_opaque)) | 72 if (!context->Init(width, height, is_always_opaque)) |
| 74 return NULL; | 73 return NULL; |
| 75 context->AddRef(); // AddRef for the caller. | 74 context->AddRef(); // AddRef for the caller. |
| 76 return context->GetResource(); | 75 return context->GetResource(); |
| 77 } | 76 } |
| 78 | 77 |
| 79 bool IsDeviceContext2D(PP_Resource resource) { | 78 bool IsDeviceContext2D(PP_Resource resource) { |
| 80 scoped_refptr<DeviceContext2D> context( | 79 scoped_refptr<DeviceContext2D> context( |
| 81 ResourceTracker::Get()->GetAsDeviceContext2D(resource)); | 80 Resource::GetAs<DeviceContext2D>(resource)); |
| 82 return !!context.get(); | 81 return !!context.get(); |
| 83 } | 82 } |
| 84 | 83 |
| 85 bool Describe(PP_Resource device_context, | 84 bool Describe(PP_Resource device_context, |
| 86 int32_t* width, int32_t* height, bool* is_always_opaque) { | 85 int32_t* width, int32_t* height, bool* is_always_opaque) { |
| 87 scoped_refptr<DeviceContext2D> context( | 86 scoped_refptr<DeviceContext2D> context( |
| 88 ResourceTracker::Get()->GetAsDeviceContext2D(device_context)); | 87 Resource::GetAs<DeviceContext2D>(device_context)); |
| 89 if (!context.get()) | 88 if (!context.get()) |
| 90 return false; | 89 return false; |
| 91 return context->Describe(width, height, is_always_opaque); | 90 return context->Describe(width, height, is_always_opaque); |
| 92 } | 91 } |
| 93 | 92 |
| 94 bool PaintImageData(PP_Resource device_context, | 93 bool PaintImageData(PP_Resource device_context, |
| 95 PP_Resource image, | 94 PP_Resource image, |
| 96 int32_t x, int32_t y, | 95 int32_t x, int32_t y, |
| 97 const PP_Rect* src_rect) { | 96 const PP_Rect* src_rect) { |
| 98 scoped_refptr<DeviceContext2D> context( | 97 scoped_refptr<DeviceContext2D> context( |
| 99 ResourceTracker::Get()->GetAsDeviceContext2D(device_context)); | 98 Resource::GetAs<DeviceContext2D>(device_context)); |
| 100 if (!context.get()) | 99 if (!context.get()) |
| 101 return false; | 100 return false; |
| 102 return context->PaintImageData(image, x, y, src_rect); | 101 return context->PaintImageData(image, x, y, src_rect); |
| 103 } | 102 } |
| 104 | 103 |
| 105 bool Scroll(PP_Resource device_context, | 104 bool Scroll(PP_Resource device_context, |
| 106 const PP_Rect* clip_rect, | 105 const PP_Rect* clip_rect, |
| 107 int32_t dx, int32_t dy) { | 106 int32_t dx, int32_t dy) { |
| 108 scoped_refptr<DeviceContext2D> context( | 107 scoped_refptr<DeviceContext2D> context( |
| 109 ResourceTracker::Get()->GetAsDeviceContext2D(device_context)); | 108 Resource::GetAs<DeviceContext2D>(device_context)); |
| 110 if (!context.get()) | 109 if (!context.get()) |
| 111 return false; | 110 return false; |
| 112 return context->Scroll(clip_rect, dx, dy); | 111 return context->Scroll(clip_rect, dx, dy); |
| 113 } | 112 } |
| 114 | 113 |
| 115 bool ReplaceContents(PP_Resource device_context, PP_Resource image) { | 114 bool ReplaceContents(PP_Resource device_context, PP_Resource image) { |
| 116 scoped_refptr<DeviceContext2D> context( | 115 scoped_refptr<DeviceContext2D> context( |
| 117 ResourceTracker::Get()->GetAsDeviceContext2D(device_context)); | 116 Resource::GetAs<DeviceContext2D>(device_context)); |
| 118 if (!context.get()) | 117 if (!context.get()) |
| 119 return false; | 118 return false; |
| 120 return context->ReplaceContents(image); | 119 return context->ReplaceContents(image); |
| 121 } | 120 } |
| 122 | 121 |
| 123 int32_t Flush(PP_Resource device_context, | 122 int32_t Flush(PP_Resource device_context, |
| 124 PP_CompletionCallback callback) { | 123 PP_CompletionCallback callback) { |
| 125 scoped_refptr<DeviceContext2D> context( | 124 scoped_refptr<DeviceContext2D> context( |
| 126 ResourceTracker::Get()->GetAsDeviceContext2D(device_context)); | 125 Resource::GetAs<DeviceContext2D>(device_context)); |
| 127 if (!context.get()) | 126 if (!context.get()) |
| 128 return PP_Error_BadResource; | 127 return PP_Error_BadResource; |
| 129 return context->Flush(callback); | 128 return context->Flush(callback); |
| 130 } | 129 } |
| 131 | 130 |
| 132 const PPB_DeviceContext2D ppb_devicecontext2d = { | 131 const PPB_DeviceContext2D ppb_devicecontext2d = { |
| 133 &Create, | 132 &Create, |
| 134 &IsDeviceContext2D, | 133 &IsDeviceContext2D, |
| 135 &Describe, | 134 &Describe, |
| 136 &PaintImageData, | 135 &PaintImageData, |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 202 bool* is_always_opaque) { | 201 bool* is_always_opaque) { |
| 203 *width = image_data_->width(); | 202 *width = image_data_->width(); |
| 204 *height = image_data_->height(); | 203 *height = image_data_->height(); |
| 205 *is_always_opaque = false; // TODO(brettw) implement this. | 204 *is_always_opaque = false; // TODO(brettw) implement this. |
| 206 return true; | 205 return true; |
| 207 } | 206 } |
| 208 | 207 |
| 209 bool DeviceContext2D::PaintImageData(PP_Resource image, | 208 bool DeviceContext2D::PaintImageData(PP_Resource image, |
| 210 int32_t x, int32_t y, | 209 int32_t x, int32_t y, |
| 211 const PP_Rect* src_rect) { | 210 const PP_Rect* src_rect) { |
| 212 scoped_refptr<ImageData> image_resource( | 211 scoped_refptr<ImageData> image_resource(Resource::GetAs<ImageData>(image)); |
| 213 ResourceTracker::Get()->GetAsImageData(image)); | |
| 214 if (!image_resource.get()) | 212 if (!image_resource.get()) |
| 215 return false; | 213 return false; |
| 216 | 214 |
| 217 QueuedOperation operation(QueuedOperation::PAINT); | 215 QueuedOperation operation(QueuedOperation::PAINT); |
| 218 operation.paint_image = image_resource; | 216 operation.paint_image = image_resource; |
| 219 if (!ValidateAndConvertRect(src_rect, image_resource->width(), | 217 if (!ValidateAndConvertRect(src_rect, image_resource->width(), |
| 220 image_resource->height(), | 218 image_resource->height(), |
| 221 &operation.paint_src_rect)) | 219 &operation.paint_src_rect)) |
| 222 return false; | 220 return false; |
| 223 | 221 |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 255 return true; | 253 return true; |
| 256 | 254 |
| 257 operation.scroll_dx = dx; | 255 operation.scroll_dx = dx; |
| 258 operation.scroll_dy = dy; | 256 operation.scroll_dy = dy; |
| 259 | 257 |
| 260 queued_operations_.push_back(operation); | 258 queued_operations_.push_back(operation); |
| 261 return false; | 259 return false; |
| 262 } | 260 } |
| 263 | 261 |
| 264 bool DeviceContext2D::ReplaceContents(PP_Resource image) { | 262 bool DeviceContext2D::ReplaceContents(PP_Resource image) { |
| 265 scoped_refptr<ImageData> image_resource( | 263 scoped_refptr<ImageData> image_resource(Resource::GetAs<ImageData>(image)); |
| 266 ResourceTracker::Get()->GetAsImageData(image)); | |
| 267 if (!image_resource.get()) | 264 if (!image_resource.get()) |
| 268 return false; | 265 return false; |
| 269 if (image_resource->format() != PP_IMAGEDATAFORMAT_BGRA_PREMUL) | 266 if (image_resource->format() != PP_IMAGEDATAFORMAT_BGRA_PREMUL) |
| 270 return false; | 267 return false; |
| 271 | 268 |
| 272 if (image_resource->width() != image_data_->width() || | 269 if (image_resource->width() != image_data_->width() || |
| 273 image_resource->height() != image_data_->height()) | 270 image_resource->height() != image_data_->height()) |
| 274 return false; | 271 return false; |
| 275 | 272 |
| 276 QueuedOperation operation(QueuedOperation::REPLACE); | 273 QueuedOperation operation(QueuedOperation::REPLACE); |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 329 } else { | 326 } else { |
| 330 // There's nothing visible to invalidate so just schedule the callback to | 327 // There's nothing visible to invalidate so just schedule the callback to |
| 331 // execute in the next round of the message loop. | 328 // execute in the next round of the message loop. |
| 332 ScheduleOffscreenCallback(FlushCallbackData(callback)); | 329 ScheduleOffscreenCallback(FlushCallbackData(callback)); |
| 333 } | 330 } |
| 334 return PP_Error_WouldBlock; | 331 return PP_Error_WouldBlock; |
| 335 } | 332 } |
| 336 | 333 |
| 337 bool DeviceContext2D::ReadImageData(PP_Resource image, int32_t x, int32_t y) { | 334 bool DeviceContext2D::ReadImageData(PP_Resource image, int32_t x, int32_t y) { |
| 338 // Get and validate the image object to paint into. | 335 // Get and validate the image object to paint into. |
| 339 scoped_refptr<ImageData> image_resource( | 336 scoped_refptr<ImageData> image_resource(Resource::GetAs<ImageData>(image)); |
| 340 ResourceTracker::Get()->GetAsImageData(image)); | |
| 341 if (!image_resource.get()) | 337 if (!image_resource.get()) |
| 342 return false; | 338 return false; |
| 343 if (image_resource->format() != PP_IMAGEDATAFORMAT_BGRA_PREMUL) | 339 if (image_resource->format() != PP_IMAGEDATAFORMAT_BGRA_PREMUL) |
| 344 return false; // Must be in the right format. | 340 return false; // Must be in the right format. |
| 345 | 341 |
| 346 // Validate the bitmap position. | 342 // Validate the bitmap position. |
| 347 if (x < 0 || | 343 if (x < 0 || |
| 348 static_cast<int64>(x) + static_cast<int64>(image_resource->width()) > | 344 static_cast<int64>(x) + static_cast<int64>(image_resource->width()) > |
| 349 image_data_->width()) | 345 image_data_->width()) |
| 350 return false; | 346 return false; |
| (...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 538 data.Execute(PP_OK); | 534 data.Execute(PP_OK); |
| 539 } | 535 } |
| 540 | 536 |
| 541 bool DeviceContext2D::HasPendingFlush() const { | 537 bool DeviceContext2D::HasPendingFlush() const { |
| 542 return !unpainted_flush_callback_.is_null() || | 538 return !unpainted_flush_callback_.is_null() || |
| 543 !painted_flush_callback_.is_null() || | 539 !painted_flush_callback_.is_null() || |
| 544 offscreen_flush_pending_; | 540 offscreen_flush_pending_; |
| 545 } | 541 } |
| 546 | 542 |
| 547 } // namespace pepper | 543 } // namespace pepper |
| OLD | NEW |