blob: 118e7082c256b77d95af74623ce9010e4539f956 [file] [log] [blame]
// Copyright (c) 2009 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_VECTOR_PLATFORM_DEVICE_LINUX_H_
#define SKIA_EXT_VECTOR_PLATFORM_DEVICE_LINUX_H_
#include "skia/ext/platform_device.h"
#include "third_party/skia/include/core/SkMatrix.h"
#include "third_party/skia/include/core/SkRegion.h"
namespace skia {
// This device is basically a wrapper that provides a surface for SkCanvas
// to draw into. It is basically an adaptor which converts skia APIs into
// cooresponding Cairo APIs and outputs to a Cairo surface. Please NOTE that
// since it is completely vectorial, the bitmap content in it is thus
// meaningless.
class VectorPlatformDevice : public PlatformDevice {
public:
// Factory function. Ownership of |context| is not transferred.
static VectorPlatformDevice* create(PlatformSurface context,
int width, int height);
virtual ~VectorPlatformDevice();
virtual bool IsVectorial() { return true; }
virtual PlatformSurface beginPlatformPaint() { return context_; }
// We translate following skia APIs into corresponding Cairo APIs.
virtual void drawBitmap(const SkDraw& draw, const SkBitmap& bitmap,
const SkMatrix& matrix, const SkPaint& paint);
virtual void drawDevice(const SkDraw& draw, SkDevice*, int x, int y,
const SkPaint&);
virtual void drawPaint(const SkDraw& draw, const SkPaint& paint);
virtual void drawPath(const SkDraw& draw, const SkPath& path,
const SkPaint& paint);
virtual void drawPoints(const SkDraw& draw, SkCanvas::PointMode mode,
size_t count, const SkPoint[], const SkPaint& paint);
virtual void drawPosText(const SkDraw& draw, const void* text, size_t len,
const SkScalar pos[], SkScalar constY,
int scalarsPerPos, const SkPaint& paint);
virtual void drawRect(const SkDraw& draw, const SkRect& r,
const SkPaint& paint);
virtual void drawSprite(const SkDraw& draw, const SkBitmap& bitmap,
int x, int y, const SkPaint& paint);
virtual void drawText(const SkDraw& draw, const void* text, size_t len,
SkScalar x, SkScalar y, const SkPaint& paint);
virtual void drawTextOnPath(const SkDraw& draw, const void* text, size_t len,
const SkPath& path, const SkMatrix* matrix,
const SkPaint& paint);
virtual void drawVertices(const SkDraw& draw, SkCanvas::VertexMode,
int vertexCount,
const SkPoint verts[], const SkPoint texs[],
const SkColor colors[], SkXfermode* xmode,
const uint16_t indices[], int indexCount,
const SkPaint& paint);
virtual void setMatrixClip(const SkMatrix& transform,
const SkRegion& region);
// Clean up cached fonts. It is an error to call this while some
// VectorPlatformDevice callee is still using fonts created for it by this
// class.
static void ClearFontCache();
protected:
explicit VectorPlatformDevice(PlatformSurface context,
const SkBitmap& bitmap);
private:
// Apply paint's color in the context.
void ApplyPaintColor(const SkPaint& paint);
// Apply path's fill style in the context.
void ApplyFillStyle(const SkPath& path);
// Apply paint's stroke style in the context.
void ApplyStrokeStyle(const SkPaint& paint);
// Perform painting.
void DoPaintStyle(const SkPaint& paint);
// Draws a bitmap in the the device, using the currently loaded matrix.
void InternalDrawBitmap(const SkBitmap& bitmap, int x, int y,
const SkPaint& paint);
// Set up the clipping region for the context. Please note that now we only
// use the bounding box of the region for clipping.
// TODO(myhuang): Support non-rectangular clipping.
void LoadClipRegion(const SkRegion& clip);
// Use identity matrix to set up context's transformation.
void LoadIdentityTransformToContext();
// Use matrix to set up context's transformation.
void LoadTransformToContext(const SkMatrix& matrix);
// Selects the font associated with |font_id| in |context|.
// Return true on success.
bool SelectFontById(uint32_t font_id);
// Transformation assigned to the context.
SkMatrix transform_;
// The current clipping region.
SkRegion clip_region_;
// Device context.
PlatformSurface context_;
// Copy & assign are not supported.
VectorPlatformDevice(const VectorPlatformDevice&);
const VectorPlatformDevice& operator=(const VectorPlatformDevice&);
};
} // namespace skia
#endif // SKIA_EXT_VECTOR_PLATFORM_DEVICE_LINUX_H_