From 1101fcb3e61634f1be92e1b9ba9fad5a11b8554a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn=20Gustavsson?=
Date: Thu, 16 Jan 2014 12:16:39 +0100
Subject: Add the 'rle' zstrategy
---
erts/doc/src/zlib.xml | 30 ++++++++++++++++--------------
erts/preloaded/src/zlib.erl | 4 +++-
lib/kernel/test/zlib_SUITE.erl | 2 +-
3 files changed, 20 insertions(+), 16 deletions(-)
diff --git a/erts/doc/src/zlib.xml b/erts/doc/src/zlib.xml
index afc597b729..11a7437f5a 100644
--- a/erts/doc/src/zlib.xml
+++ b/erts/doc/src/zlib.xml
@@ -161,20 +161,22 @@ list_to_binary([Compressed|Last])
state. MemLevel=1 uses minimum memory but is slow and
reduces compression ratio; MemLevel=9 uses maximum
memory for optimal speed. The default value is 8.
- The Strategy parameter is used to tune the
- compression algorithm. Use the value default for
- normal data, filtered for data produced by a filter
- (or predictor), or huffman_only to force Huffman
- encoding only (no string match). Filtered data consists
- mostly of small values with a somewhat random
- distribution. In this case, the compression algorithm is
- tuned to compress them better. The effect of
- filteredis to force more Huffman coding and less
- string matching; it is somewhat intermediate between
- default and huffman_only. The Strategy
- parameter only affects the compression ratio but not the
- correctness of the compressed output even if it is not set
- appropriately.
+ The Strategy parameter is used to tune
+ the compression algorithm. Use the value default for
+ normal data, filtered for data produced by a filter (or
+ predictor), huffman_only to force Huffman encoding
+ only (no string match), or rle to limit match
+ distances to one (run-length encoding). Filtered data
+ consists mostly of small values with a somewhat random
+ distribution. In this case, the compression algorithm is tuned
+ to compress them better. The effect of filteredis to
+ force more Huffman coding and less string matching; it is
+ somewhat intermediate between default and
+ huffman_only. rle is designed to be almost as
+ fast as huffman_only, but give better compression for PNG
+ image data. The Strategy parameter only
+ affects the compression ratio but not the correctness of the
+ compressed output even if it is not set appropriately.
diff --git a/erts/preloaded/src/zlib.erl b/erts/preloaded/src/zlib.erl
index 3d85533b80..df7b2e6198 100644
--- a/erts/preloaded/src/zlib.erl
+++ b/erts/preloaded/src/zlib.erl
@@ -47,6 +47,7 @@
%% compresssion strategy
-define(Z_FILTERED, 1).
-define(Z_HUFFMAN_ONLY, 2).
+-define(Z_RLE, 3).
-define(Z_DEFAULT_STRATEGY, 0).
%% deflate compression method
@@ -125,7 +126,7 @@
-type zmethod() :: 'deflated'.
-type zwindowbits() :: -15..-9 | 9..47.
-type zmemlevel() :: 1..9.
--type zstrategy() :: 'default' | 'filtered' | 'huffman_only'.
+-type zstrategy() :: 'default' | 'filtered' | 'huffman_only' | 'rle'.
%%------------------------------------------------------------------------
@@ -486,6 +487,7 @@ arg_level(_) -> erlang:error(badarg).
arg_strategy(filtered) -> ?Z_FILTERED;
arg_strategy(huffman_only) -> ?Z_HUFFMAN_ONLY;
+arg_strategy(rle) -> ?Z_RLE;
arg_strategy(default) -> ?Z_DEFAULT_STRATEGY;
arg_strategy(_) -> erlang:error(badarg).
diff --git a/lib/kernel/test/zlib_SUITE.erl b/lib/kernel/test/zlib_SUITE.erl
index 329a6f0485..3be6f39d95 100644
--- a/lib/kernel/test/zlib_SUITE.erl
+++ b/lib/kernel/test/zlib_SUITE.erl
@@ -178,7 +178,7 @@ api_deflateInit(Config) when is_list(Config) ->
?m(ok,zlib:close(Z))
end, lists:seq(1,8)),
- Strategies = [filtered,huffman_only,default],
+ Strategies = [filtered,huffman_only,rle,default],
lists:foreach(fun(Strategy) ->
?line Z = zlib:open(),
?m(ok, zlib:deflateInit(Z,best_speed,deflated,-15,8,Strategy)),
--
cgit v1.2.3