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 "SkRecordOpts.h" | 8 #include "SkRecordOpts.h" |
9 | 9 |
10 #include "SkRecordPattern.h" | 10 #include "SkRecordPattern.h" |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
80 Is<Restore>> | 80 Is<Restore>> |
81 Match; | 81 Match; |
82 | 82 |
83 bool onMatch(SkRecord* record, Match*, int begin, int end) { | 83 bool onMatch(SkRecord* record, Match*, int begin, int end) { |
84 record->replace<NoOp>(begin); // Save | 84 record->replace<NoOp>(begin); // Save |
85 record->replace<NoOp>(end-1); // Restore | 85 record->replace<NoOp>(end-1); // Restore |
86 return true; | 86 return true; |
87 } | 87 } |
88 }; | 88 }; |
89 | 89 |
90 static bool fold_opacity_layer_color_to_paint(const SkPaint& layerPaint, | 90 static bool fold_opacity_layer_color_to_paint(const SkPaint* layerPaint, |
91 bool isSaveLayer, | 91 bool isSaveLayer, |
92 SkPaint* paint) { | 92 SkPaint* paint) { |
93 // We assume layerPaint is always from a saveLayer. If isSaveLayer is | 93 // We assume layerPaint is always from a saveLayer. If isSaveLayer is |
94 // true, we assume paint is too. | 94 // true, we assume paint is too. |
95 | 95 |
96 // The alpha folding can proceed if the filter layer paint does not have pro perties which cause | 96 // The alpha folding can proceed if the filter layer paint does not have pro perties which cause |
97 // the resulting filter layer to be "blended" in complex ways to the parent layer. For example, | 97 // the resulting filter layer to be "blended" in complex ways to the parent layer. For example, |
98 // looper drawing unmodulated filter layer twice and then modulating the res ult produces | 98 // looper drawing unmodulated filter layer twice and then modulating the res ult produces |
99 // different image to drawing modulated filter layer twice. | 99 // different image to drawing modulated filter layer twice. |
100 // TODO: most likely the looper and only some xfer modes are the hard constr aints | 100 // TODO: most likely the looper and only some xfer modes are the hard constr aints |
(...skipping 13 matching lines...) Expand all Loading... | |
114 if (paint->getColorFilter()) { | 114 if (paint->getColorFilter()) { |
115 // Filter input depends on the paint color. | 115 // Filter input depends on the paint color. |
116 | 116 |
117 // Here we could filter the color if we knew the draw is going to be uni form color. This | 117 // Here we could filter the color if we knew the draw is going to be uni form color. This |
118 // should be detectable as drawPath/drawRect/.. without a shader being u niform, while | 118 // should be detectable as drawPath/drawRect/.. without a shader being u niform, while |
119 // drawBitmap/drawSprite or a shader being non-uniform. However, current matchers don't | 119 // drawBitmap/drawSprite or a shader being non-uniform. However, current matchers don't |
120 // give the type out easily, so just do not optimize that at the moment. | 120 // give the type out easily, so just do not optimize that at the moment. |
121 return false; | 121 return false; |
122 } | 122 } |
123 | 123 |
124 const uint32_t layerColor = layerPaint.getColor(); | 124 const uint32_t layerColor = layerPaint ? layerPaint->getColor() : SK_ColorBL ACK; |
mtklein
2016/09/06 16:00:53
How about
if (layerPaint) {
SkColor layerColor
reed1
2016/09/06 16:49:44
Done.
| |
125 // The layer paint color must have only alpha component. | 125 // The layer paint color must have only alpha component. |
126 if (SK_ColorTRANSPARENT != SkColorSetA(layerColor, SK_AlphaTRANSPARENT)) { | 126 if (SK_ColorTRANSPARENT != SkColorSetA(layerColor, SK_AlphaTRANSPARENT)) { |
127 return false; | 127 return false; |
128 } | 128 } |
129 | 129 |
130 // The layer paint can not have any effects. | 130 if (layerPaint) { |
131 if (layerPaint.getPathEffect() || | 131 // The layer paint can not have any effects. |
132 layerPaint.getShader() || | 132 if (layerPaint->getPathEffect() || |
133 layerPaint.getXfermode() || | 133 layerPaint->getShader() || |
134 layerPaint.getMaskFilter() || | 134 layerPaint->getXfermode() || |
135 layerPaint.getColorFilter() || | 135 layerPaint->getMaskFilter() || |
136 layerPaint.getRasterizer() || | 136 layerPaint->getColorFilter() || |
137 layerPaint.getLooper() || | 137 layerPaint->getRasterizer() || |
138 layerPaint.getImageFilter()) { | 138 layerPaint->getLooper() || |
139 return false; | 139 layerPaint->getImageFilter()) { |
140 return false; | |
141 } | |
140 } | 142 } |
141 | 143 |
142 paint->setAlpha(SkMulDiv255Round(paint->getAlpha(), SkColorGetA(layerColor)) ); | 144 paint->setAlpha(SkMulDiv255Round(paint->getAlpha(), SkColorGetA(layerColor)) ); |
143 | 145 |
144 return true; | 146 return true; |
145 } | 147 } |
146 | 148 |
147 // Turns logical no-op Save-[non-drawing command]*-Restore patterns into actual no-ops. | 149 // Turns logical no-op Save-[non-drawing command]*-Restore patterns into actual no-ops. |
148 struct SaveNoDrawsRestoreNooper { | 150 struct SaveNoDrawsRestoreNooper { |
149 // Greedy matches greedily, so we also have to exclude Save and Restore. | 151 // Greedy matches greedily, so we also have to exclude Save and Restore. |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
204 // There wasn't really any point to this SaveLayer at all. | 206 // There wasn't really any point to this SaveLayer at all. |
205 return KillSaveLayerAndRestore(record, begin); | 207 return KillSaveLayerAndRestore(record, begin); |
206 } | 208 } |
207 | 209 |
208 if (drawPaint == nullptr) { | 210 if (drawPaint == nullptr) { |
209 // We can just give the draw the SaveLayer's paint. | 211 // We can just give the draw the SaveLayer's paint. |
210 // TODO(mtklein): figure out how to do this clearly | 212 // TODO(mtklein): figure out how to do this clearly |
211 return false; | 213 return false; |
212 } | 214 } |
213 | 215 |
214 if (!fold_opacity_layer_color_to_paint(*layerPaint, false /*isSaveLayer* /, drawPaint)) { | 216 if (!fold_opacity_layer_color_to_paint(layerPaint, false /*isSaveLayer*/ , drawPaint)) { |
215 return false; | 217 return false; |
216 } | 218 } |
217 | 219 |
218 return KillSaveLayerAndRestore(record, begin); | 220 return KillSaveLayerAndRestore(record, begin); |
219 } | 221 } |
220 | 222 |
221 static bool KillSaveLayerAndRestore(SkRecord* record, int saveLayerIndex) { | 223 static bool KillSaveLayerAndRestore(SkRecord* record, int saveLayerIndex) { |
222 record->replace<NoOp>(saveLayerIndex); // SaveLayer | 224 record->replace<NoOp>(saveLayerIndex); // SaveLayer |
223 record->replace<NoOp>(saveLayerIndex+2); // Restore | 225 record->replace<NoOp>(saveLayerIndex+2); // Restore |
224 return true; | 226 return true; |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
257 | 259 |
258 // This layer typically contains a filter, but this should work for laye rs with for other | 260 // This layer typically contains a filter, but this should work for laye rs with for other |
259 // purposes too. | 261 // purposes too. |
260 SkPaint* filterLayerPaint = match->fourth<SaveLayer>()->paint; | 262 SkPaint* filterLayerPaint = match->fourth<SaveLayer>()->paint; |
261 if (filterLayerPaint == nullptr) { | 263 if (filterLayerPaint == nullptr) { |
262 // We can just give the inner SaveLayer the paint of the outer SaveL ayer. | 264 // We can just give the inner SaveLayer the paint of the outer SaveL ayer. |
263 // TODO(mtklein): figure out how to do this clearly | 265 // TODO(mtklein): figure out how to do this clearly |
264 return false; | 266 return false; |
265 } | 267 } |
266 | 268 |
267 if (!fold_opacity_layer_color_to_paint(*opacityPaint, true /*isSaveLayer */, | 269 if (!fold_opacity_layer_color_to_paint(opacityPaint, true /*isSaveLayer* /, |
268 filterLayerPaint)) { | 270 filterLayerPaint)) { |
269 return false; | 271 return false; |
270 } | 272 } |
271 | 273 |
272 return KillSaveLayerAndRestore(record, begin); | 274 return KillSaveLayerAndRestore(record, begin); |
273 } | 275 } |
274 | 276 |
275 static bool KillSaveLayerAndRestore(SkRecord* record, int saveLayerIndex) { | 277 static bool KillSaveLayerAndRestore(SkRecord* record, int saveLayerIndex) { |
276 record->replace<NoOp>(saveLayerIndex); // SaveLayer | 278 record->replace<NoOp>(saveLayerIndex); // SaveLayer |
277 record->replace<NoOp>(saveLayerIndex + 6); // Restore | 279 record->replace<NoOp>(saveLayerIndex + 6); // Restore |
(...skipping 25 matching lines...) Expand all Loading... | |
303 } | 305 } |
304 | 306 |
305 void SkRecordOptimize2(SkRecord* record) { | 307 void SkRecordOptimize2(SkRecord* record) { |
306 multiple_set_matrices(record); | 308 multiple_set_matrices(record); |
307 SkRecordNoopSaveRestores(record); | 309 SkRecordNoopSaveRestores(record); |
308 SkRecordNoopSaveLayerDrawRestores(record); | 310 SkRecordNoopSaveLayerDrawRestores(record); |
309 SkRecordMergeSvgOpacityAndFilterLayers(record); | 311 SkRecordMergeSvgOpacityAndFilterLayers(record); |
310 | 312 |
311 record->defrag(); | 313 record->defrag(); |
312 } | 314 } |
OLD | NEW |