private void DecodeCompressed(StripData strip) { _numBitPerPaletteEntry = strip.CodecId - strip.ParamSubtraction; _substrationVariable = 1; _bitStreamManager = new BitStreamManager(strip.ImageData); _currentLine = 0; _currentColumn = 0; bool finishDecode = false; //if (strip.CodecId >= 0x54 && strip.CodecId <= 0x58) Debugger.Break(); //if (strip.CodecId >= 0x40 && strip.CodecId <= 0x44) Debugger.Break(); //Read palette and Draw the first pixel. _paletteIndex = _bitStreamManager.ReadByte(); SetCurrentColor(); _resultBitmap.SetPixel(_currentOffset + _currentColumn, _currentLine, _currentColor); while (!finishDecode) { var changeAction = _bitStreamManager.ReadBit(); //changeAction = false (0): Draw next pixel with current palette index. // Otherwise changeAction is true and we need the next bit to decide what to do. //changeAction = true (1): We need the next bit to discover what to do. if (changeAction) { if (strip.CompressionType == CompressionTypes.Method1) { DecodeCode1Specifics(); } else if (strip.CompressionType == CompressionTypes.Method2) { DecodeCode2Specifics(); } } else { DrawNextPixel(); } if ((_currentColumn == 7 && _currentLine == (_height - 1)) || _bitStreamManager.EndOfStream) { finishDecode = true; } } UsedIndexes.Sort(); }
private void SetCurrentColor() { if (!UsedIndexes.Contains(_paletteIndex)) { UsedIndexes.Add(_paletteIndex); } _currentColor = _pallete.Colors[_paletteIndex]; if ((_paletteIndex == _transparency) && UseTransparentColor) { _currentColor = Color.FromArgb(0, _currentColor.R, _currentColor.G, _currentColor.B); } }