Browse Source

Implemented support for changing zlib compression levels from the

Tight encoder.


git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@334 3789f03b-4d11-0410-bbf8-ca57d06f2519
tags/v0.0.90
Constantin Kaplinsky 18 years ago
parent
commit
a22779beea
3 changed files with 27 additions and 1 deletions
  1. 22
    1
      rdr/ZlibOutStream.cxx
  2. 4
    0
      rdr/ZlibOutStream.h
  3. 1
    0
      rfb/tightEncode.h

+ 22
- 1
rdr/ZlibOutStream.cxx View File

@@ -25,7 +25,8 @@ using namespace rdr;
enum { DEFAULT_BUF_SIZE = 16384 };

ZlibOutStream::ZlibOutStream(OutStream* os, int bufSize_, int compressLevel)
: underlying(os), bufSize(bufSize_ ? bufSize_ : DEFAULT_BUF_SIZE), offset(0)
: underlying(os), compressionLevel(compressLevel), newLevel(compressLevel),
bufSize(bufSize_ ? bufSize_ : DEFAULT_BUF_SIZE), offset(0)
{
zs = new z_stream;
zs->zalloc = Z_NULL;
@@ -55,6 +56,14 @@ void ZlibOutStream::setUnderlying(OutStream* os)
underlying = os;
}

void ZlibOutStream::setCompressionLevel(int level)
{
if (level < -1 || level > 9)
level = -1; // Z_DEFAULT_COMPRESSION

newLevel = level;
}

int ZlibOutStream::length()
{
return offset + ptr - start;
@@ -76,6 +85,7 @@ void ZlibOutStream::flush()

// fprintf(stderr,"zos flush: calling deflate, avail_in %d, avail_out %d\n",
// zs->avail_in,zs->avail_out);
checkCompressionLevel();
int rc = deflate(zs, Z_SYNC_FLUSH);
if (rc != Z_OK) throw Exception("ZlibOutStream: deflate failed");

@@ -109,6 +119,7 @@ int ZlibOutStream::overrun(int itemSize, int nItems)
// fprintf(stderr,"zos overrun: calling deflate, avail_in %d, avail_out %d\n",
// zs->avail_in,zs->avail_out);

checkCompressionLevel();
int rc = deflate(zs, 0);
if (rc != Z_OK) throw Exception("ZlibOutStream: deflate failed");

@@ -138,3 +149,13 @@ int ZlibOutStream::overrun(int itemSize, int nItems)

return nItems;
}

void ZlibOutStream::checkCompressionLevel()
{
if (newLevel != compressionLevel) {
if (deflateParams (zs, newLevel, Z_DEFAULT_STRATEGY) != Z_OK) {
throw Exception("ZlibOutStream: deflateParams failed");
}
compressionLevel = newLevel;
}
}

+ 4
- 0
rdr/ZlibOutStream.h View File

@@ -38,14 +38,18 @@ namespace rdr {
virtual ~ZlibOutStream();

void setUnderlying(OutStream* os);
void setCompressionLevel(int level=-1);
void flush();
int length();

private:

int overrun(int itemSize, int nItems);
void checkCompressionLevel();

OutStream* underlying;
int compressionLevel;
int newLevel;
int bufSize;
int offset;
z_stream_s* zs;

+ 1
- 0
rfb/tightEncode.h View File

@@ -192,6 +192,7 @@ static void compressData(rdr::OutStream *os, rdr::ZlibOutStream *zos,
// Maybe use the same static object used in the JPEG coder?
rdr::MemOutStream mem_os;
zos->setUnderlying(&mem_os);
zos->setCompressionLevel(zlibLevel);
zos->writeBytes(buf, length);
zos->flush();
os->writeCompactLength(mem_os.length());

Loading…
Cancel
Save