mirror of
https://github.com/qpdf/qpdf.git
synced 2024-06-03 19:00:51 +00:00
Add ability to set zlib compression level globally
This commit is contained in:
parent
bda5d26894
commit
dac0598b94
|
@ -1,3 +1,8 @@
|
||||||
|
2019-08-23 Jay Berkenbilt <ejb@ql.org>
|
||||||
|
|
||||||
|
* Add option Pl_Flate::setCompressionLevel to globally set the
|
||||||
|
zlib compression level used by all Pl_Flate pipelines.
|
||||||
|
|
||||||
2019-08-22 Jay Berkenbilt <ejb@ql.org>
|
2019-08-22 Jay Berkenbilt <ejb@ql.org>
|
||||||
|
|
||||||
* In QPDFObjectHandle::ParserCallbacks, in addition to
|
* In QPDFObjectHandle::ParserCallbacks, in addition to
|
||||||
|
|
|
@ -28,6 +28,7 @@ class Pl_Flate: public Pipeline
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
static unsigned int const def_bufsize = 65536;
|
static unsigned int const def_bufsize = 65536;
|
||||||
|
static int compression_level;
|
||||||
|
|
||||||
enum action_e { a_inflate, a_deflate };
|
enum action_e { a_inflate, a_deflate };
|
||||||
|
|
||||||
|
@ -42,6 +43,15 @@ class Pl_Flate: public Pipeline
|
||||||
QPDF_DLL
|
QPDF_DLL
|
||||||
virtual void finish();
|
virtual void finish();
|
||||||
|
|
||||||
|
// Globally set compression level from 1 (fastest, least
|
||||||
|
// compression) to 9 (slowest, most compression). Use -1 to set
|
||||||
|
// the default compression level. This is passed directly to zlib.
|
||||||
|
// This method returns a pointer to the current Pl_Flate object so
|
||||||
|
// you can create a pipeline with
|
||||||
|
// Pl_Flate(...)->setCompressionLevel(...)
|
||||||
|
QPDF_DLL
|
||||||
|
static void setCompressionLevel(int);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void handleData(unsigned char* data, size_t len, int flush);
|
void handleData(unsigned char* data, size_t len, int flush);
|
||||||
void checkError(char const* prefix, int error_code);
|
void checkError(char const* prefix, int error_code);
|
||||||
|
|
|
@ -6,6 +6,8 @@
|
||||||
#include <qpdf/QUtil.hh>
|
#include <qpdf/QUtil.hh>
|
||||||
#include <qpdf/QIntC.hh>
|
#include <qpdf/QIntC.hh>
|
||||||
|
|
||||||
|
int Pl_Flate::compression_level = Z_DEFAULT_COMPRESSION;
|
||||||
|
|
||||||
Pl_Flate::Members::Members(size_t out_bufsize,
|
Pl_Flate::Members::Members(size_t out_bufsize,
|
||||||
action_e action) :
|
action_e action) :
|
||||||
out_bufsize(out_bufsize),
|
out_bufsize(out_bufsize),
|
||||||
|
@ -120,7 +122,7 @@ Pl_Flate::handleData(unsigned char* data, size_t len, int flush)
|
||||||
#endif
|
#endif
|
||||||
if (this->m->action == a_deflate)
|
if (this->m->action == a_deflate)
|
||||||
{
|
{
|
||||||
err = deflateInit(&zstream, Z_DEFAULT_COMPRESSION);
|
err = deflateInit(&zstream, compression_level);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -235,6 +237,12 @@ Pl_Flate::finish()
|
||||||
this->getNext()->finish();
|
this->getNext()->finish();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Pl_Flate::setCompressionLevel(int level)
|
||||||
|
{
|
||||||
|
compression_level = level;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
Pl_Flate::checkError(char const* prefix, int error_code)
|
Pl_Flate::checkError(char const* prefix, int error_code)
|
||||||
{
|
{
|
||||||
|
|
BIN
zlib-flate/qtest/1.compressed-1
Normal file
BIN
zlib-flate/qtest/1.compressed-1
Normal file
Binary file not shown.
BIN
zlib-flate/qtest/1.compressed-9
Normal file
BIN
zlib-flate/qtest/1.compressed-9
Normal file
Binary file not shown.
|
@ -7,15 +7,21 @@ require TestDriver;
|
||||||
|
|
||||||
my $td = new TestDriver('zlib-flate');
|
my $td = new TestDriver('zlib-flate');
|
||||||
|
|
||||||
$td->runtest("compress",
|
foreach my $level ('', '=1', '=9')
|
||||||
{$td->COMMAND => "zlib-flate -compress < 1.uncompressed"},
|
{
|
||||||
{$td->FILE => "1.compressed",
|
my $f = $level;
|
||||||
$td->EXIT_STATUS => 0});
|
$f =~ s/=/-/;
|
||||||
|
$td->runtest("compress",
|
||||||
|
{$td->COMMAND =>
|
||||||
|
"zlib-flate -compress$level < 1.uncompressed"},
|
||||||
|
{$td->FILE => "1.compressed$f",
|
||||||
|
$td->EXIT_STATUS => 0});
|
||||||
|
|
||||||
$td->runtest("uncompress",
|
$td->runtest("uncompress",
|
||||||
{$td->COMMAND => "zlib-flate -uncompress < 1.compressed"},
|
{$td->COMMAND => "zlib-flate -uncompress < 1.compressed"},
|
||||||
{$td->FILE => "1.uncompressed",
|
{$td->FILE => "1.uncompressed",
|
||||||
$td->EXIT_STATUS => 0});
|
$td->EXIT_STATUS => 0});
|
||||||
|
}
|
||||||
|
|
||||||
$td->runtest("error",
|
$td->runtest("error",
|
||||||
{$td->COMMAND => "zlib-flate -uncompress < 1.uncompressed"},
|
{$td->COMMAND => "zlib-flate -uncompress < 1.uncompressed"},
|
||||||
|
@ -23,4 +29,4 @@ $td->runtest("error",
|
||||||
$td->EXIT_STATUS => 2},
|
$td->EXIT_STATUS => 2},
|
||||||
$td->NORMALIZE_NEWLINES);
|
$td->NORMALIZE_NEWLINES);
|
||||||
|
|
||||||
$td->report(3);
|
$td->report(7);
|
||||||
|
|
|
@ -12,8 +12,14 @@ static char const* whoami = 0;
|
||||||
|
|
||||||
void usage()
|
void usage()
|
||||||
{
|
{
|
||||||
std::cerr << "Usage: " << whoami << " { -uncompress | -compress }"
|
std::cerr << "Usage: " << whoami << " { -uncompress | -compress[=n] }"
|
||||||
<< std::endl;
|
<< std::endl
|
||||||
|
<< "If n is specified with -compress, it is a"
|
||||||
|
<< " zlib compression level from" << std::endl
|
||||||
|
<< "1 to 9 where lower numbers are faster and"
|
||||||
|
<< " less compressed and higher" << std::endl
|
||||||
|
<< "numbers are slower and more compresed"
|
||||||
|
<< std::endl;
|
||||||
exit(2);
|
exit(2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -43,6 +49,7 @@ int main(int argc, char* argv[])
|
||||||
{
|
{
|
||||||
usage();
|
usage();
|
||||||
}
|
}
|
||||||
|
// QXXXQ level
|
||||||
|
|
||||||
Pl_Flate::action_e action = Pl_Flate::a_inflate;
|
Pl_Flate::action_e action = Pl_Flate::a_inflate;
|
||||||
|
|
||||||
|
@ -54,6 +61,12 @@ int main(int argc, char* argv[])
|
||||||
{
|
{
|
||||||
action = Pl_Flate::a_deflate;
|
action = Pl_Flate::a_deflate;
|
||||||
}
|
}
|
||||||
|
else if ((strncmp(argv[1], "-compress=", 10) == 0))
|
||||||
|
{
|
||||||
|
action = Pl_Flate::a_deflate;
|
||||||
|
int level = QUtil::string_to_int(argv[1] + 10);
|
||||||
|
Pl_Flate::setCompressionLevel(level);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
usage();
|
usage();
|
||||||
|
|
Loading…
Reference in New Issue
Block a user