public static bool GenerateSprites(// input
        List <SVGAssetInput> svgList,
        int maxTexturesDimension,
        int border,
        bool pow2Textures,
        float scale,
        Color clearColor,
        bool fastUpload,
        SVGSpritesDictionary previousSprites,
        // output
        List <Texture2D> textures,
        List <KeyValuePair <SVGSpriteRef, SVGSpriteData> > sprites,
        SVGSpritesListDictionary spritesList)
    {
        // create dictionaries
        Dictionary <int, PackedSvgAssetDocLink> processedAssets = new Dictionary <int, PackedSvgAssetDocLink>();
        Dictionary <uint, PackedSvgDocRef>      loadedDocuments = new Dictionary <uint, PackedSvgDocRef>();

        // generate bins
        SVGPackedBin[] bins = SVGRuntimeGenerator.GenerateBins(svgList, maxTexturesDimension, border, pow2Textures, scale, processedAssets, loadedDocuments);
        if (bins != null)
        {
            // generate textures and sprites
            if (SVGRuntimeGenerator.GenerateSpritesFromBins(bins, loadedDocuments, scale, clearColor, fastUpload, previousSprites, textures, sprites, spritesList))
            {
                return(true);
            }
        }
        return(false);
    }
    public SVGRuntimeSprite GetSpriteByName(string spriteName)
    {
        SVGSpritesDictionary spritesSet = Application.isPlaying ? this.m_RuntimeSprites : this.m_GeneratedSpritesFiles;
        float scale = Application.isPlaying ? this.m_RuntimeGenerationScale : this.m_EditorGenerationScale;

        if (spritesSet != null)
        {
            // slow linear search
            foreach (SVGSpriteAssetFile spriteAsset in spritesSet.Values())
            {
                Sprite sprite = spriteAsset.SpriteData.Sprite;
                if (sprite.name == spriteName)
                {
                    return(new SVGRuntimeSprite(sprite, scale, spriteAsset.SpriteRef));
                }
            }
        }
        return(null);
    }
    private static bool GenerateSpritesFromBins(// input
        SVGPackedBin[] bins,
        Dictionary <uint, PackedSvgDocRef> loadedDocuments,
        float generationScale,
        Color clearColor,
        bool fastUpload,
        SVGSpritesDictionary previousSprites,
        // output
        List <Texture2D> textures, List <KeyValuePair <SVGSpriteRef, SVGSpriteData> > sprites,
        SVGSpritesListDictionary spritesListDict)
    {
        if (bins == null || loadedDocuments == null || textures == null || sprites == null)
        {
            return(false);
        }

        // sprite reference/key used to get pivot
        SVGSpriteRef tmpRef = new SVGSpriteRef(null, 0);

        for (int i = 0; i < bins.Length; ++i)
        {
            // extract the bin
            SVGPackedBin bin = bins[i];
            // create drawing surface
            SVGSurface surface = SVGAssets.CreateSurface(bin.Width, bin.Height);

            if (surface != null)
            {
                // draw packed rectangles of the current bin
                if (surface.Draw(bin, new SVGColor(clearColor.r, clearColor.g, clearColor.b, clearColor.a), SVGRenderingQuality.Better))
                {
                    // bin rectangles
                    SVGPackedRectangle[] rectangles = bin.Rectangles;
                    // create a 2D texture compatible with the drawing surface
                    Texture2D texture = surface.CreateCompatibleTexture(true, false);

                    if (texture != null)
                    {
                        // push the created texture
                        textures.Add(texture);
                        for (int j = 0; j < rectangles.Length; ++j)
                        {
                            PackedSvgDocRef    svgDocRef;
                            SVGPackedRectangle rect = rectangles[j];
                            // get access to the referenced SVG document
                            if (loadedDocuments.TryGetValue(rect.DocHandle, out svgDocRef))
                            {
                                SVGSpriteAssetFile spriteAsset;
                                Vector2            pivot;
                                Vector4            border;
                                bool inCurrentInstancesGroup;
                                // try to see if this sprite was previously generated, and if so get its pivot
                                tmpRef.TxtAsset = svgDocRef.TxtAsset;
                                tmpRef.ElemIdx  = (int)rect.ElemIdx;
                                // get the previous pivot if present, else start with a default centered pivot
                                if (previousSprites.TryGetValue(tmpRef, out spriteAsset))
                                {
                                    float deltaScaleRatio = generationScale / spriteAsset.SpriteData.GenerationScale;
                                    pivot  = spriteAsset.SpriteData.Pivot;
                                    border = spriteAsset.SpriteData.Border * deltaScaleRatio;
                                    inCurrentInstancesGroup = spriteAsset.SpriteData.InCurrentInstancesGroup;
                                }
                                else
                                {
                                    pivot  = new Vector2(0.5f, 0.5f);
                                    border = Vector4.zero;
                                    inCurrentInstancesGroup = false;
                                }
                                // create a new sprite
                                Sprite sprite = Sprite.Create(texture, new Rect((float)rect.X, (float)((int)bin.Height - rect.Y - rect.Height), (float)rect.Width, (float)rect.Height), pivot, SVGBasicAtlas.SPRITE_PIXELS_PER_UNIT, 0, SpriteMeshType.FullRect, border);
                                sprite.name = svgDocRef.Name + "_" + rect.Name;
                                // push the sprite reference
                                SVGSpriteRef  key   = new SVGSpriteRef(svgDocRef.TxtAsset, (int)rect.ElemIdx);
                                SVGSpriteData value = new SVGSpriteData(sprite, pivot, border, rect.ZOrder, rect.OriginalX, rect.OriginalY, generationScale, inCurrentInstancesGroup);
                                sprites.Add(new KeyValuePair <SVGSpriteRef, SVGSpriteData>(key, value));
                                // check if we are interested in getting, for each SVG document, the list of its generated sprites
                                if (spritesListDict != null)
                                {
                                    SVGSpritesList spritesList;
                                    if (!spritesListDict.TryGetValue(svgDocRef.TxtAsset.GetInstanceID(), out spritesList))
                                    {
                                        // create the list of sprites location relative to the SVG text asset
                                        spritesList = new SVGSpritesList();
                                        spritesListDict.Add(svgDocRef.TxtAsset.GetInstanceID(), spritesList);
                                    }
                                    // add the new sprite the its list
                                    spritesList.Sprites.Add(key);
                                }

                                // decrement document references
                                if (svgDocRef.Dec(1) == 0)
                                {
                                    // we can free AmanithSVG native SVG document
                                    svgDocRef.Document.Dispose();
                                }
                            }
                        }
                        // copy the surface content into the texture
                        if (fastUpload && (Application.isPlaying))
                        {
                            surface.CopyAndDestroy(texture);
                        }
                        else
                        {
                            if (surface.Copy(texture))
                            {
                                // call Apply() so it's actually uploaded to the GPU
                                texture.Apply(false, false);
                            }
                        }
                    }
                }
                // destroy the AmanithSVG rendering surface
                surface.Dispose();
            }
        }
        return(true);
    }