198d709bc8d0761df8e0ad35e92c06e500f0be50drobertphillips/* 298d709bc8d0761df8e0ad35e92c06e500f0be50drobertphillips * Copyright 2014 Google Inc. 398d709bc8d0761df8e0ad35e92c06e500f0be50drobertphillips * 498d709bc8d0761df8e0ad35e92c06e500f0be50drobertphillips * Use of this source code is governed by a BSD-style license that can be 598d709bc8d0761df8e0ad35e92c06e500f0be50drobertphillips * found in the LICENSE file. 698d709bc8d0761df8e0ad35e92c06e500f0be50drobertphillips */ 798d709bc8d0761df8e0ad35e92c06e500f0be50drobertphillips 898d709bc8d0761df8e0ad35e92c06e500f0be50drobertphillips#ifndef GrLayerHoister_DEFINED 998d709bc8d0761df8e0ad35e92c06e500f0be50drobertphillips#define GrLayerHoister_DEFINED 1098d709bc8d0761df8e0ad35e92c06e500f0be50drobertphillips 1198d709bc8d0761df8e0ad35e92c06e500f0be50drobertphillips#include "SkPicture.h" 1298d709bc8d0761df8e0ad35e92c06e500f0be50drobertphillips#include "SkTDArray.h" 1398d709bc8d0761df8e0ad35e92c06e500f0be50drobertphillips 1498d709bc8d0761df8e0ad35e92c06e500f0be50drobertphillipsclass GrAccelData; 1598d709bc8d0761df8e0ad35e92c06e500f0be50drobertphillipsstruct GrCachedLayer; 161c4c528c2a5693c88ceb94888c747559c6a32091robertphillipsclass GrReplacements; 1798d709bc8d0761df8e0ad35e92c06e500f0be50drobertphillipsstruct SkRect; 1898d709bc8d0761df8e0ad35e92c06e500f0be50drobertphillips 1998d709bc8d0761df8e0ad35e92c06e500f0be50drobertphillips// This class collects the layer hoisting functionality in one place. 2098d709bc8d0761df8e0ad35e92c06e500f0be50drobertphillips// For each picture rendering: 2198d709bc8d0761df8e0ad35e92c06e500f0be50drobertphillips// FindLayersToHoist should be called once to collect the required layers 2298d709bc8d0761df8e0ad35e92c06e500f0be50drobertphillips// DrawLayers should be called once to render them 2398d709bc8d0761df8e0ad35e92c06e500f0be50drobertphillips// UnlockLayers should be called once to allow the texture resources to be recycled 2498d709bc8d0761df8e0ad35e92c06e500f0be50drobertphillipsclass GrLayerHoister { 2598d709bc8d0761df8e0ad35e92c06e500f0be50drobertphillipspublic: 2630d2cc6ff47cb7f981d83e9a536971beec920f61robertphillips struct HoistedLayer { 2730d2cc6ff47cb7f981d83e9a536971beec920f61robertphillips const SkPicture* fPicture; 2830d2cc6ff47cb7f981d83e9a536971beec920f61robertphillips GrCachedLayer* fLayer; 2930d2cc6ff47cb7f981d83e9a536971beec920f61robertphillips }; 3030d2cc6ff47cb7f981d83e9a536971beec920f61robertphillips 3130d2cc6ff47cb7f981d83e9a536971beec920f61robertphillips /** Find the layers in 'topLevelPicture' that need hoisting. Note that the discovered 3230d2cc6ff47cb7f981d83e9a536971beec920f61robertphillips layers can be inside nested sub-pictures. 3330d2cc6ff47cb7f981d83e9a536971beec920f61robertphillips @param topLevelPicture The top-level picture that is about to be rendered 3430d2cc6ff47cb7f981d83e9a536971beec920f61robertphillips @param query The rectangle that is about to be drawn. 3530d2cc6ff47cb7f981d83e9a536971beec920f61robertphillips @param atlased Out parameter storing the layers that should be hoisted to the atlas 3630d2cc6ff47cb7f981d83e9a536971beec920f61robertphillips @param nonAtlased Out parameter storing the layers that should be hoisted stand alone 371c4c528c2a5693c88ceb94888c747559c6a32091robertphillips @param layerCache The source of new layers 3898d709bc8d0761df8e0ad35e92c06e500f0be50drobertphillips Return true if any layers are suitable for hoisting; false otherwise 3998d709bc8d0761df8e0ad35e92c06e500f0be50drobertphillips */ 4030d2cc6ff47cb7f981d83e9a536971beec920f61robertphillips static bool FindLayersToHoist(const SkPicture* topLevelPicture, 4198d709bc8d0761df8e0ad35e92c06e500f0be50drobertphillips const SkRect& query, 4230d2cc6ff47cb7f981d83e9a536971beec920f61robertphillips SkTDArray<HoistedLayer>* altased, 4330d2cc6ff47cb7f981d83e9a536971beec920f61robertphillips SkTDArray<HoistedLayer>* nonAtlased, 441c4c528c2a5693c88ceb94888c747559c6a32091robertphillips GrLayerCache* layerCache); 4598d709bc8d0761df8e0ad35e92c06e500f0be50drobertphillips 4630d2cc6ff47cb7f981d83e9a536971beec920f61robertphillips /** Draw the specified layers into either the atlas or free floating textures. 471c4c528c2a5693c88ceb94888c747559c6a32091robertphillips @param atlased The layers to be drawn into the atlas 481c4c528c2a5693c88ceb94888c747559c6a32091robertphillips @param nonAtlased The layers to be drawn into their own textures 491c4c528c2a5693c88ceb94888c747559c6a32091robertphillips @oaram replacements The replacement structure to fill in with the rendered layer info 5098d709bc8d0761df8e0ad35e92c06e500f0be50drobertphillips */ 5130d2cc6ff47cb7f981d83e9a536971beec920f61robertphillips static void DrawLayers(const SkTDArray<HoistedLayer>& atlased, 5230d2cc6ff47cb7f981d83e9a536971beec920f61robertphillips const SkTDArray<HoistedLayer>& nonAtlased, 531c4c528c2a5693c88ceb94888c747559c6a32091robertphillips GrReplacements* replacements); 5498d709bc8d0761df8e0ad35e92c06e500f0be50drobertphillips 5530d2cc6ff47cb7f981d83e9a536971beec920f61robertphillips /** Unlock unneeded layers in the layer cache. 5698d709bc8d0761df8e0ad35e92c06e500f0be50drobertphillips @param layerCache holder of the locked layers 5730d2cc6ff47cb7f981d83e9a536971beec920f61robertphillips @param atlased Unneeded layers in the atlas 5830d2cc6ff47cb7f981d83e9a536971beec920f61robertphillips @param nonAtlased Unneeded layers in their own textures 5998d709bc8d0761df8e0ad35e92c06e500f0be50drobertphillips */ 6030d2cc6ff47cb7f981d83e9a536971beec920f61robertphillips static void UnlockLayers(GrLayerCache* layerCache, 6130d2cc6ff47cb7f981d83e9a536971beec920f61robertphillips const SkTDArray<HoistedLayer>& atlased, 6230d2cc6ff47cb7f981d83e9a536971beec920f61robertphillips const SkTDArray<HoistedLayer>& nonAtlased); 6398d709bc8d0761df8e0ad35e92c06e500f0be50drobertphillips}; 6498d709bc8d0761df8e0ad35e92c06e500f0be50drobertphillips 6598d709bc8d0761df8e0ad35e92c06e500f0be50drobertphillips#endif 66