Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
7640 views
1
#include "mupdf/fitz.h"
2
#include "draw-imp.h"
3
4
/* Unpack image samples and optionally pad pixels with opaque alpha */
5
6
#define get1(buf,x) ((buf[x >> 3] >> ( 7 - (x & 7) ) ) & 1 )
7
#define get2(buf,x) ((buf[x >> 2] >> ( ( 3 - (x & 3) ) << 1 ) ) & 3 )
8
#define get4(buf,x) ((buf[x >> 1] >> ( ( 1 - (x & 1) ) << 2 ) ) & 15 )
9
#define get8(buf,x) (buf[x])
10
#define get16(buf,x) (buf[x << 1])
11
12
static unsigned char get1_tab_1[256][8];
13
static unsigned char get1_tab_1p[256][16];
14
static unsigned char get1_tab_255[256][8];
15
static unsigned char get1_tab_255p[256][16];
16
17
static void
18
init_get1_tables(void)
19
{
20
static int once = 0;
21
unsigned char bits[1];
22
int i, k, x;
23
24
/* TODO: mutex lock here */
25
26
if (once)
27
return;
28
29
for (i = 0; i < 256; i++)
30
{
31
bits[0] = i;
32
for (k = 0; k < 8; k++)
33
{
34
x = get1(bits, k);
35
36
get1_tab_1[i][k] = x;
37
get1_tab_1p[i][k * 2] = x;
38
get1_tab_1p[i][k * 2 + 1] = 255;
39
40
get1_tab_255[i][k] = x * 255;
41
get1_tab_255p[i][k * 2] = x * 255;
42
get1_tab_255p[i][k * 2 + 1] = 255;
43
}
44
}
45
46
once = 1;
47
}
48
49
void
50
fz_unpack_tile(fz_context *ctx, fz_pixmap *dst, unsigned char * restrict src, int n, int depth, int stride, int scale)
51
{
52
int pad, x, y, k;
53
int w = dst->w;
54
55
pad = 0;
56
if (dst->n > n)
57
pad = 255;
58
59
if (depth == 1)
60
init_get1_tables();
61
62
if (scale == 0)
63
{
64
switch (depth)
65
{
66
case 1: scale = 255; break;
67
case 2: scale = 85; break;
68
case 4: scale = 17; break;
69
}
70
}
71
72
for (y = 0; y < dst->h; y++)
73
{
74
unsigned char *sp = src + (unsigned int)(y * stride);
75
unsigned char *dp = dst->samples + (unsigned int)(y * dst->w * dst->n);
76
77
/* Specialized loops */
78
79
if (n == 1 && depth == 1 && scale == 1 && !pad)
80
{
81
int w3 = w >> 3;
82
for (x = 0; x < w3; x++)
83
{
84
memcpy(dp, get1_tab_1[*sp++], 8);
85
dp += 8;
86
}
87
x = x << 3;
88
if (x < w)
89
memcpy(dp, get1_tab_1[*sp], w - x);
90
}
91
92
else if (n == 1 && depth == 1 && scale == 255 && !pad)
93
{
94
int w3 = w >> 3;
95
for (x = 0; x < w3; x++)
96
{
97
memcpy(dp, get1_tab_255[*sp++], 8);
98
dp += 8;
99
}
100
x = x << 3;
101
if (x < w)
102
memcpy(dp, get1_tab_255[*sp], w - x);
103
}
104
105
else if (n == 1 && depth == 1 && scale == 1 && pad)
106
{
107
int w3 = w >> 3;
108
for (x = 0; x < w3; x++)
109
{
110
memcpy(dp, get1_tab_1p[*sp++], 16);
111
dp += 16;
112
}
113
x = x << 3;
114
if (x < w)
115
memcpy(dp, get1_tab_1p[*sp], (w - x) << 1);
116
}
117
118
else if (n == 1 && depth == 1 && scale == 255 && pad)
119
{
120
int w3 = w >> 3;
121
for (x = 0; x < w3; x++)
122
{
123
memcpy(dp, get1_tab_255p[*sp++], 16);
124
dp += 16;
125
}
126
x = x << 3;
127
if (x < w)
128
memcpy(dp, get1_tab_255p[*sp], (w - x) << 1);
129
}
130
131
else if (depth == 8 && !pad)
132
{
133
int len = w * n;
134
while (len--)
135
*dp++ = *sp++;
136
}
137
138
else if (depth == 8 && pad)
139
{
140
for (x = 0; x < w; x++)
141
{
142
for (k = 0; k < n; k++)
143
*dp++ = *sp++;
144
*dp++ = 255;
145
}
146
}
147
148
else
149
{
150
int b = 0;
151
for (x = 0; x < w; x++)
152
{
153
for (k = 0; k < n; k++)
154
{
155
switch (depth)
156
{
157
case 1: *dp++ = get1(sp, b) * scale; break;
158
case 2: *dp++ = get2(sp, b) * scale; break;
159
case 4: *dp++ = get4(sp, b) * scale; break;
160
case 8: *dp++ = get8(sp, b); break;
161
case 16: *dp++ = get16(sp, b); break;
162
}
163
b++;
164
}
165
if (pad)
166
*dp++ = 255;
167
}
168
}
169
}
170
}
171
172
/* Apply decode array */
173
174
void
175
fz_decode_indexed_tile(fz_context *ctx, fz_pixmap *pix, float *decode, int maxval)
176
{
177
int add[FZ_MAX_COLORS];
178
int mul[FZ_MAX_COLORS];
179
unsigned char *p = pix->samples;
180
int len = pix->w * pix->h;
181
int n = pix->n - 1;
182
int needed;
183
int k;
184
185
needed = 0;
186
for (k = 0; k < n; k++)
187
{
188
int min = decode[k * 2] * 256;
189
int max = decode[k * 2 + 1] * 256;
190
add[k] = min;
191
mul[k] = (max - min) / maxval;
192
needed |= min != 0 || max != maxval * 256;
193
}
194
195
if (!needed)
196
return;
197
198
while (len--)
199
{
200
for (k = 0; k < n; k++)
201
{
202
int value = (add[k] + (((p[k] << 8) * mul[k]) >> 8)) >> 8;
203
p[k] = fz_clampi(value, 0, 255);
204
}
205
p += n + 1;
206
}
207
}
208
209
void
210
fz_decode_tile(fz_context *ctx, fz_pixmap *pix, float *decode)
211
{
212
int add[FZ_MAX_COLORS];
213
int mul[FZ_MAX_COLORS];
214
unsigned char *p = pix->samples;
215
int len = pix->w * pix->h;
216
int n = fz_maxi(1, pix->n - 1);
217
int needed;
218
int k;
219
220
needed = 0;
221
for (k = 0; k < n; k++)
222
{
223
int min = decode[k * 2] * 255;
224
int max = decode[k * 2 + 1] * 255;
225
add[k] = min;
226
mul[k] = max - min;
227
needed |= min != 0 || max != 255;
228
}
229
230
if (!needed)
231
return;
232
233
while (len--)
234
{
235
for (k = 0; k < n; k++)
236
{
237
int value = add[k] + fz_mul255(p[k], mul[k]);
238
p[k] = fz_clampi(value, 0, 255);
239
}
240
p += pix->n;
241
}
242
}
243
244