summaryrefslogtreecommitdiff
path: root/Build/source/texk/dvisvgm/dvisvgm-src/src/ZLibOutputStream.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/dvisvgm/dvisvgm-src/src/ZLibOutputStream.hpp')
-rw-r--r--Build/source/texk/dvisvgm/dvisvgm-src/src/ZLibOutputStream.hpp181
1 files changed, 0 insertions, 181 deletions
diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/ZLibOutputStream.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/ZLibOutputStream.hpp
deleted file mode 100644
index a995dbf01e9..00000000000
--- a/Build/source/texk/dvisvgm/dvisvgm-src/src/ZLibOutputStream.hpp
+++ /dev/null
@@ -1,181 +0,0 @@
-/*************************************************************************
-** ZLibOutputStream.hpp **
-** **
-** This file is part of dvisvgm -- a fast DVI to SVG converter **
-** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> **
-** **
-** This program is free software; you can redistribute it and/or **
-** modify it under the terms of the GNU General Public License as **
-** published by the Free Software Foundation; either version 3 of **
-** the License, or (at your option) any later version. **
-** **
-** This program is distributed in the hope that it will be useful, but **
-** WITHOUT ANY WARRANTY; without even the implied warranty of **
-** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the **
-** GNU General Public License for more details. **
-** **
-** You should have received a copy of the GNU General Public License **
-** along with this program; if not, see <http://www.gnu.org/licenses/>. **
-*************************************************************************/
-
-#ifndef ZLIBOUTPUTSTREAM_HPP
-#define ZLIBOUTPUTSTREAM_HPP
-
-#include <fstream>
-#include <ostream>
-#include <vector>
-#include <zlib.h>
-#include "MessageException.hpp"
-
-#ifdef _WIN32
-# include <fcntl.h>
-# include <io.h>
-#endif
-
-struct ZLibException : public MessageException {
- explicit ZLibException (const std::string &msg) : MessageException(msg) {}
-};
-
-enum ZLibCompressionFormat {ZLIB_DEFLATE=0, ZLIB_GZIP=16};
-
-class ZLibOutputBuffer : public std::streambuf {
- public:
- ZLibOutputBuffer () =default;
-
- ZLibOutputBuffer (std::streambuf *sbuf, ZLibCompressionFormat format, int zipLevel) {
- open(sbuf, format, zipLevel);
- }
-
- ~ZLibOutputBuffer () override {
- close();
- }
-
- /** Opens the buffer for writing.
- * @param[in] sink stream buffer taking the compressed data
- * @param[in] format compression format (deflate or gzip)
- * @param[in] zipLevel compression level (1-9)
- * @return true if buffer is ready for writing */
- bool open (std::streambuf *sink, ZLibCompressionFormat format, int zipLevel) {
- if (sink) {
- _inbuf.reserve(4096);
- _zbuf.resize(4096);
- _zstream.zalloc = Z_NULL;
- _zstream.zfree = Z_NULL;
- _zstream.opaque = Z_NULL;
- zipLevel = std::max(1, std::min(9, zipLevel));
- if (deflateInit2(&_zstream, zipLevel, Z_DEFLATED, 15+format, 8, Z_DEFAULT_STRATEGY) != Z_OK)
- throw ZLibException("failed to initialize deflate compression");
- _sink = sink;
- _opened = true;
- }
- return _opened;
- }
-
- /** Flushes the remaining data, finishes the compression process, and
- * closes the buffer so that further output doesn't reach the sink. */
- void close () {
- close(true);
- }
-
- int_type overflow (int_type c) override {
- if (c == traits_type::eof()) {
- close();
- }
- else {
- if (_inbuf.size() == _inbuf.capacity())
- flush(Z_NO_FLUSH);
- _inbuf.push_back(static_cast<unsigned char>(c));
- }
- return c;
- }
-
- int sync () override {
- flush(Z_NO_FLUSH);
- return 0;
- }
-
- protected:
- /** Compresses the chunk of data present in the input buffer
- * and writes it to the assigned output stream.
- * @param[in] flushmode flush mode of deflate function (Z_NO_FLUSH or Z_FINISH)
- * @throws ZLibException if compression failed */
- void flush (int flushmode) {
- if (_opened) {
- _zstream.avail_in = static_cast<uInt>(_inbuf.size());
- _zstream.next_in = _inbuf.data();
- do {
- _zstream.avail_out = static_cast<uInt>(_zbuf.size());
- _zstream.next_out = _zbuf.data();
- int ret = deflate(&_zstream, flushmode);
- if (ret == Z_STREAM_ERROR) {
- close(false);
- throw ZLibException("stream error during data compression");
- }
- auto have = _zbuf.size()-_zstream.avail_out;
- _sink->sputn(reinterpret_cast<char*>(_zbuf.data()), have);
- } while (_zstream.avail_out == 0);
- }
- _inbuf.clear();
- }
-
- /** Closes the buffer so that further output doesn't reach the sink.
- * @param[in] finish if true, flushes the remaining data and finishes the compression process */
- void close (bool finish) {
- if (_opened) {
- if (finish)
- flush(Z_FINISH);
- deflateEnd(&_zstream);
- _sink = nullptr;
- _opened = false;
- }
- }
-
- private:
- z_stream _zstream;
- std::streambuf *_sink = nullptr; ///< target buffer where the compressded data is flushed to
- std::vector<Bytef> _inbuf; ///< buffer holding a chunk of data to be compressed
- std::vector<Bytef> _zbuf; ///< buffer holding a chunk of compressed data
- bool _opened = false; ///< true if ready to process the incoming data correctly
-};
-
-
-class ZLibOutputStream : private ZLibOutputBuffer, public std::ostream {
- public:
- ZLibOutputStream () : std::ostream(this) {}
-
- ZLibOutputStream (std::ostream &os, ZLibCompressionFormat format, int zipLevel)
- : ZLibOutputBuffer(os.rdbuf(), format, zipLevel), std::ostream(this) {}
-
- ~ZLibOutputStream () override {close();}
-
- bool open (std::ostream &os, ZLibCompressionFormat format, int zipLevel) {
- ZLibOutputBuffer::close();
- return ZLibOutputBuffer::open(os.rdbuf(), format, zipLevel);
- }
-
- void close () {
- ZLibOutputBuffer::close();
- }
-};
-
-
-class ZLibOutputFileStream : public ZLibOutputStream {
- public:
- ZLibOutputFileStream (const std::string &fname, ZLibCompressionFormat format, int zipLevel)
- : _ofs(fname, std::ios::binary)
- {
- if (_ofs) {
- if (_ofs.rdbuf())
- open(_ofs, format, zipLevel);
- else
- _ofs.close();
- }
- }
-
- ~ZLibOutputFileStream () override {close();}
-
- private:
- std::ofstream _ofs;
-};
-
-#endif