Index: chrome/renderer/webplugin_delegate_proxy.cc |
diff --git a/chrome/renderer/webplugin_delegate_proxy.cc b/chrome/renderer/webplugin_delegate_proxy.cc |
index 45a98bf5d756cb6fc5c6a43cfec276d63e21c9d6..524b9089faae611c9bec0bc70ee7c4da79b75da4 100644 |
--- a/chrome/renderer/webplugin_delegate_proxy.cc |
+++ b/chrome/renderer/webplugin_delegate_proxy.cc |
@@ -476,13 +476,8 @@ bool WebPluginDelegateProxy::CreateBitmap( |
const size_t stride = skia::PlatformCanvas::StrideForWidth(width); |
const size_t size = stride * height; |
#if defined(OS_LINUX) |
- static unsigned long max_size = 0; |
- if (max_size == 0) { |
- std::string contents; |
- file_util::ReadFileToString(FilePath("/proc/sys/kernel/shmmax"), &contents); |
- max_size = strtoul(contents.c_str(), NULL, 0); |
- } |
- if (size > max_size) |
+ memory->reset(TransportDIB::Create(size, 0)); |
+ if (!memory->get()) |
return false; |
#endif |
#if defined(OS_MACOSX) |
@@ -543,7 +538,19 @@ void WebPluginDelegateProxy::Paint(gfx::NativeDrawingContext context, |
CGImageCreateWithImageInRect(background_image, offset_rect.ToCGRect())); |
CGContextDrawImage(context, rect.ToCGRect(), sub_image); |
#else |
- NOTIMPLEMENTED(); |
+ cairo_t *cairo = |
+ background_store_canvas_->getTopPlatformDevice().beginPlatformPaint(); |
+ cairo_save(cairo); |
+ double surface_x = plugin_rect_.x(); |
+ double surface_y = plugin_rect_.y(); |
+ cairo_user_to_device(context, &surface_x, &surface_y); |
+ cairo_set_source_surface(cairo, cairo_get_target(context), |
+ -surface_x, -surface_y); |
+ cairo_rectangle(cairo, offset_rect.x(), offset_rect.y(), |
+ offset_rect.width(), offset_rect.height()); |
+ cairo_clip(cairo); |
+ cairo_paint(cairo); |
+ cairo_restore(cairo); |
#endif |
} |
@@ -565,7 +572,15 @@ void WebPluginDelegateProxy::Paint(gfx::NativeDrawingContext context, |
CGImageCreateWithImageInRect(backing_image, offset_rect.ToCGRect())); |
CGContextDrawImage(context, rect.ToCGRect(), sub_image); |
#else |
- NOTIMPLEMENTED(); |
+ cairo_save(context); |
+ cairo_t *cairo = |
+ backing_store_canvas_->getTopPlatformDevice().beginPlatformPaint(); |
+ cairo_set_source_surface(context, cairo_get_target(cairo), |
+ plugin_rect_.x(), plugin_rect_.y()); |
+ cairo_rectangle(context, rect.x(), rect.y(), rect.width(), rect.height()); |
+ cairo_paint(context); |
+ cairo_clip(context); |
+ cairo_restore(context); |
#endif |
if (invalidate_pending_) { |
@@ -619,11 +634,11 @@ bool WebPluginDelegateProxy::BackgroundChanged( |
if (memcmp(hdc_row_start, canvas_row_start, row_byte_size) != 0) |
return true; |
} |
- |
+ return false; |
#else |
NOTIMPLEMENTED(); |
+ return true; |
#endif |
- return false; |
} |
void WebPluginDelegateProxy::Print(gfx::NativeDrawingContext context) { |
@@ -932,10 +947,14 @@ void WebPluginDelegateProxy::PaintSadPlugin(gfx::NativeDrawingContext context, |
skia::PlatformDevice& device = canvas.getTopPlatformDevice(); |
device.drawToHDC(context, plugin_rect_.x(), plugin_rect_.y(), NULL); |
#elif defined(OS_LINUX) |
+ cairo_save(context); |
cairo_t* cairo = canvas.getTopPlatformDevice().beginPlatformPaint(); |
- cairo_set_source_surface(cairo, cairo_get_target(context), |
+ cairo_set_source_surface(context, cairo_get_target(cairo), |
plugin_rect_.x(), plugin_rect_.y()); |
- cairo_paint(cairo); |
+ cairo_rectangle(context, rect.x(), rect.y(), rect.width(), rect.height()); |
+ cairo_clip(context); |
+ cairo_paint(context); |
+ cairo_restore(context); |
// We have no endPlatformPaint() on the Linux PlatformDevice. |
// The cairo_t* is owned by the device. |
#elif defined(OS_MACOSX) |
@@ -967,8 +986,16 @@ void WebPluginDelegateProxy::CopyFromTransportToBacking(const gfx::Rect& rect) { |
CGImageCreateWithImageInRect(image, rect.ToCGRect())); |
CGContextDrawImage(backing, rect.ToCGRect(), sub_image); |
#else |
- // TODO(port): probably some new code in TransportDIB should go here. |
- NOTIMPLEMENTED(); |
+ cairo_t *cairo = |
+ backing_store_canvas_->getTopPlatformDevice().beginPlatformPaint(); |
+ cairo_save(cairo); |
+ cairo_t *transport = |
+ transport_store_canvas_->getTopPlatformDevice().beginPlatformPaint(); |
+ cairo_set_source_surface(cairo, cairo_get_target(transport), 0, 0); |
+ cairo_rectangle(cairo, rect.x(), rect.y(), rect.width(), rect.height()); |
+ cairo_clip(cairo); |
+ cairo_paint(cairo); |
+ cairo_restore(cairo); |
#endif |
backing_store_painted_ = backing_store_painted_.Union(rect); |
} |