示例#1
0
        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);
        }
示例#2
0
        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);
        }
示例#3
0
        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);
        }
示例#4
0
 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();
 }
示例#5
0
 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);
 }
示例#6
0
        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);
        }
示例#7
0
        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);
        }
示例#8
0
        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);
        }
示例#9
0
        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();
                    }
                }
            }
        }