Index: ui/gfx/canvas_skia_paint_linux.cc |
=================================================================== |
--- ui/gfx/canvas_skia_paint_linux.cc (revision 0) |
+++ ui/gfx/canvas_skia_paint_linux.cc (revision 0) |
@@ -0,0 +1,69 @@ |
+// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "ui/gfx/canvas_skia_paint_linux.h" |
+ |
+#include "base/logging.h" |
+#include "ui/gfx/canvas_skia.h" |
+#include "ui/gfx/rect.h" |
+ |
+namespace gfx { |
+ |
+CanvasSkiaPaint::CanvasSkiaPaint(GdkEventExpose* event, bool opaque) |
+ : window_(event->window), |
+ region_(gdk_region_copy(event->region)) { |
+ CHECK(InitCanvas()); |
+} |
+ |
+CanvasSkiaPaint::~CanvasSkiaPaint() { |
+ canvas_->skia_canvas()->restoreToCount(1); |
+ |
+ if (!IsValid()) { |
+ // Blit the dirty rect to the window. |
+ CHECK(window_); |
+ cairo_t* dst_context = gdk_cairo_create(window_); |
+ CHECK(dst_context); |
+ cairo_surface_t* src_surface = cairo_get_target( |
+ canvas_->BeginPlatformPaint()); |
+ CHECK(src_surface); |
+ // Flush cairo's cache of the surface. |
+ cairo_surface_mark_dirty(src_surface); |
+ gfx::Rect rect = GetInvalidRect(); |
+ cairo_set_source_surface(dst_context, src_surface, rect.x(), rect.y()); |
+ gdk_cairo_region(dst_context, region_); |
+ cairo_fill(dst_context); |
+ cairo_destroy(dst_context); |
+ canvas_->EndPlatformPaint(); |
+ } |
+ |
+ gdk_region_destroy(region_); |
+} |
+ |
+bool CanvasSkiaPaint::IsValid() const { |
+ return gdk_region_empty(region_); |
+} |
+ |
+gfx::Rect CanvasSkiaPaint::GetInvalidRect() const { |
+ GdkRectangle invalid_rect; |
+ gdk_region_get_clipbox(region_, &invalid_rect); |
+ return gfx::Rect(invalid_rect); |
+} |
+ |
+Canvas* CanvasSkiaPaint::AsCanvas() { |
+ return canvas_.get(); |
+} |
+ |
+bool CanvasSkiaPaint::InitCanvas() { |
+ gfx::Rect rect = GetInvalidRect(); |
+ canvas_.reset(new CanvasSkia); |
+ if (!canvas_->Init(rect.width(), rect.height(), true)) |
+ return false; |
+ |
+ // Translate so that the dirty region appears at the origin. |
+ canvas_->skia_canvas()->translate(-SkIntToScalar(rect.x()), |
+ -SkIntToScalar(rect.y())); |
+ return true; |
+} |
+ |
+} // namespace gfx |
Property changes on: ui\gfx\canvas_skia_paint_linux.cc |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |