// Copyright (c) 2010 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_BITMAP_PLATFORM_DEVICE_DATA_H_ #define SKIA_EXT_BITMAP_PLATFORM_DEVICE_DATA_H_ #include "skia/ext/bitmap_platform_device.h" namespace skia { class BitmapPlatformDevice::BitmapPlatformDeviceData : #if defined(WIN32) || defined(__APPLE__) public SkRefCnt { #elif defined(__linux__) || defined(__FreeBSD__) || defined(__OpenBSD__) // These objects are reference counted and own a Cairo surface. The surface // is the backing store for a Skia bitmap and we reference count it so that // we can copy BitmapPlatformDevice objects without having to copy all the // image data. public base::RefCounted { #endif public: #if defined(WIN32) typedef HBITMAP PlatformContext; #elif defined(__APPLE__) typedef CGContextRef PlatformContext; #elif defined(__linux__) || defined(__FreeBSD__) || defined(__OpenBSD__) typedef cairo_t* PlatformContext; #endif #if defined(WIN32) || defined(__APPLE__) explicit BitmapPlatformDeviceData(PlatformContext bitmap); #elif defined(__linux__) || defined(__FreeBSD__) || defined(__OpenBSD__) explicit BitmapPlatformDeviceData(cairo_surface_t* surface); #endif #if defined(WIN32) // Create/destroy hdc_, which is the memory DC for our bitmap data. HDC GetBitmapDC(); void ReleaseBitmapDC(); bool IsBitmapDCCreated() const; #endif #if defined(__APPLE__) void ReleaseBitmapContext(); #endif // defined(__APPLE__) // Sets the transform and clip operations. This will not update the CGContext, // but will mark the config as dirty. The next call of LoadConfig will // pick up these changes. void SetMatrixClip(const SkMatrix& transform, const SkRegion& region); // Loads the current transform and clip into the context. Can be called even // when |bitmap_context_| is NULL (will be a NOP). void LoadConfig(); const SkMatrix& transform() const { return transform_; } PlatformContext bitmap_context() { return bitmap_context_; } private: #if defined(__linux__) || defined(__FreeBSD__) || defined(__OpenBSD__) friend class base::RefCounted; #endif virtual ~BitmapPlatformDeviceData(); // Lazily-created graphics context used to draw into the bitmap. PlatformContext bitmap_context_; #if defined(WIN32) // Lazily-created DC used to draw into the bitmap, see GetBitmapDC(). HDC hdc_; #elif defined(__linux__) || defined(__FreeBSD__) || defined(__OpenBSD__) cairo_surface_t *const surface_; #endif // True when there is a transform or clip that has not been set to the // context. The context is retrieved for every text operation, and the // transform and clip do not change as much. We can save time by not loading // the clip and transform for every one. bool config_dirty_; // Translation assigned to the context: we need to keep track of this // separately so it can be updated even if the context isn't created yet. SkMatrix transform_; // The current clipping SkRegion clip_region_; // Disallow copy & assign. BitmapPlatformDeviceData(const BitmapPlatformDeviceData&); BitmapPlatformDeviceData& operator=(const BitmapPlatformDeviceData&); }; } // namespace skia #endif // SKIA_EXT_BITMAP_PLATFORM_DEVICE_DATA_H_