Index: skia/ext/vector_platform_device_skia.cc |
diff --git a/skia/ext/vector_platform_device_skia.cc b/skia/ext/vector_platform_device_skia.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..cc88c419ed1f5069074a6e776e37d7a4a8c7617b |
--- /dev/null |
+++ b/skia/ext/vector_platform_device_skia.cc |
@@ -0,0 +1,254 @@ |
+// 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. |
+ |
+#include "skia/ext/vector_platform_device_skia.h" |
+ |
+#include "skia/ext/bitmap_platform_device.h" |
+#include "third_party/skia/include/core/SkClipStack.h" |
+#include "third_party/skia/include/core/SkDraw.h" |
+#include "third_party/skia/include/core/SkScalar.h" |
+#include "third_party/skia/include/core/SkRegion.h" |
Lei Zhang
2011/04/06 20:43:56
nit: SkRegion before SKScalar.
vandebo (ex-Chrome)
2011/04/06 22:01:37
Done.
|
+ |
+namespace skia { |
+ |
+SkDevice* VectorPlatformDeviceSkiaFactory::newDevice(SkCanvas* noUsed, |
+ SkBitmap::Config config, |
+ int width, int height, |
+ bool isOpaque, |
+ bool isForLayer) { |
+ SkASSERT(config == SkBitmap::kARGB_8888_Config); |
+ SkPDFDevice::OriginTransform flip = SkPDFDevice::kFlip_OriginTransform; |
+ if (isForLayer) |
+ flip = SkPDFDevice::kNoFlip_OriginTransform; |
+ return new VectorPlatformDeviceSkia(width, height, flip); |
+} |
+ |
+static inline SkBitmap makeABitmap(int width, int height) { |
+ SkBitmap bitmap; |
+ bitmap.setConfig(SkBitmap::kNo_Config, width, height); |
+ return bitmap; |
+} |
+ |
+VectorPlatformDeviceSkia::VectorPlatformDeviceSkia( |
+ int width, int height, SkPDFDevice::OriginTransform flip) |
+ : PlatformDevice(makeABitmap(width, height)), |
+ pdf_device_(new SkPDFDevice(width, height, flip)) { |
+ pdf_device_->unref(); // SkRefPtr and new both took a reference. |
+ base_transform_.reset(); |
+} |
+ |
+VectorPlatformDeviceSkia::~VectorPlatformDeviceSkia() { |
+} |
+ |
+bool VectorPlatformDeviceSkia::IsVectorial() { |
+ return true; |
+} |
+ |
+bool VectorPlatformDeviceSkia::IsNativeFontRenderingAllowed() { |
+ return false; |
+} |
+ |
+PlatformDevice::PlatformSurface VectorPlatformDeviceSkia::beginPlatformPaint() { |
+ // Even when drawing a vector representation of the page, we have to |
+ // provide a raster surface for plugins to render into - they don't have |
+ // a vector interface. Therefore we create a BitmapPlatformDevice here |
+ // and return the context from it, then layer on the raster data as an |
+ // image in endPlatformPaint. |
+ DCHECK(raster_surface_ == NULL); |
+#if defined(OS_WIN) |
+ raster_surface_ = BitmapPlatformDevice::create(pdf_device_->width(), |
+ pdf_device_->height(), |
+ false, /* not opaque */ |
+ NULL); |
+#elif defined(OS_LINUX) |
+ raster_surface_ = BitmapPlatformDevice::Create(pdf_device_->width(), |
+ pdf_device_->height(), |
+ false /* not opaque */); |
+#endif |
+ raster_surface_->unref(); // SkRefPtr and create both took a reference. |
+ |
+ // Set it to be transparent. |
+ SkCanvas canvas(raster_surface_.get()); |
+ SkPaint transparent; |
+ transparent.setColor(SK_ColorBLACK); |
+ canvas.drawPaint(transparent); |
+ return raster_surface_->beginPlatformPaint(); |
+} |
+ |
+void VectorPlatformDeviceSkia::endPlatformPaint() { |
+ DCHECK(raster_surface_ != NULL); |
+ SkPaint paint; |
+ pdf_device_->drawSprite(SkDraw(), |
+ raster_surface_->accessBitmap(false), |
+ base_transform_.getTranslateX(), |
+ base_transform_.getTranslateY(), |
+ paint); |
+ raster_surface_ = NULL; |
+} |
+ |
+SkDeviceFactory* VectorPlatformDeviceSkia::getDeviceFactory() { |
+ return SkNEW(VectorPlatformDeviceSkiaFactory); |
+} |
+ |
+uint32_t VectorPlatformDeviceSkia::getDeviceCapabilities() { |
+ return kVector_Capability; |
+} |
+ |
+int VectorPlatformDeviceSkia::width() const { |
+ return pdf_device_->width(); |
+} |
+ |
+int VectorPlatformDeviceSkia::height() const { |
+ return pdf_device_->height(); |
+} |
+ |
+void VectorPlatformDeviceSkia::setMatrixClip(const SkMatrix& matrix, |
+ const SkRegion& region, |
+ const SkClipStack& stack) { |
+ SkMatrix transform = base_transform_; |
+ transform.preConcat(matrix); |
+ |
+ DCHECK(SkMatrix::kTranslate_Mask == base_transform_.getType() || |
+ SkMatrix::kIdentity_Mask == base_transform_.getType()); |
+ SkRegion clip = region; |
+ clip.translate(base_transform_.getTranslateX(), |
+ base_transform_.getTranslateY()); |
+ |
+ pdf_device_->setMatrixClip(transform, clip, stack); |
+} |
+ |
+bool VectorPlatformDeviceSkia::readPixels(const SkIRect& srcRect, |
+ SkBitmap* bitmap) { |
+ return false; |
+} |
+ |
+void VectorPlatformDeviceSkia::drawPaint(const SkDraw& draw, |
+ const SkPaint& paint) { |
+ pdf_device_->drawPaint(draw, paint); |
+} |
+ |
+void VectorPlatformDeviceSkia::drawPoints(const SkDraw& draw, |
+ SkCanvas::PointMode mode, |
+ size_t count, const SkPoint pts[], |
+ const SkPaint& paint) { |
+ pdf_device_->drawPoints(draw, mode, count, pts, paint); |
+} |
+ |
+void VectorPlatformDeviceSkia::drawRect(const SkDraw& draw, |
+ const SkRect& rect, |
+ const SkPaint& paint) { |
+ pdf_device_->drawRect(draw, rect, paint); |
+} |
+ |
+void VectorPlatformDeviceSkia::drawPath(const SkDraw& draw, |
+ const SkPath& path, |
+ const SkPaint& paint, |
+ const SkMatrix* prePathMatrix, |
+ bool pathIsMutable) { |
+ pdf_device_->drawPath(draw, path, paint, prePathMatrix, pathIsMutable); |
+} |
+ |
+void VectorPlatformDeviceSkia::drawBitmap(const SkDraw& draw, |
+ const SkBitmap& bitmap, |
+ const SkIRect* srcRectOrNull, |
+ const SkMatrix& matrix, |
+ const SkPaint& paint) { |
+ pdf_device_->drawBitmap(draw, bitmap, srcRectOrNull, matrix, paint); |
+} |
+ |
+void VectorPlatformDeviceSkia::drawSprite(const SkDraw& draw, |
+ const SkBitmap& bitmap, |
+ int x, int y, |
+ const SkPaint& paint) { |
+ pdf_device_->drawSprite(draw, bitmap, x, y, paint); |
+} |
+ |
+void VectorPlatformDeviceSkia::drawText(const SkDraw& draw, |
+ const void* text, |
+ size_t byteLength, |
+ SkScalar x, |
+ SkScalar y, |
+ const SkPaint& paint) { |
+ pdf_device_->drawText(draw, text, byteLength, x, y, paint); |
+} |
+ |
+void VectorPlatformDeviceSkia::drawPosText(const SkDraw& draw, |
+ const void* text, |
+ size_t len, |
+ const SkScalar pos[], |
+ SkScalar constY, |
+ int scalarsPerPos, |
+ const SkPaint& paint) { |
+ pdf_device_->drawPosText(draw, text, len, pos, constY, scalarsPerPos, paint); |
+} |
+ |
+void VectorPlatformDeviceSkia::drawTextOnPath(const SkDraw& draw, |
+ const void* text, |
+ size_t len, |
+ const SkPath& path, |
+ const SkMatrix* matrix, |
+ const SkPaint& paint) { |
+ pdf_device_->drawTextOnPath(draw, text, len, path, matrix, paint); |
+} |
+ |
+void VectorPlatformDeviceSkia::drawVertices(const SkDraw& draw, |
+ SkCanvas::VertexMode vmode, |
+ int vertexCount, |
+ const SkPoint vertices[], |
+ const SkPoint texs[], |
+ const SkColor colors[], |
+ SkXfermode* xmode, |
+ const uint16_t indices[], |
+ int indexCount, |
+ const SkPaint& paint) { |
+ pdf_device_->drawVertices(draw, vmode, vertexCount, vertices, texs, colors, |
+ xmode, indices, indexCount, paint); |
+} |
+ |
+void VectorPlatformDeviceSkia::drawDevice(const SkDraw& draw, |
+ SkDevice* device, |
+ int x, |
+ int y, |
+ const SkPaint& paint) { |
+ SkDevice* real_device = device; |
+ if ((device->getDeviceCapabilities() & kVector_Capability)) { |
+ // Assume that a vectorial device means a VectorPlatformDeviceSkia, we need |
+ // to unwrap the embedded SkPDFDevice. |
+ VectorPlatformDeviceSkia* vector_device = |
+ static_cast<VectorPlatformDeviceSkia*>(device); |
+ real_device = vector_device->pdf_device_.get(); |
+ } |
+ pdf_device_->drawDevice(draw, real_device, x, y, paint); |
+} |
+ |
+#if defined(OS_WIN) |
+void VectorPlatformDeviceSkia::drawToHDC(HDC dc, |
+ int x, |
+ int y, |
+ const RECT* src_rect) { |
+ SkASSERT(false); |
+} |
+#endif |
+ |
+void VectorPlatformDeviceSkia::setInitialTransform(int xOffset, int yOffset, |
+ float scale_factor) { |
+ // TODO(vandebo) Supporting a scale factor is some work because we have to |
+ // transform both matrices and clips that come in, but Region only supports |
+ // translation. Instead, we could change SkPDFDevice to include it in the |
+ // initial transform. Delay that work until we would use it. Also checked |
+ // in setMatrixClip. |
+ DCHECK_EQ(1.0f, scale_factor); |
+ |
+ base_transform_.setTranslate(xOffset, yOffset); |
+ SkScalar scale = SkFloatToScalar(scale_factor); |
+ base_transform_.postScale(scale, scale); |
+ |
+ SkMatrix matrix; |
+ matrix.reset(); |
+ SkRegion region; |
+ SkClipStack stack; |
+ setMatrixClip(matrix, region, stack); |
+} |
+ |
+} // namespace skia |