private static RgbaImage TextureDefinitionToImage(TextureDefinition definition) { RgbaImage newImage = new RgbaImage(definition.Dimension) { Namespace = definition.Namespace, Offset = definition.Offset }; foreach (TextureDefinitionPatch patch in definition.Patches) { if (TryGetOrReadImage(patch.Name, patch.Namespace, out RgbaImage image)) { Vec2I position = patch.Origin; if (patch.UseOffsets) { position += image.Offset; } // TODO: Handle the other fields on the patch (ex: flipping, rotation). newImage.DrawOntoThis(image, position); } else { throw new Exception($"Cannot find image patch {patch.Name} in texture definition {definition.Name}"); } } return(newImage); }
private static bool TryCreateAnyNamespaceTexture(UpperString name, out Texture texture, out ResourceNamespace newNamespace) { if (loadedImages.TryGetAnyValue(name, out RgbaImage loadedImage, out newNamespace)) { texture = CreateAndTrackTexture(name, newNamespace, loadedImage); return(true); } if (TextureDefinitionManager.TryGetAny(name, out TextureDefinition definition, out ResourceNamespace definitionNamespace)) { RgbaImage compiledImage = TextureDefinitionToImage(definition); loadedImages.Add(name, definitionNamespace, compiledImage); texture = CreateAndTrackTexture(name, definitionNamespace, compiledImage); return(true); } if (Data.TryFindAny(name, out IEntry entry)) { if (TryReadImageEntry(entry, entry.Namespace, out RgbaImage newImage)) { loadedImages.Add(name, entry.Namespace, newImage); texture = CreateAndTrackTexture(name, entry.Namespace, newImage); return(true); } } texture = null; newNamespace = ResourceNamespace.Global; return(false); }
private static bool TryCreateExactNamespaceTexture(UpperString name, ResourceNamespace resourceNamespace, out Texture texture) { if (loadedImages.TryGetValue(name, resourceNamespace, out RgbaImage loadedImage)) { texture = CreateAndTrackTexture(name, resourceNamespace, loadedImage); return(true); } if (TextureDefinitionManager.TryGetExact(name, resourceNamespace, out TextureDefinition definition)) { RgbaImage compiledImage = TextureDefinitionToImage(definition); loadedImages.Add(name, resourceNamespace, compiledImage); texture = CreateAndTrackTexture(name, resourceNamespace, compiledImage); return(true); } if (Data.TryFindExact(name, resourceNamespace, out IEntry entry)) { if (TryReadImageEntry(entry, resourceNamespace, out RgbaImage newImage)) { loadedImages.Add(name, resourceNamespace, newImage); texture = CreateAndTrackTexture(name, resourceNamespace, newImage); return(true); } } texture = null; return(false); }
static void Main(string[] args) { // Calls the Run method on all the example classes // The rasterized images will be saved in the applications bin folder by default GifWithWebPalette.Run(); IndexedImage.Run(); JpegImage.Run(); MonochromeImage.Run(); MultiPageTiff.Run(); PdfPortfolio.Run(); PngImageWithRgbColor.Run(); PngImageWithUserPalette.Run(); RgbaImage.Run(); TiffImageColorFormat.Run(); }
public Texture(UpperString name, ResourceNamespace resourceNamespace, Shader shader, RgbaImage rgbaImage, PaletteImage paletteImage = null) { Name = name; Namespace = resourceNamespace; Material = new Material(shader) { mainTexture = rgbaImage.ToTexture(), name = $"{name.String} ({resourceNamespace})" }; Dimension = rgbaImage.Dimension; InverseDimension = new Vector2(1.0f / Dimension.Width, 1.0f / Dimension.Height); Rgba = new Optional <RgbaImage>(rgbaImage); Palette = new Optional <PaletteImage>(paletteImage); }
private static Texture CreateAndTrackTexture(UpperString name, ResourceNamespace resourceNamespace, RgbaImage image) { Texture texture = new Texture(name, resourceNamespace, defaultShader, image); textures.Add(name, resourceNamespace, texture); // To make things look a bit more reasonable with sprites, we'll // do GL_NEAREST since filtering makes them blurry and ugly. if (resourceNamespace == ResourceNamespace.Sprites) { texture.Material.mainTexture.filterMode = FilterMode.Point; } return(texture); }
private static bool TryGetOrReadImage(UpperString name, ResourceNamespace resourceNamespace, out RgbaImage rgbaImage) { if (loadedImages.TryGetValue(name, resourceNamespace, out rgbaImage)) { return(true); } if (Data.TryFindExact(name, resourceNamespace, out IEntry entry)) { if (TryReadImageEntry(entry, entry.Namespace, out rgbaImage)) { loadedImages.Add(name, entry.Namespace, rgbaImage); return(true); } } rgbaImage = null; return(false); }
private static bool TryReadImageEntry(IEntry entry, ResourceNamespace resourceNamespace, out RgbaImage rgbaImage) { byte[] data = entry.Data; // TODO: Handle PNG/JPG/...etc, here! // We want to give priority to reading flats if it's coming from a // flat namespace. This way we reduce false positive hits... which // should be very rare. Usually column palette images are in the // global namespace anyways and flats are generally in the flat // namespace. PaletteReaderFunc[] paletteReaders; if (resourceNamespace == ResourceNamespace.Flats) { paletteReaders = new PaletteReaderFunc[] { PaletteImage.FromFlat, PaletteImage.FromColumn } } ; else { paletteReaders = new PaletteReaderFunc[] { PaletteImage.FromColumn, PaletteImage.FromFlat } }; foreach (PaletteReaderFunc readerFunc in paletteReaders) { Optional <PaletteImage> paletteImage = readerFunc(data, resourceNamespace); if (!paletteImage) { continue; } rgbaImage = paletteImage.Value.ToColor(Palette); return(true); } rgbaImage = null; return(false); }
private static void SaveImageAsPpm(RgbaImage img, string path) { var utf8 = new UTF8Encoding(false); using (var fs = File.Open(path, FileMode.Create, FileAccess.Write, FileShare.Write)) { using (var writer = new StreamWriter(fs, utf8)) { writer.NewLine = "\n"; var w = img.Width; var h = img.Height; writer.WriteLine("P3"); writer.WriteLine("{0} {1}", w.ToString(), h.ToString()); writer.WriteLine("255"); for (var y = 0; y < h; y += 1) { for (var x = 0; x < w; x += 1) { var pixel = img.ReadPixel(x, y); var a = pixel.A / 255.0f; var r = (int)(pixel.R * a); var g = (int)(pixel.G * a); var b = (int)(pixel.B * a); writer.Write("{0} {1} {2}", r.ToString(), g.ToString(), b.ToString()); writer.Write("\t"); } writer.WriteLine(); } } } }