From ba4ea337ef8c32b3bdfb1f044b2c1396e640241c Mon Sep 17 00:00:00 2001 From: Matan Lurey Date: Sat, 31 Aug 2024 13:39:13 -0700 Subject: [PATCH] Add a packed binary format, tweaks, fix blitting. (#9) Closes https://github.com/matanlurey/pxl.dart/issues/3. --- lib/src/buffer/compare.dart | 2 + lib/src/buffer/pixels.dart | 7 +- lib/src/codec.dart | 1 + lib/src/codec/netpbm.dart | 142 +++++++++++++++++- lib/src/codec/packedbm.dart | 133 ++++++++++++++++ lib/src/format/grayscale.dart | 2 + pubspec.yaml | 1 + test/codec/netpbm_ascii_test.dart | 14 +- test/codec/netpbm_binary_test.dart | 9 +- test/codec/packedbm_test.dart | 23 +++ test/golden/blit_with_embedded_font.png | Bin 0 -> 899 bytes test/golden/copyFrom_with_embedded_font.png | Bin 0 -> 899 bytes test/golden/terminal8x8_font.png | Bin 0 -> 66627 bytes ...npng_golden_test.dart => golden_test.dart} | 83 +++++++++- test/src/embed.dart | 18 +++ tool/embed.dart | 33 ++++ tool/terminal8x8.png | Bin 0 -> 43114 bytes 17 files changed, 447 insertions(+), 21 deletions(-) create mode 100644 lib/src/codec/packedbm.dart create mode 100644 test/codec/packedbm_test.dart create mode 100644 test/golden/blit_with_embedded_font.png create mode 100644 test/golden/copyFrom_with_embedded_font.png create mode 100644 test/golden/terminal8x8_font.png rename test/{codec/unpng_golden_test.dart => golden_test.dart} (53%) create mode 100644 test/src/embed.dart create mode 100755 tool/embed.dart create mode 100644 tool/terminal8x8.png diff --git a/lib/src/buffer/compare.dart b/lib/src/buffer/compare.dart index 8f4fa5c..874d657 100644 --- a/lib/src/buffer/compare.dart +++ b/lib/src/buffer/compare.dart @@ -1,6 +1,8 @@ part of '../buffer.dart'; /// The result of a pixel comparison test. +/// +/// {@category Output and Comparison} final class ComparisonResult { /// Compares two pixel buffers [a] and [b] and returns the result. factory ComparisonResult._compare( diff --git a/lib/src/buffer/pixels.dart b/lib/src/buffer/pixels.dart index 6e7c3e9..adec631 100644 --- a/lib/src/buffer/pixels.dart +++ b/lib/src/buffer/pixels.dart @@ -311,8 +311,8 @@ abstract final class Pixels with Buffer { return; } source = Rect.fromLTWH( - source.top, source.left, + source.top, clipped.width, clipped.height, ); @@ -457,8 +457,8 @@ abstract final class Pixels with Buffer { return; } source = Rect.fromLTWH( - source.top, source.left, + source.top, clipped.width, clipped.height, ); @@ -508,8 +508,8 @@ abstract final class Pixels with Buffer { return; } source = Rect.fromLTWH( - sRect.top, sRect.left, + sRect.top, tRect.width, tRect.height, ); @@ -557,6 +557,7 @@ abstract final class Pixels with Buffer { dstIdx++; } dstIdx += width - source.width; + srcIdx += from.width - source.width; } } } diff --git a/lib/src/codec.dart b/lib/src/codec.dart index 31f18df..66a0c89 100644 --- a/lib/src/codec.dart +++ b/lib/src/codec.dart @@ -1,2 +1,3 @@ export 'codec/netpbm.dart'; +export 'codec/packedbm.dart'; export 'codec/unpng.dart'; diff --git a/lib/src/codec/netpbm.dart b/lib/src/codec/netpbm.dart index 83f2284..e37d509 100644 --- a/lib/src/codec/netpbm.dart +++ b/lib/src/codec/netpbm.dart @@ -10,6 +10,114 @@ import 'dart:typed_data'; import 'package:meta/meta.dart'; import 'package:pxl/pxl.dart'; +/// A codec that encodes and decodes pixel data as a portable pixmap (Netpbm) +/// image format. +/// +/// {@category Output and Comparison} +const netpbmAsciiCodec = NetpbmAsciiCodec._(); + +/// A codec that encodes and decodes pixel data as a portable pixmap (Netpbm) +/// image format. +/// +/// {@category Output and Comparison} +const netpbmBinaryCodec = NetpbmBinaryCodec._(); + +/// A codec that encodes and decodes pixel data as a portable pixmap (Netpbm) +/// image format. +/// +/// A singleton instance of this class is available as [netpbmAsciiCodec]. +/// +/// {@category Output and Comparison} +final class NetpbmAsciiCodec extends Codec, String> { + const NetpbmAsciiCodec._(); + + @override + NetpbmAsciiEncoder get encoder => netpbmAsciiEncoder; + + /// Encodes pixel data as an ASCII Netpbm image. + /// + /// The [comments] are added to the image. + /// + /// If the [format] is omitted, defaults to: + /// - [NetpbmFormat.graymap] for grayscale pixel data. + /// - [NetpbmFormat.pixmap] for RGB pixel data. + /// - [NetpbmFormat.bitmap] otherwise. + @override + String encode( + Buffer input, { + Iterable comments = const [], + NetpbmFormat? format, + }) { + return netpbmAsciiEncoder.convert( + input, + comments: comments, + format: format, + ); + } + + @override + NetpbmAsciiDecoder get decoder => netpbmAsciiDecoder; + + /// Decodes an ASCII Netpbm image to pixel data. + /// + /// If the input is invalid, a [FormatException] is thrown. + /// + /// The [format] is used to convert the pixel data to the desired format; + /// if omitted defaults to [abgr8888]. + @override + Buffer decode(String input, {PixelFormat? format}) { + return netpbmAsciiDecoder.convert(input, format: format); + } +} + +/// A codec that encodes and decodes pixel data as a portable pixmap (Netpbm) +/// image format. +/// +/// A singleton instance of this class is available as [netpbmBinaryCodec]. +/// +/// {@category Output and Comparison} +final class NetpbmBinaryCodec extends Codec, Uint8List> { + const NetpbmBinaryCodec._(); + + @override + NetpbmBinaryEncoder get encoder => netpbmBinaryEncoder; + + /// Encodes pixel data as a binary Netpbm image. + /// + /// The [comments] are added to the image. + /// + /// If the [format] is omitted, defaults to: + /// - [NetpbmFormat.graymap] for grayscale pixel data. + /// - [NetpbmFormat.pixmap] for RGB pixel data. + /// - [NetpbmFormat.bitmap] otherwise. + @override + Uint8List encode( + Buffer input, { + Iterable comments = const [], + NetpbmFormat? format, + }) { + return netpbmBinaryEncoder.convert( + input, + comments: comments, + format: format, + ); + } + + @override + NetpbmBinaryDecoder get decoder => netpbmBinaryDecoder; + + /// Decodes a binary Netpbm image to pixel data. + /// + /// If the input is invalid, a [FormatException] is thrown. + /// + /// The [format] is used to convert the pixel data to the desired format; + /// if omitted defaults to [abgr8888]. + @override + Buffer decode(Uint8List input, {PixelFormat? format}) { + return netpbmBinaryDecoder.convert(input, format: format); + } +} + /// Encodes pixel data as a portable pixmap (Netpbm) image format. /// /// {@macro pxl.netpbm_encoder.format} @@ -84,9 +192,19 @@ abstract final class NetpbmEncoder extends Converter, T> { /// {@endtemplate} final NetpbmFormat? format; + /// Converts the pixel data to a Netpbm image. + /// + /// The [comments] are added to the image. + /// + /// If the [format] is omitted, and [NetpbmEncoder.format] is not set, the + /// format is inferred from the pixel data. @override - T convert(Buffer input, {Iterable comments = const []}) { - final format = _getOrInferFormat(input); + T convert( + Buffer input, { + Iterable comments = const [], + NetpbmFormat? format, + }) { + format ??= _getOrInferFormat(input); final header = NetpbmHeader( width: input.width, height: input.height, @@ -391,13 +509,21 @@ abstract final class NetpbmDecoder extends Converter> { @protected List _data(T input, int offset, {required bool bitmap}); + /// Converts the input to integer-based pixel data. + /// + /// If the input is invalid, a [FormatException] is thrown. + /// + /// The [format] is used to convert the pixel data to the desired format; + /// if omitted, the decoder's [NetpbmDecoder.format] is used, which defaults + /// to [abgr8888]. @override @nonVirtual - Buffer convert(T input) { + Buffer convert(T input, {PixelFormat? format}) { final (header, error, offset) = _parseHeader(input); if (header == null) { throw FormatException(error, input); } + final fmt = format ?? this.format; final data = _data( input, offset, @@ -407,12 +533,12 @@ abstract final class NetpbmDecoder extends Converter> { switch (header.format) { case NetpbmFormat.bitmap: pixels = data.map((value) { - return value == 0x0 ? format.zero : format.max; + return value == 0x0 ? fmt.zero : fmt.max; }); case NetpbmFormat.graymap: pixels = data.map((value) { final gray = gray8.create(gray: value); - return format.convert(gray, from: gray8); + return fmt.convert(gray, from: gray8); }); case NetpbmFormat.pixmap: if (data.length % 3 != 0) { @@ -423,11 +549,11 @@ abstract final class NetpbmDecoder extends Converter> { final g = data[i * 3 + 1]; final b = data[i * 3 + 2]; final rgb = rgb888.create(red: r, green: g, blue: b); - return format.convert(rgb, from: rgb888); + return fmt.convert(rgb, from: rgb888); }); } - final buffer = IntPixels(header.width, header.height, format: format); + final buffer = IntPixels(header.width, header.height, format: fmt); buffer.data.setAll(0, pixels); return buffer; } @@ -519,6 +645,8 @@ final class NetpbmBinaryDecoder extends NetpbmDecoder { } /// Parsed header information from a Netpbm image. +/// +/// {@category Output and Comparison} @immutable final class NetpbmHeader { /// Creates a new Netpbm header with the given values. diff --git a/lib/src/codec/packedbm.dart b/lib/src/codec/packedbm.dart new file mode 100644 index 0000000..671d777 --- /dev/null +++ b/lib/src/codec/packedbm.dart @@ -0,0 +1,133 @@ +import 'dart:convert'; +import 'dart:typed_data'; + +import 'package:pxl/pxl.dart'; + +/// Codec for encoding and decoding packed bitmaps. +/// +/// A packed bitmap is a compact binary representation of a bitmap, where each +/// pixel is encoded as a single bit. This can be useful for storing large +/// bitmaps in a compact format, at the cost of some overhead to pack and +/// unpack the data. +const packedBitmapCodec = PackedBitmapCodec._(); + +/// Codec for encoding and decoding packed bitmaps. +final class PackedBitmapCodec extends Codec, List> { + const PackedBitmapCodec._(); + + @override + Converter, Uint32List> get encoder => packedBitmapEncoder; + + @override + Converter, Buffer> get decoder => packedBitmapDecoder; + + @override + Buffer decode( + List encoded, { + PixelFormat format = abgr8888, + }) { + return packedBitmapDecoder.convert(encoded, format: format); + } +} + +/// Encodes a bitmap to a compact (packed) binary format. +/// +/// See [PackedBitmapEncoder] for details. +const packedBitmapEncoder = PackedBitmapEncoder._(); + +/// Encodes a bitmap to a compact (packed) binary format. +/// +/// For a given buffer, [PixelFormat.zero] is encoded as `0`, and any other +/// value is encoded as `1`. 32 values are packed into a single byte, with the +/// least significant bit representing the first value. The first two 32-bit +/// words of the output are the width and height of the bitmap, respectively. +/// +/// For example, a 128x128 bitmap, which normally would require 2048 bytes, +/// can be encoded into 256 bytes (128 * 128 / 32), or a 8x reduction in size, +/// at the cost of some overhead to pack and unpack the data. +/// +/// A singleton instance of this class is available as [packedBitmapEncoder]. +final class PackedBitmapEncoder extends Converter, Uint32List> { + const PackedBitmapEncoder._(); + + @override + Uint32List convert(Buffer input) { + final width = input.width; + final height = input.height; + final data = input.data; + + // Convert every 32 pixels into 32-bits. + // That is, a 128x128 bitmap is represented as 4x4 32-bit words. + final output = Uint32List(2 + (data.length ~/ 32)); + output[0] = width; + output[1] = height; + + var word = 0; + var bit = 0; + var offset = 2; + for (final pixel in input.data) { + if (pixel != input.format.zero) { + word |= 1 << bit; + } + bit++; + if (bit == 32) { + output[offset] = word; + word = 0; + bit = 0; + offset++; + } + } + + return output; + } +} + +/// Decodes a bitmap from a compact (packed) binary format. +/// +/// See [PackedBitmapDecoder] for details. +const packedBitmapDecoder = PackedBitmapDecoder._(); + +/// Decodes a bitmap from a compact (packed) binary format. +/// +/// A `0` bit represents [PixelFormat.zero], and a `1` bit is [PixelFormat.max]; +/// 32 values are packed into a single byte, with the least significant bit +/// representing the first value. The first two 32-bit words of the input are +/// the width and height of the bitmap, respectively. +final class PackedBitmapDecoder extends Converter, Buffer> { + const PackedBitmapDecoder._(); + + @override + Buffer convert( + List input, { + PixelFormat format = abgr8888, + }) { + final Uint32List view; + if (input is TypedDataList) { + view = input.buffer.asUint32List(); + } else { + view = Uint32List.fromList(input); + } + final width = view[0]; + final height = view[1]; + final output = IntPixels(width, height, format: format); + + // Reverse of the above encoding. + var word = 0; + var bit = 0; + var offset = 2; + for (var i = 0; i < output.data.length; i++) { + if (bit == 0) { + word = view[offset]; + offset++; + } + output.data[i] = (word & 1) == 0 ? format.zero : format.max; + word >>= 1; + bit++; + if (bit == 32) { + bit = 0; + } + } + + return output; + } +} diff --git a/lib/src/format/grayscale.dart b/lib/src/format/grayscale.dart index 8b79ebf..bcdfa9c 100644 --- a/lib/src/format/grayscale.dart +++ b/lib/src/format/grayscale.dart @@ -1,6 +1,8 @@ part of '../format.dart'; /// A mixin for pixel formats that represent _graysacle_ pixels. +/// +/// {@category Pixel Formats} base mixin Grayscale implements PixelFormat { /// Creates a new pixel with the given channel values. /// diff --git a/pubspec.yaml b/pubspec.yaml index c48ab70..0be7e9e 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -12,6 +12,7 @@ dependencies: dev_dependencies: checks: ^0.3.0 + image: ^4.2.0 oath: ^0.2.1 path: ^1.9.0 test: ^1.25.8 diff --git a/test/codec/netpbm_ascii_test.dart b/test/codec/netpbm_ascii_test.dart index c330f7b..fbb85ab 100644 --- a/test/codec/netpbm_ascii_test.dart +++ b/test/codec/netpbm_ascii_test.dart @@ -60,9 +60,10 @@ void main() { pixels.set(Pos(1, 0), abgr8888.white); pixels.set(Pos(2, 0), abgr8888.white); - final encoded = const NetpbmAsciiEncoder( + final encoded = netpbmAsciiEncoder.convert( + pixels, format: NetpbmFormat.bitmap, - ).convert(pixels); + ); check(encoded).equals( [ 'P1', @@ -102,7 +103,7 @@ void main() { ); // Try decoding the encoded string. - final decoded = NetpbmAsciiDecoder(format: monochrome).convert(encoded); + final decoded = netpbmAsciiDecoder.convert(encoded, format: monochrome); check(decoded.compare(pixels).difference).equals(0.0); }); @@ -113,9 +114,10 @@ void main() { pixels.set(Pos(1, 0), gray8.create(gray: 128)); pixels.set(Pos(2, 0), gray8.create(gray: 255)); - final encoded = const NetpbmAsciiEncoder( + final encoded = netpbmAsciiEncoder.convert( + pixels, format: NetpbmFormat.graymap, - ).convert(pixels); + ); check(encoded).equals( [ @@ -127,7 +129,7 @@ void main() { ); // Try decoding the encoded string. - final decoded = NetpbmAsciiDecoder(format: gray8).convert(encoded); + final decoded = netpbmAsciiDecoder.convert(encoded, format: gray8); check(decoded.format).equals(pixels.format); check(decoded.compare(pixels).difference).equals(0.0); }); diff --git a/test/codec/netpbm_binary_test.dart b/test/codec/netpbm_binary_test.dart index 371c05f..98b0f9f 100644 --- a/test/codec/netpbm_binary_test.dart +++ b/test/codec/netpbm_binary_test.dart @@ -69,9 +69,10 @@ void main() { pixels.set(Pos(1, 0), abgr8888.white); pixels.set(Pos(2, 0), abgr8888.white); - final encoded = const NetpbmBinaryEncoder( + final encoded = netpbmBinaryEncoder.convert( + pixels, format: NetpbmFormat.bitmap, - ).convert(pixels); + ); check(encoded).deepEquals( Uint8List.fromList([ ...utf8.encode('P4\n3 2\n'), @@ -109,7 +110,7 @@ void main() { ); // Try decoding the encoded string. - final decoded = NetpbmBinaryDecoder(format: monochrome).convert(encoded); + final decoded = netpbmBinaryDecoder.convert(encoded, format: monochrome); check(decoded.compare(pixels).difference).equals(0.0); }); @@ -132,7 +133,7 @@ void main() { ); // Try decoding the encoded string. - final decoded = NetpbmBinaryDecoder(format: gray8).convert(encoded); + final decoded = netpbmBinaryDecoder.convert(encoded, format: gray8); check(decoded.format).equals(pixels.format); check(decoded.compare(pixels).difference).equals(0.0); }); diff --git a/test/codec/packedbm_test.dart b/test/codec/packedbm_test.dart new file mode 100644 index 0000000..c039c3d --- /dev/null +++ b/test/codec/packedbm_test.dart @@ -0,0 +1,23 @@ +import 'package:pxl/pxl.dart'; + +import '../src/prelude.dart'; + +void main() { + test('encodes a 128x128 image compactly', () { + final input = IntPixels(128, 128); + + // Fill every other pixel with white. + for (var i = 0; i < input.data.length; i += 2) { + input.data[i] = abgr8888.white; + } + + final encoded = packedBitmapCodec.encoder.convert(input); + check(encoded).deepEquals([ + 128, 128, // Width and height. + ...Iterable.generate(128 * 128 ~/ 32, (i) => 0x55555555), + ]); + + final decoded = packedBitmapCodec.decoder.convert(encoded); + check(decoded.compare(input).difference).equals(0); + }); +} diff --git a/test/golden/blit_with_embedded_font.png b/test/golden/blit_with_embedded_font.png new file mode 100644 index 0000000000000000000000000000000000000000..0a426bf492302714814162815cbc8eb77f068045 GIT binary patch literal 899 zcmeAS@N?(olHy`uVBq!ia0vp^5qF;b(~mBO&PTS3SbNB^mykU$cY$bRwa9ki zlS9`7;^XrVx_X%X$o3(tL6(P!!`wrxJ-Ez(nS;%4WIZr@U}7*D<{lW0O&nPa#>Pg2 k%z)VgGmlm@6NdrA9Z#`|5g!k30cI`+Pgg&ebxsLQ05Z2Vpa1{> literal 0 HcmV?d00001 diff --git a/test/golden/copyFrom_with_embedded_font.png b/test/golden/copyFrom_with_embedded_font.png new file mode 100644 index 0000000000000000000000000000000000000000..77fe4b8ceebe5e317c6cd2f7e34cdbd4637077ce GIT binary patch literal 899 zcmeAS@N?(olHy`uVBq!ia0vp^5N sXl&xhVlXx~8e|5{9+-KwqM0}h81gTe-8l1(I|*cmr>mdKI;Vst0PrML(EtDd literal 0 HcmV?d00001 diff --git a/test/golden/terminal8x8_font.png b/test/golden/terminal8x8_font.png new file mode 100644 index 0000000000000000000000000000000000000000..49466cc8044f6b08cd3f2360a7709ff638db0806 GIT binary patch literal 66627 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 a;Qs-{pADMEQDff#0000