| Index: src/core/SkPictureShader.cpp
|
| diff --git a/src/core/SkPictureShader.cpp b/src/core/SkPictureShader.cpp
|
| index 6ea67f8035692f75edc2f27763130bcf84a73ad9..2a6aae5f4ed477db2daf3c781d6d98c1ada11851 100644
|
| --- a/src/core/SkPictureShader.cpp
|
| +++ b/src/core/SkPictureShader.cpp
|
| @@ -19,16 +19,20 @@
|
| #endif
|
|
|
| SkPictureShader::SkPictureShader(const SkPicture* picture, TileMode tmx, TileMode tmy,
|
| - const SkMatrix* localMatrix)
|
| + const SkMatrix* localMatrix, const SkRect* tile)
|
| : INHERITED(localMatrix)
|
| , fPicture(SkRef(picture))
|
| , fTmx(tmx)
|
| - , fTmy(tmy) { }
|
| + , fTmy(tmy) {
|
| + fTile = tile ? *tile : SkRect::MakeWH(SkIntToScalar(picture->width()),
|
| + SkIntToScalar(picture->height()));
|
| +}
|
|
|
| SkPictureShader::SkPictureShader(SkReadBuffer& buffer)
|
| : INHERITED(buffer) {
|
| fTmx = static_cast<SkShader::TileMode>(buffer.read32());
|
| fTmy = static_cast<SkShader::TileMode>(buffer.read32());
|
| + buffer.readRect(&fTile);
|
| fPicture = SkPicture::CreateFromBuffer(buffer);
|
| }
|
|
|
| @@ -37,11 +41,12 @@ SkPictureShader::~SkPictureShader() {
|
| }
|
|
|
| SkPictureShader* SkPictureShader::Create(const SkPicture* picture, TileMode tmx, TileMode tmy,
|
| - const SkMatrix* localMatrix) {
|
| - if (!picture || 0 == picture->width() || 0 == picture->height()) {
|
| + const SkMatrix* localMatrix, const SkRect* tile) {
|
| + if (!picture || 0 == picture->width() || 0 == picture->height()
|
| + || (NULL != tile && tile->isEmpty())) {
|
| return NULL;
|
| }
|
| - return SkNEW_ARGS(SkPictureShader, (picture, tmx, tmy, localMatrix));
|
| + return SkNEW_ARGS(SkPictureShader, (picture, tmx, tmy, localMatrix, tile));
|
| }
|
|
|
| void SkPictureShader::flatten(SkWriteBuffer& buffer) const {
|
| @@ -49,6 +54,7 @@ void SkPictureShader::flatten(SkWriteBuffer& buffer) const {
|
|
|
| buffer.write32(fTmx);
|
| buffer.write32(fTmy);
|
| + buffer.writeRect(fTile);
|
| fPicture->flatten(buffer);
|
| }
|
|
|
| @@ -68,7 +74,7 @@ SkShader* SkPictureShader::refBitmapShader(const SkMatrix& matrix, const SkMatri
|
| scale.set(SkScalarSqrt(m.getScaleX() * m.getScaleX() + m.getSkewX() * m.getSkewX()),
|
| SkScalarSqrt(m.getScaleY() * m.getScaleY() + m.getSkewY() * m.getSkewY()));
|
| }
|
| - SkSize scaledSize = SkSize::Make(scale.x() * fPicture->width(), scale.y() * fPicture->height());
|
| + SkSize scaledSize = SkSize::Make(scale.x() * fTile.width(), scale.y() * fTile.height());
|
|
|
| SkISize tileSize = scaledSize.toRound();
|
| if (tileSize.isEmpty()) {
|
| @@ -76,8 +82,8 @@ SkShader* SkPictureShader::refBitmapShader(const SkMatrix& matrix, const SkMatri
|
| }
|
|
|
| // The actual scale, compensating for rounding.
|
| - SkSize tileScale = SkSize::Make(SkIntToScalar(tileSize.width()) / fPicture->width(),
|
| - SkIntToScalar(tileSize.height()) / fPicture->height());
|
| + SkSize tileScale = SkSize::Make(SkIntToScalar(tileSize.width()) / fTile.width(),
|
| + SkIntToScalar(tileSize.height()) / fTile.height());
|
|
|
| SkAutoMutexAcquire ama(fCachedBitmapShaderMutex);
|
|
|
| @@ -90,6 +96,7 @@ SkShader* SkPictureShader::refBitmapShader(const SkMatrix& matrix, const SkMatri
|
|
|
| SkCanvas canvas(bm);
|
| canvas.scale(tileScale.width(), tileScale.height());
|
| + canvas.translate(fTile.x(), fTile.y());
|
| canvas.drawPicture(fPicture);
|
|
|
| fCachedTileScale = tileScale;
|
|
|