File: Compressor.h

package info (click to toggle)
lsp-plugins 1.2.26-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 130,004 kB
  • sloc: cpp: 642,749; xml: 78,805; makefile: 14,229; php: 1,361; sh: 185
file content (131 lines) | stat: -rw-r--r-- 5,472 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
/*
 * Copyright (C) 2025 Linux Studio Plugins Project <https://lsp-plug.in/>
 *           (C) 2025 Vladimir Sadovnikov <sadko4u@gmail.com>
 *
 * This file is part of lsp-runtime-lib
 * Created on: 1 мар. 2021 г.
 *
 * lsp-runtime-lib is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * any later version.
 *
 * lsp-runtime-lib 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 Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with lsp-runtime-lib. If not, see <https://www.gnu.org/licenses/>.
 */

#ifndef LSP_PLUG_IN_RESOURCE_ICOMPRESSOR_H_
#define LSP_PLUG_IN_RESOURCE_ICOMPRESSOR_H_

#include <lsp-plug.in/runtime/version.h>
#include <lsp-plug.in/io/OutMemoryStream.h>
#include <lsp-plug.in/io/IOutSequence.h>
#include <lsp-plug.in/io/IOutStream.h>
#include <lsp-plug.in/io/OutBitStream.h>
#include <lsp-plug.in/lltl/darray.h>
#include <lsp-plug.in/lltl/parray.h>
#include <lsp-plug.in/resource/ILoader.h>
#include <lsp-plug.in/resource/buffer.h>
#include <lsp-plug.in/resource/OutProxyStream.h>

namespace lsp
{
    namespace resource
    {
        /**
         * Interface for resource compressor
         */
        class Compressor
        {
            protected:
                lltl::darray<raw_resource_t>    vEntries;
                io::OutMemoryStream             sTemp;          // Temporary buffer
                OutProxyStream                  sOS;            // Output stream
                io::OutBitStream                sOut;           // Output bit stream
                size_t                          nSegment;       // Start of data segment
                size_t                          nOffset;        // Current offset in segment
                cbuffer_t                       sBuffer;        // Buffer for caching
//                FILE                           *hFD;

            protected:
                status_t            alloc_entry(raw_resource_t **r, io::Path *path, resource_type_t type);
                wssize_t            write_entry(raw_resource_t *r, io::IInStream *is);
                static size_t       calc_repeats(const uint8_t *head, const uint8_t *tail);
                status_t            emit_uint(size_t value, size_t initial, size_t stepping);
                static size_t       est_uint(size_t value, size_t initial, size_t stepping);

            public:
                explicit Compressor();
                Compressor(const Compressor &) = delete;
                Compressor(Compressor &&) = delete;
                ~Compressor();

                Compressor & operator = (const Compressor &) = delete;
                Compressor & operator = (Compressor &&) = delete;

            public:
                /**
                 * Close the compressor
                 * @return status of operation
                 */
                status_t                close();

                /**
                 * Initialize compressor
                 * @param buf_size buffer size
                 * @param os output stream
                 * @param flags flags
                 * @return status of operation
                 */
                status_t                init(size_t buf_size, io::IOutStream *os, size_t flags = WRAP_NONE);

            public:
                /**
                 * Get all resource entries
                 * @return all resource entries
                 */
                inline const raw_resource_t *entries() const    { return vEntries.array();                                  }

                /**
                 * Get number of resource entries
                 * @return number of resource entries
                 */
                inline size_t           num_entires() const     { return vEntries.size();                                   }

                /**
                 * Start a new segment of data. May be useful for sorting data by different types
                 * @return status of operation
                 */
                status_t                flush();

                /**
                 * Create resource entry and start it's writing
                 * @param name resource entry name
                 * @param is input stream to read entry from
                 * @return number of bytes read from original stream or negative error code
                 */
                wssize_t                create_file(const char *name, io::IInStream *is);
                wssize_t                create_file(const LSPString *name, io::IInStream *is);
                wssize_t                create_file(const io::Path *name, io::IInStream *is);

                /**
                 * Create directory
                 * @param name name of the directory
                 * @return status of operation
                 */
                status_t                create_dir(const char *name);
                status_t                create_dir(const LSPString *name);
                status_t                create_dir(const io::Path *name);
        };

    } /* namespace resource */
} /* namespace lsp */



#endif /* LSP_PLUG_IN_RESOURCE_ICOMPRESSOR_H_ */