aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar reed <reed@google.com>2014-11-19 06:59:41 -0800
committerGravatar Commit bot <commit-bot@chromium.org>2014-11-19 06:59:41 -0800
commit7e76bff26e7c74902841ca4f607eb0b24a833a4a (patch)
treecb2f55b88a3ec2b3838dc9003808af03b6700e1d /src
parentec03a4608025106ea3f21353865c7d302c0a13c6 (diff)
allow pictures to have a full bounds
Diffstat (limited to 'src')
-rw-r--r--src/core/SkBBHFactory.cpp13
-rw-r--r--src/core/SkCanvas.cpp15
-rw-r--r--src/core/SkCanvasDrawable.cpp22
-rw-r--r--src/core/SkPicture.cpp5
-rw-r--r--src/core/SkPictureRecorder.cpp17
-rw-r--r--src/core/SkRecorder.cpp8
-rw-r--r--src/core/SkRecorder.h3
7 files changed, 56 insertions, 27 deletions
diff --git a/src/core/SkBBHFactory.cpp b/src/core/SkBBHFactory.cpp
index 22f816c4d9..4b9ae558e2 100644
--- a/src/core/SkBBHFactory.cpp
+++ b/src/core/SkBBHFactory.cpp
@@ -9,15 +9,20 @@
#include "SkRTree.h"
#include "SkTileGrid.h"
-
-SkBBoxHierarchy* SkRTreeFactory::operator()(int width, int height) const {
- SkScalar aspectRatio = SkScalarDiv(SkIntToScalar(width), SkIntToScalar(height));
+SkBBoxHierarchy* SkRTreeFactory::operator()(const SkRect& bounds) const {
+ SkScalar aspectRatio = bounds.width() / bounds.height();
return SkNEW_ARGS(SkRTree, (aspectRatio));
}
-SkBBoxHierarchy* SkTileGridFactory::operator()(int width, int height) const {
+SkBBoxHierarchy* SkTileGridFactory::operator()(const SkRect& bounds) const {
SkASSERT(fInfo.fMargin.width() >= 0);
SkASSERT(fInfo.fMargin.height() >= 0);
+
+ // We want a conservative answer for the size...
+ const SkIRect ibounds = bounds.roundOut();
+ const int width = ibounds.width();
+ const int height = ibounds.height();
+
// Note: SkIRects are non-inclusive of the right() column and bottom() row.
// For example, an SkIRect at 0,0 with a size of (1,1) will only have
// content at pixel (0,0) and will report left=0 and right=1, hence the
diff --git a/src/core/SkCanvas.cpp b/src/core/SkCanvas.cpp
index 4fda7a37b3..31a9a7970b 100644
--- a/src/core/SkCanvas.cpp
+++ b/src/core/SkCanvas.cpp
@@ -431,7 +431,7 @@ SkBaseDevice* SkCanvas::init(SkBaseDevice* device, InitFlags flags) {
}
device->onAttachToCanvas(this);
fMCRec->fLayer->fDevice = SkRef(device);
- fMCRec->fRasterClip.setRect(SkIRect::MakeWH(device->width(), device->height()));
+ fMCRec->fRasterClip.setRect(device->getGlobalBounds());
}
return device;
}
@@ -453,7 +453,11 @@ static SkBitmap make_nopixels(int width, int height) {
class SkNoPixelsBitmapDevice : public SkBitmapDevice {
public:
- SkNoPixelsBitmapDevice(int width, int height) : INHERITED(make_nopixels(width, height)) {}
+ SkNoPixelsBitmapDevice(const SkIRect& bounds)
+ : INHERITED(make_nopixels(bounds.width(), bounds.height()))
+ {
+ this->setOrigin(bounds.x(), bounds.y());
+ }
private:
@@ -466,16 +470,17 @@ SkCanvas::SkCanvas(int width, int height)
{
inc_canvas();
- this->init(SkNEW_ARGS(SkNoPixelsBitmapDevice, (width, height)), kDefault_InitFlags)->unref();
+ this->init(SkNEW_ARGS(SkNoPixelsBitmapDevice,
+ (SkIRect::MakeWH(width, height))), kDefault_InitFlags)->unref();
}
-SkCanvas::SkCanvas(int width, int height, InitFlags flags)
+SkCanvas::SkCanvas(const SkIRect& bounds, InitFlags flags)
: fMCStack(sizeof(MCRec), fMCRecStorage, sizeof(fMCRecStorage))
, fProps(SkSurfaceProps::kLegacyFontHost_InitType)
{
inc_canvas();
- this->init(SkNEW_ARGS(SkNoPixelsBitmapDevice, (width, height)), flags)->unref();
+ this->init(SkNEW_ARGS(SkNoPixelsBitmapDevice, (bounds)), flags)->unref();
}
SkCanvas::SkCanvas(SkBaseDevice* device, const SkSurfaceProps* props, InitFlags flags)
diff --git a/src/core/SkCanvasDrawable.cpp b/src/core/SkCanvasDrawable.cpp
index 0065d430f9..e0120f0bb1 100644
--- a/src/core/SkCanvasDrawable.cpp
+++ b/src/core/SkCanvasDrawable.cpp
@@ -23,9 +23,22 @@ static int32_t next_generation_id() {
SkCanvasDrawable::SkCanvasDrawable() : fGenerationID(0) {}
+static void draw_bbox(SkCanvas* canvas, const SkRect& r) {
+ SkPaint paint;
+ paint.setStyle(SkPaint::kStroke_Style);
+ paint.setColor(0xFFFF7088);
+ canvas->drawRect(r, paint);
+ canvas->drawLine(r.left(), r.top(), r.right(), r.bottom(), paint);
+ canvas->drawLine(r.left(), r.bottom(), r.right(), r.top(), paint);
+}
+
void SkCanvasDrawable::draw(SkCanvas* canvas) {
SkAutoCanvasRestore acr(canvas, true);
this->onDraw(canvas);
+
+ if (false) {
+ draw_bbox(canvas, this->getBounds());
+ }
}
SkPicture* SkCanvasDrawable::newPictureSnapshot(SkBBHFactory* bbhFactory, uint32_t recordFlags) {
@@ -52,8 +65,13 @@ void SkCanvasDrawable::notifyDrawingChanged() {
#include "SkPictureRecorder.h"
SkPicture* SkCanvasDrawable::onNewPictureSnapshot(SkBBHFactory* bbhFactory, uint32_t recordFlags) {
- const SkRect bounds = this->getBounds();
SkPictureRecorder recorder;
- this->draw(recorder.beginRecording(bounds.width(), bounds.height(), bbhFactory, recordFlags));
+
+ const SkRect bounds = this->getBounds();
+ SkCanvas* canvas = recorder.beginRecording(bounds, bbhFactory, recordFlags);
+ this->draw(canvas);
+ if (false) {
+ draw_bbox(canvas, bounds);
+ }
return recorder.endRecording();
}
diff --git a/src/core/SkPicture.cpp b/src/core/SkPicture.cpp
index 4c97cb71b9..7f4b33afac 100644
--- a/src/core/SkPicture.cpp
+++ b/src/core/SkPicture.cpp
@@ -530,10 +530,9 @@ uint32_t SkPicture::uniqueID() const {
return fUniqueID;
}
-SkPicture::SkPicture(SkScalar width, SkScalar height, SkRecord* record, SkData* drawablePicts,
+SkPicture::SkPicture(const SkRect& cullRect, SkRecord* record, SkData* drawablePicts,
SkBBoxHierarchy* bbh)
- : fCullWidth(width)
- , fCullHeight(height)
+ : fCullRect(cullRect)
, fRecord(record)
, fBBH(SkSafeRef(bbh))
, fDrawablePicts(SkSafeRef(drawablePicts))
diff --git a/src/core/SkPictureRecorder.cpp b/src/core/SkPictureRecorder.cpp
index bc8bffb9b3..aea9e389da 100644
--- a/src/core/SkPictureRecorder.cpp
+++ b/src/core/SkPictureRecorder.cpp
@@ -18,20 +18,19 @@ SkPictureRecorder::SkPictureRecorder() {}
SkPictureRecorder::~SkPictureRecorder() {}
-SkCanvas* SkPictureRecorder::beginRecording(SkScalar width, SkScalar height,
+SkCanvas* SkPictureRecorder::beginRecording(const SkRect& cullRect,
SkBBHFactory* bbhFactory /* = NULL */,
uint32_t recordFlags /* = 0 */) {
+ fCullRect = cullRect;
fFlags = recordFlags;
- fCullWidth = width;
- fCullHeight = height;
if (bbhFactory) {
- fBBH.reset((*bbhFactory)(width, height));
+ fBBH.reset((*bbhFactory)(cullRect));
SkASSERT(fBBH.get());
}
fRecord.reset(SkNEW(SkRecord));
- fRecorder.reset(SkNEW_ARGS(SkRecorder, (fRecord.get(), width, height)));
+ fRecorder.reset(SkNEW_ARGS(SkRecorder, (fRecord.get(), cullRect)));
return this->getRecordingCanvas();
}
@@ -52,12 +51,10 @@ SkPicture* SkPictureRecorder::endRecording() {
}
if (fBBH.get()) {
- SkRect cullRect = SkRect::MakeWH(fCullWidth, fCullHeight);
-
if (saveLayerData) {
- SkRecordComputeLayers(cullRect, *fRecord, fBBH.get(), saveLayerData);
+ SkRecordComputeLayers(fCullRect, *fRecord, fBBH.get(), saveLayerData);
} else {
- SkRecordFillBounds(cullRect, *fRecord, fBBH.get());
+ SkRecordFillBounds(fCullRect, *fRecord, fBBH.get());
}
}
@@ -65,7 +62,7 @@ SkPicture* SkPictureRecorder::endRecording() {
SkBBHFactory* factory = NULL;
uint32_t recordFlags = 0;
SkAutoDataUnref drawablePicts(fRecorder->newDrawableSnapshot(factory, recordFlags));
- SkPicture* pict = SkNEW_ARGS(SkPicture, (fCullWidth, fCullHeight, fRecord.detach(),
+ SkPicture* pict = SkNEW_ARGS(SkPicture, (fCullRect, fRecord.detach(),
drawablePicts, fBBH.get()));
if (saveLayerData) {
diff --git a/src/core/SkRecorder.cpp b/src/core/SkRecorder.cpp
index 1af328afd2..998fb6645b 100644
--- a/src/core/SkRecorder.cpp
+++ b/src/core/SkRecorder.cpp
@@ -10,9 +10,13 @@
#include "SkPatchUtils.h"
#include "SkPicture.h"
-// SkCanvas will fail in mysterious ways if it doesn't know the real width and height.
SkRecorder::SkRecorder(SkRecord* record, int width, int height)
- : SkCanvas(width, height, SkCanvas::kConservativeRasterClip_InitFlag)
+ : SkCanvas(SkIRect::MakeWH(width, height), SkCanvas::kConservativeRasterClip_InitFlag)
+ , fRecord(record)
+ , fSaveLayerCount(0) {}
+
+SkRecorder::SkRecorder(SkRecord* record, const SkRect& bounds)
+ : SkCanvas(bounds.roundOut(), SkCanvas::kConservativeRasterClip_InitFlag)
, fRecord(record)
, fSaveLayerCount(0) {}
diff --git a/src/core/SkRecorder.h b/src/core/SkRecorder.h
index 563f16d124..7b2cbfe3a0 100644
--- a/src/core/SkRecorder.h
+++ b/src/core/SkRecorder.h
@@ -18,7 +18,8 @@
class SkRecorder : public SkCanvas {
public:
// Does not take ownership of the SkRecord.
- SkRecorder(SkRecord*, int width, int height);
+ SkRecorder(SkRecord*, int width, int height); // legacy version
+ SkRecorder(SkRecord*, const SkRect& bounds);
virtual ~SkRecorder() SK_OVERRIDE;
// return a (new or ref'd) data containing the array of pictures that were