blob: 81e81ed79ff2b5884d1dc53d0cbfb160484029f2 [file] [log] [blame]
// 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_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__) || defined(__sun)
// 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<BitmapPlatformDeviceData> {
#endif
public:
#if defined(WIN32)
typedef HBITMAP PlatformContext;
#elif defined(__APPLE__)
typedef CGContextRef PlatformContext;
#elif defined(__linux__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__sun)
typedef cairo_t* PlatformContext;
#endif
#if defined(WIN32) || defined(__APPLE__)
explicit BitmapPlatformDeviceData(PlatformContext bitmap);
#elif defined(__linux__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__sun)
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__) || defined(__sun)
friend class base::RefCounted<BitmapPlatformDeviceData>;
#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__) || defined(__sun)
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_