| 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 "GrLayerCache.h" | 8 #include "GrLayerCache.h" |
| 9 #include "GrLayerHoister.h" | 9 #include "GrLayerHoister.h" |
| 10 #include "GrRecordReplaceDraw.h" | 10 #include "GrRecordReplaceDraw.h" |
| (...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 186 | 186 |
| 187 void GrLayerHoister::DrawLayersToAtlas(GrContext* context, | 187 void GrLayerHoister::DrawLayersToAtlas(GrContext* context, |
| 188 const SkTDArray<GrHoistedLayer>& atlased)
{ | 188 const SkTDArray<GrHoistedLayer>& atlased)
{ |
| 189 if (atlased.count() > 0) { | 189 if (atlased.count() > 0) { |
| 190 // All the atlased layers are rendered into the same GrTexture | 190 // All the atlased layers are rendered into the same GrTexture |
| 191 SkAutoTUnref<SkSurface> surface(SkSurface::NewRenderTargetDirect( | 191 SkAutoTUnref<SkSurface> surface(SkSurface::NewRenderTargetDirect( |
| 192 atlased[0].fLayer->texture()->asRenderTa
rget(), NULL)); | 192 atlased[0].fLayer->texture()->asRenderTa
rget(), NULL)); |
| 193 | 193 |
| 194 SkCanvas* atlasCanvas = surface->getCanvas(); | 194 SkCanvas* atlasCanvas = surface->getCanvas(); |
| 195 | 195 |
| 196 SkPaint clearPaint; | |
| 197 clearPaint.setColor(SK_ColorTRANSPARENT); | |
| 198 clearPaint.setXfermode(SkXfermode::Create(SkXfermode::kSrc_Mode))->unref
(); | |
| 199 | |
| 200 for (int i = 0; i < atlased.count(); ++i) { | 196 for (int i = 0; i < atlased.count(); ++i) { |
| 201 const GrCachedLayer* layer = atlased[i].fLayer; | 197 const GrCachedLayer* layer = atlased[i].fLayer; |
| 202 const SkPicture* pict = atlased[i].fPicture; | 198 const SkPicture* pict = atlased[i].fPicture; |
| 203 const SkIPoint offset = SkIPoint::Make(layer->bound().fLeft, layer->
bound().fTop); | 199 const SkIPoint offset = SkIPoint::Make(layer->bound().fLeft, layer->
bound().fTop); |
| 204 SkDEBUGCODE(const SkPaint* layerPaint = layer->paint();) | 200 SkDEBUGCODE(const SkPaint* layerPaint = layer->paint();) |
| 205 | 201 |
| 206 SkASSERT(!layerPaint || !layerPaint->getImageFilter()); | 202 SkASSERT(!layerPaint || !layerPaint->getImageFilter()); |
| 207 | 203 |
| 208 atlasCanvas->save(); | 204 atlasCanvas->save(); |
| 209 | 205 |
| 210 // Add a rect clip to make sure the rendering doesn't | 206 // Add a rect clip to make sure the rendering doesn't |
| 211 // extend beyond the boundaries of the atlased sub-rect | 207 // extend beyond the boundaries of the atlased sub-rect |
| 212 const SkRect bound = SkRect::Make(layer->rect()); | 208 const SkRect bound = SkRect::Make(layer->rect()); |
| 213 atlasCanvas->clipRect(bound); | 209 atlasCanvas->clipRect(bound); |
| 214 | 210 atlasCanvas->clear(0); |
| 215 // Since 'clear' doesn't respect the clip we need to draw a rect | |
| 216 atlasCanvas->drawRect(bound, clearPaint); | |
| 217 | 211 |
| 218 // '-offset' maps the layer's top/left to the origin. | 212 // '-offset' maps the layer's top/left to the origin. |
| 219 // Since this layer is atlased, the top/left corner needs | 213 // Since this layer is atlased, the top/left corner needs |
| 220 // to be offset to the correct location in the backing texture. | 214 // to be offset to the correct location in the backing texture. |
| 221 SkMatrix initialCTM; | 215 SkMatrix initialCTM; |
| 222 initialCTM.setTranslate(SkIntToScalar(-offset.fX), SkIntToScalar(-of
fset.fY)); | 216 initialCTM.setTranslate(SkIntToScalar(-offset.fX), SkIntToScalar(-of
fset.fY)); |
| 223 initialCTM.preTranslate(bound.fLeft, bound.fTop); | 217 initialCTM.preTranslate(bound.fLeft, bound.fTop); |
| 224 initialCTM.preConcat(atlased[i].fPreMat); | 218 initialCTM.preConcat(atlased[i].fPreMat); |
| 225 | 219 |
| 226 atlasCanvas->setMatrix(initialCTM); | 220 atlasCanvas->setMatrix(initialCTM); |
| 227 atlasCanvas->concat(atlased[i].fLocalMat); | 221 atlasCanvas->concat(atlased[i].fLocalMat); |
| 228 | 222 |
| 229 SkRecordPartialDraw(*pict->fRecord.get(), atlasCanvas, | 223 SkRecordPartialDraw(*pict->fRecord.get(), atlasCanvas, |
| 230 pict->drawablePicts(), pict->drawableCount(), | 224 pict->drawablePicts(), pict->drawableCount(), |
| 231 bound, layer->start() + 1, layer->stop(), initia
lCTM); | 225 layer->start() + 1, layer->stop(), initialCTM); |
| 232 | 226 |
| 233 atlasCanvas->restore(); | 227 atlasCanvas->restore(); |
| 234 } | 228 } |
| 235 | 229 |
| 236 atlasCanvas->flush(); | 230 atlasCanvas->flush(); |
| 237 } | 231 } |
| 238 } | 232 } |
| 239 | 233 |
| 240 void GrLayerHoister::DrawLayers(GrContext* context, const SkTDArray<GrHoistedLay
er>& layers) { | 234 void GrLayerHoister::DrawLayers(GrContext* context, const SkTDArray<GrHoistedLay
er>& layers) { |
| 241 for (int i = 0; i < layers.count(); ++i) { | 235 for (int i = 0; i < layers.count(); ++i) { |
| 242 GrCachedLayer* layer = layers[i].fLayer; | 236 GrCachedLayer* layer = layers[i].fLayer; |
| 243 const SkPicture* pict = layers[i].fPicture; | 237 const SkPicture* pict = layers[i].fPicture; |
| 244 const SkIPoint offset = SkIPoint::Make(layer->bound().fLeft, layer->boun
d().fTop); | 238 const SkIPoint offset = SkIPoint::Make(layer->bound().fLeft, layer->boun
d().fTop); |
| 245 | 239 |
| 246 // Each non-atlased layer has its own GrTexture | 240 // Each non-atlased layer has its own GrTexture |
| 247 SkAutoTUnref<SkSurface> surface(SkSurface::NewRenderTargetDirect( | 241 SkAutoTUnref<SkSurface> surface(SkSurface::NewRenderTargetDirect( |
| 248 layer->texture()->asRenderTarget(), NULL
)); | 242 layer->texture()->asRenderTarget(), NULL
)); |
| 249 | 243 |
| 250 SkCanvas* layerCanvas = surface->getCanvas(); | 244 SkCanvas* layerCanvas = surface->getCanvas(); |
| 251 | 245 |
| 252 SkASSERT(0 == layer->rect().fLeft && 0 == layer->rect().fTop); | 246 SkASSERT(0 == layer->rect().fLeft && 0 == layer->rect().fTop); |
| 253 | 247 |
| 254 // Add a rect clip to make sure the rendering doesn't | 248 // Add a rect clip to make sure the rendering doesn't |
| 255 // extend beyond the boundaries of the layer | 249 // extend beyond the boundaries of the layer |
| 256 const SkRect bound = SkRect::Make(layer->rect()); | 250 const SkRect bound = SkRect::Make(layer->rect()); |
| 257 layerCanvas->clipRect(bound); | 251 layerCanvas->clipRect(bound); |
| 258 | |
| 259 layerCanvas->clear(SK_ColorTRANSPARENT); | 252 layerCanvas->clear(SK_ColorTRANSPARENT); |
| 260 | 253 |
| 261 SkMatrix initialCTM; | 254 SkMatrix initialCTM; |
| 262 initialCTM.setTranslate(SkIntToScalar(-offset.fX), SkIntToScalar(-offset
.fY)); | 255 initialCTM.setTranslate(SkIntToScalar(-offset.fX), SkIntToScalar(-offset
.fY)); |
| 263 initialCTM.preConcat(layers[i].fPreMat); | 256 initialCTM.preConcat(layers[i].fPreMat); |
| 264 | 257 |
| 265 layerCanvas->setMatrix(initialCTM); | 258 layerCanvas->setMatrix(initialCTM); |
| 266 layerCanvas->concat(layers[i].fLocalMat); | 259 layerCanvas->concat(layers[i].fLocalMat); |
| 267 | 260 |
| 268 SkRecordPartialDraw(*pict->fRecord.get(), layerCanvas, | 261 SkRecordPartialDraw(*pict->fRecord.get(), layerCanvas, |
| 269 pict->drawablePicts(), pict->drawableCount(), | 262 pict->drawablePicts(), pict->drawableCount(), |
| 270 bound, layer->start()+1, layer->stop(), initialCTM); | 263 layer->start()+1, layer->stop(), initialCTM); |
| 271 | 264 |
| 272 layerCanvas->flush(); | 265 layerCanvas->flush(); |
| 273 } | 266 } |
| 274 } | 267 } |
| 275 | 268 |
| 276 void GrLayerHoister::UnlockLayers(GrContext* context, | 269 void GrLayerHoister::UnlockLayers(GrContext* context, |
| 277 const SkTDArray<GrHoistedLayer>& layers) { | 270 const SkTDArray<GrHoistedLayer>& layers) { |
| 278 GrLayerCache* layerCache = context->getLayerCache(); | 271 GrLayerCache* layerCache = context->getLayerCache(); |
| 279 | 272 |
| 280 for (int i = 0; i < layers.count(); ++i) { | 273 for (int i = 0; i < layers.count(); ++i) { |
| 281 layerCache->removeUse(layers[i].fLayer); | 274 layerCache->removeUse(layers[i].fLayer); |
| 282 } | 275 } |
| 283 | 276 |
| 284 SkDEBUGCODE(layerCache->validate();) | 277 SkDEBUGCODE(layerCache->validate();) |
| 285 } | 278 } |
| 286 | 279 |
| 287 void GrLayerHoister::PurgeCache(GrContext* context) { | 280 void GrLayerHoister::PurgeCache(GrContext* context) { |
| 288 #if !GR_CACHE_HOISTED_LAYERS | 281 #if !GR_CACHE_HOISTED_LAYERS |
| 289 GrLayerCache* layerCache = context->getLayerCache(); | 282 GrLayerCache* layerCache = context->getLayerCache(); |
| 290 | 283 |
| 291 // This code completely clears out the atlas. It is required when | 284 // This code completely clears out the atlas. It is required when |
| 292 // caching is disabled so the atlas doesn't fill up and force more | 285 // caching is disabled so the atlas doesn't fill up and force more |
| 293 // free floating layers | 286 // free floating layers |
| 294 layerCache->purgeAll(); | 287 layerCache->purgeAll(); |
| 295 #endif | 288 #endif |
| 296 } | 289 } |
| OLD | NEW |