Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(880)

Unified Diff: skia/ext/bitmap_platform_device_linux.cc

Issue 59133008: ozone: Support building without cairo (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase & fix whitespace Created 7 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « skia/ext/bitmap_platform_device_linux.h ('k') | skia/ext/bitmap_platform_device_skia.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: skia/ext/bitmap_platform_device_linux.cc
diff --git a/skia/ext/bitmap_platform_device_linux.cc b/skia/ext/bitmap_platform_device_linux.cc
deleted file mode 100644
index f259c6fd319546a48fd3a79d64ab6618f86076d6..0000000000000000000000000000000000000000
--- a/skia/ext/bitmap_platform_device_linux.cc
+++ /dev/null
@@ -1,219 +0,0 @@
-// Copyright (c) 2012 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.
-
-#include "skia/ext/bitmap_platform_device_linux.h"
-#include "skia/ext/bitmap_platform_device_data.h"
-#include "skia/ext/platform_canvas.h"
-
-#if defined(OS_OPENBSD)
-#include <cairo.h>
-#else
-#include <cairo/cairo.h>
-#endif
-
-namespace skia {
-
-namespace {
-
-void LoadMatrixToContext(cairo_t* context, const SkMatrix& matrix) {
- cairo_matrix_t cairo_matrix;
- cairo_matrix_init(&cairo_matrix,
- SkScalarToFloat(matrix.getScaleX()),
- SkScalarToFloat(matrix.getSkewY()),
- SkScalarToFloat(matrix.getSkewX()),
- SkScalarToFloat(matrix.getScaleY()),
- SkScalarToFloat(matrix.getTranslateX()),
- SkScalarToFloat(matrix.getTranslateY()));
- cairo_set_matrix(context, &cairo_matrix);
-}
-
-void LoadClipToContext(cairo_t* context, const SkRegion& clip) {
- cairo_reset_clip(context);
-
- // TODO(brettw) support non-rect clips.
- SkIRect bounding = clip.getBounds();
- cairo_rectangle(context, bounding.fLeft, bounding.fTop,
- bounding.fRight - bounding.fLeft,
- bounding.fBottom - bounding.fTop);
- cairo_clip(context);
-}
-
-} // namespace
-
-BitmapPlatformDevice::BitmapPlatformDeviceData::BitmapPlatformDeviceData(
- cairo_surface_t* surface)
- : surface_(surface),
- config_dirty_(true),
- transform_(SkMatrix::I()) { // Want to load the config next time.
- bitmap_context_ = cairo_create(surface);
-}
-
-BitmapPlatformDevice::BitmapPlatformDeviceData::~BitmapPlatformDeviceData() {
- cairo_destroy(bitmap_context_);
- cairo_surface_destroy(surface_);
-}
-
-void BitmapPlatformDevice::BitmapPlatformDeviceData::SetMatrixClip(
- const SkMatrix& transform,
- const SkRegion& region) {
- transform_ = transform;
- clip_region_ = region;
- config_dirty_ = true;
-}
-
-void BitmapPlatformDevice::BitmapPlatformDeviceData::LoadConfig() {
- if (!config_dirty_ || !bitmap_context_)
- return; // Nothing to do.
- config_dirty_ = false;
-
- // Load the identity matrix since this is what our clip is relative to.
- cairo_matrix_t cairo_matrix;
- cairo_matrix_init_identity(&cairo_matrix);
- cairo_set_matrix(bitmap_context_, &cairo_matrix);
-
- LoadClipToContext(bitmap_context_, clip_region_);
- LoadMatrixToContext(bitmap_context_, transform_);
-}
-
-// We use this static factory function instead of the regular constructor so
-// that we can create the pixel data before calling the constructor. This is
-// required so that we can call the base class' constructor with the pixel
-// data.
-BitmapPlatformDevice* BitmapPlatformDevice::Create(int width, int height,
- bool is_opaque,
- cairo_surface_t* surface) {
- if (cairo_surface_status(surface) != CAIRO_STATUS_SUCCESS) {
- cairo_surface_destroy(surface);
- return NULL;
- }
- SkBitmap bitmap;
- bitmap.setConfig(SkBitmap::kARGB_8888_Config, width, height,
- cairo_image_surface_get_stride(surface),
- is_opaque ? kOpaque_SkAlphaType : kPremul_SkAlphaType);
- bitmap.setPixels(cairo_image_surface_get_data(surface));
-
- // The device object will take ownership of the graphics context.
- return new BitmapPlatformDevice
- (bitmap, new BitmapPlatformDeviceData(surface));
-}
-
-BitmapPlatformDevice* BitmapPlatformDevice::Create(int width, int height,
- bool is_opaque) {
- // This initializes the bitmap to all zeros.
- cairo_surface_t* surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32,
- width, height);
-
- BitmapPlatformDevice* device = Create(width, height, is_opaque, surface);
-
-#ifndef NDEBUG
- if (device && is_opaque) // Fill with bright bluish green
- device->eraseColor(SkColorSetARGB(255, 0, 255, 128));
-#endif
-
- return device;
-}
-
-BitmapPlatformDevice* BitmapPlatformDevice::CreateAndClear(int width,
- int height,
- bool is_opaque) {
- // The Linux port always constructs initialized bitmaps, so there is no extra
- // work to perform here.
- return Create(width, height, is_opaque);
-}
-
-BitmapPlatformDevice* BitmapPlatformDevice::Create(int width, int height,
- bool is_opaque,
- uint8_t* data) {
- cairo_surface_t* surface = cairo_image_surface_create_for_data(
- data, CAIRO_FORMAT_ARGB32, width, height,
- cairo_format_stride_for_width(CAIRO_FORMAT_ARGB32, width));
-
- return Create(width, height, is_opaque, surface);
-}
-
-// The device will own the bitmap, which corresponds to also owning the pixel
-// data. Therefore, we do not transfer ownership to the SkBitmapDevice's bitmap.
-BitmapPlatformDevice::BitmapPlatformDevice(
- const SkBitmap& bitmap,
- BitmapPlatformDeviceData* data)
- : SkBitmapDevice(bitmap),
- data_(data) {
- SetPlatformDevice(this, this);
-}
-
-BitmapPlatformDevice::~BitmapPlatformDevice() {
-}
-
-SkBaseDevice* BitmapPlatformDevice::onCreateCompatibleDevice(
- SkBitmap::Config config, int width, int height, bool isOpaque,
- Usage /*usage*/) {
- SkASSERT(config == SkBitmap::kARGB_8888_Config);
- return BitmapPlatformDevice::Create(width, height, isOpaque);
-}
-
-cairo_t* BitmapPlatformDevice::BeginPlatformPaint() {
- data_->LoadConfig();
- cairo_t* cairo = data_->bitmap_context();
- cairo_surface_t* surface = cairo_get_target(cairo);
- // Tell cairo to flush anything it has pending.
- cairo_surface_flush(surface);
- // Tell Cairo that we (probably) modified (actually, will modify) its pixel
- // buffer directly.
- cairo_surface_mark_dirty(surface);
- return cairo;
-}
-
-void BitmapPlatformDevice::DrawToNativeContext(
- PlatformSurface surface, int x, int y, const PlatformRect* src_rect) {
- // Should never be called on Linux.
- SkASSERT(false);
-}
-
-void BitmapPlatformDevice::setMatrixClip(const SkMatrix& transform,
- const SkRegion& region,
- const SkClipStack&) {
- data_->SetMatrixClip(transform, region);
-}
-
-// PlatformCanvas impl
-
-SkCanvas* CreatePlatformCanvas(int width, int height, bool is_opaque,
- uint8_t* data, OnFailureType failureType) {
- skia::RefPtr<SkBaseDevice> dev = skia::AdoptRef(
- BitmapPlatformDevice::Create(width, height, is_opaque, data));
- return CreateCanvas(dev, failureType);
-}
-
-// Port of PlatformBitmap to linux
-PlatformBitmap::~PlatformBitmap() {
- cairo_destroy(surface_);
-}
-
-bool PlatformBitmap::Allocate(int width, int height, bool is_opaque) {
- // The SkBitmap allocates and owns the bitmap memory; PlatformBitmap owns the
- // cairo drawing context tied to the bitmap. The SkBitmap's pixelRef can
- // outlive the PlatformBitmap if additional copies are made.
- int stride = cairo_format_stride_for_width(CAIRO_FORMAT_ARGB32, width);
- bitmap_.setConfig(SkBitmap::kARGB_8888_Config, width, height, stride,
- is_opaque ? kOpaque_SkAlphaType : kPremul_SkAlphaType);
- if (!bitmap_.allocPixels()) // Using the default allocator.
- return false;
-
- cairo_surface_t* surf = cairo_image_surface_create_for_data(
- reinterpret_cast<unsigned char*>(bitmap_.getPixels()),
- CAIRO_FORMAT_ARGB32,
- width,
- height,
- stride);
- if (cairo_surface_status(surf) != CAIRO_STATUS_SUCCESS) {
- cairo_surface_destroy(surf);
- return false;
- }
-
- surface_ = cairo_create(surf);
- cairo_surface_destroy(surf);
- return true;
-}
-
-} // namespace skia
« no previous file with comments | « skia/ext/bitmap_platform_device_linux.h ('k') | skia/ext/bitmap_platform_device_skia.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698