• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
13 namespace 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).
36 class 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.
is_empty()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
paint_struct()58   const PAINTSTRUCT& paint_struct() const { return ps_; }
59 
60   // Returns the DC that will be painted to
paint_dc()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