Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
4680 right-hear 1
#include "fitz.h"
2
 
3
static int fz_memory_limit = 256 << 20;
4
static int fz_memory_used = 0;
5
 
6
fz_pixmap *
7
fz_new_pixmap_with_data(fz_colorspace *colorspace, int w, int h, unsigned char *samples)
8
{
9
	fz_pixmap *pix;
10
 
11
	pix = fz_malloc(sizeof(fz_pixmap));
12
	pix->refs = 1;
13
	pix->x = 0;
14
	pix->y = 0;
15
	pix->w = w;
16
	pix->h = h;
17
	pix->mask = NULL;
18
	pix->interpolate = 1;
19
	pix->xres = 96;
20
	pix->yres = 96;
21
	pix->colorspace = NULL;
22
	pix->n = 1;
23
 
24
	if (colorspace)
25
	{
26
		pix->colorspace = fz_keep_colorspace(colorspace);
27
		pix->n = 1 + colorspace->n;
28
	}
29
 
30
	if (samples)
31
	{
32
		pix->samples = samples;
33
		pix->free_samples = 0;
34
	}
35
	else
36
	{
37
		fz_memory_used += pix->w * pix->h * pix->n;
38
		pix->samples = fz_calloc(pix->h, pix->w * pix->n);
39
		pix->free_samples = 1;
40
	}
41
 
42
	return pix;
43
}
44
 
45
fz_pixmap *
46
fz_new_pixmap_with_limit(fz_colorspace *colorspace, int w, int h)
47
{
48
	int n = colorspace ? colorspace->n + 1 : 1;
49
	int size = w * h * n;
50
	if (fz_memory_used + size > fz_memory_limit)
51
	{
52
		fz_warn("pixmap memory exceeds soft limit %dM + %dM > %dM",
53
			fz_memory_used/(1<<20), size/(1<<20), fz_memory_limit/(1<<20));
54
		return NULL;
55
	}
56
	return fz_new_pixmap_with_data(colorspace, w, h, NULL);
57
}
58
 
59
fz_pixmap *
60
fz_new_pixmap(fz_colorspace *colorspace, int w, int h)
61
{
62
	return fz_new_pixmap_with_data(colorspace, w, h, NULL);
63
}
64
 
65
fz_pixmap *
66
fz_new_pixmap_with_rect(fz_colorspace *colorspace, fz_bbox r)
67
{
68
	fz_pixmap *pixmap;
69
	pixmap = fz_new_pixmap(colorspace, r.x1 - r.x0, r.y1 - r.y0);
70
	pixmap->x = r.x0;
71
	pixmap->y = r.y0;
72
	return pixmap;
73
}
74
 
75
fz_pixmap *
76
fz_new_pixmap_with_rect_and_data(fz_colorspace *colorspace, fz_bbox r, unsigned char *samples)
77
{
78
	fz_pixmap *pixmap;
79
	pixmap = fz_new_pixmap_with_data(colorspace, r.x1 - r.x0, r.y1 - r.y0, samples);
80
	pixmap->x = r.x0;
81
	pixmap->y = r.y0;
82
	return pixmap;
83
}
84
 
85
fz_pixmap *
86
fz_keep_pixmap(fz_pixmap *pix)
87
{
88
	pix->refs++;
89
	return pix;
90
}
91
 
92
void
93
fz_drop_pixmap(fz_pixmap *pix)
94
{
95
	if (pix && --pix->refs == 0)
96
	{
97
		fz_memory_used -= pix->w * pix->h * pix->n;
98
		if (pix->mask)
99
			fz_drop_pixmap(pix->mask);
100
		if (pix->colorspace)
101
			fz_drop_colorspace(pix->colorspace);
102
		if (pix->free_samples)
103
			fz_free(pix->samples);
104
		fz_free(pix);
105
	}
106
}
107
 
108
fz_bbox
109
fz_bound_pixmap(fz_pixmap *pix)
110
{
111
	fz_bbox bbox;
112
	bbox.x0 = pix->x;
113
	bbox.y0 = pix->y;
114
	bbox.x1 = pix->x + pix->w;
115
	bbox.y1 = pix->y + pix->h;
116
	return bbox;
117
}
118
 
119
void
120
fz_clear_pixmap(fz_pixmap *pix)
121
{
122
	memset(pix->samples, 0, pix->w * pix->h * pix->n);
123
}
124
 
125
void
126
fz_clear_pixmap_with_color(fz_pixmap *pix, int value)
127
{
128
	if (value == 255)
129
		memset(pix->samples, 255, pix->w * pix->h * pix->n);
130
	else
131
	{
132
		int k, x, y;
133
		unsigned char *s = pix->samples;
134
		for (y = 0; y < pix->h; y++)
135
		{
136
			for (x = 0; x < pix->w; x++)
137
			{
138
				for (k = 0; k < pix->n - 1; k++)
139
					*s++ = value;
140
				*s++ = 255;
141
			}
142
		}
143
	}
144
}
145
 
146
void
147
fz_copy_pixmap_rect(fz_pixmap *dest, fz_pixmap *src, fz_bbox r)
148
{
149
	const unsigned char *srcp;
150
	unsigned char *destp;
151
	int y, w, destspan, srcspan;
152
 
153
	r = fz_intersect_bbox(r, fz_bound_pixmap(dest));
154
	r = fz_intersect_bbox(r, fz_bound_pixmap(src));
155
	w = r.x1 - r.x0;
156
	y = r.y1 - r.y0;
157
	if (w <= 0 || y <= 0)
158
		return;
159
 
160
	w *= src->n;
161
	srcspan = src->w * src->n;
162
	srcp = src->samples + srcspan * (r.y0 - src->y) + src->n * (r.x0 - src->x);
163
	destspan = dest->w * dest->n;
164
	destp = dest->samples + destspan * (r.y0 - dest->y) + dest->n * (r.x0 - dest->x);
165
	do
166
	{
167
		memcpy(destp, srcp, w);
168
		srcp += srcspan;
169
		destp += destspan;
170
	}
171
	while (--y);
172
}
173
 
174
void
175
fz_clear_pixmap_rect_with_color(fz_pixmap *dest, int value, fz_bbox r)
176
{
177
	unsigned char *destp;
178
	int x, y, w, k, destspan;
179
 
180
	r = fz_intersect_bbox(r, fz_bound_pixmap(dest));
181
	w = r.x1 - r.x0;
182
	y = r.y1 - r.y0;
183
	if (w <= 0 || y <= 0)
184
		return;
185
 
186
	destspan = dest->w * dest->n;
187
	destp = dest->samples + destspan * (r.y0 - dest->y) + dest->n * (r.x0 - dest->x);
188
	if (value == 255)
189
		do
190
		{
191
			memset(destp, 255, w * dest->n);
192
			destp += destspan;
193
		}
194
		while (--y);
195
	else
196
		do
197
		{
198
			unsigned char *s = destp;
199
			for (x = 0; x < w; x++)
200
			{
201
				for (k = 0; k < dest->n - 1; k++)
202
					*s++ = value;
203
				*s++ = 255;
204
			}
205
			destp += destspan;
206
		}
207
		while (--y);
208
}
209
 
210
void
211
fz_premultiply_pixmap(fz_pixmap *pix)
212
{
213
	unsigned char *s = pix->samples;
214
	unsigned char a;
215
	int k, x, y;
216
 
217
	for (y = 0; y < pix->h; y++)
218
	{
219
		for (x = 0; x < pix->w; x++)
220
		{
221
			a = s[pix->n - 1];
222
			for (k = 0; k < pix->n - 1; k++)
223
				s[k] = fz_mul255(s[k], a);
224
			s += pix->n;
225
		}
226
	}
227
}
228
 
229
fz_pixmap *
230
fz_alpha_from_gray(fz_pixmap *gray, int luminosity)
231
{
232
	fz_pixmap *alpha;
233
	unsigned char *sp, *dp;
234
	int len;
235
 
236
	assert(gray->n == 2);
237
 
238
	alpha = fz_new_pixmap_with_rect(NULL, fz_bound_pixmap(gray));
239
	dp = alpha->samples;
240
	sp = gray->samples;
241
	if (!luminosity)
242
		sp ++;
243
 
244
	len = gray->w * gray->h;
245
	while (len--)
246
	{
247
		*dp++ = sp[0];
248
		sp += 2;
249
	}
250
 
251
	return alpha;
252
}
253
 
254
void
255
fz_invert_pixmap(fz_pixmap *pix)
256
{
257
	unsigned char *s = pix->samples;
258
	int k, x, y;
259
 
260
	for (y = 0; y < pix->h; y++)
261
	{
262
		for (x = 0; x < pix->w; x++)
263
		{
264
			for (k = 0; k < pix->n - 1; k++)
265
				s[k] = 255 - s[k];
266
			s += pix->n;
267
		}
268
	}
269
}
270
 
271
void
272
fz_gamma_pixmap(fz_pixmap *pix, float gamma)
273
{
274
	unsigned char gamma_map[256];
275
	unsigned char *s = pix->samples;
276
	int k, x, y;
277
 
278
	for (k = 0; k < 256; k++)
279
		gamma_map[k] = pow(k / 255.0f, gamma) * 255;
280
 
281
	for (y = 0; y < pix->h; y++)
282
	{
283
		for (x = 0; x < pix->w; x++)
284
		{
285
			for (k = 0; k < pix->n - 1; k++)
286
				s[k] = gamma_map[s[k]];
287