summaryrefslogtreecommitdiffstats
path: root/ui/gfx
diff options
context:
space:
mode:
authorsergeyu@chromium.org <sergeyu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-10-29 17:20:30 +0000
committersergeyu@chromium.org <sergeyu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-10-29 17:20:30 +0000
commitac14bd672e866312b4bea945c0ce859167d51b82 (patch)
tree04de0beafc23c110126a429a3147e9bfb5d99887 /ui/gfx
parent2208a74d15fcc6796f3267064763bb019cc16506 (diff)
downloadchromium_src-ac14bd672e866312b4bea945c0ce859167d51b82.zip
chromium_src-ac14bd672e866312b4bea945c0ce859167d51b82.tar.gz
chromium_src-ac14bd672e866312b4bea945c0ce859167d51b82.tar.bz2
Revert 164660 - Change CanvasPaintT from a template to just a subclass of gfx::Canvas. Greatly
simplifies source-code-readability, and will allow us to move the impl into a .cc file, rather than carry it to every call-site. This is also a necessary precursor to a subsequent change to remove initialize() from PlatformCanvas, and make it just a typedef for SkCanvas. Review URL: https://codereview.chromium.org/11193037 TBR=reed@google.com Review URL: https://codereview.chromium.org/11347017 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@164666 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ui/gfx')
-rw-r--r--ui/gfx/canvas_paint_gtk.cc71
-rw-r--r--ui/gfx/canvas_paint_gtk.h62
-rw-r--r--ui/gfx/canvas_paint_mac.h59
-rw-r--r--ui/gfx/canvas_paint_mac.mm76
-rw-r--r--ui/gfx/canvas_paint_win.cc1
-rw-r--r--ui/gfx/canvas_paint_win.h135
-rw-r--r--ui/gfx/canvas_skia_paint.h46
7 files changed, 33 insertions, 417 deletions
diff --git a/ui/gfx/canvas_paint_gtk.cc b/ui/gfx/canvas_paint_gtk.cc
deleted file mode 100644
index e164cdc..0000000
--- a/ui/gfx/canvas_paint_gtk.cc
+++ /dev/null
@@ -1,71 +0,0 @@
-// Copyright (c) 2012 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 "base/basictypes.h"
-#include "base/compiler_specific.h"
-#include "ui/gfx/canvas.h"
-#include "ui/gfx/canvas_skia_paint.h"
-#include "ui/gfx/rect.h"
-
-namespace gfx {
-
-CanvasSkiaPaint::CanvasSkiaPaint(GdkEventExpose* event)
- : context_(NULL),
- window_(event->window),
- region_(gdk_region_copy(event->region)),
- composite_alpha_(false) {
- Init(true);
-}
-
-CanvasSkiaPaint::CanvasSkiaPaint(GdkEventExpose* event, bool opaque)
- : context_(NULL),
- window_(event->window),
- region_(gdk_region_copy(event->region)),
- composite_alpha_(false) {
- Init(opaque);
-}
-
-CanvasSkiaPaint::~CanvasSkiaPaint() {
- if (!is_empty()) {
- platform_canvas()->restoreToCount(1);
-
- // Blit the dirty rect to the window.
- CHECK(window_);
- cairo_t* cr = gdk_cairo_create(window_);
- CHECK(cr);
- if (composite_alpha_)
- cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE);
- cairo_surface_t* source_surface = cairo_get_target(context_);
- CHECK(source_surface);
- // Flush cairo's cache of the surface.
- cairo_surface_mark_dirty(source_surface);
- GdkRectangle bounds = rectangle();
- cairo_set_source_surface(cr, source_surface, bounds.x, bounds.y);
- gdk_cairo_region(cr, region_);
- cairo_fill(cr);
- cairo_destroy(cr);
- }
-
- gdk_region_destroy(region_);
-}
-
-void CanvasSkiaPaint::Init(bool opaque) {
- GdkRectangle bounds = rectangle();
- skia::PlatformCanvas* canvas = platform_canvas();
- if (!canvas->initialize(bounds.width, bounds.height, opaque, NULL)) {
- // Cause a deliberate crash;
- CHECK(false);
- }
- // No need to clear the canvas, because cairo automatically performs the
- // clear.
-
- // Need to translate so that the dirty region appears at the origin of the
- // surface.
- canvas->translate(-SkIntToScalar(bounds.x), -SkIntToScalar(bounds.y));
-
- context_ = skia::BeginPlatformPaint(canvas);
-}
-
-} // namespace gfx
-
diff --git a/ui/gfx/canvas_paint_gtk.h b/ui/gfx/canvas_paint_gtk.h
deleted file mode 100644
index db64e49..0000000
--- a/ui/gfx/canvas_paint_gtk.h
+++ /dev/null
@@ -1,62 +0,0 @@
-
-// 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.
-
-#ifndef UI_GFX_CANVAS_PAINT_LINUX_H_
-#define UI_GFX_CANVAS_PAINT_LINUX_H_
-
-#include "base/logging.h"
-#include "skia/ext/platform_canvas.h"
-#include "ui/gfx/canvas.h"
-#include <gdk/gdk.h>
-
-namespace gfx {
-
-// A class designed to translate skia painting into a region in a GdkWindow.
-// On construction, it will set up a context for painting into, and on
-// destruction, it will commit it to the GdkWindow.
-// Note: The created context is always inialized to (0, 0, 0, 0).
-class CanvasSkiaPaint : public Canvas {
- public:
- // This constructor assumes the result is opaque.
- explicit CanvasSkiaPaint(GdkEventExpose* event);
- CanvasSkiaPaint(GdkEventExpose* event, bool opaque);
- virtual ~CanvasSkiaPaint();
-
- // Sets whether the bitmap is composited in such a way that the alpha channel
- // is honored. This is only useful if you've enabled an RGBA colormap on the
- // widget. The default is false.
- void set_composite_alpha(bool composite_alpha) {
- composite_alpha_ = composite_alpha;
- }
-
- // Returns true if the invalid region is empty. The caller should call this
- // function to determine if anything needs painting.
- bool is_empty() const {
- return gdk_region_empty(region_);
- }
-
- GdkRectangle rectangle() const {
- GdkRectangle bounds;
- gdk_region_get_clipbox(region_, &bounds);
- return bounds;
- }
-
- private:
- void Init(bool opaque);
-
- cairo_t* context_;
- GdkWindow* window_;
- GdkRegion* region_;
- // See description above setter.
- bool composite_alpha_;
-
- // Disallow copy and assign.
- CanvasSkiaPaint(const CanvasSkiaPaint&);
- CanvasSkiaPaint& operator=(const CanvasSkiaPaint&);
-};
-
-} // namespace gfx
-
-#endif // UI_GFX_CANVAS_PAINT_LINUX_H_
diff --git a/ui/gfx/canvas_paint_mac.h b/ui/gfx/canvas_paint_mac.h
deleted file mode 100644
index 6d19565..0000000
--- a/ui/gfx/canvas_paint_mac.h
+++ /dev/null
@@ -1,59 +0,0 @@
-
-// Copyright (c) 2012 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.
-
-#ifndef UI_GFX_CANVAS_PAINT_MAC_H_
-#define UI_GFX_CANVAS_PAINT_MAC_H_
-
-#include "skia/ext/platform_canvas.h"
-#include "ui/gfx/canvas.h"
-
-#import <Cocoa/Cocoa.h>
-
-namespace gfx {
-
-// A class designed to translate skia painting into a region to the current
-// graphics context. On construction, it will set up a context for painting
-// into, and on destruction, it will commit it to the current context.
-// Note: The created context is always inialized to (0, 0, 0, 0).
-class CanvasSkiaPaint : public Canvas {
- public:
- // This constructor assumes the result is opaque.
- explicit CanvasSkiaPaint(NSRect dirtyRect);
- CanvasSkiaPaint(NSRect dirtyRect, bool opaque);
- virtual ~CanvasSkiaPaint();
-
- // If true, the data painted into the CanvasSkiaPaint is blended onto the
- // current context, else it is copied.
- void set_composite_alpha(bool composite_alpha) {
- composite_alpha_ = composite_alpha;
- }
-
- // Returns true if the invalid region is empty. The caller should call this
- // function to determine if anything needs painting.
- bool is_empty() const {
- return NSIsEmptyRect(rectangle_);
- }
-
- const NSRect& rectangle() const {
- return rectangle_;
- }
-
- private:
- void Init(bool opaque);
-
- CGContext* context_;
- NSRect rectangle_;
- // See description above setter.
- bool composite_alpha_;
-
- // Disallow copy and assign.
- CanvasSkiaPaint(const CanvasSkiaPaint&);
- CanvasSkiaPaint& operator=(const CanvasSkiaPaint&);
-};
-
-} // namespace gfx
-
-
-#endif // UI_GFX_CANVAS_PAINT_MAC_H_
diff --git a/ui/gfx/canvas_paint_mac.mm b/ui/gfx/canvas_paint_mac.mm
deleted file mode 100644
index 83c5a9bb..0000000
--- a/ui/gfx/canvas_paint_mac.mm
+++ /dev/null
@@ -1,76 +0,0 @@
-// Copyright (c) 2012 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_paint_mac.h"
-#include "ui/gfx/size.h"
-
-namespace gfx {
-
-CanvasSkiaPaint::CanvasSkiaPaint(NSRect dirtyRect)
- : context_(NULL),
- rectangle_(dirtyRect),
- composite_alpha_(false) {
- Init(true);
-}
-
-CanvasSkiaPaint::CanvasSkiaPaint(NSRect dirtyRect, bool opaque)
- : context_(NULL),
- rectangle_(dirtyRect),
- composite_alpha_(false) {
- Init(opaque);
-}
-
-CanvasSkiaPaint::~CanvasSkiaPaint() {
- if (!is_empty()) {
- platform_canvas()->restoreToCount(1);
-
- // Blit the dirty rect to the current context.
- CGImageRef image = CGBitmapContextCreateImage(context_);
- CGRect dest_rect = NSRectToCGRect(rectangle_);
-
- CGContextRef destination_context =
- (CGContextRef)[[NSGraphicsContext currentContext] graphicsPort];
- CGContextSaveGState(destination_context);
- CGContextSetBlendMode(
- destination_context,
- composite_alpha_ ? kCGBlendModeNormal : kCGBlendModeCopy);
-
- if ([[NSGraphicsContext currentContext] isFlipped]) {
- // Mirror context on the target's rect middle scanline.
- CGContextTranslateCTM(destination_context, 0.0, NSMidY(rectangle_));
- CGContextScaleCTM(destination_context, 1.0, -1.0);
- CGContextTranslateCTM(destination_context, 0.0, -NSMidY(rectangle_));
- }
-
- CGContextDrawImage(destination_context, dest_rect, image);
- CGContextRestoreGState(destination_context);
-
- CFRelease(image);
- }
-}
-
-void CanvasSkiaPaint::Init(bool opaque) {
- CGContextRef destination_context =
- (CGContextRef)[[NSGraphicsContext currentContext] graphicsPort];
- CGRect scaled_unit_rect = CGContextConvertRectToDeviceSpace(
- destination_context, CGRectMake(0, 0, 1, 1));
- // Assume that the x scale and the y scale are the same.
- CGFloat scale = scaled_unit_rect.size.width;
-
- ui::ScaleFactor scale_factor = ui::GetScaleFactorFromScale(scale);
- gfx::Size size(NSWidth(rectangle_), NSHeight(rectangle_));
- this->RecreateBackingCanvas(size, scale_factor, opaque);
- skia::PlatformCanvas* canvas = platform_canvas();
- canvas->clear(SkColorSetARGB(0, 0, 0, 0));
-
- // Need to translate so that the dirty region appears at the origin of the
- // surface.
- canvas->translate(-SkDoubleToScalar(NSMinX(rectangle_)),
- -SkDoubleToScalar(NSMinY(rectangle_)));
-
- context_ = skia::GetBitmapContext(skia::GetTopDevice(*canvas));
-}
-
-} // namespace skia
-
diff --git a/ui/gfx/canvas_paint_win.cc b/ui/gfx/canvas_paint_win.cc
index 27898fc..87ba3f6 100644
--- a/ui/gfx/canvas_paint_win.cc
+++ b/ui/gfx/canvas_paint_win.cc
@@ -5,6 +5,7 @@
#include "base/basictypes.h"
#include "base/compiler_specific.h"
#include "ui/gfx/canvas.h"
+#include "ui/gfx/canvas_paint.h"
#include "ui/gfx/canvas_skia_paint.h"
#include "ui/gfx/rect.h"
diff --git a/ui/gfx/canvas_paint_win.h b/ui/gfx/canvas_paint_win.h
deleted file mode 100644
index 07044b5..0000000
--- a/ui/gfx/canvas_paint_win.h
+++ /dev/null
@@ -1,135 +0,0 @@
-// 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.
-
-#ifndef UI_GFX_CANVAS_PAINT_WIN_H_
-#define UI_GFX_CANVAS_PAINT_WIN_H_
-
-#include "skia/ext/platform_canvas.h"
-#include "ui/gfx/canvas.h"
-#include "ui/gfx/canvas_paint.h"
-
-namespace gfx {
-
-// A class designed to help with WM_PAINT operations on Windows. It will
-// do BeginPaint/EndPaint on init/destruction, and will create the bitmap and
-// canvas with the correct size and transform for the dirty rect. The bitmap
-// will be automatically painted to the screen on destruction.
-//
-// You MUST call isEmpty before painting to determine if anything needs
-// painting. Sometimes the dirty rect can actually be empty, and this makes
-// the bitmap functions we call unhappy. The caller should not paint in this
-// case.
-//
-// Therefore, all you need to do is:
-// case WM_PAINT: {
-// gfx::PlatformCanvasPaint canvas(hwnd);
-// if (!canvas.isEmpty()) {
-// ... paint to the canvas ...
-// }
-// return 0;
-// }
-// Note: The created context is always inialized to (0, 0, 0, 0).
-class CanvasSkiaPaint : public Canvas {
- public:
- // This constructor assumes the canvas is opaque.
- explicit CanvasSkiaPaint(HWND hwnd) : hwnd_(hwnd), paint_dc_(NULL),
- for_paint_(true) {
- memset(&ps_, 0, sizeof(ps_));
- initPaint(true);
- }
-
- CanvasSkiaPaint(HWND hwnd, bool opaque) : hwnd_(hwnd), paint_dc_(NULL),
- for_paint_(true) {
- memset(&ps_, 0, sizeof(ps_));
- initPaint(opaque);
- }
-
- // Creates a CanvasSkiaPaint for the specified region that paints to the
- // specified dc. This does NOT do BeginPaint/EndPaint.
- CanvasSkiaPaint(HDC dc, bool opaque, int x, int y, int w, int h)
- : hwnd_(NULL),
- paint_dc_(dc),
- for_paint_(false) {
- memset(&ps_, 0, sizeof(ps_));
- ps_.rcPaint.left = x;
- ps_.rcPaint.right = x + w;
- ps_.rcPaint.top = y;
- ps_.rcPaint.bottom = y + h;
- init(opaque);
- }
-
- virtual ~CanvasSkiaPaint() {
- if (!isEmpty()) {
- skia::PlatformCanvas* canvas = platform_canvas();
- canvas->restoreToCount(1);
- // Commit the drawing to the screen
- skia::DrawToNativeContext(canvas, paint_dc_, ps_.rcPaint.left,
- ps_.rcPaint.top, NULL);
- }
- if (for_paint_)
- EndPaint(hwnd_, &ps_);
- }
-
- // Returns true if the invalid region is empty. The caller should call this
- // function to determine if anything needs painting.
- bool isEmpty() const {
- return ps_.rcPaint.right - ps_.rcPaint.left == 0 ||
- ps_.rcPaint.bottom - ps_.rcPaint.top == 0;
- }
-
- // Use to access the Windows painting parameters, especially useful for
- // getting the bounding rect for painting: paintstruct().rcPaint
- const PAINTSTRUCT& paintStruct() const {
- return ps_;
- }
-
- // Returns the DC that will be painted to
- HDC paintDC() const {
- return paint_dc_;
- }
-
- protected:
- HWND hwnd_;
- HDC paint_dc_;
- PAINTSTRUCT ps_;
-
- private:
- void initPaint(bool opaque) {
- paint_dc_ = BeginPaint(hwnd_, &ps_);
-
- init(opaque);
- }
-
- void init(bool opaque) {
- skia::PlatformCanvas* canvas = platform_canvas();
- // FIXME(brettw) for ClearType, we probably want to expand the bounds of
- // painting by one pixel so that the boundaries will be correct (ClearType
- // text can depend on the adjacent pixel). Then we would paint just the
- // inset pixels to the screen.
- const int width = ps_.rcPaint.right - ps_.rcPaint.left;
- const int height = ps_.rcPaint.bottom - ps_.rcPaint.top;
- if (!canvas->initialize(width, height, opaque, NULL)) {
- // Cause a deliberate crash;
- __debugbreak();
- _exit(1);
- }
- canvas->clear(SkColorSetARGB(0, 0, 0, 0));
-
- // This will bring the canvas into the screen coordinate system for the
- // dirty rect
- canvas->translate(SkIntToScalar(-ps_.rcPaint.left),
- SkIntToScalar(-ps_.rcPaint.top));
- }
-
- // If true, this canvas was created for a BeginPaint.
- const bool for_paint_;
-
- // Disallow copy and assign.
- CanvasSkiaPaint(const CanvasSkiaPaint&);
- CanvasSkiaPaint& operator=(const CanvasSkiaPaint&);
-};
-
-} // namespace gfx
-
-#endif // UI_GFX_CANVAS_PAINT_WIN_H_
diff --git a/ui/gfx/canvas_skia_paint.h b/ui/gfx/canvas_skia_paint.h
index 3f21f5c..ad92d94 100644
--- a/ui/gfx/canvas_skia_paint.h
+++ b/ui/gfx/canvas_skia_paint.h
@@ -5,19 +5,37 @@
#ifndef UI_GFX_CANVAS_SKIA_PAINT_H_
#define UI_GFX_CANVAS_SKIA_PAINT_H_
-// This file provides an easy way to include the appropriate CanvasPaint
-// header file on your platform.
-
-#if defined(WIN32)
-#include "ui/gfx/canvas_paint_win.h"
-#elif defined(__APPLE__)
-#include "ui/gfx/canvas_paint_mac.h"
-#elif defined(__linux__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__sun)
-#if defined(TOOLKIT_GTK)
-#include "ui/gfx/canvas_paint_gtk.h"
-#else
-#error "No canvas paint for this platform"
-#endif
-#endif
+#include "base/logging.h"
+#include "skia/ext/canvas_paint.h"
+#include "ui/gfx/canvas.h"
+#include "ui/gfx/size.h"
+
+// Define a gfx::CanvasSkiaPaint type that wraps our gfx::Canvas like the
+// skia::PlatformCanvasPaint wraps PlatformCanvas.
+
+namespace skia {
+
+template<> inline
+PlatformCanvas* GetPlatformCanvas(skia::CanvasPaintT<gfx::Canvas>* canvas) {
+ PlatformCanvas* platform_canvas = canvas->platform_canvas();
+ DCHECK(platform_canvas);
+ return platform_canvas;
+}
+
+template<> inline
+void RecreateBackingCanvas(skia::CanvasPaintT<gfx::Canvas>* canvas,
+ int width, int height, float scale, bool opaque) {
+ ui::ScaleFactor scale_factor = ui::GetScaleFactorFromScale(scale);
+ canvas->RecreateBackingCanvas(gfx::Size(width, height), scale_factor,
+ opaque);
+}
+
+} // namespace skia
+
+namespace gfx {
+
+typedef skia::CanvasPaintT<Canvas> CanvasSkiaPaint;
+
+} // namespace gfx
#endif // UI_GFX_CANVAS_SKIA_PAINT_H_