1// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef UI_GFX_CANVAS_PAINT_WIN_H_
6#define UI_GFX_CANVAS_PAINT_WIN_H_
7
8#include "skia/ext/platform_canvas.h"
9#include "ui/gfx/canvas.h"
10#include "ui/gfx/size.h"
11#include "ui/gfx/win/dpi.h"
12
13namespace gfx {
14
15// A class designed to help with WM_PAINT operations on Windows. It will create
16// the bitmap and canvas with the correct size and transform for the dirty rect.
17// The bitmap will be automatically painted to the screen on destruction.
18//
19// You MUST call isEmpty before painting to determine if anything needs
20// painting. Sometimes the dirty rect can actually be empty, and this makes
21// the bitmap functions we call unhappy. The caller should not paint in this
22// case.
23//
24// Therefore, all you need to do is:
25//   case WM_PAINT: {
26//     PAINTSTRUCT ps;
27//     HDC hdc = BeginPaint(hwnd, &ps);
28//     gfx::CanvasSkiaPaint canvas(hwnd, hdc, ps);
29//     if (!canvas.isEmpty()) {
30//       ... paint to the canvas ...
31//     }
32//     EndPaint(hwnd, &ps);
33//     return 0;
34//   }
35// Note: The created context is always inialized to (0, 0, 0, 0).
36class GFX_EXPORT CanvasSkiaPaint : public Canvas {
37 public:
38  // This constructor assumes the canvas is opaque.
39  CanvasSkiaPaint(HWND hwnd, HDC dc, const PAINTSTRUCT& ps);
40  virtual ~CanvasSkiaPaint();
41
42  // Creates a CanvasSkiaPaint for the specified region that paints to the
43  // specified dc.
44  CanvasSkiaPaint(HDC dc, bool opaque, int x, int y, int w, int h);
45
46  // Returns the rectangle that is invalid.
47  virtual gfx::Rect GetInvalidRect() const;
48
49  // Returns true if the invalid region is empty. The caller should call this
50  // function to determine if anything needs painting.
51  bool is_empty() const {
52    return ps_.rcPaint.right - ps_.rcPaint.left == 0 ||
53           ps_.rcPaint.bottom - ps_.rcPaint.top == 0;
54  };
55
56  // Use to access the Windows painting parameters, especially useful for
57  // getting the bounding rect for painting: paintstruct().rcPaint
58  const PAINTSTRUCT& paint_struct() const { return ps_; }
59
60  // Returns the DC that will be painted to
61  HDC paint_dc() const { return paint_dc_; }
62
63 private:
64  void Init(bool opaque);
65
66  HWND hwnd_;
67  HDC paint_dc_;
68  PAINTSTRUCT ps_;
69
70  // Disallow copy and assign.
71  DISALLOW_COPY_AND_ASSIGN(CanvasSkiaPaint);
72};
73
74}  // namespace gfx
75
76#endif  // UI_GFX_CANVAS_PAINT_WIN_H_
77