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 |