Chromium Code Reviews| Index: skia/ext/canvas_paint_wayland.h |
| diff --git a/skia/ext/canvas_paint_wayland.h b/skia/ext/canvas_paint_wayland.h |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..e8debb93a4ff5e3bc33d386615c12900d0f3e9ca |
| --- /dev/null |
| +++ b/skia/ext/canvas_paint_wayland.h |
| @@ -0,0 +1,109 @@ |
| +// 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 SKIA_EXT_CANVAS_PAINT_WAYLAND_H_ |
| +#define SKIA_EXT_CANVAS_PAINT_WAYLAND_H_ |
| +#pragma once |
| + |
| +#include "base/logging.h" |
| +#include "skia/ext/platform_canvas.h" |
| + |
| +namespace skia { |
| + |
| +// A class designed to translate skia painting into a region in a Wayland window |
| +// surface. On construction, it will set up a context for painting into, and on |
| +// destruction, it will commit it to the Wayland window surface. |
| +template <class T> |
| +class CanvasPaintT : public T { |
| + public: |
| + // This constructor assumes the result is opaque. |
| + explicit CanvasPaintT(cairo_surface_t* cairo_window_surface, |
|
sadrul
2011/08/22 18:44:11
Remove 'explicit'
|
| + cairo_rectangle_int_t* region) |
| + : context_(NULL), |
| + cairo_window_surface_(cairo_window_surface), |
| + region_(region), |
| + composite_alpha_(false) { |
| + init(true); |
| + } |
| + |
| + CanvasPaintT(cairo_surface_t* cairo_window_surface, |
| + cairo_rectangle_int_t* region, |
| + bool opaque) |
| + : context_(NULL), |
| + cairo_window_surface_(cairo_window_surface), |
| + region_(region), |
| + composite_alpha_(false) { |
| + init(opaque); |
| + } |
| + |
| + virtual ~CanvasPaintT() { |
| + if (!is_empty()) { |
| + T::restoreToCount(1); |
| + |
| + // Blit the dirty rect to the window. |
| + CHECK(cairo_window_surface_); |
| + cairo_t* cr = cairo_create(cairo_window_surface_); |
| + CHECK(cr); |
| + |
| + if (composite_alpha_) |
| + cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE); |
| + |
| + cairo_surface_t* source_surface = cairo_get_target(context_); |
| + CHECK(source_surface); |
| + // Flush cairo's cache of the surface. |
| + cairo_surface_mark_dirty(source_surface); |
| + cairo_set_source_surface(cr, source_surface, region_->x, region_->y); |
| + cairo_rectangle(cr, |
| + region_->x, |
| + region_->y, |
| + region_->width, |
| + region_->height); |
| + cairo_fill(cr); |
| + cairo_destroy(cr); |
| + } |
| + } |
| + |
| + // Sets whether the bitmap is composited in such a way that the alpha channel |
| + // is honored. This is only useful if you've enabled an RGBA colormap on the |
| + // widget. The default is false. |
| + void set_composite_alpha(bool composite_alpha) { |
| + composite_alpha_ = composite_alpha; |
| + } |
| + |
| + // 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 region_->width == 0 && region_->height == 0; |
| + } |
| + |
| + private: |
| + void init(bool opaque) { |
| + if (!T::initialize(region_->width, region_->height, opaque, NULL)) { |
| + // Cause a deliberate crash; |
| + CHECK(false); |
| + } |
| + |
| + // Need to translate so that the dirty region appears at the origin of the |
| + // surface. |
| + T::translate(-SkIntToScalar(region_->x), -SkIntToScalar(region_->y)); |
| + |
| + context_ = BeginPlatformPaint(this); |
| + } |
| + |
| + cairo_t* context_; |
| + cairo_surface_t* cairo_window_surface_; |
| + cairo_rectangle_int_t* region_; |
| + // See description above setter. |
| + bool composite_alpha_; |
| + |
| + // Disallow copy and assign. |
| + CanvasPaintT(const CanvasPaintT&); |
| + CanvasPaintT& operator=(const CanvasPaintT&); |
| +}; |
| + |
| +typedef CanvasPaintT<PlatformCanvas> PlatformCanvasPaint; |
| + |
| +} // namespace skia |
| + |
| +#endif // SKIA_EXT_CANVAS_PAINT_WAYLAND_H_ |