/* * Copyright 2014 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef GrLayerHoister_DEFINED #define GrLayerHoister_DEFINED #include "SkPicture.h" #include "SkTDArray.h" class GrAccelData; struct GrCachedLayer; class GrReplacements; struct SkRect; class GrHoistedLayer { public: const SkPicture* fPicture; GrCachedLayer* fLayer; SkIPoint fOffset; SkMatrix fPreMat; SkMatrix fLocalMat; }; // This class collects the layer hoisting functionality in one place. // For each picture rendering: // FindLayersToHoist should be called once to collect the required layers // DrawLayers should be called once to render them // UnlockLayers should be called once to allow the texture resources to be recycled class GrLayerHoister { public: /** Find the layers in 'topLevelPicture' that can be atlased. Note that the discovered layers can be inside nested sub-pictures. @param context Owner of the layer cache (the source of new layers) @param topLevelPicture The top-level picture that is about to be rendered @param query The rectangle that is about to be drawn. @param atlasedNeedRendering Out parameter storing the layers that should be hoisted to the atlas @param recycled Out parameter storing layers that are atlased but do not need rendering */ static void FindLayersToAtlas(GrContext* context, const SkPicture* topLevelPicture, const SkRect& query, SkTDArray* atlasedNeedRendering, SkTDArray* recycled); /** Find the layers in 'topLevelPicture' that need hoisting. Note that the discovered layers can be inside nested sub-pictures. @param context Owner of the layer cache (the source of new layers) @param topLevelPicture The top-level picture that is about to be rendered @param query The rectangle that is about to be drawn. @param needRendering Out parameter storing the layers that need rendering. This should never include atlased layers. @param recycled Out parameter storing layers that need hoisting but not rendering */ static void FindLayersToHoist(GrContext* context, const SkPicture* topLevelPicture, const SkRect& query, SkTDArray* needRendering, SkTDArray* recycled); /** Draw the specified layers into the atlas. @param context Owner of the layer cache (and thus the layers) @param layers The layers to be drawn into the atlas */ static void DrawLayersToAtlas(GrContext* context, const SkTDArray& layers); /** Draw the specified layers into their own individual textures. @param context Owner of the layer cache (and thus the layers) @param layers The layers to be drawn */ static void DrawLayers(GrContext* context, const SkTDArray& layers); /** Convert all the layers in 'layers' into replacement objects in 'replacements'. @param layers The hoisted layers @param replacements Replacement object that will be used for a replacement draw */ static void ConvertLayersToReplacements(const SkTDArray& layers, GrReplacements* replacements); /** Unlock a group of layers in the layer cache. @param context Owner of the layer cache (and thus the layers) @param layers Unneeded layers in the atlas */ static void UnlockLayers(GrContext* context, const SkTDArray& layers); }; #endif