aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/core/SkBitmapProcShader.cpp6
-rw-r--r--src/core/SkBitmapProcShader.h1
-rw-r--r--src/core/SkCanvas.cpp4
-rw-r--r--src/core/SkPicturePreroll.cpp162
-rw-r--r--src/core/SkPictureShader.cpp4
-rw-r--r--src/core/SkPictureShader.h1
-rw-r--r--src/image/SkImage.cpp4
-rw-r--r--src/image/SkImage_Base.h2
-rw-r--r--src/image/SkImage_Raster.cpp8
9 files changed, 190 insertions, 2 deletions
diff --git a/src/core/SkBitmapProcShader.cpp b/src/core/SkBitmapProcShader.cpp
index 456e0d4920..e6ed1136c0 100644
--- a/src/core/SkBitmapProcShader.cpp
+++ b/src/core/SkBitmapProcShader.cpp
@@ -112,6 +112,12 @@ size_t SkBitmapProcShader::contextSize() const {
return sizeof(BitmapProcShaderContext) + sizeof(SkBitmapProcState);
}
+void SkBitmapProcShader::onPreroll() const {
+ SkBitmap bm(fRawBitmap);
+ bm.lockPixels();
+ bm.unlockPixels();
+}
+
SkBitmapProcShader::BitmapProcShaderContext::BitmapProcShaderContext(
const SkBitmapProcShader& shader, const ContextRec& rec, SkBitmapProcState* state)
: INHERITED(shader, rec)
diff --git a/src/core/SkBitmapProcShader.h b/src/core/SkBitmapProcShader.h
index f73d56f2fb..dc361542da 100644
--- a/src/core/SkBitmapProcShader.h
+++ b/src/core/SkBitmapProcShader.h
@@ -57,6 +57,7 @@ public:
protected:
void flatten(SkWriteBuffer&) const SK_OVERRIDE;
Context* onCreateContext(const ContextRec&, void* storage) const SK_OVERRIDE;
+ void onPreroll() const SK_OVERRIDE;
SkBitmap fRawBitmap; // experimental for RLE encoding
uint8_t fTileModeX, fTileModeY;
diff --git a/src/core/SkCanvas.cpp b/src/core/SkCanvas.cpp
index 13b84e7f0f..5b37e08b30 100644
--- a/src/core/SkCanvas.cpp
+++ b/src/core/SkCanvas.cpp
@@ -482,9 +482,9 @@ private:
typedef SkBitmapDevice INHERITED;
};
-SkCanvas::SkCanvas(int width, int height)
+SkCanvas::SkCanvas(int width, int height, const SkSurfaceProps* props)
: fMCStack(sizeof(MCRec), fMCRecStorage, sizeof(fMCRecStorage))
- , fProps(SkSurfaceProps::kLegacyFontHost_InitType)
+ , fProps(SkSurfacePropsCopyOrDefault(props))
{
inc_canvas();
diff --git a/src/core/SkPicturePreroll.cpp b/src/core/SkPicturePreroll.cpp
new file mode 100644
index 0000000000..b0a4b17f56
--- /dev/null
+++ b/src/core/SkPicturePreroll.cpp
@@ -0,0 +1,162 @@
+/*
+ * Copyright 2015 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include "SkCanvas.h"
+#include "SkPicture.h"
+
+class SkPrerollCanvas : public SkCanvas {
+public:
+ SkPrerollCanvas(int width, int height, const SkSurfaceProps* props)
+ : SkCanvas(width, height, props)
+ {}
+
+protected:
+ void onDrawDRRect(const SkRRect&, const SkRRect&, const SkPaint& paint) SK_OVERRIDE {
+ this->handlePaint(paint);
+ }
+
+ void onDrawText(const void*, size_t, SkScalar, SkScalar, const SkPaint& paint) SK_OVERRIDE {
+ this->handlePaint(paint);
+ }
+
+ void onDrawPosText(const void*, size_t, const SkPoint[], const SkPaint& paint) SK_OVERRIDE {
+ this->handlePaint(paint);
+ }
+
+ void onDrawPosTextH(const void*, size_t, const SkScalar[], SkScalar,
+ const SkPaint& paint) SK_OVERRIDE {
+ this->handlePaint(paint);
+ }
+
+ void onDrawTextOnPath(const void*, size_t, const SkPath&, const SkMatrix*,
+ const SkPaint& paint) SK_OVERRIDE {
+ this->handlePaint(paint);
+ }
+
+ void onDrawTextBlob(const SkTextBlob*, SkScalar, SkScalar, const SkPaint& paint) SK_OVERRIDE {
+ this->handlePaint(paint);
+ }
+
+ void onDrawPatch(const SkPoint[12], const SkColor[4], const SkPoint[4], SkXfermode*,
+ const SkPaint& paint) SK_OVERRIDE {
+ this->handlePaint(paint);
+ }
+
+ void onDrawPaint(const SkPaint& paint) SK_OVERRIDE {
+ this->handlePaint(paint);
+ }
+
+ void onDrawRect(const SkRect&, const SkPaint& paint) SK_OVERRIDE {
+ this->handlePaint(paint);
+ }
+
+ void onDrawOval(const SkRect&, const SkPaint& paint) SK_OVERRIDE {
+ this->handlePaint(paint);
+ }
+
+ void onDrawRRect(const SkRRect&, const SkPaint& paint) SK_OVERRIDE {
+ this->handlePaint(paint);
+ }
+
+ void onDrawPoints(PointMode, size_t, const SkPoint[], const SkPaint& paint) {
+ this->handlePaint(paint);
+ }
+
+ void onDrawVertices(VertexMode, int, const SkPoint[], const SkPoint[], const SkColor[],
+ SkXfermode*, const uint16_t[], int, const SkPaint& paint) SK_OVERRIDE {
+ this->handlePaint(paint);
+ }
+
+ void onDrawPath(const SkPath&, const SkPaint& paint) SK_OVERRIDE {
+ this->handlePaint(paint);
+ }
+
+ void onDrawImage(const SkImage* image, SkScalar, SkScalar, const SkPaint* paint) SK_OVERRIDE {
+ this->handleImage(image);
+ if (paint) {
+ this->handlePaint(*paint);
+ }
+ }
+
+ void onDrawImageRect(const SkImage* image, const SkRect*, const SkRect&,
+ const SkPaint* paint) SK_OVERRIDE {
+ this->handleImage(image);
+ if (paint) {
+ this->handlePaint(*paint);
+ }
+ }
+
+ void onDrawBitmap(const SkBitmap& bm, SkScalar, SkScalar, const SkPaint* paint) SK_OVERRIDE {
+ this->handleBitmap(bm);
+ if (paint) {
+ this->handlePaint(*paint);
+ }
+ }
+
+ void onDrawBitmapRect(const SkBitmap& bm, const SkRect*, const SkRect&, const SkPaint* paint,
+ DrawBitmapRectFlags) SK_OVERRIDE {
+ this->handleBitmap(bm);
+ if (paint) {
+ this->handlePaint(*paint);
+ }
+ }
+
+ void onDrawBitmapNine(const SkBitmap& bm, const SkIRect&, const SkRect&,
+ const SkPaint* paint) SK_OVERRIDE {
+ this->handleBitmap(bm);
+ if (paint) {
+ this->handlePaint(*paint);
+ }
+ }
+
+ void onDrawSprite(const SkBitmap& bm, int, int, const SkPaint* paint) SK_OVERRIDE {
+ this->handleBitmap(bm);
+ if (paint) {
+ this->handlePaint(*paint);
+ }
+ }
+
+private:
+ void handlePaint(const SkPaint& paint) {
+ const SkShader* shader = paint.getShader();
+ if (shader) {
+ shader->preroll();
+ }
+ }
+
+ void handleImage(const SkImage* image) {
+ image->preroll();
+ }
+
+ void handleBitmap(const SkBitmap& bitmap) {
+ SkBitmap bm(bitmap);
+ bm.lockPixels();
+ }
+
+ typedef SkCanvas INHERITED;
+};
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+void SkPicture::preroll(const SkRect* srcBounds, const SkMatrix* initialMatrix,
+ const SkSurfaceProps* props, void* gpuCacheAccessor) const {
+ SkRect bounds = this->cullRect();
+ if (srcBounds && !bounds.intersect(*srcBounds)) {
+ return;
+ }
+
+ const SkIRect ibounds = bounds.roundOut();
+ if (ibounds.isEmpty()) {
+ return;
+ }
+
+ SkPrerollCanvas canvas(ibounds.width(), ibounds.height(), props);
+
+ canvas.translate(-SkIntToScalar(ibounds.left()), -SkIntToScalar(ibounds.top()));
+ canvas.drawPicture(this, initialMatrix, NULL);
+}
+
diff --git a/src/core/SkPictureShader.cpp b/src/core/SkPictureShader.cpp
index 819a0d0ae7..36b55cae66 100644
--- a/src/core/SkPictureShader.cpp
+++ b/src/core/SkPictureShader.cpp
@@ -221,6 +221,10 @@ SkShader::Context* SkPictureShader::onCreateContext(const ContextRec& rec, void*
return PictureShaderContext::Create(storage, *this, rec, bitmapShader);
}
+void SkPictureShader::onPreroll() const {
+ fPicture->preroll(NULL, NULL, NULL, NULL);
+}
+
/////////////////////////////////////////////////////////////////////////////////////////
SkShader::Context* SkPictureShader::PictureShaderContext::Create(void* storage,
diff --git a/src/core/SkPictureShader.h b/src/core/SkPictureShader.h
index 8df9f539b8..7b07b851ef 100644
--- a/src/core/SkPictureShader.h
+++ b/src/core/SkPictureShader.h
@@ -37,6 +37,7 @@ protected:
SkPictureShader(SkReadBuffer&);
void flatten(SkWriteBuffer&) const SK_OVERRIDE;
Context* onCreateContext(const ContextRec&, void* storage) const SK_OVERRIDE;
+ void onPreroll() const SK_OVERRIDE;
private:
SkPictureShader(const SkPicture*, TileMode, TileMode, const SkMatrix*, const SkRect*);
diff --git a/src/image/SkImage.cpp b/src/image/SkImage.cpp
index 109808842e..35fff1f242 100644
--- a/src/image/SkImage.cpp
+++ b/src/image/SkImage.cpp
@@ -118,6 +118,10 @@ SkImage* SkImage::newImage(int newWidth, int newHeight, const SkIRect* subset,
return as_IB(this)->onNewImage(newWidth, newHeight, subset, quality);
}
+void SkImage::preroll() const {
+ as_IB(this)->onPreroll();
+}
+
///////////////////////////////////////////////////////////////////////////////
static bool raster_canvas_supports(const SkImageInfo& info) {
diff --git a/src/image/SkImage_Base.h b/src/image/SkImage_Base.h
index 512c80c44b..ca0559ffd0 100644
--- a/src/image/SkImage_Base.h
+++ b/src/image/SkImage_Base.h
@@ -63,6 +63,8 @@ public:
virtual SkImage* onNewImage(int newWidth, int newHeight, const SkIRect* subset,
SkFilterQuality) const;
+ virtual void onPreroll() const {}
+
private:
const SkSurfaceProps fProps;
diff --git a/src/image/SkImage_Raster.cpp b/src/image/SkImage_Raster.cpp
index 1dd57d6dc2..940d532378 100644
--- a/src/image/SkImage_Raster.cpp
+++ b/src/image/SkImage_Raster.cpp
@@ -58,6 +58,7 @@ public:
bool onReadPixels(const SkImageInfo&, void*, size_t, int srcX, int srcY) const SK_OVERRIDE;
const void* onPeekPixels(SkImageInfo*, size_t* /*rowBytes*/) const SK_OVERRIDE;
bool getROPixels(SkBitmap*) const SK_OVERRIDE;
+ void onPreroll() const SK_OVERRIDE;
// exposed for SkSurface_Raster via SkNewImageFromPixelRef
SkImage_Raster(const SkImageInfo&, SkPixelRef*, size_t rowBytes, const SkSurfaceProps*);
@@ -154,6 +155,12 @@ bool SkImage_Raster::getROPixels(SkBitmap* dst) const {
return true;
}
+void SkImage_Raster::onPreroll() const {
+ SkBitmap bm(fBitmap);
+ bm.lockPixels();
+ bm.unlockPixels();
+}
+
///////////////////////////////////////////////////////////////////////////////
SkImage* SkImage::NewRasterCopy(const SkImageInfo& info, const void* pixels, size_t rowBytes) {
@@ -208,3 +215,4 @@ const SkPixelRef* SkBitmapImageGetPixelRef(const SkImage* image) {
bool SkImage_Raster::isOpaque() const {
return fBitmap.isOpaque();
}
+