diff options
Diffstat (limited to 'src/pdf')
-rw-r--r-- | src/pdf/SkPDFDevice.cpp | 2 | ||||
-rw-r--r-- | src/pdf/SkPDFShader.cpp | 31 |
2 files changed, 18 insertions, 15 deletions
diff --git a/src/pdf/SkPDFDevice.cpp b/src/pdf/SkPDFDevice.cpp index ef06c60bb4..0e476a2b83 100644 --- a/src/pdf/SkPDFDevice.cpp +++ b/src/pdf/SkPDFDevice.cpp @@ -135,7 +135,7 @@ static inline SkBitmap makeContentBitmap(const SkISize& contentSize, SkISize size = SkSize::Make(drawingSize.fX, drawingSize.fY).toRound(); SkBitmap bitmap; - bitmap.setConfig(SkBitmap::kNo_Config, size.fWidth, size.fHeight); + bitmap.setConfig(SkBitmap::kNo_Config, abs(size.fWidth), abs(size.fHeight)); return bitmap; } diff --git a/src/pdf/SkPDFShader.cpp b/src/pdf/SkPDFShader.cpp index 2538c0db12..6845e09833 100644 --- a/src/pdf/SkPDFShader.cpp +++ b/src/pdf/SkPDFShader.cpp @@ -496,12 +496,14 @@ void SkPDFShader::doImageShader() { transformBBox(finalMatrix, &surfaceBBox); SkMatrix unflip; - unflip.setTranslate(0, surfaceBBox.fBottom); + unflip.setTranslate(0, SkScalarRound(surfaceBBox.height())); unflip.preScale(1, -1); - SkISize size = SkISize::Make(surfaceBBox.width(), surfaceBBox.height()); + SkISize size = SkISize::Make(SkScalarRound(surfaceBBox.width()), + SkScalarRound(surfaceBBox.height())); SkPDFDevice pattern(size, size, unflip); SkCanvas canvas(&pattern); - canvas.clipRect(surfaceBBox, SkRegion::kReplace_Op); + canvas.translate(-surfaceBBox.fLeft, -surfaceBBox.fTop); + finalMatrix.preTranslate(surfaceBBox.fLeft, surfaceBBox.fTop); const SkBitmap* image = &fState.get()->fImage; int width = image->width(); @@ -511,7 +513,8 @@ void SkPDFShader::doImageShader() { tileModes[1] = fState.get()->fImageTileModes[1]; canvas.drawBitmap(*image, 0, 0); - SkRect patternBBox = SkRect::MakeWH(width, height); + SkRect patternBBox = SkRect::MakeXYWH(-surfaceBBox.fLeft, -surfaceBBox.fTop, + width, height); // Tiling is implied. First we handle mirroring. if (tileModes[0] == SkShader::kMirror_TileMode) { @@ -589,7 +592,7 @@ void SkPDFShader::doImageShader() { leftMatrix.postTranslate(0, 2 * height); canvas.drawBitmapMatrix(left, leftMatrix); } - patternBBox.fLeft = surfaceBBox.fLeft; + patternBBox.fLeft = 0; } if (surfaceBBox.fRight > width) { @@ -607,7 +610,7 @@ void SkPDFShader::doImageShader() { rightMatrix.postTranslate(0, 2 * height); canvas.drawBitmapMatrix(right, rightMatrix); } - patternBBox.fRight = surfaceBBox.fRight; + patternBBox.fRight = surfaceBBox.width(); } } @@ -627,7 +630,7 @@ void SkPDFShader::doImageShader() { topMatrix.postTranslate(2 * width, 0); canvas.drawBitmapMatrix(top, topMatrix); } - patternBBox.fTop = surfaceBBox.fTop; + patternBBox.fTop = 0; } if (surfaceBBox.fBottom > height) { @@ -645,17 +648,17 @@ void SkPDFShader::doImageShader() { bottomMatrix.postTranslate(2 * width, 0); canvas.drawBitmapMatrix(bottom, bottomMatrix); } - patternBBox.fBottom = surfaceBBox.fBottom; + patternBBox.fBottom = surfaceBBox.height(); } } SkRefPtr<SkPDFArray> patternBBoxArray = new SkPDFArray; patternBBoxArray->unref(); // SkRefPtr and new both took a reference. patternBBoxArray->reserve(4); - patternBBoxArray->append(new SkPDFInt(patternBBox.fLeft))->unref(); - patternBBoxArray->append(new SkPDFInt(patternBBox.fTop))->unref(); - patternBBoxArray->append(new SkPDFInt(patternBBox.fRight))->unref(); - patternBBoxArray->append(new SkPDFInt(patternBBox.fBottom))->unref(); + patternBBoxArray->append(new SkPDFScalar(patternBBox.fLeft))->unref(); + patternBBoxArray->append(new SkPDFScalar(patternBBox.fTop))->unref(); + patternBBoxArray->append(new SkPDFScalar(patternBBox.fRight))->unref(); + patternBBoxArray->append(new SkPDFScalar(patternBBox.fBottom))->unref(); // Put the canvas into the pattern stream (fContent). SkRefPtr<SkStream> content = pattern.content(); @@ -669,8 +672,8 @@ void SkPDFShader::doImageShader() { fContent->insert("PaintType", new SkPDFInt(1))->unref(); fContent->insert("TilingType", new SkPDFInt(1))->unref(); fContent->insert("BBox", patternBBoxArray.get()); - fContent->insert("XStep", new SkPDFInt(patternBBox.width()))->unref(); - fContent->insert("YStep", new SkPDFInt(patternBBox.height()))->unref(); + fContent->insert("XStep", new SkPDFScalar(patternBBox.width()))->unref(); + fContent->insert("YStep", new SkPDFScalar(patternBBox.height()))->unref(); fContent->insert("Resources", pattern.getResourceDict().get()); fContent->insert("Matrix", SkPDFUtils::MatrixToArray(finalMatrix))->unref(); |