Terraria v1.4.4.9
Terraria source code documentation
All Classes Namespaces Files Functions Variables Enumerations Enumerator Properties Events Macros
BrotliEncoder.cs
Go to the documentation of this file.
4
6
8{
10
11 private bool _disposed;
12
13 public BrotliEncoder(int quality, int window)
14 {
15 _disposed = false;
16 _state = global::Interop.Brotli.BrotliEncoderCreateInstance(IntPtr.Zero, IntPtr.Zero, IntPtr.Zero);
17 if (_state.IsInvalid)
18 {
20 }
21 SetQuality(quality);
22 SetWindow(window);
23 }
24
25 internal void InitializeEncoder()
26 {
28 _state = global::Interop.Brotli.BrotliEncoderCreateInstance(IntPtr.Zero, IntPtr.Zero, IntPtr.Zero);
29 if (_state.IsInvalid)
30 {
32 }
33 }
34
35 internal void EnsureInitialized()
36 {
38 if (_state == null)
39 {
41 }
42 }
43
44 public void Dispose()
45 {
46 _disposed = true;
47 _state?.Dispose();
48 }
49
50 private void EnsureNotDisposed()
51 {
52 if (_disposed)
53 {
54 throw new ObjectDisposedException("BrotliEncoder", System.SR.BrotliEncoder_Disposed);
55 }
56 }
57
58 internal void SetQuality(int quality)
59 {
61 if (_state == null || _state.IsInvalid || _state.IsClosed)
62 {
64 }
65 if (quality < 0 || quality > 11)
66 {
67 throw new ArgumentOutOfRangeException("quality", System.SR.Format(System.SR.BrotliEncoder_Quality, quality, 0, 11));
68 }
69 if (global::Interop.Brotli.BrotliEncoderSetParameter(_state, BrotliEncoderParameter.Quality, (uint)quality) == global::Interop.BOOL.FALSE)
70 {
72 }
73 }
74
75 internal void SetWindow(int window)
76 {
78 if (_state == null || _state.IsInvalid || _state.IsClosed)
79 {
81 }
82 if (window < 10 || window > 24)
83 {
84 throw new ArgumentOutOfRangeException("window", System.SR.Format(System.SR.BrotliEncoder_Window, window, 10, 24));
85 }
86 if (global::Interop.Brotli.BrotliEncoderSetParameter(_state, BrotliEncoderParameter.LGWin, (uint)window) == global::Interop.BOOL.FALSE)
87 {
89 }
90 }
91
92 public static int GetMaxCompressedLength(int inputSize)
93 {
94 if (inputSize < 0 || inputSize > 2147483132)
95 {
96 throw new ArgumentOutOfRangeException("inputSize");
97 }
98 if (inputSize == 0)
99 {
100 return 1;
101 }
102 int num = inputSize >> 24;
103 int num2 = inputSize & 0xFFFFFF;
104 int num3 = ((num2 > 1048576) ? 4 : 3);
105 int num4 = 2 + 4 * num + num3 + 1;
106 return inputSize + num4;
107 }
108
109 internal OperationStatus Flush(Memory<byte> destination, out int bytesWritten)
110 {
111 return Flush(destination.Span, out bytesWritten);
112 }
113
114 public OperationStatus Flush(Span<byte> destination, out int bytesWritten)
115 {
116 int bytesConsumed;
117 return Compress(ReadOnlySpan<byte>.Empty, destination, out bytesConsumed, out bytesWritten, BrotliEncoderOperation.Flush);
118 }
119
120 internal OperationStatus Compress(ReadOnlyMemory<byte> source, Memory<byte> destination, out int bytesConsumed, out int bytesWritten, bool isFinalBlock)
121 {
122 return Compress(source.Span, destination.Span, out bytesConsumed, out bytesWritten, isFinalBlock);
123 }
124
125 public OperationStatus Compress(ReadOnlySpan<byte> source, Span<byte> destination, out int bytesConsumed, out int bytesWritten, bool isFinalBlock)
126 {
127 return Compress(source, destination, out bytesConsumed, out bytesWritten, isFinalBlock ? BrotliEncoderOperation.Finish : BrotliEncoderOperation.Process);
128 }
129
130 internal unsafe OperationStatus Compress(ReadOnlySpan<byte> source, Span<byte> destination, out int bytesConsumed, out int bytesWritten, BrotliEncoderOperation operation)
131 {
133 bytesWritten = 0;
134 bytesConsumed = 0;
135 nuint availableOut = (nuint)destination.Length;
136 nuint availableIn = (nuint)source.Length;
137 while ((int)availableOut > 0)
138 {
139 fixed (byte* ptr = &MemoryMarshal.GetReference(source))
140 {
141 byte* ptr2 = ptr;
142 fixed (byte* ptr3 = &MemoryMarshal.GetReference(destination))
143 {
144 byte* ptr4 = ptr3;
145 if (global::Interop.Brotli.BrotliEncoderCompressStream(_state, operation, ref availableIn, &ptr2, ref availableOut, &ptr4, out UIntPtr _) == global::Interop.BOOL.FALSE)
146 {
147 return OperationStatus.InvalidData;
148 }
149 bytesConsumed += source.Length - (int)availableIn;
150 bytesWritten += destination.Length - (int)availableOut;
151 if ((int)availableOut == destination.Length && global::Interop.Brotli.BrotliEncoderHasMoreOutput(_state) == global::Interop.BOOL.FALSE && availableIn == 0)
152 {
153 return OperationStatus.Done;
154 }
155 source = source.Slice(source.Length - (int)availableIn);
156 destination = destination.Slice(destination.Length - (int)availableOut);
157 }
158 }
159 }
160 return OperationStatus.DestinationTooSmall;
161 }
162
163 public static bool TryCompress(ReadOnlySpan<byte> source, Span<byte> destination, out int bytesWritten)
164 {
165 return TryCompress(source, destination, out bytesWritten, 11, 22);
166 }
167
168 public unsafe static bool TryCompress(ReadOnlySpan<byte> source, Span<byte> destination, out int bytesWritten, int quality, int window)
169 {
170 if (quality < 0 || quality > 11)
171 {
172 throw new ArgumentOutOfRangeException("quality", System.SR.Format(System.SR.BrotliEncoder_Quality, quality, 0, 11));
173 }
174 if (window < 10 || window > 24)
175 {
176 throw new ArgumentOutOfRangeException("window", System.SR.Format(System.SR.BrotliEncoder_Window, window, 10, 24));
177 }
178 fixed (byte* inBytes = &MemoryMarshal.GetReference(source))
179 {
180 fixed (byte* outBytes = &MemoryMarshal.GetReference(destination))
181 {
182 nuint num = (nuint)destination.Length;
183 bool result = global::Interop.Brotli.BrotliEncoderCompress(quality, window, 0, (nuint)source.Length, inBytes, &num, outBytes) != global::Interop.BOOL.FALSE;
184 bytesWritten = (int)num;
185 return result;
186 }
187 }
188 }
189}
static string BrotliEncoder_Quality
Definition SR.cs:28
static string Format(string resourceFormat, object p1)
Definition SR.cs:118
static string BrotliEncoder_InvalidSetParameter
Definition SR.cs:32
static string BrotliEncoder_Disposed
Definition SR.cs:26
static string BrotliEncoder_Create
Definition SR.cs:24
static string BrotliEncoder_Window
Definition SR.cs:30
Definition SR.cs:7
OperationStatus Flush(Memory< byte > destination, out int bytesWritten)
OperationStatus Flush(Span< byte > destination, out int bytesWritten)
BrotliEncoder(int quality, int window)
SafeBrotliEncoderHandle _state
static int GetMaxCompressedLength(int inputSize)
OperationStatus Compress(ReadOnlyMemory< byte > source, Memory< byte > destination, out int bytesConsumed, out int bytesWritten, bool isFinalBlock)
OperationStatus Compress(ReadOnlySpan< byte > source, Span< byte > destination, out int bytesConsumed, out int bytesWritten, bool isFinalBlock)
static unsafe bool TryCompress(ReadOnlySpan< byte > source, Span< byte > destination, out int bytesWritten, int quality, int window)
unsafe OperationStatus Compress(ReadOnlySpan< byte > source, Span< byte > destination, out int bytesConsumed, out int bytesWritten, BrotliEncoderOperation operation)
static bool TryCompress(ReadOnlySpan< byte > source, Span< byte > destination, out int bytesWritten)
static readonly IntPtr Zero
Definition IntPtr.cs:18