Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(86)

Side by Side Diff: src/gpu/GrLayerHoister.cpp

Issue 772533004: Change clear() to respect the clip (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: fix SkRecordPartialDraw Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 "GrLayerCache.h" 8 #include "GrLayerCache.h"
9 #include "GrLayerHoister.h" 9 #include "GrLayerHoister.h"
10 #include "GrRecordReplaceDraw.h" 10 #include "GrRecordReplaceDraw.h"
(...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after
227 227
228 void GrLayerHoister::DrawLayersToAtlas(GrContext* context, 228 void GrLayerHoister::DrawLayersToAtlas(GrContext* context,
229 const SkTDArray<GrHoistedLayer>& atlased) { 229 const SkTDArray<GrHoistedLayer>& atlased) {
230 if (atlased.count() > 0) { 230 if (atlased.count() > 0) {
231 // All the atlased layers are rendered into the same GrTexture 231 // All the atlased layers are rendered into the same GrTexture
232 SkAutoTUnref<SkSurface> surface(SkSurface::NewRenderTargetDirect( 232 SkAutoTUnref<SkSurface> surface(SkSurface::NewRenderTargetDirect(
233 atlased[0].fLayer->texture()->asRenderTa rget(), NULL)); 233 atlased[0].fLayer->texture()->asRenderTa rget(), NULL));
234 234
235 SkCanvas* atlasCanvas = surface->getCanvas(); 235 SkCanvas* atlasCanvas = surface->getCanvas();
236 236
237 SkPaint clearPaint;
238 clearPaint.setColor(SK_ColorTRANSPARENT);
239 clearPaint.setXfermode(SkXfermode::Create(SkXfermode::kSrc_Mode))->unref ();
240
241 for (int i = 0; i < atlased.count(); ++i) { 237 for (int i = 0; i < atlased.count(); ++i) {
242 const GrCachedLayer* layer = atlased[i].fLayer; 238 const GrCachedLayer* layer = atlased[i].fLayer;
243 const SkPicture* pict = atlased[i].fPicture; 239 const SkPicture* pict = atlased[i].fPicture;
244 const SkIPoint offset = atlased[i].fOffset; 240 const SkIPoint offset = atlased[i].fOffset;
245 SkDEBUGCODE(const SkPaint* layerPaint = layer->paint();) 241 SkDEBUGCODE(const SkPaint* layerPaint = layer->paint();)
246 242
247 SkASSERT(!layerPaint || !layerPaint->getImageFilter()); 243 SkASSERT(!layerPaint || !layerPaint->getImageFilter());
248 244
249 atlasCanvas->save(); 245 atlasCanvas->save();
250 246
251 // Add a rect clip to make sure the rendering doesn't 247 // Add a rect clip to make sure the rendering doesn't
252 // extend beyond the boundaries of the atlased sub-rect 248 // extend beyond the boundaries of the atlased sub-rect
253 SkRect bound = SkRect::MakeXYWH(SkIntToScalar(layer->rect().fLeft), 249 SkRect bound = SkRect::MakeXYWH(SkIntToScalar(layer->rect().fLeft),
254 SkIntToScalar(layer->rect().fTop), 250 SkIntToScalar(layer->rect().fTop),
255 SkIntToScalar(layer->rect().width()) , 251 SkIntToScalar(layer->rect().width()) ,
256 SkIntToScalar(layer->rect().height() )); 252 SkIntToScalar(layer->rect().height() ));
257 atlasCanvas->clipRect(bound); 253 atlasCanvas->clipRect(bound);
258 254 atlasCanvas->clear(0);
259 // Since 'clear' doesn't respect the clip we need to draw a rect
260 atlasCanvas->drawRect(bound, clearPaint);
261 255
262 // '-offset' maps the layer's top/left to the origin. 256 // '-offset' maps the layer's top/left to the origin.
263 // Since this layer is atlased, the top/left corner needs 257 // Since this layer is atlased, the top/left corner needs
264 // to be offset to the correct location in the backing texture. 258 // to be offset to the correct location in the backing texture.
265 SkMatrix initialCTM; 259 SkMatrix initialCTM;
266 initialCTM.setTranslate(SkIntToScalar(-offset.fX), SkIntToScalar(-of fset.fY)); 260 initialCTM.setTranslate(SkIntToScalar(-offset.fX), SkIntToScalar(-of fset.fY));
267 initialCTM.preTranslate(bound.fLeft, bound.fTop); 261 initialCTM.preTranslate(bound.fLeft, bound.fTop);
268 initialCTM.preConcat(atlased[i].fPreMat); 262 initialCTM.preConcat(atlased[i].fPreMat);
269 263
270 atlasCanvas->setMatrix(initialCTM); 264 atlasCanvas->setMatrix(initialCTM);
271 atlasCanvas->concat(atlased[i].fLocalMat); 265 atlasCanvas->concat(atlased[i].fLocalMat);
272 266
273 SkRecordPartialDraw(*pict->fRecord.get(), atlasCanvas, 267 SkRecordPartialDraw(*pict->fRecord.get(), atlasCanvas,
274 pict->drawablePicts(), pict->drawableCount(), 268 pict->drawablePicts(), pict->drawableCount(),
275 bound, layer->start() + 1, layer->stop(), initia lCTM); 269 layer->start() + 1, layer->stop(), initialCTM);
276 270
277 atlasCanvas->restore(); 271 atlasCanvas->restore();
278 } 272 }
279 273
280 atlasCanvas->flush(); 274 atlasCanvas->flush();
281 } 275 }
282 } 276 }
283 277
284 void GrLayerHoister::DrawLayers(GrContext* context, const SkTDArray<GrHoistedLay er>& layers) { 278 void GrLayerHoister::DrawLayers(GrContext* context, const SkTDArray<GrHoistedLay er>& layers) {
285 for (int i = 0; i < layers.count(); ++i) { 279 for (int i = 0; i < layers.count(); ++i) {
(...skipping 10 matching lines...) Expand all
296 SkASSERT(0 == layer->rect().fLeft && 0 == layer->rect().fTop); 290 SkASSERT(0 == layer->rect().fLeft && 0 == layer->rect().fTop);
297 291
298 // Add a rect clip to make sure the rendering doesn't 292 // Add a rect clip to make sure the rendering doesn't
299 // extend beyond the boundaries of the layer 293 // extend beyond the boundaries of the layer
300 SkRect bound = SkRect::MakeXYWH(SkIntToScalar(layer->rect().fLeft), 294 SkRect bound = SkRect::MakeXYWH(SkIntToScalar(layer->rect().fLeft),
301 SkIntToScalar(layer->rect().fTop), 295 SkIntToScalar(layer->rect().fTop),
302 SkIntToScalar(layer->rect().width()), 296 SkIntToScalar(layer->rect().width()),
303 SkIntToScalar(layer->rect().height())); 297 SkIntToScalar(layer->rect().height()));
304 298
305 layerCanvas->clipRect(bound); 299 layerCanvas->clipRect(bound);
306
307 layerCanvas->clear(SK_ColorTRANSPARENT); 300 layerCanvas->clear(SK_ColorTRANSPARENT);
308 301
309 SkMatrix initialCTM; 302 SkMatrix initialCTM;
310 initialCTM.setTranslate(SkIntToScalar(-offset.fX), SkIntToScalar(-offset .fY)); 303 initialCTM.setTranslate(SkIntToScalar(-offset.fX), SkIntToScalar(-offset .fY));
311 initialCTM.preConcat(layers[i].fPreMat); 304 initialCTM.preConcat(layers[i].fPreMat);
312 305
313 layerCanvas->setMatrix(initialCTM); 306 layerCanvas->setMatrix(initialCTM);
314 layerCanvas->concat(layers[i].fLocalMat); 307 layerCanvas->concat(layers[i].fLocalMat);
315 308
316 SkRecordPartialDraw(*pict->fRecord.get(), layerCanvas, 309 SkRecordPartialDraw(*pict->fRecord.get(), layerCanvas,
317 pict->drawablePicts(), pict->drawableCount(), 310 pict->drawablePicts(), pict->drawableCount(),
318 bound, layer->start()+1, layer->stop(), initialCTM); 311 layer->start()+1, layer->stop(), initialCTM);
319 312
320 layerCanvas->flush(); 313 layerCanvas->flush();
321 } 314 }
322 } 315 }
323 316
324 void GrLayerHoister::UnlockLayers(GrContext* context, 317 void GrLayerHoister::UnlockLayers(GrContext* context,
325 const SkTDArray<GrHoistedLayer>& layers) { 318 const SkTDArray<GrHoistedLayer>& layers) {
326 GrLayerCache* layerCache = context->getLayerCache(); 319 GrLayerCache* layerCache = context->getLayerCache();
327 320
328 for (int i = 0; i < layers.count(); ++i) { 321 for (int i = 0; i < layers.count(); ++i) {
329 layerCache->removeUse(layers[i].fLayer); 322 layerCache->removeUse(layers[i].fLayer);
330 } 323 }
331 324
332 SkDEBUGCODE(layerCache->validate();) 325 SkDEBUGCODE(layerCache->validate();)
333 } 326 }
334 327
335 void GrLayerHoister::PurgeCache(GrContext* context) { 328 void GrLayerHoister::PurgeCache(GrContext* context) {
336 #if !GR_CACHE_HOISTED_LAYERS 329 #if !GR_CACHE_HOISTED_LAYERS
337 GrLayerCache* layerCache = context->getLayerCache(); 330 GrLayerCache* layerCache = context->getLayerCache();
338 331
339 // This code completely clears out the atlas. It is required when 332 // This code completely clears out the atlas. It is required when
340 // caching is disabled so the atlas doesn't fill up and force more 333 // caching is disabled so the atlas doesn't fill up and force more
341 // free floating layers 334 // free floating layers
342 layerCache->purgeAll(); 335 layerCache->purgeAll();
343 #endif 336 #endif
344 } 337 }
OLDNEW
« src/core/SkRecordDraw.h ('K') | « src/core/SkRecords.h ('k') | src/gpu/SkGpuDevice.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698