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 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
115 } | 115 } |
116 | 116 |
117 SkShader* SkPictureShader::Create(const SkPicture* picture, TileMode tmx, TileMo
de 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 SkShader::CreateEmptyShader(); | 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 // TODO: rename SK_DISALLOW_CROSSPROCESS_PICTUREIMAGEFILTERS to SK_DISALLOW_CROS
SPROCESS_PICTURES |
| 126 |
125 SkFlattenable* SkPictureShader::CreateProc(SkReadBuffer& buffer) { | 127 SkFlattenable* SkPictureShader::CreateProc(SkReadBuffer& buffer) { |
126 SkMatrix lm; | 128 SkMatrix lm; |
127 buffer.readMatrix(&lm); | 129 buffer.readMatrix(&lm); |
128 TileMode mx = (TileMode)buffer.read32(); | 130 TileMode mx = (TileMode)buffer.read32(); |
129 TileMode my = (TileMode)buffer.read32(); | 131 TileMode my = (TileMode)buffer.read32(); |
130 SkRect tile; | 132 SkRect tile; |
131 buffer.readRect(&tile); | 133 buffer.readRect(&tile); |
132 SkAutoTUnref<SkPicture> picture(SkPicture::CreateFromBuffer(buffer)); | 134 |
| 135 SkAutoTUnref<SkPicture> picture; |
| 136 #ifdef SK_DISALLOW_CROSSPROCESS_PICTUREIMAGEFILTERS |
| 137 if (buffer.isCrossProcess()) { |
| 138 if (buffer.isVersionLT(SkReadBuffer::kPictureShaderHasPictureBool_Versio
n)) { |
| 139 // Older code blindly serialized pictures. We don't trust them. |
| 140 buffer.validate(false); |
| 141 return NULL; |
| 142 } |
| 143 // Newer code won't serialize pictures in disallow-cross-process-picture
mode. |
| 144 // Assert that they didn't serialize anything except a false here. |
| 145 buffer.validate(!buffer.readBool()); |
| 146 } else |
| 147 #endif |
| 148 { |
| 149 // Old code always serialized the picture. New code writes a 'true' fir
st if it did. |
| 150 if (buffer.isVersionLT(SkReadBuffer::kPictureShaderHasPictureBool_Versio
n) || |
| 151 buffer.readBool()) { |
| 152 picture.reset(SkPicture::CreateFromBuffer(buffer)); |
| 153 } |
| 154 } |
133 return SkPictureShader::Create(picture, mx, my, &lm, &tile); | 155 return SkPictureShader::Create(picture, mx, my, &lm, &tile); |
134 } | 156 } |
135 | 157 |
136 void SkPictureShader::flatten(SkWriteBuffer& buffer) const { | 158 void SkPictureShader::flatten(SkWriteBuffer& buffer) const { |
137 buffer.writeMatrix(this->getLocalMatrix()); | 159 buffer.writeMatrix(this->getLocalMatrix()); |
138 buffer.write32(fTmx); | 160 buffer.write32(fTmx); |
139 buffer.write32(fTmy); | 161 buffer.write32(fTmy); |
140 buffer.writeRect(fTile); | 162 buffer.writeRect(fTile); |
141 fPicture->flatten(buffer); | 163 |
| 164 #ifdef SK_DISALLOW_CROSSPROCESS_PICTUREIMAGEFILTERS |
| 165 // The deserialization code won't trust that our serialized picture is safe
to deserialize. |
| 166 // So write a 'false' telling it that we're not serializing a picture. |
| 167 if (buffer.isCrossProcess()) { |
| 168 buffer.writeBool(false); |
| 169 } else |
| 170 #endif |
| 171 { |
| 172 buffer.writeBool(true); |
| 173 fPicture->flatten(buffer); |
| 174 } |
142 } | 175 } |
143 | 176 |
144 SkShader* SkPictureShader::refBitmapShader(const SkMatrix& matrix, const SkMatri
x* localM, | 177 SkShader* SkPictureShader::refBitmapShader(const SkMatrix& matrix, const SkMatri
x* localM, |
145 const int maxTextureSize) const { | 178 const int maxTextureSize) const { |
146 SkASSERT(fPicture && !fPicture->cullRect().isEmpty()); | 179 SkASSERT(fPicture && !fPicture->cullRect().isEmpty()); |
147 | 180 |
148 SkMatrix m; | 181 SkMatrix m; |
149 m.setConcat(matrix, this->getLocalMatrix()); | 182 m.setConcat(matrix, this->getLocalMatrix()); |
150 if (localM) { | 183 if (localM) { |
151 m.preConcat(*localM); | 184 m.preConcat(*localM); |
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
321 return bitmapShader->asFragmentProcessor(context, paint, viewM, NULL, paintC
olor, fp); | 354 return bitmapShader->asFragmentProcessor(context, paint, viewM, NULL, paintC
olor, fp); |
322 } | 355 } |
323 #else | 356 #else |
324 bool SkPictureShader::asFragmentProcessor(GrContext*, const SkPaint&, const SkMa
trix&, | 357 bool SkPictureShader::asFragmentProcessor(GrContext*, const SkPaint&, const SkMa
trix&, |
325 const SkMatrix*, GrColor*, | 358 const SkMatrix*, GrColor*, |
326 GrFragmentProcessor**) const { | 359 GrFragmentProcessor**) const { |
327 SkDEBUGFAIL("Should not call in GPU-less build"); | 360 SkDEBUGFAIL("Should not call in GPU-less build"); |
328 return false; | 361 return false; |
329 } | 362 } |
330 #endif | 363 #endif |
OLD | NEW |