| 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_graphics_2d_impl.h" | 5 #include "webkit/plugins/ppapi/ppb_graphics_2d_impl.h" |
| 6 | 6 |
| 7 #include <iterator> | 7 #include <iterator> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/debug/trace_event.h" | 10 #include "base/debug/trace_event.h" |
| 11 #include "base/logging.h" | 11 #include "base/logging.h" |
| 12 #include "base/message_loop.h" | 12 #include "base/message_loop.h" |
| 13 #include "base/time.h" | 13 #include "base/time.h" |
| 14 #include "skia/ext/platform_canvas.h" | 14 #include "skia/ext/platform_canvas.h" |
| 15 #include "ppapi/c/pp_errors.h" | 15 #include "ppapi/c/pp_errors.h" |
| 16 #include "ppapi/c/pp_rect.h" | 16 #include "ppapi/c/pp_rect.h" |
| 17 #include "ppapi/c/pp_resource.h" | 17 #include "ppapi/c/pp_resource.h" |
| 18 #include "ppapi/c/ppb_graphics_2d.h" | 18 #include "ppapi/c/ppb_graphics_2d.h" |
| 19 #include "ppapi/thunk/enter.h" | 19 #include "ppapi/thunk/enter.h" |
| 20 #include "ppapi/thunk/thunk.h" | 20 #include "ppapi/thunk/thunk.h" |
| 21 #include "third_party/skia/include/core/SkBitmap.h" | 21 #include "third_party/skia/include/core/SkBitmap.h" |
| 22 #include "ui/gfx/blit.h" | 22 #include "ui/gfx/blit.h" |
| 23 #include "ui/gfx/point.h" | 23 #include "ui/gfx/point.h" |
| 24 #include "ui/gfx/point_conversions.h" |
| 24 #include "ui/gfx/rect.h" | 25 #include "ui/gfx/rect.h" |
| 26 #include "ui/gfx/rect_conversions.h" |
| 27 #include "ui/gfx/size_conversions.h" |
| 25 #include "ui/gfx/scoped_ns_graphics_context_save_gstate_mac.h" | 28 #include "ui/gfx/scoped_ns_graphics_context_save_gstate_mac.h" |
| 26 #include "ui/gfx/skia_util.h" | 29 #include "ui/gfx/skia_util.h" |
| 27 #include "webkit/plugins/ppapi/common.h" | 30 #include "webkit/plugins/ppapi/common.h" |
| 28 #include "webkit/plugins/ppapi/gfx_conversion.h" | 31 #include "webkit/plugins/ppapi/gfx_conversion.h" |
| 29 #include "webkit/plugins/ppapi/ppapi_plugin_instance.h" | 32 #include "webkit/plugins/ppapi/ppapi_plugin_instance.h" |
| 30 #include "webkit/plugins/ppapi/ppb_image_data_impl.h" | 33 #include "webkit/plugins/ppapi/ppb_image_data_impl.h" |
| 31 #include "webkit/plugins/ppapi/resource_helper.h" | 34 #include "webkit/plugins/ppapi/resource_helper.h" |
| 32 | 35 |
| 33 #if defined(OS_MACOSX) | 36 #if defined(OS_MACOSX) |
| 34 #include "base/mac/mac_util.h" | 37 #include "base/mac/mac_util.h" |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 70 static_cast<int64>(rect->size.height) > | 73 static_cast<int64>(rect->size.height) > |
| 71 static_cast<int64>(image_height)) | 74 static_cast<int64>(image_height)) |
| 72 return false; | 75 return false; |
| 73 | 76 |
| 74 *dest = gfx::Rect(rect->point.x, rect->point.y, | 77 *dest = gfx::Rect(rect->point.x, rect->point.y, |
| 75 rect->size.width, rect->size.height); | 78 rect->size.width, rect->size.height); |
| 76 } | 79 } |
| 77 return true; | 80 return true; |
| 78 } | 81 } |
| 79 | 82 |
| 80 // Scale the rectangle, taking care to round coordinates outward so a | |
| 81 // rectangle scaled down then scaled back up by the inverse scale would | |
| 82 // fully contain the entire area affected by the original rectangle. | |
| 83 gfx::Rect ScaleRectBounds(const gfx::Rect& rect, float scale) { | |
| 84 int left = static_cast<int>(floorf(rect.x() * scale)); | |
| 85 int top = static_cast<int>(floorf(rect.y() * scale)); | |
| 86 int right = static_cast<int>(ceilf((rect.x() + rect.width()) * scale)); | |
| 87 int bottom = static_cast<int>(ceilf((rect.y() + rect.height()) * scale)); | |
| 88 return gfx::Rect(left, top, right - left, bottom - top); | |
| 89 } | |
| 90 | |
| 91 // Converts BGRA <-> RGBA. | 83 // Converts BGRA <-> RGBA. |
| 92 void ConvertBetweenBGRAandRGBA(const uint32_t* input, | 84 void ConvertBetweenBGRAandRGBA(const uint32_t* input, |
| 93 int pixel_length, | 85 int pixel_length, |
| 94 uint32_t* output) { | 86 uint32_t* output) { |
| 95 for (int i = 0; i < pixel_length; i++) { | 87 for (int i = 0; i < pixel_length; i++) { |
| 96 const unsigned char* pixel_in = | 88 const unsigned char* pixel_in = |
| 97 reinterpret_cast<const unsigned char*>(&input[i]); | 89 reinterpret_cast<const unsigned char*>(&input[i]); |
| 98 unsigned char* pixel_out = reinterpret_cast<unsigned char*>(&output[i]); | 90 unsigned char* pixel_out = reinterpret_cast<unsigned char*>(&output[i]); |
| 99 pixel_out[0] = pixel_in[2]; | 91 pixel_out[0] = pixel_in[2]; |
| 100 pixel_out[1] = pixel_in[1]; | 92 pixel_out[1] = pixel_in[1]; |
| (...skipping 465 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 566 // TODO(brettw) bug 56673: do a direct memcpy instead of going through CG | 558 // TODO(brettw) bug 56673: do a direct memcpy instead of going through CG |
| 567 // if the is_always_opaque_ flag is set. Must ensure bitmap is still clipped. | 559 // if the is_always_opaque_ flag is set. Must ensure bitmap is still clipped. |
| 568 | 560 |
| 569 CGContextDrawImage(canvas, bitmap_rect, image); | 561 CGContextDrawImage(canvas, bitmap_rect, image); |
| 570 #else | 562 #else |
| 571 gfx::Rect invalidate_rect = plugin_rect.Intersect(paint_rect); | 563 gfx::Rect invalidate_rect = plugin_rect.Intersect(paint_rect); |
| 572 SkRect sk_invalidate_rect = gfx::RectToSkRect(invalidate_rect); | 564 SkRect sk_invalidate_rect = gfx::RectToSkRect(invalidate_rect); |
| 573 SkAutoCanvasRestore auto_restore(canvas, true); | 565 SkAutoCanvasRestore auto_restore(canvas, true); |
| 574 canvas->clipRect(sk_invalidate_rect); | 566 canvas->clipRect(sk_invalidate_rect); |
| 575 gfx::Size pixel_image_size(image_data_->width(), image_data_->height()); | 567 gfx::Size pixel_image_size(image_data_->width(), image_data_->height()); |
| 576 gfx::Size image_size = pixel_image_size.Scale(scale_); | 568 gfx::Size image_size = gfx::ToFlooredSize(pixel_image_size.Scale(scale_)); |
| 577 | 569 |
| 578 PluginInstance* plugin_instance = ResourceHelper::GetPluginInstance(this); | 570 PluginInstance* plugin_instance = ResourceHelper::GetPluginInstance(this); |
| 579 if (!plugin_instance) | 571 if (!plugin_instance) |
| 580 return; | 572 return; |
| 581 if (plugin_instance->IsFullPagePlugin()) { | 573 if (plugin_instance->IsFullPagePlugin()) { |
| 582 // When we're resizing a window with a full-frame plugin, the plugin may | 574 // When we're resizing a window with a full-frame plugin, the plugin may |
| 583 // not yet have bound a new device, which will leave parts of the | 575 // not yet have bound a new device, which will leave parts of the |
| 584 // background exposed if the window is getting larger. We want this to | 576 // background exposed if the window is getting larger. We want this to |
| 585 // show white (typically less jarring) rather than black or uninitialized. | 577 // show white (typically less jarring) rather than black or uninitialized. |
| 586 // We don't do this for non-full-frame plugins since we specifically want | 578 // We don't do this for non-full-frame plugins since we specifically want |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 645 } | 637 } |
| 646 | 638 |
| 647 // static | 639 // static |
| 648 bool PPB_Graphics2D_Impl::ConvertToLogicalPixels(float scale, | 640 bool PPB_Graphics2D_Impl::ConvertToLogicalPixels(float scale, |
| 649 gfx::Rect* op_rect, | 641 gfx::Rect* op_rect, |
| 650 gfx::Point* delta) { | 642 gfx::Point* delta) { |
| 651 if (scale == 1.0f || scale <= 0.0f) | 643 if (scale == 1.0f || scale <= 0.0f) |
| 652 return true; | 644 return true; |
| 653 | 645 |
| 654 gfx::Rect original_rect = *op_rect; | 646 gfx::Rect original_rect = *op_rect; |
| 655 *op_rect = ScaleRectBounds(*op_rect, scale); | 647 // Take the enclosing rectangle after scaling so a rectangle scaled down then |
| 648 // scaled back up by the inverse scale would fully contain the entire area |
| 649 // affected by the original rectangle. |
| 650 *op_rect = gfx::ToEnclosingRect(op_rect->Scale(scale)); |
| 656 if (delta) { | 651 if (delta) { |
| 657 gfx::Point original_delta = *delta; | 652 gfx::Point original_delta = *delta; |
| 658 float inverse_scale = 1.0f / scale; | 653 float inverse_scale = 1.0f / scale; |
| 659 *delta = delta->Scale(scale); | 654 *delta = gfx::ToFlooredPoint(delta->Scale(scale)); |
| 660 if (original_rect != ScaleRectBounds(*op_rect, inverse_scale) || | 655 if (original_rect != gfx::ToEnclosingRect(op_rect->Scale(inverse_scale)) || |
| 661 original_delta != delta->Scale(inverse_scale)) { | 656 original_delta != gfx::ToFlooredPoint(delta->Scale(inverse_scale))) { |
| 662 return false; | 657 return false; |
| 663 } | 658 } |
| 664 } | 659 } |
| 665 | 660 |
| 666 return true; | 661 return true; |
| 667 } | 662 } |
| 668 | 663 |
| 669 void PPB_Graphics2D_Impl::ExecutePaintImageData(PPB_ImageData_Impl* image, | 664 void PPB_Graphics2D_Impl::ExecutePaintImageData(PPB_ImageData_Impl* image, |
| 670 int x, int y, | 665 int x, int y, |
| 671 const gfx::Rect& src_rect, | 666 const gfx::Rect& src_rect, |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 760 } | 755 } |
| 761 | 756 |
| 762 bool PPB_Graphics2D_Impl::HasPendingFlush() const { | 757 bool PPB_Graphics2D_Impl::HasPendingFlush() const { |
| 763 return !unpainted_flush_callback_.is_null() || | 758 return !unpainted_flush_callback_.is_null() || |
| 764 !painted_flush_callback_.is_null() || | 759 !painted_flush_callback_.is_null() || |
| 765 offscreen_flush_pending_; | 760 offscreen_flush_pending_; |
| 766 } | 761 } |
| 767 | 762 |
| 768 } // namespace ppapi | 763 } // namespace ppapi |
| 769 } // namespace webkit | 764 } // namespace webkit |
| OLD | NEW |