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

Unified Diff: webkit/tools/test_shell/webwidget_host_win.cc

Issue 6283019: Render using WebPaintSurface. Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 9 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 | « webkit/tools/test_shell/webwidget_host.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: webkit/tools/test_shell/webwidget_host_win.cc
===================================================================
--- webkit/tools/test_shell/webwidget_host_win.cc (revision 73503)
+++ webkit/tools/test_shell/webwidget_host_win.cc (working copy)
@@ -21,6 +21,7 @@
using WebKit::WebKeyboardEvent;
using WebKit::WebMouseEvent;
using WebKit::WebMouseWheelEvent;
+using WebKit::WebPaintSurface;
using WebKit::WebPopupMenu;
using WebKit::WebScreenInfo;
using WebKit::WebScreenInfoFactory;
@@ -137,6 +138,22 @@
return DefWindowProc(hwnd, message, wparam, lparam);;
}
+#if WEBKIT_USING_PAINTSURFACE
+
+WebPaintSurface* WebWidgetHost::GetPaintSurface() {
+ gfx::Size widget_size = webwidget_->size();
+ if (!paint_surface_.get() || paint_surface_->size() != widget_size) {
+ // This may result in discarding a previously allocated paint surface,
+ // which had not yet been fully rendered (see DidModifyPaintSurface).
+ pending_paint_surface_.reset(
+ new SimpleWebPaintSurfaceImpl(this, widget_size));
+ return pending_paint_surface_.get();
+ }
+ return paint_surface_.get();
+}
+
+#else // WEBKIT_USING_PAINTSURFACE
+
void WebWidgetHost::DidInvalidateRect(const gfx::Rect& damaged_rect) {
DLOG_IF(WARNING, painting_) << "unexpected invalidation while painting";
@@ -176,6 +193,8 @@
InvalidateRect(view_, &r, FALSE);
}
+#endif // WEBKIT_USING_PAINTSURFACE
+
void WebWidgetHost::ScheduleComposite() {
if (!webwidget_)
return;
@@ -231,6 +250,49 @@
}
void WebWidgetHost::Paint() {
+#if WEBKIT_USING_PAINTSURFACE
+ // Paint to the screen
+ PAINTSTRUCT ps;
+ BeginPaint(view_, &ps);
+
+ gfx::Rect damage_rect(ps.rcPaint);
+ gfx::Rect canvas_rect;
+
+ if (paint_surface_.get()) {
+ canvas_rect.set_size(paint_surface_->size());
+ canvas_rect = canvas_rect.Intersect(damage_rect);
+ if (!canvas_rect.IsEmpty()) {
+ skia::PlatformCanvas* canvas = paint_surface_->canvas();
+ canvas->getTopPlatformDevice().drawToHDC(ps.hdc,
+ canvas_rect.x(),
+ canvas_rect.y(),
+ &canvas_rect.ToRECT());
+ }
+ }
+
+ if (damage_rect.right() > canvas_rect.right()) {
+ // Paint right edge.
+ gfx::Rect r(canvas_rect.right(),
+ damage_rect.y(),
+ damage_rect.right() - canvas_rect.right(),
+ damage_rect.height());
+ FillRect(ps.hdc, &r.ToRECT(), (HBRUSH)GetStockObject(WHITE_BRUSH));
+ }
+
+ if (damage_rect.bottom() > canvas_rect.bottom()) {
+ // Paint bottom edge, possibly overpainting the corner for simplicity.
+ gfx::Rect r(damage_rect.x(),
+ canvas_rect.bottom(),
+ damage_rect.width(),
+ damage_rect.bottom() - canvas_rect.bottom());
+ FillRect(ps.hdc, &r.ToRECT(), (HBRUSH)GetStockObject(WHITE_BRUSH));
+ }
+
+ EndPaint(view_, &ps);
+
+ if (paint_surface_.get())
+ paint_surface_->DidCopyPaintSurface();
+#else
RECT r;
GetClientRect(view_, &r);
gfx::Rect client_rect(r);
@@ -286,6 +348,7 @@
// Draw children
UpdateWindow(view_);
+#endif
}
WebScreenInfo WebWidgetHost::GetScreenInfo() {
@@ -371,6 +434,15 @@
scroll_dy_ = 0;
}
+void WebWidgetHost::DidModifyPaintSurface(const gfx::Rect& bounds) {
+ // If there is a pending paint surface, then we can now consider it
+ // up-to-date and usable.
+ if (pending_paint_surface_.get())
+ paint_surface_.reset(pending_paint_surface_.release());
+
+ InvalidateRect(view_, &bounds.ToRECT(), FALSE);
+}
+
void WebWidgetHost::PaintRect(const gfx::Rect& rect) {
#ifndef NDEBUG
DCHECK(!painting_);
« no previous file with comments | « webkit/tools/test_shell/webwidget_host.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698