private bool[,] ProcessImage(Func <bool[, ], bool[, ]> imageDataProcessor, FirmwareImageMetadata imageMetadata, bool rebuildCache = false)
        {
            var processedData      = imageDataProcessor(ImagePixelGrid.Data);
            var processedImageSize = processedData.GetSize();
            var imageSizeChanged   = imageMetadata.Width != processedImageSize.Width || imageMetadata.Height != processedImageSize.Height;

            imageMetadata.Width  = (byte)processedImageSize.Width;
            imageMetadata.Height = (byte)processedImageSize.Height;

            m_firmware.WriteImage(processedData, imageMetadata);

            if (imageSizeChanged || rebuildCache)
            {
                ImageCacheManager.RebuildImageCache(m_firmware);
                ImageListBox.Invalidate();
            }
            else
            {
                var cachedImage = FirmwareImageProcessor.CreateBitmap(processedData);
                ImageCacheManager.SetImage(imageMetadata.Index, imageMetadata.BlockType, cachedImage);

                var updateCache = new Action(() =>
                {
                    ImageListBox.Invoke(new Action(() =>
                    {
                        var itemRect = ImageListBox.GetItemRectangle(imageMetadata.Index - 1);
                        ImageListBox.Invalidate(itemRect);
                    }));
                });
                updateCache.BeginInvoke(null, null);
            }

            return(processedData);
        }
Пример #2
0
        public PreviewResourcePackWindow
        (
            Firmware firmware,
            IList <int> originalImageIndices,
            IList <bool[, ]> importedImages,
            bool resourceImport          = false,
            BlockType?defaultImportBlock = null
        ) : this()
        {
            if (originalImageIndices.Count != importedImages.Count)
            {
                throw new InvalidOperationException("Source and imported images count does not match.");
            }
            m_firmware = firmware;

            if (m_firmware.Block2Images.Any())
            {
                ImportModeComboBox.Items.Add("Block 1 & 2");
                ImportModeComboBox.Items.Add("Block 1");
                ImportModeComboBox.Items.Add("Block 2");

                if (defaultImportBlock.HasValue)
                {
                    ImportModeComboBox.SelectedIndex = defaultImportBlock == BlockType.Block1 ? 1 : 2;
                }
                else
                {
                    ImportModeComboBox.SelectedIndex = 0;
                }
            }
            else
            {
                ImportModeComboBox.Items.Add("Block 1");
                ImportModeComboBox.SelectedIndex = 0;
            }

            OptionsGroupBox.Enabled = !resourceImport;
            LeftLayoutPanel.SuspendLayout();
            RightLayoutPanel.SuspendLayout();
            for (var i = 0; i < originalImageIndices.Count; i++)
            {
                var originalImageIndex = originalImageIndices[i];
                var originalImage      = GetImageByIndex(originalImageIndex);
                if (originalImage == null)
                {
                    continue;
                }

                var importedImage        = importedImages[i];
                var croppedImportedImage = FirmwareImageProcessor.PasteImage(originalImage, importedImage);

                m_originalImportedImages[i] = importedImage;
                m_croppedImportedImages[i]  = croppedImportedImage;

                LeftLayoutPanel.Controls.Add(CreateGrid(originalImage));
                RightLayoutPanel.Controls.Add(CreateGrid(croppedImportedImage));
            }
            LeftLayoutPanel.ResumeLayout();
            RightLayoutPanel.ResumeLayout();
        }
 private void RotateAntiClockwiseButton_Click(object sender, EventArgs e)
 {
     if (LastSelectedImageMetadata == null)
     {
         return;
     }
     ImagePixelGrid.Data = ImagePreviewPixelGrid.Data = ProcessImage(x => FirmwareImageProcessor.Rotate(x, false), LastSelectedImageMetadata);
 }
Пример #4
0
 internal static Size GetSize([NotNull] this bool[,] imageData)
 {
     if (imageData == null)
     {
         throw new ArgumentNullException("imageData");
     }
     return(FirmwareImageProcessor.GetImageSize(imageData));
 }
        private void ImportBlockImage(IDictionary <int, FirmwareImageMetadata> blockMetadataDictionary, int imageIndex, bool[,] importedImage, bool allowResizeOriginalImages)
        {
            FirmwareImageMetadata imageMetadata;

            if (!blockMetadataDictionary.TryGetValue(imageIndex, out imageMetadata))
            {
                return;
            }

            if (allowResizeOriginalImages)
            {
                ProcessImage(x => importedImage, imageMetadata);
            }
            else
            {
                ProcessImage(x => FirmwareImageProcessor.PasteImage(imageMetadata.CreateImage(), importedImage), imageMetadata);
            }
        }
Пример #6
0
        private void ImportResourcePack([NotNull] IList <int> originalImageIndices, [NotNull] IList <bool[, ]> importedImages)
        {
            if (importedImages == null)
            {
                throw new ArgumentNullException("importedImages");
            }
            if (originalImageIndices == null)
            {
                throw new ArgumentNullException("originalImageIndices");
            }
            if (importedImages.Count == 0)
            {
                return;
            }

            for (var i = 0; i < originalImageIndices.Count; i++)
            {
                var originalImageIndex = originalImageIndices[i];
                var importedImage      = importedImages[i];

                if (m_firmware.Block1Images.Count > 0)
                {
                    FirmwareImageMetadata block1ImageMetadata;
                    if (m_firmware.Block1Images.TryGetValue(originalImageIndex, out block1ImageMetadata))
                    {
                        var block1Image = FirmwareImageProcessor.PasteImage(block1ImageMetadata.CreateImage(), importedImage);
                        m_firmware.WriteImage(block1Image, block1ImageMetadata);
                    }
                }

                if (m_firmware.Block2Images.Count > 0)
                {
                    FirmwareImageMetadata block2ImageMetadata;
                    if (m_firmware.Block2Images.TryGetValue(originalImageIndex, out block2ImageMetadata))
                    {
                        var block2Image = FirmwareImageProcessor.PasteImage(block2ImageMetadata.CreateImage(), importedImage);
                        m_firmware.WriteImage(block2Image, block2ImageMetadata);
                    }
                }
            }

            IsDirty = true;
            ImageCacheManager.RebuildCache(m_firmware);
        }
        private void ResizeButton_Click(object sender, EventArgs e)
        {
            if (LastSelectedImageMetadata == null)
            {
                return;
            }

            using (var rw = new ResizeImageWindow(LastSelectedImageMetadata.Width, LastSelectedImageMetadata.Height))
            {
                if (rw.ShowDialog() != DialogResult.OK)
                {
                    return;
                }

                var newSize = rw.NewSize;
                ProcessImage(x => FirmwareImageProcessor.ResizeImage(x, newSize), LastSelectedImageMetadata, true);
                ImageListBox_SelectedValueChanged(ImageListBox, EventArgs.Empty);
            }
        }
Пример #8
0
        private void UpdateStringPreview()
        {
            if (LastSelectedStringMetadata == null)
            {
                return;
            }

            var stringData = m_firmware.ReadString(LastSelectedStringMetadata);
            var charsData  = new Dictionary <int, bool[, ]>();

            foreach (var b in stringData)
            {
                if (charsData.ContainsKey(b))
                {
                    continue;
                }

                FirmwareImageMetadata imageMetadata;
                if (!CurrentImageBlockForStrings.TryGetValue(b, out imageMetadata))
                {
                    continue;
                }

                charsData[b] = m_firmware.ReadImage(imageMetadata);
            }

            var imageData = FirmwareImageProcessor.GetStringImageData(stringData, charsData,
                                                                      m_firmware.Definition.StringsPreviewCorrection != null ? m_firmware.Definition.StringsPreviewCorrection.ForGlyphs : null);
            var imageDataSize = imageData.GetSize();

            StringPrewviewPixelGrid.Data = imageData;
            StringStatusLabel.Text       = string.Format
                                           (
                "String: 0x{0:X2}, Size: {1}x{2}, Data: 0x{3:X4}, Length: {4} bytes",
                LastSelectedStringMetadata.Index,
                imageDataSize.Width,
                imageDataSize.Height,
                LastSelectedStringMetadata.DataOffset,
                LastSelectedStringMetadata.DataLength
                                           );
        }
Пример #9
0
        public IList <Tuple <FirmwareImageMetadata, bool[, ]> > GetImportedData()
        {
            var result = new List <Tuple <FirmwareImageMetadata, bool[, ]> >();

            using (var surface = DrawSurfaceInRealScale())
            {
                foreach (var letterBox in m_letters)
                {
                    var metadata = letterBox.Metadata;
                    var rect     = letterBox.Rect;

                    var cropRect = new Rectangle(rect.X + 1, rect.Y + 1, rect.Width - 1, rect.Height - 1);
                    using (var croppedLetter = FirmwareImageProcessor.CropImage(surface, cropRect))
                    {
                        var imageData = croppedLetter.CreateRawFromBitmap(0x00);
                        result.Add(new Tuple <FirmwareImageMetadata, bool[, ]>(metadata, imageData));
                    }
                }
            }
            return(result);
        }
Пример #10
0
        private void ImportResourcePack([NotNull] IList <int> originalImageIndices, [NotNull] IList <bool[, ]> importedImages)
        {
            if (importedImages == null)
            {
                throw new ArgumentNullException("importedImages");
            }
            if (originalImageIndices == null)
            {
                throw new ArgumentNullException("originalImageIndices");
            }
            if (importedImages.Count == 0)
            {
                return;
            }

            var block1MetadataDictionary = m_firmware.Block1Images.ToDictionary(x => x.Index, x => x);
            var block2MetadataDictionary = m_firmware.Block2Images.ToDictionary(x => x.Index, x => x);

            for (var i = 0; i < originalImageIndices.Count; i++)
            {
                var originalImageIndex = originalImageIndices[i];
                var importedImage      = importedImages[i];

                if (block1MetadataDictionary.Count > 0)
                {
                    var block1ImageMetadata = block1MetadataDictionary[originalImageIndex];
                    var block1Image         = FirmwareImageProcessor.PasteImage(block1ImageMetadata.CreateImage(), importedImage);
                    m_firmware.WriteImage(block1Image, block1ImageMetadata);
                }

                if (block2MetadataDictionary.Count > 0)
                {
                    var block2ImageMetadata = block2MetadataDictionary[originalImageIndex];
                    var block2Image         = FirmwareImageProcessor.PasteImage(block2ImageMetadata.CreateImage(), importedImage);
                    m_firmware.WriteImage(block2Image, block2ImageMetadata);
                }
            }

            ImageCacheManager.RebuildImageCache(m_firmware);
        }
        private void UpdateStringPreview()
        {
            if (LastSelectedStringMetadata == null)
            {
                return;
            }

            var firmwareString = m_firmware.ReadString(LastSelectedStringMetadata);
            var charMetadatas  = new List <FirmwareImageMetadata>();

            foreach (var charIndex in firmwareString)
            {
                var metadata = CurrentImageBlockForStrings.FirstOrDefault(x => x.Index == charIndex);
                if (metadata != null)
                {
                    charMetadatas.Add(metadata);
                }
            }

            var images = new List <bool[, ]>();

            foreach (var charMetadata in charMetadatas)
            {
                var image = m_firmware.ReadImage(charMetadata);
                if (m_firmware.Definition.CharsToCorrect != null && m_firmware.Definition.CharsToCorrect.Contains((byte)charMetadata.Index))
                {
                    var imageSize = image.GetSize();
                    image = FirmwareImageProcessor.ResizeImage(image, new Size(imageSize.Width, imageSize.Height + 2));
                    image = FirmwareImageProcessor.ShiftDown(image);
                    image = FirmwareImageProcessor.ShiftDown(image);
                }
                images.Add(image);
            }
            var data     = FirmwareImageProcessor.MergeImages(images);
            var dataSize = data.GetSize();

            StringPreviewImageSizeLabel.Text = dataSize.Width + @"x" + dataSize.Height;
            StringPrewviewPixelGrid.Data     = data;
        }
        private void BitmapImportButton_Click(object sender, EventArgs eventArgs)
        {
            if (LastSelectedImageMetadata == null)
            {
                return;
            }

            using (var op = new OpenFileDialog {
                Filter = Consts.BitmapImportFilter
            })
            {
                if (op.ShowDialog() != DialogResult.OK)
                {
                    return;
                }

                try
                {
                    var bitmapFile = op.FileName;
                    using (var bitmap = (Bitmap)Image.FromFile(bitmapFile, true))
                    {
                        if (bitmap.Width > Consts.MaximumImageWidthAndHeight || bitmap.Height > Consts.MaximumImageWidthAndHeight)
                        {
                            InfoBox.Show("Image is too big. Image width and height must be lower or equals to {0} pixels.", Consts.MaximumImageWidthAndHeight);
                            return;
                        }
                        var imageData = FirmwareImageProcessor.ImportBitmap(bitmap);
                        ProcessImage(x => imageData, LastSelectedImageMetadata, true);
                        ImageListBox_SelectedValueChanged(ImageListBox, EventArgs.Empty);
                    }
                }
                catch (Exception ex)
                {
                    InfoBox.Show("Unable to import bitmap image.\n" + ex.Message);
                }
            }
        }
        private void ImportImages([NotNull] IList <int> originalImageIndices, [NotNull] IList <bool[, ]> importedImages)
        {
            if (importedImages == null)
            {
                throw new ArgumentNullException("importedImages");
            }
            if (originalImageIndices == null)
            {
                throw new ArgumentNullException("originalImageIndices");
            }
            if (importedImages.Count == 0)
            {
                return;
            }

            var minimumImagesCount = Math.Min(originalImageIndices.Count, importedImages.Count);

            originalImageIndices = originalImageIndices.Take(minimumImagesCount).ToList();
            importedImages       = importedImages.Take(minimumImagesCount).ToList();

            ImageImportMode importMode;
            bool            allowResizeOriginalImages;

            using (var importWindow = new PreviewResourcePackWindow(m_firmware, originalImageIndices, importedImages, false, m_currentBlock))
            {
                importWindow.Text             = Consts.ApplicationTitleWoVersion + @" - Paste image(s)";
                importWindow.ImportButtonText = "Paste";
                if (importWindow.ShowDialog() != DialogResult.OK)
                {
                    return;
                }

                importMode = importWindow.GetImportMode();
                allowResizeOriginalImages = importWindow.AllowResizeOriginalImages;
            }

            for (var i = 0; i < minimumImagesCount; i++)
            {
                var index = i;
                var originalImageIndex = originalImageIndices[index];
                var importedImage      = importedImages[index];
                if (importMode == ImageImportMode.Block1)
                {
                    var block1ImageMetadata = m_firmware.Block1Images.First(x => x.Index == originalImageIndex);
                    if (allowResizeOriginalImages)
                    {
                        ProcessImage(x => importedImage, block1ImageMetadata);
                    }
                    else
                    {
                        ProcessImage(x => FirmwareImageProcessor.PasteImage(block1ImageMetadata.CreateImage(), importedImage), block1ImageMetadata);
                    }
                }
                else if (importMode == ImageImportMode.Block2)
                {
                    var block2ImageMetadata = m_firmware.Block2Images.First(x => x.Index == originalImageIndex);
                    if (allowResizeOriginalImages)
                    {
                        ProcessImage(x => importedImage, block2ImageMetadata);
                    }
                    else
                    {
                        ProcessImage(x => FirmwareImageProcessor.PasteImage(block2ImageMetadata.CreateImage(), importedImage), block2ImageMetadata);
                    }
                }
                else
                {
                    var block1ImageMetadata = m_firmware.Block1Images.First(x => x.Index == originalImageIndex);
                    var block2ImageMetadata = m_firmware.Block2Images.First(x => x.Index == originalImageIndex);

                    if (allowResizeOriginalImages)
                    {
                        ProcessImage(x => importedImage, block1ImageMetadata);
                        ProcessImage(x => importedImage, block2ImageMetadata);
                    }
                    else
                    {
                        ProcessImage(x => FirmwareImageProcessor.PasteImage(block1ImageMetadata.CreateImage(), importedImage), block1ImageMetadata);
                        ProcessImage(x => FirmwareImageProcessor.PasteImage(block2ImageMetadata.CreateImage(), importedImage), block2ImageMetadata);
                    }
                }
            }

            ImageCacheManager.RebuildImageCache(m_firmware);
            ImageListBox.Invalidate();
            ImageListBox_SelectedValueChanged(ImageListBox, EventArgs.Empty);
        }
        private void BitmapImportButton_Click(object sender, EventArgs eventArgs)
        {
            if (LastSelectedImageMetadata == null)
            {
                return;
            }

            try
            {
                using (var imageConverterWindow = new ImageConverterWindow(true, LastSelectedImageMetadata.Width, LastSelectedImageMetadata.Height))
                {
                    if (imageConverterWindow.ShowDialog() != DialogResult.OK)
                    {
                        return;
                    }

                    using (var monochrome = imageConverterWindow.GetConvertedImage())
                    {
                        var imageData = BitmapProcessor.CreateRawFromBitmap(monochrome);
                        ImagePixelGrid.CreateUndo();
                        ImagePixelGrid.Data = ImagePreviewPixelGrid.Data = ProcessImage(x => FirmwareImageProcessor.PasteImage(x, imageData), LastSelectedImageMetadata, true);
                    }
                }
            }
            catch (Exception ex)
            {
                InfoBox.Show("Unable to import bitmap image.\n" + ex.Message);
            }
        }
Пример #15
0
        private void BitmapImportButton_Click(object sender, EventArgs eventArgs)
        {
            if (LastSelectedImageMetadata == null)
            {
                return;
            }

            using (var op = new OpenFileDialog {
                Filter = Consts.BitmapImportFilter
            })
            {
                if (op.ShowDialog() != DialogResult.OK)
                {
                    return;
                }

                try
                {
                    var bitmapFile = op.FileName;
                    using (var bitmap = (Bitmap)Image.FromFile(bitmapFile))
                    {
                        if (bitmap.Width > 2048 || bitmap.Height > 2048)
                        {
                            InfoBox.Show("Selected images is too big. Choose an image that has dimension lower than 2048x2048.");
                            return;
                        }
                        using (var scaledBitmap = BitmapProcessor.ScaleBitmapIfNecessary(bitmap, new Size(LastSelectedImageMetadata.Width, LastSelectedImageMetadata.Height)))
                            using (var monochrome = BitmapProcessor.ConvertTo1Bit(scaledBitmap))
                            {
                                var imageData = BitmapProcessor.CreateRawFromBitmap(monochrome);
                                ImagePixelGrid.CreateUndo();
                                ImagePixelGrid.Data = ImagePreviewPixelGrid.Data = ProcessImage(x => FirmwareImageProcessor.PasteImage(x, imageData), LastSelectedImageMetadata, true);
                            }
                    }
                }
                catch (Exception ex)
                {
                    InfoBox.Show("Unable to import bitmap image.\n" + ex.Message);
                }
            }
        }