示例#1
0
        public PhotonLayer GetLayer()
        {
            var photonLayer = new PhotonLayer(photonFileHeader.GetResolutionX(), photonFileHeader.GetResolutionY());

            photonLayer.UnpackLayerImage(packedLayerImage);
            return(photonLayer);
        }
示例#2
0
 public void SaveLayer(PhotonLayer photonLayer)
 {
     this.packedLayerImage = photonLayer.PackLayerImage();
     this.imageData        = photonLayer.PackImageData();
     this.dataSize         = imageData.Length;
     islandRows            = new List <BitArray>();
     isLandsCount          = photonLayer.SetIslands(islandRows);
 }
示例#3
0
        public static List <PhotonFileLayer> ReadLayers(PhotonFileHeader photonFileHeader, byte[] fileContent, int margin, Action <string> reportProgress)
        {
            var photonLayer = new PhotonLayer(photonFileHeader.GetResolutionX(), photonFileHeader.GetResolutionY());

            var layers = new List <PhotonFileLayer>();

            int antiAliasLevel = 1;

            if (photonFileHeader.GetVersion() > 1)
            {
                antiAliasLevel = photonFileHeader.GetAntiAliasingLevel();
            }

            int layerCount = photonFileHeader.GetNumberOfLayers();

            var start = photonFileHeader.GetLayersDefinitionOffsetAddress();
            var ds    = new BinaryReader(new MemoryStream(fileContent, start, fileContent.Length - start));

            {
                var layerMap = new Dictionary <int, PhotonFileLayer>();
                for (int i = 0; i < layerCount; i++)
                {
                    reportProgress?.Invoke("Reading photon file layer " + (i + 1) + "/" + photonFileHeader.GetNumberOfLayers());

                    var layer = new PhotonFileLayer(ds)
                    {
                        photonFileHeader = photonFileHeader
                    };
                    layer.imageData = ArraysEmulation.CopyOfRange(fileContent, layer.dataAddress, layer.dataAddress + layer.dataSize);
                    layers.Add(layer);
                    layerMap[i] = layer;
                }

                if (antiAliasLevel > 1)
                {
                    for (int a = 0; a < (antiAliasLevel - 1); a++)
                    {
                        for (int i = 0; i < layerCount; i++)
                        {
                            reportProgress?.Invoke("Reading photon file AA " + (2 + a) + "/" + antiAliasLevel + " layer " + (i + 1) + "/" + photonFileHeader.GetNumberOfLayers());

                            var layer = new PhotonFileLayer(ds)
                            {
                                photonFileHeader = photonFileHeader
                            };
                            layer.imageData = ArraysEmulation.CopyOfRange(fileContent, layer.dataAddress, layer.dataAddress + layer.dataSize);

                            layerMap[i].AddAntiAliasLayer(layer);
                        }
                    }
                }
            }

            photonLayer.UnLink();

            return(layers);
        }
示例#4
0
        private int Fixit(Action <string> reportProgress, PhotonLayer layer, PhotonFileLayer fileLayer, int loops)
        {
            int changed = layer.Fixlayer();

            if (changed > 0)
            {
                layer.Reduce();
                fileLayer.UpdateLayerIslands(layer);
                reportProgress?.Invoke(", " + changed + " pixels changed");
                if (loops > 0)
                {
                    changed += Fixit(reportProgress, layer, fileLayer, loops - 1);
                }
            }
            return(changed);
        }
示例#5
0
        public static void CalculateLayers(PhotonFileHeader photonFileHeader, List <PhotonFileLayer> layers, int margin, Action <string> reportProgress)
        {
            var             photonLayer           = new PhotonLayer(photonFileHeader.GetResolutionX(), photonFileHeader.GetResolutionY());
            List <BitArray> previousUnpackedImage = null;

            for (int i = 0; i < layers.Count; i++)
            {
                var layer = layers[i];

                List <BitArray> unpackedImage = layer.UnpackImage(photonFileHeader.GetResolutionX(), photonFileHeader.GetResolutionY());

                reportProgress?.Invoke("Calculating photon file layer " + i + "/" + photonFileHeader.GetNumberOfLayers());

                if (margin > 0)
                {
                    layer.extendsMargin = layer.CheckMargin(unpackedImage, margin);
                }

                layer.UnknownPixels(unpackedImage, photonLayer);

                layer.Calculate(unpackedImage, previousUnpackedImage, photonLayer);

                if (previousUnpackedImage != null)
                {
                    previousUnpackedImage.Clear();
                }
                previousUnpackedImage = unpackedImage;

                layer.packedLayerImage = photonLayer.PackLayerImage();
                layer.isCalculated     = true;

                if (photonFileHeader.GetVersion() > 1)
                {
                    foreach (var aaFileLayer in layer.antiAliasLayers)
                    {
                        List <BitArray> aaUnpackedImage = aaFileLayer.UnpackImage(photonFileHeader.GetResolutionX(), photonFileHeader.GetResolutionY());
                        var             aaPhotonLayer   = new PhotonLayer(photonFileHeader.GetResolutionX(), photonFileHeader.GetResolutionY());
                        aaFileLayer.UnknownPixels(aaUnpackedImage, aaPhotonLayer);
                        aaFileLayer.packedLayerImage = aaPhotonLayer.PackLayerImage();
                        aaFileLayer.isCalculated     = false;
                    }
                }
            }
            photonLayer.UnLink();
        }
示例#6
0
        private void UnknownPixels(List <BitArray> unpackedImage, PhotonLayer photonLayer)
        {
            photonLayer.Clear();

            for (int y = 0; y < unpackedImage.Count; y++)
            {
                BitArray currentRow = unpackedImage[y];
                if (currentRow != null)
                {
                    int x = 0;
                    while ((x = currentRow.NextSetBit(x)) >= 0)
                    {
                        photonLayer.Supported(x, y);
                        ++x;
                    }
                }
            }
        }
示例#7
0
        private void AaPixels(List <BitArray> unpackedImage, PhotonLayer photonLayer)
        {
            photonLayer.Clear();

            for (int y = 0; y < unpackedImage.Count; y++)
            {
                BitArray currentRow = unpackedImage[y];
                if (currentRow != null)
                {
                    for (int x = 0; x < currentRow.Length; x++)
                    {
                        if (currentRow[x])
                        {
                            photonLayer.UnSupported(x, y);
                        }
                    }
                }
            }
        }
示例#8
0
        public bool RemoveAllIslands(Action <string> reportProgress)
        {
            bool layersFixed = false;

            reportProgress?.Invoke("Removing islands from " + islandLayers.Count + " layers...<br>");
            PhotonLayer layer = null;

            foreach (var layerNo in islandLayers)
            {
                PhotonFileLayer fileLayer = layers[layerNo];
                if (layer == null)
                {
                    layer = fileLayer.GetLayer();
                }
                else
                {
                    fileLayer.GetUpdateLayer(layer);
                }
                reportProgress?.Invoke("Removing islands from layer " + layerNo);

                int removed = layer.RemoveIslands();
                if (removed == 0)
                {
                    reportProgress?.Invoke(", but nothing could be done.");
                }
                else
                {
                    reportProgress?.Invoke(", " + removed + " islands removed");
                    fileLayer.SaveLayer(layer);
                    Calculate(layerNo);
                    if (layerNo < GetLayerCount() - 1)
                    {
                        Calculate(layerNo + 1);
                    }
                    layersFixed = true;
                }
                reportProgress?.Invoke("<br>");
            }
            FindIslands();
            return(layersFixed);
        }
示例#9
0
        public bool FixLayers(Action <string> reportProgress)
        {
            bool        layersFixed = false;
            PhotonLayer layer       = null;

            foreach (int layerNo in islandLayers)
            {
                reportProgress?.Invoke("Checking layer " + layerNo);

                // Unpack the layer data to the layer utility class
                PhotonFileLayer fileLayer = layers[layerNo];
                if (layer == null)
                {
                    layer = fileLayer.GetLayer();
                }
                else
                {
                    fileLayer.GetUpdateLayer(layer);
                }

                int changed = Fixit(reportProgress, layer, fileLayer, 10);
                if (changed == 0)
                {
                    reportProgress?.Invoke(", but nothing could be done.");
                }
                else
                {
                    fileLayer.SaveLayer(layer);
                    Calculate(layerNo);
                    if (layerNo < GetLayerCount() - 1)
                    {
                        Calculate(layerNo + 1);
                    }
                    layersFixed = true;
                }

                reportProgress?.Invoke("<br>");
            }
            FindIslands();
            return(layersFixed);
        }
示例#10
0
        public static void CalculateLayers(PhotonFileHeader photonFileHeader, List <PhotonFileLayer> layers, int margin, int layerIndex)
        {
            var             photonLayer           = new PhotonLayer(photonFileHeader.GetResolutionX(), photonFileHeader.GetResolutionY());
            List <BitArray> previousUnpackedImage = null;

            if (layerIndex > 0)
            {
                previousUnpackedImage = layers[layerIndex - 1].UnpackImage(photonFileHeader.GetResolutionX(), photonFileHeader.GetResolutionY());
            }

            for (int i = 0; i < 2; i++)
            {
                PhotonFileLayer layer         = layers[layerIndex + i];
                List <BitArray> unpackedImage = layer.UnpackImage(photonFileHeader.GetResolutionX(), photonFileHeader.GetResolutionY());

                if (margin > 0)
                {
                    layer.extendsMargin = layer.CheckMargin(unpackedImage, margin);
                }

                layer.UnknownPixels(unpackedImage, photonLayer);

                layer.Calculate(unpackedImage, previousUnpackedImage, photonLayer);

                if (previousUnpackedImage != null)
                {
                    previousUnpackedImage.Clear();
                }
                previousUnpackedImage = unpackedImage;

                layer.packedLayerImage = photonLayer.PackLayerImage();
                layer.isCalculated     = true;

                i++;
            }
            photonLayer.UnLink();
        }
示例#11
0
        public static void CalculateAALayers(PhotonFileHeader photonFileHeader, List <PhotonFileLayer> layers, PhotonAaMatrix photonAaMatrix, Action <string> reportProgress)
        {
            var photonLayer = new PhotonLayer(photonFileHeader.GetResolutionX(), photonFileHeader.GetResolutionY());

            int[,] source = new int[photonFileHeader.GetResolutionY(), photonFileHeader.GetResolutionX()];

            int i = 0;

            foreach (var layer in layers)
            {
                List <BitArray> unpackedImage = layer.UnpackImage(photonFileHeader.GetResolutionX(), photonFileHeader.GetResolutionY());

                reportProgress?.Invoke("Calculating AA for photon file layer " + i + "/" + photonFileHeader.GetNumberOfLayers());

                for (int y = 0; y < photonFileHeader.GetResolutionY(); y++)
                {
                    for (int x = 0; x < photonFileHeader.GetResolutionX(); x++)
                    {
                        source[y, x] = 0;
                    }
                }

                for (int y = 0; y < unpackedImage.Count; y++)
                {
                    BitArray currentRow = unpackedImage[y];
                    if (currentRow != null)
                    {
                        for (int x = 0; x < currentRow.Length; x++)
                        {
                            if (currentRow[x])
                            {
                                source[y, x] = 255;
                            }
                        }
                    }
                }

                // Calc
                int[,] target = photonAaMatrix.Calc(source);

                int aaTresholdDiff = 255 / photonFileHeader.GetAntiAliasingLevel();
                int aaTreshold     = 0;
                foreach (var aaFileLayer in layer.antiAliasLayers)
                {
                    photonLayer.Clear();
                    aaTreshold += aaTresholdDiff;

                    for (int y = 0; y < photonFileHeader.GetResolutionY(); y++)
                    {
                        for (int x = 0; x < photonFileHeader.GetResolutionX(); x++)
                        {
                            if (target[y, x] >= aaTreshold)
                            {
                                photonLayer.Supported(x, y);
                            }
                        }
                    }

                    aaFileLayer.SaveLayer(photonLayer);
                }

                i++;
            }
            photonLayer.UnLink();
        }
示例#12
0
        private void Calculate(List <BitArray> unpackedImage, List <BitArray> previousUnpackedImage, PhotonLayer photonLayer)
        {
            islandRows   = new List <BitArray>();
            isLandsCount = 0;

            photonLayer.Clear();

            for (int y = 0; y < unpackedImage.Count; y++)
            {
                BitArray currentRow = unpackedImage[y];
                BitArray prevRow    = previousUnpackedImage?[y];
                if (currentRow != null)
                {
                    int x = 0;
                    while ((x = currentRow.NextSetBit(x)) >= 0)
                    {
                        if (prevRow == null || prevRow[x])
                        {
                            photonLayer.Supported(x, y);
                        }
                        else
                        {
                            photonLayer.Island(x, y);
                        }
                        ++x;
                    }
                }
            }

            photonLayer.Reduce();

            isLandsCount = photonLayer.SetIslands(islandRows);
        }
示例#13
0
 public void UpdateLayerIslands(PhotonLayer photonLayer)
 {
     islandRows   = new List <BitArray>();
     isLandsCount = photonLayer.SetIslands(islandRows);
 }
示例#14
0
 public void GetUpdateLayer(PhotonLayer photonLayer)
 {
     photonLayer.UnpackLayerImage(packedLayerImage);
 }
示例#15
0
 public List <PhotonRow> GetRows()
 {
     return(PhotonLayer.GetRows(packedLayerImage, photonFileHeader.GetResolutionX(), isCalculated));
 }