Chromium Code Reviews| Index: ui/gfx/canvas_paint_win.h |
| diff --git a/ui/gfx/canvas_paint_win.h b/ui/gfx/canvas_paint_win.h |
| index 1316b9616bd7f0e719c4e7a0c14d62ea81ed7100..8523cc031ebaedfd6a55637b7adcff062949796a 100644 |
| --- a/ui/gfx/canvas_paint_win.h |
| +++ b/ui/gfx/canvas_paint_win.h |
| @@ -1,135 +1,138 @@ |
| -// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
|
kevers
2013/04/19 20:31:42
CRLF issue?
|
| -// 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" |
| -#include "ui/gfx/size.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 UI_EXPORT 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) { |
| - // 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; |
| - |
| - RecreateBackingCanvas(gfx::Size(width, height), ui::SCALE_FACTOR_100P, |
| - opaque); |
| - skia::PlatformCanvas* canvas = platform_canvas(); |
| - |
| - 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_ |
| +// 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/base/win/dpi.h" |
| +#include "ui/gfx/canvas.h" |
| +#include "ui/gfx/canvas_paint.h" |
| +#include "ui/gfx/size.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 UI_EXPORT 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) { |
| + // 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; |
| + |
| + RecreateBackingCanvas(gfx::Size(width, height), |
| + ui::GetScaleFactorFromScale(ui::win::GetDeviceScaleFactor()), |
| + opaque); |
| + skia::PlatformCanvas* canvas = platform_canvas(); |
| + |
| + canvas->clear(SkColorSetARGB(0, 0, 0, 0)); |
| + |
| + // This will bring the canvas into the screen coordinate system for the |
| + // dirty rect |
| + canvas->translate( |
| + SkScalarRoundToInt(-ps_.rcPaint.left/ui::win::GetDeviceScaleFactor()), |
| + SkScalarRoundToInt(-ps_.rcPaint.top/ui::win::GetDeviceScaleFactor())); |
| + } |
| + |
| + // 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_ |