15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/canvas.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/canvas_skia_paint.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/rect.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)namespace gfx {
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)CanvasSkiaPaint::CanvasSkiaPaint(HWND hwnd, HDC dc, const PAINTSTRUCT& ps)
14a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    : hwnd_(hwnd),
15a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      paint_dc_(dc) {
16a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  memset(&ps_, 0, sizeof(ps_));
17a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ps_.rcPaint.left = ps.rcPaint.left;
18a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ps_.rcPaint.right = ps.rcPaint.right;
19a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ps_.rcPaint.top = ps.rcPaint.top;
20a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ps_.rcPaint.bottom = ps.rcPaint.bottom;
21a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  Init(true);
22a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)CanvasSkiaPaint::CanvasSkiaPaint(HDC dc, bool opaque, int x, int y,
25a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                 int w, int h)
26a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    : hwnd_(NULL),
27a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      paint_dc_(dc) {
28a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  memset(&ps_, 0, sizeof(ps_));
29a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ps_.rcPaint.left = x;
30a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ps_.rcPaint.right = x + w;
31a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ps_.rcPaint.top = y;
32a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ps_.rcPaint.bottom = y + h;
33a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  Init(opaque);
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)CanvasSkiaPaint::~CanvasSkiaPaint() {
37a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (!is_empty()) {
38a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    skia::PlatformCanvas* canvas = platform_canvas();
39a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    canvas->restoreToCount(1);
40a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    // Commit the drawing to the screen
41a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    skia::DrawToNativeContext(canvas, paint_dc_, ps_.rcPaint.left,
42a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                              ps_.rcPaint.top, NULL);
43a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)gfx::Rect CanvasSkiaPaint::GetInvalidRect() const {
47a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  return gfx::Rect(paint_struct().rcPaint);
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
50a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void CanvasSkiaPaint::Init(bool opaque) {
51a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // FIXME(brettw) for ClearType, we probably want to expand the bounds of
52a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // painting by one pixel so that the boundaries will be correct (ClearType
53a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // text can depend on the adjacent pixel). Then we would paint just the
54a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // inset pixels to the screen.
55a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  const int width = ps_.rcPaint.right - ps_.rcPaint.left;
56a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  const int height = ps_.rcPaint.bottom - ps_.rcPaint.top;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  RecreateBackingCanvas(gfx::Size(width, height),
5968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      gfx::win::GetDeviceScaleFactor(),
60a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      opaque);
61a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  skia::PlatformCanvas* canvas = platform_canvas();
62a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
63a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  canvas->clear(SkColorSetARGB(0, 0, 0, 0));
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // This will bring the canvas into the screen coordinate system for the
66a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // dirty rect
67a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  canvas->translate(
6858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      -ps_.rcPaint.left / gfx::win::GetDeviceScaleFactor(),
6958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      -ps_.rcPaint.top / gfx::win::GetDeviceScaleFactor());
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace gfx
73