зеркало из https://github.com/mozilla/moz-skia.git
[PDF] Fix fallout from r1217.
The width and height we pass to SkDevice must be postive. Shader can no longer use negative coordinates (without transform). Shader unflip matrix should use same values as passed to SkPDFDevice (height). Most Shader dictionary entries should be scalars and not ints. Review URL: http://codereview.appspot.com/4454047 git-svn-id: http://skia.googlecode.com/svn/trunk@1219 2bbb7eff-a529-9590-31e7-b0007b416f81
This commit is contained in:
Родитель
8295dc1474
Коммит
be2048a371
|
@ -61,6 +61,7 @@ public:
|
||||||
* inverse scale+translate to accommodate the one that SkPDFDevice
|
* inverse scale+translate to accommodate the one that SkPDFDevice
|
||||||
* always does.
|
* always does.
|
||||||
*/
|
*/
|
||||||
|
// TODO(vandebo) The sizes should be SkSize and not SkISize.
|
||||||
SK_API SkPDFDevice(const SkISize& pageSize, const SkISize& contentSize,
|
SK_API SkPDFDevice(const SkISize& pageSize, const SkISize& contentSize,
|
||||||
const SkMatrix& initialTransform);
|
const SkMatrix& initialTransform);
|
||||||
SK_API virtual ~SkPDFDevice();
|
SK_API virtual ~SkPDFDevice();
|
||||||
|
|
|
@ -135,7 +135,7 @@ static inline SkBitmap makeContentBitmap(const SkISize& contentSize,
|
||||||
SkISize size = SkSize::Make(drawingSize.fX, drawingSize.fY).toRound();
|
SkISize size = SkSize::Make(drawingSize.fX, drawingSize.fY).toRound();
|
||||||
|
|
||||||
SkBitmap bitmap;
|
SkBitmap bitmap;
|
||||||
bitmap.setConfig(SkBitmap::kNo_Config, size.fWidth, size.fHeight);
|
bitmap.setConfig(SkBitmap::kNo_Config, abs(size.fWidth), abs(size.fHeight));
|
||||||
return bitmap;
|
return bitmap;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -496,12 +496,14 @@ void SkPDFShader::doImageShader() {
|
||||||
transformBBox(finalMatrix, &surfaceBBox);
|
transformBBox(finalMatrix, &surfaceBBox);
|
||||||
|
|
||||||
SkMatrix unflip;
|
SkMatrix unflip;
|
||||||
unflip.setTranslate(0, surfaceBBox.fBottom);
|
unflip.setTranslate(0, SkScalarRound(surfaceBBox.height()));
|
||||||
unflip.preScale(1, -1);
|
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);
|
SkPDFDevice pattern(size, size, unflip);
|
||||||
SkCanvas canvas(&pattern);
|
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;
|
const SkBitmap* image = &fState.get()->fImage;
|
||||||
int width = image->width();
|
int width = image->width();
|
||||||
|
@ -511,7 +513,8 @@ void SkPDFShader::doImageShader() {
|
||||||
tileModes[1] = fState.get()->fImageTileModes[1];
|
tileModes[1] = fState.get()->fImageTileModes[1];
|
||||||
|
|
||||||
canvas.drawBitmap(*image, 0, 0);
|
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.
|
// Tiling is implied. First we handle mirroring.
|
||||||
if (tileModes[0] == SkShader::kMirror_TileMode) {
|
if (tileModes[0] == SkShader::kMirror_TileMode) {
|
||||||
|
@ -589,7 +592,7 @@ void SkPDFShader::doImageShader() {
|
||||||
leftMatrix.postTranslate(0, 2 * height);
|
leftMatrix.postTranslate(0, 2 * height);
|
||||||
canvas.drawBitmapMatrix(left, leftMatrix);
|
canvas.drawBitmapMatrix(left, leftMatrix);
|
||||||
}
|
}
|
||||||
patternBBox.fLeft = surfaceBBox.fLeft;
|
patternBBox.fLeft = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (surfaceBBox.fRight > width) {
|
if (surfaceBBox.fRight > width) {
|
||||||
|
@ -607,7 +610,7 @@ void SkPDFShader::doImageShader() {
|
||||||
rightMatrix.postTranslate(0, 2 * height);
|
rightMatrix.postTranslate(0, 2 * height);
|
||||||
canvas.drawBitmapMatrix(right, rightMatrix);
|
canvas.drawBitmapMatrix(right, rightMatrix);
|
||||||
}
|
}
|
||||||
patternBBox.fRight = surfaceBBox.fRight;
|
patternBBox.fRight = surfaceBBox.width();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -627,7 +630,7 @@ void SkPDFShader::doImageShader() {
|
||||||
topMatrix.postTranslate(2 * width, 0);
|
topMatrix.postTranslate(2 * width, 0);
|
||||||
canvas.drawBitmapMatrix(top, topMatrix);
|
canvas.drawBitmapMatrix(top, topMatrix);
|
||||||
}
|
}
|
||||||
patternBBox.fTop = surfaceBBox.fTop;
|
patternBBox.fTop = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (surfaceBBox.fBottom > height) {
|
if (surfaceBBox.fBottom > height) {
|
||||||
|
@ -645,17 +648,17 @@ void SkPDFShader::doImageShader() {
|
||||||
bottomMatrix.postTranslate(2 * width, 0);
|
bottomMatrix.postTranslate(2 * width, 0);
|
||||||
canvas.drawBitmapMatrix(bottom, bottomMatrix);
|
canvas.drawBitmapMatrix(bottom, bottomMatrix);
|
||||||
}
|
}
|
||||||
patternBBox.fBottom = surfaceBBox.fBottom;
|
patternBBox.fBottom = surfaceBBox.height();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SkRefPtr<SkPDFArray> patternBBoxArray = new SkPDFArray;
|
SkRefPtr<SkPDFArray> patternBBoxArray = new SkPDFArray;
|
||||||
patternBBoxArray->unref(); // SkRefPtr and new both took a reference.
|
patternBBoxArray->unref(); // SkRefPtr and new both took a reference.
|
||||||
patternBBoxArray->reserve(4);
|
patternBBoxArray->reserve(4);
|
||||||
patternBBoxArray->append(new SkPDFInt(patternBBox.fLeft))->unref();
|
patternBBoxArray->append(new SkPDFScalar(patternBBox.fLeft))->unref();
|
||||||
patternBBoxArray->append(new SkPDFInt(patternBBox.fTop))->unref();
|
patternBBoxArray->append(new SkPDFScalar(patternBBox.fTop))->unref();
|
||||||
patternBBoxArray->append(new SkPDFInt(patternBBox.fRight))->unref();
|
patternBBoxArray->append(new SkPDFScalar(patternBBox.fRight))->unref();
|
||||||
patternBBoxArray->append(new SkPDFInt(patternBBox.fBottom))->unref();
|
patternBBoxArray->append(new SkPDFScalar(patternBBox.fBottom))->unref();
|
||||||
|
|
||||||
// Put the canvas into the pattern stream (fContent).
|
// Put the canvas into the pattern stream (fContent).
|
||||||
SkRefPtr<SkStream> content = pattern.content();
|
SkRefPtr<SkStream> content = pattern.content();
|
||||||
|
@ -669,8 +672,8 @@ void SkPDFShader::doImageShader() {
|
||||||
fContent->insert("PaintType", new SkPDFInt(1))->unref();
|
fContent->insert("PaintType", new SkPDFInt(1))->unref();
|
||||||
fContent->insert("TilingType", new SkPDFInt(1))->unref();
|
fContent->insert("TilingType", new SkPDFInt(1))->unref();
|
||||||
fContent->insert("BBox", patternBBoxArray.get());
|
fContent->insert("BBox", patternBBoxArray.get());
|
||||||
fContent->insert("XStep", new SkPDFInt(patternBBox.width()))->unref();
|
fContent->insert("XStep", new SkPDFScalar(patternBBox.width()))->unref();
|
||||||
fContent->insert("YStep", new SkPDFInt(patternBBox.height()))->unref();
|
fContent->insert("YStep", new SkPDFScalar(patternBBox.height()))->unref();
|
||||||
fContent->insert("Resources", pattern.getResourceDict().get());
|
fContent->insert("Resources", pattern.getResourceDict().get());
|
||||||
fContent->insert("Matrix", SkPDFUtils::MatrixToArray(finalMatrix))->unref();
|
fContent->insert("Matrix", SkPDFUtils::MatrixToArray(finalMatrix))->unref();
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче