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); }
/* Map a point, expressed in the document viewport system, into the surface viewport. The transformation will be performed according to the current document viewport and the current surface viewport. The includeDstViewportTransformation parameter specifies if the surface viewport transformation must be considered during the mapping operation. */ public SVGPoint PointMap(SVGSurface surface, SVGPoint p, bool includeSurfaceViewportTransformation) { SVGPoint zero = new SVGPoint(0.0f, 0.0f); if (surface != null && p != null) { int err; float[] dst = new float[2]; // update document viewport (AmanithSVG backend) if (!this.UpdateViewport()) return zero; // update surface viewport (AmanithSVG backend) if (!surface.UpdateViewport()) return zero; // map the specified point if ((err = AmanithSVG.svgtPointMap(this._handle, surface.Handle, p.X, p.Y, includeSurfaceViewportTransformation ? AmanithSVG.SVGT_TRUE : AmanithSVG.SVGT_FALSE, dst)) != AmanithSVG.SVGT_NO_ERROR) { // log an error message AmanithSVG.svgtErrorLog("Error mapping a point: ", err); return zero; } // return the result return new SVGPoint(dst[0], dst[1]); } else return zero; }