// 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/geometry/size.h"
#include "ui/gfx/win/dpi.h"

namespace gfx {

// A class designed to help with WM_PAINT operations on Windows. It 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: {
//     PAINTSTRUCT ps;
//     HDC hdc = BeginPaint(hwnd, &ps);
//     gfx::CanvasSkiaPaint canvas(hwnd, hdc, ps);
//     if (!canvas.isEmpty()) {
//       ... paint to the canvas ...
//     }
//     EndPaint(hwnd, &ps);
//     return 0;
//   }
// Note: The created context is always inialized to (0, 0, 0, 0).
class GFX_EXPORT CanvasSkiaPaint : public Canvas {
 public:
  // This constructor assumes the canvas is opaque.
  CanvasSkiaPaint(HWND hwnd, HDC dc, const PAINTSTRUCT& ps);
  virtual ~CanvasSkiaPaint();

  // Creates a CanvasSkiaPaint for the specified region that paints to the
  // specified dc.
  CanvasSkiaPaint(HDC dc, bool opaque, int x, int y, int w, int h);

  // Returns the rectangle that is invalid.
  virtual gfx::Rect GetInvalidRect() const;

  // 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 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& paint_struct() const { return ps_; }

  // Returns the DC that will be painted to
  HDC paint_dc() const { return paint_dc_; }

 private:
  void Init(bool opaque);

  HWND hwnd_;
  HDC paint_dc_;
  PAINTSTRUCT ps_;

  // Disallow copy and assign.
  DISALLOW_COPY_AND_ASSIGN(CanvasSkiaPaint);
};

}  // namespace gfx

#endif  // UI_GFX_CANVAS_PAINT_WIN_H_
