Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(8436)

Unified Diff: chrome/renderer/render_widget.cc

Issue 19491: POSIX: bitmap data on the wire (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 11 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/renderer/render_widget.h ('k') | chrome/renderer/renderer.scons » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/renderer/render_widget.cc
===================================================================
--- chrome/renderer/render_widget.cc (revision 9053)
+++ chrome/renderer/render_widget.cc (working copy)
@@ -9,9 +9,15 @@
#include "base/logging.h"
#include "base/message_loop.h"
#include "base/scoped_ptr.h"
+#include "build/build_config.h"
#include "chrome/renderer/render_process.h"
-#include "skia/ext/platform_canvas_win.h"
+#include "skia/ext/platform_canvas.h"
+#if defined(OS_POSIX)
+#include "skia/include/SkPixelRef.h"
+#include "skia/include/SkMallocPixelRef.h"
+#endif // defined(OS_POSIX)
+
#include "webkit/glue/webinputevent.h"
#include "webkit/glue/webwidget.h"
@@ -77,10 +83,10 @@
next_paint_flags_(0),
paint_reply_pending_(false),
did_show_(false),
- closing_(false),
is_hidden_(false),
needs_repainting_on_restore_(false),
has_focus_(false),
+ closing_(false),
ime_is_active_(false),
ime_control_enable_ime_(true),
ime_control_x_(-1),
@@ -352,25 +358,25 @@
}
void RenderWidget::PaintRect(const gfx::Rect& rect,
- base::SharedMemory* paint_buf) {
- skia::PlatformCanvasWin canvas(rect.width(), rect.height(), true,
- paint_buf->handle());
+ skia::PlatformCanvas* canvas) {
// Bring the canvas into the coordinate system of the paint rect
- canvas.translate(static_cast<SkScalar>(-rect.x()),
- static_cast<SkScalar>(-rect.y()));
+ canvas->translate(static_cast<SkScalar>(-rect.x()),
+ static_cast<SkScalar>(-rect.y()));
- webwidget_->Paint(&canvas, rect);
+ webwidget_->Paint(canvas, rect);
// Flush to underlying bitmap. TODO(darin): is this needed?
- canvas.getTopPlatformDevice().accessBitmap(false);
+ canvas->getTopPlatformDevice().accessBitmap(false);
// Let the subclass observe this paint operations.
DidPaint();
}
+// static
size_t RenderWidget::GetPaintBufSize(const gfx::Rect& rect) {
// TODO(darin): protect against overflow
- return 4 * rect.width() * rect.height();
+ const size_t stride = skia::PlatformCanvas::StrideForWidth(rect.width());
+ return stride * rect.height();
}
void RenderWidget::DoDeferredPaint() {
@@ -394,22 +400,38 @@
paint_rect_ = gfx::Rect();
// Compute a buffer for painting and cache it.
+#if defined(OS_WIN)
current_paint_buf_ =
RenderProcess::AllocSharedMemory(GetPaintBufSize(damaged_rect));
if (!current_paint_buf_) {
NOTREACHED();
return;
}
+ skia::PlatformCanvasWin canvas(damaged_rect.width(), damaged_rect.height(),
+ true, current_paint_buf_->handle());
+#elif defined(OS_POSIX)
+ // Currently, on POSIX, we are serialising the bitmap data over the IPC
+ // channel.
+ skia::PlatformCanvas canvas(damaged_rect.width(), damaged_rect.height(),
+ true);
+#endif // defined(OS_POSIX)
- PaintRect(damaged_rect, current_paint_buf_);
+ PaintRect(damaged_rect, &canvas);
ViewHostMsg_PaintRect_Params params;
- params.bitmap = current_paint_buf_->handle();
params.bitmap_rect = damaged_rect;
params.view_size = size_;
params.plugin_window_moves = plugin_window_moves_;
params.flags = next_paint_flags_;
+#if defined(OS_WIN)
+ // Windows passes a HANDLE to the shared memory over IPC
+ params.bitmap = current_paint_buf_->handle();
+#elif defined(OS_POSIX)
+ // POSIX currently passes the data itself.
+ params.bitmap = canvas.getDevice()->accessBitmap(false);
+#endif // defined(OS_WIN)
+
plugin_window_moves_.clear();
paint_reply_pending_ = true;
@@ -469,17 +491,25 @@
// In case the scroll offset exceeds the width/height of the scroll rect
damaged_rect = scroll_rect_.Intersect(damaged_rect);
+#if defined(OS_WIN)
current_scroll_buf_ =
RenderProcess::AllocSharedMemory(GetPaintBufSize(damaged_rect));
if (!current_scroll_buf_) {
NOTREACHED();
return;
}
+ skia::PlatformCanvasWin canvas(damaged_rect.width(), damaged_rect.height(),
+ true, current_scroll_buf_->handle());
+#elif defined(OS_POSIX)
+ // Currently, on POSIX, we are serialising the bitmap data over the IPC
+ // channel.
+ skia::PlatformCanvas canvas(damaged_rect.width(), damaged_rect.height(),
+ true);
+#endif // defined(OS_POSIX)
// Set these parameters before calling Paint, since that could result in
// further invalidates (uncommon).
ViewHostMsg_ScrollRect_Params params;
- params.bitmap = current_scroll_buf_->handle();
params.bitmap_rect = damaged_rect;
params.dx = scroll_delta_.x();
params.dy = scroll_delta_.y();
@@ -487,12 +517,20 @@
params.view_size = size_;
params.plugin_window_moves = plugin_window_moves_;
+#if defined(OS_WIN)
+ // Windows passes a HANDLE to the shared memory over IPC
+ params.bitmap = current_scroll_buf_->handle();
+#elif defined(OS_POSIX)
+ // POSIX currently passes the data itself.
+ params.bitmap = canvas.getDevice()->accessBitmap(false);
+#endif // defined(OS_WIN)
+
plugin_window_moves_.clear();
// Mark the scroll operation as no longer pending.
scroll_rect_ = gfx::Rect();
- PaintRect(damaged_rect, current_scroll_buf_);
+ PaintRect(damaged_rect, &canvas);
Send(new ViewHostMsg_ScrollRect(routing_id_, params));
UpdateIME();
}
« no previous file with comments | « chrome/renderer/render_widget.h ('k') | chrome/renderer/renderer.scons » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698