| Index: src/utils/SkPictureUtils.cpp
|
| diff --git a/src/utils/SkPictureUtils.cpp b/src/utils/SkPictureUtils.cpp
|
| index dadd89a665990ff989d6a7aeb97df24a62519d8b..be7c431946c9d68d97df2f87b59febbe770ee04d 100644
|
| --- a/src/utils/SkPictureUtils.cpp
|
| +++ b/src/utils/SkPictureUtils.cpp
|
| @@ -6,214 +6,12 @@
|
| */
|
|
|
| #include "SkBBoxHierarchy.h"
|
| -#include "SkBitmapDevice.h"
|
| #include "SkCanvas.h"
|
| #include "SkData.h"
|
| -#include "SkNoSaveLayerCanvas.h"
|
| #include "SkPictureUtils.h"
|
| -#include "SkPixelRef.h"
|
| -#include "SkRRect.h"
|
| #include "SkRecord.h"
|
| #include "SkShader.h"
|
|
|
| -class PixelRefSet {
|
| -public:
|
| - PixelRefSet(SkTDArray<SkPixelRef*>* array) : fArray(array) {}
|
| -
|
| - // This does a linear search on existing pixelrefs, so if this list gets big
|
| - // we should use a more complex sorted/hashy thing.
|
| - //
|
| - void add(SkPixelRef* pr) {
|
| - uint32_t genID = pr->getGenerationID();
|
| - if (fGenID.find(genID) < 0) {
|
| - *fArray->append() = pr;
|
| - *fGenID.append() = genID;
|
| -// SkDebugf("--- adding [%d] %x %d\n", fArray->count() - 1, pr, genID);
|
| - } else {
|
| -// SkDebugf("--- already have %x %d\n", pr, genID);
|
| - }
|
| - }
|
| -
|
| -private:
|
| - SkTDArray<SkPixelRef*>* fArray;
|
| - SkTDArray<uint32_t> fGenID;
|
| -};
|
| -
|
| -static void not_supported() {
|
| - SkDEBUGFAIL("this method should never be called");
|
| -}
|
| -
|
| -static void nothing_to_do() {}
|
| -
|
| -/**
|
| - * This device will route all bitmaps (primitives and in shaders) to its PRSet.
|
| - * It should never actually draw anything, so there need not be any pixels
|
| - * behind its device.
|
| - */
|
| -class GatherPixelRefDevice : public SkBaseDevice {
|
| -public:
|
| - SK_DECLARE_INST_COUNT(GatherPixelRefDevice)
|
| -
|
| - GatherPixelRefDevice(int width, int height, PixelRefSet* prset) {
|
| - fSize.set(width, height);
|
| - fEmptyBitmap.setInfo(SkImageInfo::MakeUnknown(width, height));
|
| - fPRSet = prset;
|
| - }
|
| -
|
| - SkImageInfo imageInfo() const SK_OVERRIDE {
|
| - return SkImageInfo::MakeUnknown(fSize.width(), fSize.height());
|
| - }
|
| - GrRenderTarget* accessRenderTarget() SK_OVERRIDE { return NULL; }
|
| - // TODO: allow this call to return failure, or move to SkBitmapDevice only.
|
| - const SkBitmap& onAccessBitmap() SK_OVERRIDE {
|
| - return fEmptyBitmap;
|
| - }
|
| - void lockPixels() SK_OVERRIDE { nothing_to_do(); }
|
| - void unlockPixels() SK_OVERRIDE { nothing_to_do(); }
|
| - bool allowImageFilter(const SkImageFilter*) SK_OVERRIDE { return false; }
|
| - bool canHandleImageFilter(const SkImageFilter*) SK_OVERRIDE { return false; }
|
| - virtual bool filterImage(const SkImageFilter*, const SkBitmap&, const SkImageFilter::Context&,
|
| - SkBitmap* result, SkIPoint* offset) SK_OVERRIDE {
|
| - return false;
|
| - }
|
| -
|
| - void drawPaint(const SkDraw&, const SkPaint& paint) SK_OVERRIDE {
|
| - this->addBitmapFromPaint(paint);
|
| - }
|
| - virtual void drawPoints(const SkDraw&, SkCanvas::PointMode mode, size_t count,
|
| - const SkPoint[], const SkPaint& paint) SK_OVERRIDE {
|
| - this->addBitmapFromPaint(paint);
|
| - }
|
| - virtual void drawRect(const SkDraw&, const SkRect&,
|
| - const SkPaint& paint) SK_OVERRIDE {
|
| - this->addBitmapFromPaint(paint);
|
| - }
|
| - virtual void drawRRect(const SkDraw&, const SkRRect&,
|
| - const SkPaint& paint) SK_OVERRIDE {
|
| - this->addBitmapFromPaint(paint);
|
| - }
|
| - virtual void drawOval(const SkDraw&, const SkRect&,
|
| - const SkPaint& paint) SK_OVERRIDE {
|
| - this->addBitmapFromPaint(paint);
|
| - }
|
| - virtual void drawPath(const SkDraw&, const SkPath& path,
|
| - const SkPaint& paint, const SkMatrix* prePathMatrix,
|
| - bool pathIsMutable) SK_OVERRIDE {
|
| - this->addBitmapFromPaint(paint);
|
| - }
|
| - virtual void drawBitmap(const SkDraw&, const SkBitmap& bitmap,
|
| - const SkMatrix&, const SkPaint& paint) SK_OVERRIDE {
|
| - this->addBitmap(bitmap);
|
| - if (kAlpha_8_SkColorType == bitmap.colorType()) {
|
| - this->addBitmapFromPaint(paint);
|
| - }
|
| - }
|
| - virtual void drawBitmapRect(const SkDraw&, const SkBitmap& bitmap,
|
| - const SkRect* srcOrNull, const SkRect& dst,
|
| - const SkPaint& paint,
|
| - SkCanvas::DrawBitmapRectFlags flags) SK_OVERRIDE {
|
| - this->addBitmap(bitmap);
|
| - if (kAlpha_8_SkColorType == bitmap.colorType()) {
|
| - this->addBitmapFromPaint(paint);
|
| - }
|
| - }
|
| - virtual void drawSprite(const SkDraw&, const SkBitmap& bitmap,
|
| - int x, int y, const SkPaint& paint) SK_OVERRIDE {
|
| - this->addBitmap(bitmap);
|
| - }
|
| - virtual void drawText(const SkDraw&, const void* text, size_t len,
|
| - SkScalar x, SkScalar y,
|
| - const SkPaint& paint) SK_OVERRIDE {
|
| - this->addBitmapFromPaint(paint);
|
| - }
|
| - virtual void drawPosText(const SkDraw&, const void* text, size_t len,
|
| - const SkScalar pos[], int,
|
| - const SkPoint&, const SkPaint& paint) SK_OVERRIDE {
|
| - this->addBitmapFromPaint(paint);
|
| - }
|
| - virtual void drawTextOnPath(const SkDraw&, const void* text, size_t len,
|
| - const SkPath& path, const SkMatrix* matrix,
|
| - const SkPaint& paint) SK_OVERRIDE {
|
| - this->addBitmapFromPaint(paint);
|
| - }
|
| - virtual void drawVertices(const SkDraw&, SkCanvas::VertexMode, int vertexCount,
|
| - const SkPoint verts[], const SkPoint texs[],
|
| - const SkColor colors[], SkXfermode* xmode,
|
| - const uint16_t indices[], int indexCount,
|
| - const SkPaint& paint) SK_OVERRIDE {
|
| - this->addBitmapFromPaint(paint);
|
| - }
|
| - virtual void drawDevice(const SkDraw&, SkBaseDevice*, int x, int y,
|
| - const SkPaint&) SK_OVERRIDE {
|
| - nothing_to_do();
|
| - }
|
| -
|
| -protected:
|
| - void replaceBitmapBackendForRasterSurface(const SkBitmap&) SK_OVERRIDE {
|
| - not_supported();
|
| - }
|
| - SkBaseDevice* onCreateCompatibleDevice(const CreateInfo& cinfo) SK_OVERRIDE {
|
| - // we expect to only get called via savelayer, in which case it is fine.
|
| - SkASSERT(kSaveLayer_Usage == cinfo.fUsage);
|
| - return SkNEW_ARGS(GatherPixelRefDevice, (cinfo.fInfo.width(), cinfo.fInfo.height(), fPRSet));
|
| - }
|
| - void flush() SK_OVERRIDE {}
|
| -
|
| -private:
|
| - PixelRefSet* fPRSet;
|
| - SkBitmap fEmptyBitmap; // legacy -- need to remove the need for this guy
|
| - SkISize fSize;
|
| -
|
| - void addBitmap(const SkBitmap& bm) {
|
| - fPRSet->add(bm.pixelRef());
|
| - }
|
| -
|
| - void addBitmapFromPaint(const SkPaint& paint) {
|
| - SkShader* shader = paint.getShader();
|
| - if (shader) {
|
| - SkBitmap bm;
|
| - // Check whether the shader is a gradient in order to short-circuit
|
| - // call to asABitmap to prevent generation of bitmaps from
|
| - // gradient shaders, which implement asABitmap.
|
| - if (SkShader::kNone_GradientType == shader->asAGradient(NULL) &&
|
| - shader->asABitmap(&bm, NULL, NULL)) {
|
| - fPRSet->add(bm.pixelRef());
|
| - }
|
| - }
|
| - }
|
| -
|
| - typedef SkBaseDevice INHERITED;
|
| -};
|
| -
|
| -SkData* SkPictureUtils::GatherPixelRefs(const SkPicture* pict, const SkRect& area) {
|
| - if (NULL == pict) {
|
| - return NULL;
|
| - }
|
| -
|
| - // this test also handles if either area or pict's width/height are empty
|
| - if (!SkRect::Intersects(area, pict->cullRect())) {
|
| - return NULL;
|
| - }
|
| -
|
| - SkTDArray<SkPixelRef*> array;
|
| - PixelRefSet prset(&array);
|
| -
|
| - GatherPixelRefDevice device(SkScalarCeilToInt(pict->cullRect().width()),
|
| - SkScalarCeilToInt(pict->cullRect().height()),
|
| - &prset);
|
| - SkNoSaveLayerCanvas canvas(&device);
|
| -
|
| - canvas.clipRect(area, SkRegion::kIntersect_Op, false);
|
| - canvas.drawPicture(pict);
|
| -
|
| - SkData* data = NULL;
|
| - int count = array.count();
|
| - if (count > 0) {
|
| - data = SkData::NewFromMalloc(array.detach(), count * sizeof(SkPixelRef*));
|
| - }
|
| - return data;
|
| -}
|
| -
|
| struct MeasureRecords {
|
| template <typename T> size_t operator()(const T& op) { return 0; }
|
| size_t operator()(const SkRecords::DrawPicture& op) {
|
|
|