diff options
author | backer@chromium.org <backer@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-08-26 18:14:45 +0000 |
---|---|---|
committer | backer@chromium.org <backer@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-08-26 18:14:45 +0000 |
commit | a4f857f0cafb41c3d7c3fd50c6b39c99e629b48a (patch) | |
tree | 521a058f131d900136105ce2ce3c368991de5ad1 /skia/ext/canvas_paint_wayland.h | |
parent | 3a1381d637b14d103c581990451f92877107893e (diff) | |
download | chromium_src-a4f857f0cafb41c3d7c3fd50c6b39c99e629b48a.zip chromium_src-a4f857f0cafb41c3d7c3fd50c6b39c99e629b48a.tar.gz chromium_src-a4f857f0cafb41c3d7c3fd50c6b39c99e629b48a.tar.bz2 |
Wayland support for views. views_desktop on Wayland.
This CL depends on:
* http://codereview.chromium.org/7457023
* http://codereview.chromium.org/7467007
* http://codereview.chromium.org/7473010
Wayland requires newer libraries than Ubuntu currently provides. I've created a
list of required dependencies:
https://sites.google.com/a/google.com/chrome_on_wayland/home/wayland-build-dependencies
BUG=
TEST=Built Chrome to verify that Wayland dependencies and changes don't interfere with
the usual build.
Review URL: http://codereview.chromium.org/7464027
Patch from Daniel Nicoara <dnicoara@chromium.org>.
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@98453 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'skia/ext/canvas_paint_wayland.h')
-rw-r--r-- | skia/ext/canvas_paint_wayland.h | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/skia/ext/canvas_paint_wayland.h b/skia/ext/canvas_paint_wayland.h new file mode 100644 index 0000000..2afdb01 --- /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. + CanvasPaintT(cairo_surface_t* cairo_window_surface, + 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_ |