blob: fda727e54e8aadb94800f17edfc43f9a8e65b3df [file] [log] [blame]
import 'dart:typed_data';
import 'package:archive/archive.dart';
import '../../image_exception.dart';
import '../../util/input_buffer.dart';
import 'exr_compressor.dart';
import 'exr_part.dart';
abstract class ExrZipCompressor extends ExrCompressor {
factory ExrZipCompressor(
ExrPart header, int maxScanLineSize, int numScanLines) =
InternalExrZipCompressor;
}
class InternalExrZipCompressor extends InternalExrCompressor
implements ExrZipCompressor {
ZLibDecoder zlib = ZLibDecoder();
InternalExrZipCompressor(
ExrPart header, int maxScanLineSize, this._numScanLines)
: super(header as InternalExrPart);
int numScanLines() => _numScanLines;
Uint8List compress(InputBuffer input, int x, int y, [int width, int height]) {
throw new ImageException('Zip compression not yet supported');
}
Uint8List uncompress(InputBuffer input, int x, int y,
[int width, int height]) {
var data = zlib.decodeBytes(input.toUint8List());
if (width == null) {
width = header.width;
}
if (height == null) {
height = header.linesInBuffer;
}
int minX = x;
int maxX = x + width - 1;
int minY = y;
int maxY = y + height - 1;
if (maxX > header.width) {
maxX = header.width - 1;
}
if (maxY > header.height) {
maxY = header.height - 1;
}
decodedWidth = (maxX - minX) + 1;
decodedHeight = (maxY - minY) + 1;
// Predictor
for (int i = 1, len = data.length; i < len; ++i) {
data[i] = data[i - 1] + data[i] - 128;
}
// Reorder the pixel data
if (_outCache == null || _outCache.length != data.length) {
_outCache = Uint8List(data.length);
}
final int len = data.length;
int t1 = 0;
int t2 = (len + 1) ~/ 2;
int si = 0;
while (true) {
if (si < len) {
_outCache[si++] = data[t1++];
} else {
break;
}
if (si < len) {
_outCache[si++] = data[t2++];
} else {
break;
}
}
return _outCache;
}
int _numScanLines;
Uint8List _outCache;
}