OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2014 Google Inc. | 2 * Copyright 2014 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #include "SkPictureShader.h" | 8 #include "SkPictureShader.h" |
9 | 9 |
10 #include "SkBitmap.h" | 10 #include "SkBitmap.h" |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
107 , fPicture(SkRef(picture)) | 107 , fPicture(SkRef(picture)) |
108 , fTile(tile ? *tile : picture->cullRect()) | 108 , fTile(tile ? *tile : picture->cullRect()) |
109 , fTmx(tmx) | 109 , fTmx(tmx) |
110 , fTmy(tmy) { | 110 , fTmy(tmy) { |
111 } | 111 } |
112 | 112 |
113 SkPictureShader::~SkPictureShader() { | 113 SkPictureShader::~SkPictureShader() { |
114 fPicture->unref(); | 114 fPicture->unref(); |
115 } | 115 } |
116 | 116 |
117 SkPictureShader* SkPictureShader::Create(const SkPicture* picture, TileMode tmx,
TileMode tmy, | 117 SkShader* SkPictureShader::Create(const SkPicture* picture, TileMode tmx, TileMo
de tmy, |
118 const SkMatrix* localMatrix, const SkRe
ct* tile) { | 118 const SkMatrix* localMatrix, const SkRe
ct* tile) { |
119 if (!picture || picture->cullRect().isEmpty() || (tile && tile->isEmpty()))
{ | 119 if (!picture || picture->cullRect().isEmpty() || (tile && tile->isEmpty()))
{ |
120 return NULL; | 120 return SkShader::CreateEmptyShader(); |
121 } | 121 } |
122 return SkNEW_ARGS(SkPictureShader, (picture, tmx, tmy, localMatrix, tile)); | 122 return SkNEW_ARGS(SkPictureShader, (picture, tmx, tmy, localMatrix, tile)); |
123 } | 123 } |
124 | 124 |
125 SkFlattenable* SkPictureShader::CreateProc(SkReadBuffer& buffer) { | 125 SkFlattenable* SkPictureShader::CreateProc(SkReadBuffer& buffer) { |
126 SkMatrix lm; | 126 SkMatrix lm; |
127 buffer.readMatrix(&lm); | 127 buffer.readMatrix(&lm); |
128 TileMode mx = (TileMode)buffer.read32(); | 128 TileMode mx = (TileMode)buffer.read32(); |
129 TileMode my = (TileMode)buffer.read32(); | 129 TileMode my = (TileMode)buffer.read32(); |
130 SkRect tile; | 130 SkRect tile; |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
178 if (scaledSize.width() > maxTextureSize || scaledSize.height() > maxText
ureSize) { | 178 if (scaledSize.width() > maxTextureSize || scaledSize.height() > maxText
ureSize) { |
179 SkScalar downScale = maxTextureSize / SkMax32(scaledSize.width(), sc
aledSize.height()); | 179 SkScalar downScale = maxTextureSize / SkMax32(scaledSize.width(), sc
aledSize.height()); |
180 scaledSize.set(SkScalarFloorToScalar(SkScalarMul(scaledSize.width(),
downScale)), | 180 scaledSize.set(SkScalarFloorToScalar(SkScalarMul(scaledSize.width(),
downScale)), |
181 SkScalarFloorToScalar(SkScalarMul(scaledSize.height()
, downScale))); | 181 SkScalarFloorToScalar(SkScalarMul(scaledSize.height()
, downScale))); |
182 } | 182 } |
183 } | 183 } |
184 #endif | 184 #endif |
185 | 185 |
186 SkISize tileSize = scaledSize.toRound(); | 186 SkISize tileSize = scaledSize.toRound(); |
187 if (tileSize.isEmpty()) { | 187 if (tileSize.isEmpty()) { |
188 return NULL; | 188 return SkShader::CreateEmptyShader(); |
189 } | 189 } |
190 | 190 |
191 // The actual scale, compensating for rounding & clamping. | 191 // The actual scale, compensating for rounding & clamping. |
192 SkSize tileScale = SkSize::Make(SkIntToScalar(tileSize.width()) / fTile.widt
h(), | 192 SkSize tileScale = SkSize::Make(SkIntToScalar(tileSize.width()) / fTile.widt
h(), |
193 SkIntToScalar(tileSize.height()) / fTile.hei
ght()); | 193 SkIntToScalar(tileSize.height()) / fTile.hei
ght()); |
194 | 194 |
195 SkAutoTUnref<SkShader> tileShader; | 195 SkAutoTUnref<SkShader> tileShader; |
196 BitmapShaderKey key(fPicture->uniqueID(), | 196 BitmapShaderKey key(fPicture->uniqueID(), |
197 fTile, | 197 fTile, |
198 fTmx, | 198 fTmx, |
199 fTmy, | 199 fTmy, |
200 tileScale, | 200 tileScale, |
201 this->getLocalMatrix()); | 201 this->getLocalMatrix()); |
202 | 202 |
203 if (!SkResourceCache::Find(key, BitmapShaderRec::Visitor, &tileShader)) { | 203 if (!SkResourceCache::Find(key, BitmapShaderRec::Visitor, &tileShader)) { |
204 SkBitmap bm; | 204 SkBitmap bm; |
205 bm.setInfo(SkImageInfo::MakeN32Premul(tileSize)); | 205 bm.setInfo(SkImageInfo::MakeN32Premul(tileSize)); |
206 if (!cache_try_alloc_pixels(&bm)) { | 206 if (!cache_try_alloc_pixels(&bm)) { |
207 return NULL; | 207 return SkShader::CreateEmptyShader(); |
208 } | 208 } |
209 bm.eraseColor(SK_ColorTRANSPARENT); | 209 bm.eraseColor(SK_ColorTRANSPARENT); |
210 | 210 |
211 // Always disable LCD text, since we can't assume our image will be opaq
ue. | 211 // Always disable LCD text, since we can't assume our image will be opaq
ue. |
212 SkCanvas canvas(bm, SkSurfaceProps(0, kUnknown_SkPixelGeometry)); | 212 SkCanvas canvas(bm, SkSurfaceProps(0, kUnknown_SkPixelGeometry)); |
213 | 213 |
214 canvas.scale(tileScale.width(), tileScale.height()); | 214 canvas.scale(tileScale.width(), tileScale.height()); |
215 canvas.translate(-fTile.x(), -fTile.y()); | 215 canvas.translate(-fTile.x(), -fTile.y()); |
216 canvas.drawPicture(fPicture); | 216 canvas.drawPicture(fPicture); |
217 | 217 |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
321 return bitmapShader->asFragmentProcessor(context, paint, viewM, NULL, paintC
olor, fp); | 321 return bitmapShader->asFragmentProcessor(context, paint, viewM, NULL, paintC
olor, fp); |
322 } | 322 } |
323 #else | 323 #else |
324 bool SkPictureShader::asFragmentProcessor(GrContext*, const SkPaint&, const SkMa
trix&, | 324 bool SkPictureShader::asFragmentProcessor(GrContext*, const SkPaint&, const SkMa
trix&, |
325 const SkMatrix*, GrColor*, | 325 const SkMatrix*, GrColor*, |
326 GrFragmentProcessor**) const { | 326 GrFragmentProcessor**) const { |
327 SkDEBUGFAIL("Should not call in GPU-less build"); | 327 SkDEBUGFAIL("Should not call in GPU-less build"); |
328 return false; | 328 return false; |
329 } | 329 } |
330 #endif | 330 #endif |
OLD | NEW |