aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/pdf
diff options
context:
space:
mode:
authorGravatar vandebo@chromium.org <vandebo@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2011-04-15 20:01:17 +0000
committerGravatar vandebo@chromium.org <vandebo@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2011-04-15 20:01:17 +0000
commitfb0b0edd86d71bb423fa921eaac1e2071602115c (patch)
tree180b0831a0d137c5b27a96a403c12d9f6e8154e1 /src/pdf
parente61414ce7b426da43a1e6d37a2802b3c80f84d6b (diff)
[PDF] If the clip is empty, we shouldn't bother actually drawing anything.
Plus, fix ifdef for flate test. Review URL: http://codereview.appspot.com/4420041 git-svn-id: http://skia.googlecode.com/svn/trunk@1141 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src/pdf')
-rw-r--r--src/pdf/SkPDFDevice.cpp61
1 files changed, 55 insertions, 6 deletions
diff --git a/src/pdf/SkPDFDevice.cpp b/src/pdf/SkPDFDevice.cpp
index 4a255112fc..675289489d 100644
--- a/src/pdf/SkPDFDevice.cpp
+++ b/src/pdf/SkPDFDevice.cpp
@@ -17,6 +17,7 @@
#include "SkPDFDevice.h"
#include "SkColor.h"
+#include "SkDraw.h"
#include "SkGlyphCache.h"
#include "SkPaint.h"
#include "SkPath.h"
@@ -165,6 +166,16 @@ SkPDFDevice::~SkPDFDevice() {
void SkPDFDevice::setMatrixClip(const SkMatrix& matrix,
const SkRegion& region,
const SkClipStack&) {
+ if (region.isEmpty()) {
+ return;
+ }
+
+ // TODO(vandebo) SkCanvas may not draw anything after doing this call, we
+ // should defer writing anything out to fContent until we actually get
+ // a draw command. In fact SkDraw contains the clip and transform, so
+ // this method should do nothing and we should have an update
+ // transform-and-clip method, like update paint.
+
// See the comment in the header file above GraphicStackEntry.
if (region != fGraphicStack[fGraphicStackIndex].fClip) {
while (fGraphicStackIndex > 0)
@@ -192,6 +203,10 @@ void SkPDFDevice::setMatrixClip(const SkMatrix& matrix,
}
void SkPDFDevice::drawPaint(const SkDraw& d, const SkPaint& paint) {
+ if (d.fClip->isEmpty()) {
+ return;
+ }
+
SkMatrix identityTransform;
identityTransform.reset();
SkMatrix curTransform = setTransform(identityTransform);
@@ -209,8 +224,9 @@ void SkPDFDevice::drawPaint(const SkDraw& d, const SkPaint& paint) {
void SkPDFDevice::drawPoints(const SkDraw& d, SkCanvas::PointMode mode,
size_t count, const SkPoint* points,
const SkPaint& paint) {
- if (count == 0)
+ if (count == 0 || d.fClip->isEmpty()) {
return;
+ }
switch (mode) {
case SkCanvas::kPolygon_PointMode:
@@ -260,6 +276,10 @@ void SkPDFDevice::drawPoints(const SkDraw& d, SkCanvas::PointMode mode,
void SkPDFDevice::drawRect(const SkDraw& d, const SkRect& r,
const SkPaint& paint) {
+ if (d.fClip->isEmpty()) {
+ return;
+ }
+
if (paint.getPathEffect()) {
// Create a path for the rectangle and apply the path effect to it.
SkPath path;
@@ -284,6 +304,9 @@ void SkPDFDevice::drawRect(const SkDraw& d, const SkRect& r,
void SkPDFDevice::drawPath(const SkDraw& d, const SkPath& path,
const SkPaint& paint, const SkMatrix* prePathMatrix,
bool pathIsMutable) {
+ if (d.fClip->isEmpty()) {
+ return;
+ }
NOT_IMPLEMENTED(prePathMatrix != NULL, true);
if (paint.getPathEffect()) {
@@ -302,16 +325,24 @@ void SkPDFDevice::drawPath(const SkDraw& d, const SkPath& path,
SkPDFUtils::PaintPath(paint.getStyle(), path.getFillType(), &fContent);
}
-void SkPDFDevice::drawBitmap(const SkDraw&, const SkBitmap& bitmap,
+void SkPDFDevice::drawBitmap(const SkDraw& d, const SkBitmap& bitmap,
const SkIRect* srcRect,
const SkMatrix& matrix, const SkPaint& paint) {
+ if (d.fClip->isEmpty()) {
+ return;
+ }
+
SkMatrix transform = matrix;
transform.postConcat(fGraphicStack[fGraphicStackIndex].fTransform);
internalDrawBitmap(transform, bitmap, srcRect, paint);
}
-void SkPDFDevice::drawSprite(const SkDraw&, const SkBitmap& bitmap,
+void SkPDFDevice::drawSprite(const SkDraw& d, const SkBitmap& bitmap,
int x, int y, const SkPaint& paint) {
+ if (d.fClip->isEmpty()) {
+ return;
+ }
+
SkMatrix matrix;
matrix.setTranslate(SkIntToScalar(x), SkIntToScalar(y));
internalDrawBitmap(matrix, bitmap, NULL, paint);
@@ -319,6 +350,10 @@ void SkPDFDevice::drawSprite(const SkDraw&, const SkBitmap& bitmap,
void SkPDFDevice::drawText(const SkDraw& d, const void* text, size_t len,
SkScalar x, SkScalar y, const SkPaint& paint) {
+ if (d.fClip->isEmpty()) {
+ return;
+ }
+
SkPaint textPaint = calculateTextPaint(paint);
updateGSFromPaint(textPaint, true);
@@ -384,9 +419,13 @@ void SkPDFDevice::drawText(const SkDraw& d, const void* text, size_t len,
}
}
-void SkPDFDevice::drawPosText(const SkDraw&, const void* text, size_t len,
+void SkPDFDevice::drawPosText(const SkDraw& d, const void* text, size_t len,
const SkScalar pos[], SkScalar constY,
int scalarsPerPos, const SkPaint& paint) {
+ if (d.fClip->isEmpty()) {
+ return;
+ }
+
SkASSERT(1 == scalarsPerPos || 2 == scalarsPerPos);
SkPaint textPaint = calculateTextPaint(paint);
updateGSFromPaint(textPaint, true);
@@ -432,22 +471,32 @@ void SkPDFDevice::drawPosText(const SkDraw&, const void* text, size_t len,
fContent.writeText("ET\n");
}
-void SkPDFDevice::drawTextOnPath(const SkDraw&, const void* text, size_t len,
+void SkPDFDevice::drawTextOnPath(const SkDraw& d, const void* text, size_t len,
const SkPath& path, const SkMatrix* matrix,
const SkPaint& paint) {
+ if (d.fClip->isEmpty()) {
+ return;
+ }
NOT_IMPLEMENTED("drawTextOnPath", true);
}
-void SkPDFDevice::drawVertices(const SkDraw&, SkCanvas::VertexMode,
+void SkPDFDevice::drawVertices(const SkDraw& d, SkCanvas::VertexMode,
int vertexCount, const SkPoint verts[],
const SkPoint texs[], const SkColor colors[],
SkXfermode* xmode, const uint16_t indices[],
int indexCount, const SkPaint& paint) {
+ if (d.fClip->isEmpty()) {
+ return;
+ }
NOT_IMPLEMENTED("drawVerticies", true);
}
void SkPDFDevice::drawDevice(const SkDraw& d, SkDevice* device, int x, int y,
const SkPaint& paint) {
+ if (d.fClip->isEmpty()) {
+ return;
+ }
+
if ((device->getDeviceCapabilities() & kVector_Capability) == 0) {
// If we somehow get a raster device, do what our parent would do.
SkDevice::drawDevice(d, device, x, y, paint);