pixbufutils 0.0.3 → 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/Rakefile +1 -1
- data/ext/pixbufutils/auto-equalize.h +102 -0
- data/ext/pixbufutils/blend5050.h +63 -0
- data/ext/pixbufutils/blur.h +358 -0
- data/ext/pixbufutils/extconf.rb +54 -9
- data/ext/pixbufutils/extract-alpha.h +66 -0
- data/ext/pixbufutils/filter.h +376 -0
- data/ext/pixbufutils/gamma.h +49 -0
- data/ext/pixbufutils/greyscale.h +127 -0
- data/ext/pixbufutils/histogram.h +119 -0
- data/ext/pixbufutils/mask.h +74 -0
- data/ext/pixbufutils/pixbufutils.c +289 -1257
- data/ext/pixbufutils/pixbufutils.cr +113 -1180
- data/ext/pixbufutils/pixbufutils.rd +18 -0
- data/ext/pixbufutils/rotate.h +82 -0
- data/ext/pixbufutils/sharpen.h +121 -0
- data/ext/pixbufutils/soften-edges.h +52 -0
- data/ext/pixbufutils/tiff.h +61 -0
- data/ext/pixbufutils/tint.h +66 -0
- metadata +72 -85
@@ -20,1144 +20,39 @@
|
|
20
20
|
|
21
21
|
%{
|
22
22
|
|
23
|
-
extern void Init_pixbufutils(void);
|
24
|
-
|
25
|
-
#ifndef IGNORE
|
26
|
-
#define IGNORE(x) x=x
|
27
|
-
#endif
|
28
|
-
|
29
|
-
static GdkPixbuf *pixbuf_extract_alpha(GdkPixbuf *src, int cutoff, int force_2bit)
|
30
|
-
{
|
31
|
-
int s_has_alpha, d_has_alpha;
|
32
|
-
int s_width, s_height, s_rowstride;
|
33
|
-
int d_width, d_height, d_rowstride;
|
34
|
-
GdkPixbuf *dest;
|
35
|
-
guchar *s_pix, *sp;
|
36
|
-
guchar *d_pix, *dp;
|
37
|
-
int i, j, pix_width, grey;
|
38
|
-
|
39
|
-
g_return_val_if_fail(src != NULL, NULL);
|
40
|
-
|
41
|
-
s_width = gdk_pixbuf_get_width(src);
|
42
|
-
s_height = gdk_pixbuf_get_height(src);
|
43
|
-
s_has_alpha = gdk_pixbuf_get_has_alpha(src);
|
44
|
-
s_rowstride = gdk_pixbuf_get_rowstride(src);
|
45
|
-
s_pix = gdk_pixbuf_get_pixels(src);
|
46
|
-
g_return_val_if_fail(s_has_alpha, NULL);
|
47
|
-
|
48
|
-
dest = gdk_pixbuf_new(GDK_COLORSPACE_RGB, FALSE, 8, s_width, s_height);
|
49
|
-
|
50
|
-
g_return_val_if_fail(dest != NULL, NULL);
|
51
|
-
|
52
|
-
d_rowstride = gdk_pixbuf_get_rowstride(dest);
|
53
|
-
d_pix = gdk_pixbuf_get_pixels(dest);
|
54
|
-
|
55
|
-
d_width = gdk_pixbuf_get_width(dest);
|
56
|
-
d_height = gdk_pixbuf_get_height(dest);
|
57
|
-
d_has_alpha = gdk_pixbuf_get_has_alpha(dest);
|
58
|
-
d_rowstride = gdk_pixbuf_get_rowstride(dest);
|
59
|
-
d_pix = gdk_pixbuf_get_pixels(dest);
|
60
|
-
|
61
|
-
g_return_val_if_fail(d_width == s_width, NULL);
|
62
|
-
g_return_val_if_fail(d_height == s_height, NULL);
|
63
|
-
|
64
|
-
pix_width = (s_has_alpha ? 4 : 3);
|
65
|
-
|
66
|
-
for (i = 0; i < s_height; i++) {
|
67
|
-
sp = s_pix;
|
68
|
-
dp = d_pix;
|
69
|
-
|
70
|
-
for (j = 0; j < s_width; j++) {
|
71
|
-
grey = sp[3];
|
72
|
-
|
73
|
-
if (grey < cutoff)
|
74
|
-
grey = 0;
|
75
|
-
|
76
|
-
if (force_2bit)
|
77
|
-
grey = (grey >= cutoff ? 255 : 0);
|
78
|
-
|
79
|
-
dp[0] = grey; /* red */
|
80
|
-
dp[1] = grey; /* green */
|
81
|
-
dp[2] = grey; /* blue */
|
82
|
-
|
83
|
-
dp += 3;
|
84
|
-
sp += 4;
|
85
|
-
}
|
86
|
-
|
87
|
-
d_pix += d_rowstride;
|
88
|
-
s_pix += s_rowstride;
|
89
|
-
}
|
90
|
-
|
91
|
-
return dest;
|
92
|
-
}
|
93
|
-
|
94
|
-
|
95
|
-
typedef enum {
|
96
|
-
ANGLE_0 = 0,
|
97
|
-
ANGLE_90 = 90,
|
98
|
-
ANGLE_180 = 180,
|
99
|
-
ANGLE_270 = 270
|
100
|
-
} rotate_angle_t;
|
101
|
-
|
102
|
-
static GdkPixbuf *
|
103
|
-
pixbuf_blur(GdkPixbuf *src, gint radius)
|
104
|
-
{
|
105
|
-
/* Pixels and Rowstride To Perform Blur On */
|
106
|
-
guchar *pixels;
|
107
|
-
GdkPixbuf *pixbuf;
|
108
|
-
gint rowstride, width, height;
|
109
|
-
|
110
|
-
pixbuf = gdk_pixbuf_copy(src);
|
111
|
-
|
112
|
-
/* Get Pixels and Rowstride Of Image Buffer */
|
113
|
-
if (pixbuf)
|
114
|
-
{
|
115
|
-
pixels = gdk_pixbuf_get_pixels (pixbuf);
|
116
|
-
rowstride = gdk_pixbuf_get_rowstride (pixbuf);
|
117
|
-
width = gdk_pixbuf_get_width(pixbuf);
|
118
|
-
height = gdk_pixbuf_get_height(pixbuf);
|
119
|
-
/*printf("%i, %i, %i, %i\n", rowstride, width, height, rowstride/width);*/
|
120
|
-
}
|
121
|
-
else
|
122
|
-
{
|
123
|
-
return NULL;
|
124
|
-
}
|
125
|
-
if (radius > 1)
|
126
|
-
{
|
127
|
-
/* Some Important Consts */
|
128
|
-
gint bytes = rowstride/width;
|
129
|
-
gboolean alpha = (bytes == 4);
|
130
|
-
|
131
|
-
gint div = radius+radius+1;
|
132
|
-
gint divsum = ((div+1)>>1)*((div+1)>>1);
|
133
|
-
gint dv[256*divsum]; /* Table of Const RGBA Values */
|
134
|
-
|
135
|
-
/* Some Important Variables */
|
136
|
-
guchar stack[div][bytes];
|
137
|
-
gint stackpointer;
|
138
|
-
gint stackstart;
|
139
|
-
gint vmin[MAX(width,height)];
|
140
|
-
guchar *sir;
|
141
|
-
gint rbs;
|
142
|
-
|
143
|
-
gint current = 0;
|
144
|
-
|
145
|
-
/* RGBA Sums
|
146
|
-
0 - Sum of Incoming pixels(the radius pixels above the Center/to left of Center)
|
147
|
-
1 - Sum of Outgoing pixels(the Center and the radius pixels below the Center/to right of Center)
|
148
|
-
2 - Sum of All pixels within radius
|
149
|
-
*/
|
150
|
-
gint rgba_sums[3][bytes];
|
151
|
-
|
152
|
-
/* RGBA Values */
|
153
|
-
guchar rgba[bytes][width*height];
|
154
|
-
|
155
|
-
/* Temp Indexes/Counters */
|
156
|
-
gint x, y, i, p, yp, yi=0, yw=0;
|
157
|
-
|
158
|
-
for (i=0; i<256*divsum; i++)
|
159
|
-
{
|
160
|
-
dv[i] = (i/divsum);
|
161
|
-
}
|
162
|
-
|
163
|
-
for (y=0; y < height; y++)
|
164
|
-
{
|
165
|
-
/* initialize sums to zero */
|
166
|
-
for (i = 0; i<bytes; i++)
|
167
|
-
{
|
168
|
-
rgba_sums[0][i] = 0;
|
169
|
-
rgba_sums[1][i] = 0;
|
170
|
-
rgba_sums[2][i] = 0;
|
171
|
-
}
|
172
|
-
|
173
|
-
/* Calculate Initial Sums For radius */
|
174
|
-
for(i=-radius; i<=radius; i++)
|
175
|
-
{
|
176
|
-
current = (yi + MIN(width - 1, MAX(i,0)))*bytes;
|
177
|
-
|
178
|
-
sir = stack[i+radius];
|
179
|
-
|
180
|
-
sir[0] = pixels[current + 0];
|
181
|
-
sir[1] = pixels[current + 1];
|
182
|
-
sir[2] = pixels[current + 2];
|
183
|
-
sir[3] = pixels[current + 3];
|
184
|
-
|
185
|
-
rbs = (radius + 1) - abs(i);
|
186
|
-
|
187
|
-
rgba_sums[2][0] += sir[0]*rbs;
|
188
|
-
rgba_sums[2][1] += sir[1]*rbs;
|
189
|
-
rgba_sums[2][2] += sir[2]*rbs;
|
190
|
-
if (alpha)
|
191
|
-
{
|
192
|
-
rgba_sums[2][3] += sir[3]*rbs;
|
193
|
-
}
|
194
|
-
|
195
|
-
if (i>0)
|
196
|
-
{
|
197
|
-
rgba_sums[0][0] += sir[0];
|
198
|
-
rgba_sums[0][1] += sir[1];
|
199
|
-
rgba_sums[0][2] += sir[2];
|
200
|
-
if (alpha)
|
201
|
-
{
|
202
|
-
rgba_sums[0][3] += sir[3];
|
203
|
-
}
|
204
|
-
}
|
205
|
-
else
|
206
|
-
{
|
207
|
-
rgba_sums[1][0] += sir[0];
|
208
|
-
rgba_sums[1][1] += sir[1];
|
209
|
-
rgba_sums[1][2] += sir[2];
|
210
|
-
if (alpha)
|
211
|
-
{
|
212
|
-
rgba_sums[1][3] += sir[3];
|
213
|
-
}
|
214
|
-
}
|
215
|
-
}
|
216
|
-
|
217
|
-
stackpointer = radius;
|
218
|
-
|
219
|
-
for (x=0; x<width; x++)
|
220
|
-
{
|
221
|
-
rgba[0][yi] = dv[rgba_sums[2][0]];
|
222
|
-
rgba[1][yi] = dv[rgba_sums[2][1]];
|
223
|
-
rgba[2][yi] = dv[rgba_sums[2][2]];
|
224
|
-
if (alpha)
|
225
|
-
{
|
226
|
-
rgba[3][yi] = dv[rgba_sums[2][3]];
|
227
|
-
}
|
228
|
-
|
229
|
-
rgba_sums[2][0] -= rgba_sums[1][0];
|
230
|
-
rgba_sums[2][1] -= rgba_sums[1][1];
|
231
|
-
rgba_sums[2][2] -= rgba_sums[1][2];
|
232
|
-
if (alpha)
|
233
|
-
{
|
234
|
-
rgba_sums[2][3] -= rgba_sums[1][3];
|
235
|
-
}
|
236
|
-
|
237
|
-
stackstart = stackpointer - radius + div;
|
238
|
-
sir = stack[stackstart%div];
|
239
|
-
|
240
|
-
rgba_sums[1][0] -= sir[0];
|
241
|
-
rgba_sums[1][1] -= sir[1];
|
242
|
-
rgba_sums[1][2] -= sir[2];
|
243
|
-
if (alpha)
|
244
|
-
{
|
245
|
-
rgba_sums[1][3] -= sir[3];
|
246
|
-
}
|
247
|
-
|
248
|
-
if(y==0)
|
249
|
-
{
|
250
|
-
vmin[x] = MIN(x + radius + 1, width - 1);
|
251
|
-
}
|
252
|
-
|
253
|
-
current = (yw + vmin[x])*bytes;
|
254
|
-
|
255
|
-
sir[0] = pixels[current + 0];
|
256
|
-
sir[1] = pixels[current + 1];
|
257
|
-
sir[2] = pixels[current + 2];
|
258
|
-
if (alpha)
|
259
|
-
{
|
260
|
-
sir[3] = pixels[current + 3];
|
261
|
-
}
|
262
|
-
|
263
|
-
rgba_sums[0][0] += sir[0];
|
264
|
-
rgba_sums[0][1] += sir[1];
|
265
|
-
rgba_sums[0][2] += sir[2];
|
266
|
-
if (alpha)
|
267
|
-
{
|
268
|
-
rgba_sums[0][3] += sir[3];
|
269
|
-
}
|
270
|
-
|
271
|
-
rgba_sums[2][0] += rgba_sums[0][0];
|
272
|
-
rgba_sums[2][1] += rgba_sums[0][1];
|
273
|
-
rgba_sums[2][2] += rgba_sums[0][2];
|
274
|
-
if (alpha)
|
275
|
-
{
|
276
|
-
rgba_sums[2][3] += rgba_sums[0][3];
|
277
|
-
}
|
278
|
-
|
279
|
-
stackpointer=(stackpointer+1)%div;
|
280
|
-
sir=stack[(stackpointer)%div];
|
281
|
-
|
282
|
-
rgba_sums[1][0] += sir[0];
|
283
|
-
rgba_sums[1][1] += sir[1];
|
284
|
-
rgba_sums[1][2] += sir[2];
|
285
|
-
if (alpha)
|
286
|
-
{
|
287
|
-
rgba_sums[1][3] += sir[3];
|
288
|
-
}
|
289
|
-
|
290
|
-
rgba_sums[0][0] -= sir[0];
|
291
|
-
rgba_sums[0][1] -= sir[1];
|
292
|
-
rgba_sums[0][2] -= sir[2];
|
293
|
-
if (alpha)
|
294
|
-
{
|
295
|
-
rgba_sums[0][3] -= sir[3];
|
296
|
-
}
|
297
|
-
|
298
|
-
yi++;
|
299
|
-
}
|
300
|
-
|
301
|
-
yw += width;
|
302
|
-
}
|
303
|
-
|
304
|
-
for (x=0; x<width; x++)
|
305
|
-
{
|
306
|
-
yp=-radius*width;
|
307
|
-
|
308
|
-
/* initialize sums to zero */
|
309
|
-
for (i = 0; i<bytes; i++)
|
310
|
-
{
|
311
|
-
rgba_sums[0][i] = 0;
|
312
|
-
rgba_sums[1][i] = 0;
|
313
|
-
rgba_sums[2][i] = 0;
|
314
|
-
}
|
315
|
-
|
316
|
-
/* Calculate Initial Sums For radius */
|
317
|
-
for(i=-radius; i<=radius; i++)
|
318
|
-
{
|
319
|
-
yi = MAX(0,yp) + x;
|
320
|
-
|
321
|
-
sir = stack[i+radius];
|
322
|
-
|
323
|
-
sir[0] = rgba[0][yi];
|
324
|
-
sir[1] = rgba[1][yi];
|
325
|
-
sir[2] = rgba[2][yi];
|
326
|
-
if (alpha)
|
327
|
-
{
|
328
|
-
sir[3] = rgba[3][yi];
|
329
|
-
}
|
330
|
-
|
331
|
-
rbs = (radius + 1) - abs(i);
|
332
|
-
|
333
|
-
rgba_sums[2][0] += rgba[0][yi]*rbs;
|
334
|
-
rgba_sums[2][1] += rgba[1][yi]*rbs;
|
335
|
-
rgba_sums[2][2] += rgba[2][yi]*rbs;
|
336
|
-
if (alpha)
|
337
|
-
{
|
338
|
-
rgba_sums[2][3] += rgba[3][yi]*rbs;
|
339
|
-
}
|
340
|
-
|
341
|
-
if (i>0)
|
342
|
-
{
|
343
|
-
rgba_sums[0][0] += sir[0];
|
344
|
-
rgba_sums[0][1] += sir[1];
|
345
|
-
rgba_sums[0][2] += sir[2];
|
346
|
-
if (alpha)
|
347
|
-
{
|
348
|
-
rgba_sums[0][3] += sir[3];
|
349
|
-
}
|
350
|
-
}
|
351
|
-
else
|
352
|
-
{
|
353
|
-
rgba_sums[1][0] += sir[0];
|
354
|
-
rgba_sums[1][1] += sir[1];
|
355
|
-
rgba_sums[1][2] += sir[2];
|
356
|
-
if (alpha)
|
357
|
-
{
|
358
|
-
rgba_sums[1][3] += sir[3];
|
359
|
-
}
|
360
|
-
}
|
361
|
-
|
362
|
-
if(i < height - 1)
|
363
|
-
{
|
364
|
-
yp += width;
|
365
|
-
}
|
366
|
-
}
|
367
|
-
|
368
|
-
yi = x;
|
369
|
-
stackpointer = radius;
|
370
|
-
|
371
|
-
for (y=0; y<height; y++)
|
372
|
-
{
|
373
|
-
current = (yi)*bytes;
|
374
|
-
|
375
|
-
pixels[current + 0] = dv[rgba_sums[2][0]];
|
376
|
-
pixels[current + 1] = dv[rgba_sums[2][1]];
|
377
|
-
pixels[current + 2] = dv[rgba_sums[2][2]];
|
378
|
-
if (alpha)
|
379
|
-
{
|
380
|
-
pixels[current + 3] = dv[rgba_sums[2][3]];
|
381
|
-
}
|
382
|
-
|
383
|
-
rgba_sums[2][0] -= rgba_sums[1][0];
|
384
|
-
rgba_sums[2][1] -= rgba_sums[1][1];
|
385
|
-
rgba_sums[2][2] -= rgba_sums[1][2];
|
386
|
-
if (alpha)
|
387
|
-
{
|
388
|
-
rgba_sums[2][3] -= rgba_sums[1][3];
|
389
|
-
}
|
390
|
-
|
391
|
-
stackstart = stackpointer - radius + div;
|
392
|
-
sir = stack[stackstart%div];
|
393
|
-
|
394
|
-
rgba_sums[1][0] -= sir[0];
|
395
|
-
rgba_sums[1][1] -= sir[1];
|
396
|
-
rgba_sums[1][2] -= sir[2];
|
397
|
-
if (alpha)
|
398
|
-
{
|
399
|
-
rgba_sums[1][3] -= sir[3];
|
400
|
-
}
|
401
|
-
|
402
|
-
if (x == 0)
|
403
|
-
{
|
404
|
-
vmin[y] = MIN(y + (radius + 1), height - 1)*width;
|
405
|
-
}
|
406
|
-
|
407
|
-
p = x + vmin[y];
|
408
|
-
|
409
|
-
sir[0] = rgba[0][p];
|
410
|
-
sir[1] = rgba[1][p];
|
411
|
-
sir[2] = rgba[2][p];
|
412
|
-
if (alpha)
|
413
|
-
{
|
414
|
-
sir[3] = rgba[3][p];
|
415
|
-
}
|
416
|
-
|
417
|
-
rgba_sums[0][0] += sir[0];
|
418
|
-
rgba_sums[0][1] += sir[1];
|
419
|
-
rgba_sums[0][2] += sir[2];
|
420
|
-
if (alpha)
|
421
|
-
{
|
422
|
-
rgba_sums[0][3] += sir[3];
|
423
|
-
}
|
424
|
-
|
425
|
-
rgba_sums[2][0] += rgba_sums[0][0];
|
426
|
-
rgba_sums[2][1] += rgba_sums[0][1];
|
427
|
-
rgba_sums[2][2] += rgba_sums[0][2];
|
428
|
-
if (alpha)
|
429
|
-
{
|
430
|
-
rgba_sums[2][3] += rgba_sums[0][3];
|
431
|
-
}
|
432
|
-
|
433
|
-
stackpointer = (stackpointer+1)%div;
|
434
|
-
sir = stack[stackpointer];
|
435
|
-
|
436
|
-
rgba_sums[1][0] += sir[0];
|
437
|
-
rgba_sums[1][1] += sir[1];
|
438
|
-
rgba_sums[1][2] += sir[2];
|
439
|
-
if (alpha)
|
440
|
-
{
|
441
|
-
rgba_sums[1][3] += sir[3];
|
442
|
-
}
|
443
|
-
|
444
|
-
rgba_sums[0][0] -= sir[0];
|
445
|
-
rgba_sums[0][1] -= sir[1];
|
446
|
-
rgba_sums[0][2] -= sir[2];
|
447
|
-
if (alpha)
|
448
|
-
{
|
449
|
-
rgba_sums[0][3] -= sir[3];
|
450
|
-
}
|
451
|
-
|
452
|
-
yi += width;
|
453
|
-
}
|
454
|
-
}
|
455
|
-
}
|
456
|
-
|
457
|
-
return pixbuf;
|
458
|
-
}
|
459
|
-
|
460
|
-
static GdkPixbuf *
|
461
|
-
pixbuf_sharpen(GdkPixbuf *src, int strength)
|
462
|
-
{
|
463
|
-
GdkPixbuf *dest;
|
464
|
-
int has_alpha;
|
465
|
-
int s_width, s_height, s_rowstride;
|
466
|
-
int d_width, d_height, d_rowstride;
|
467
|
-
guchar *s_pix;
|
468
|
-
guchar *d_pix;
|
469
|
-
guchar *sp;
|
470
|
-
guchar *dp;
|
471
|
-
int pix_width;
|
472
|
-
bool row_only = TRUE;
|
473
|
-
int a=0, r, g, b, x, y, mul;
|
474
|
-
int b_a=0, b_r, b_g, b_b;
|
475
|
-
|
476
|
-
if (!src) return NULL;
|
477
|
-
|
478
|
-
s_width = gdk_pixbuf_get_width(src);
|
479
|
-
s_height = gdk_pixbuf_get_height(src);
|
480
|
-
has_alpha = gdk_pixbuf_get_has_alpha(src);
|
481
|
-
s_rowstride = gdk_pixbuf_get_rowstride(src);
|
482
|
-
s_pix = gdk_pixbuf_get_pixels(src);
|
483
|
-
|
484
|
-
d_width = s_width;
|
485
|
-
d_height = s_height;
|
486
|
-
|
487
|
-
dest = gdk_pixbuf_copy(src);
|
488
|
-
d_rowstride = gdk_pixbuf_get_rowstride(dest);
|
489
|
-
d_pix = gdk_pixbuf_get_pixels(dest);
|
490
|
-
|
491
|
-
pix_width = (has_alpha ? 4 : 3);
|
492
|
-
|
493
|
-
mul = (row_only ? 3 : 5);
|
494
|
-
|
495
|
-
for (y = 0; y < (s_height); y++)
|
496
|
-
{
|
497
|
-
sp = s_pix + (y * s_rowstride) + pix_width;
|
498
|
-
dp = d_pix + (y * d_rowstride) + pix_width;
|
499
|
-
|
500
|
-
for (x = 1; x < (s_width - 1); x++)
|
501
|
-
{
|
502
|
-
|
503
|
-
b_r = ((int)*(sp));
|
504
|
-
b_g = ((int)*(sp+1));
|
505
|
-
b_b = ((int)*(sp+2));
|
506
|
-
if (has_alpha)
|
507
|
-
b_a = ((int)*((sp+3)));
|
508
|
-
|
509
|
-
r = b_r * mul;
|
510
|
-
g = b_g * mul;
|
511
|
-
b = b_b * mul;
|
512
|
-
if (has_alpha)
|
513
|
-
a = b_a * mul;
|
514
|
-
|
515
|
-
r = ((int)*(sp)) * mul;
|
516
|
-
g = ((int)*(sp+1)) * mul;
|
517
|
-
b = ((int)*(sp+2)) * mul;
|
518
|
-
if (has_alpha)
|
519
|
-
a = ((int)*((sp+3))) * mul;
|
520
|
-
|
521
|
-
r -= (int)*(sp - pix_width);
|
522
|
-
g -= (int)*(sp - pix_width + 1);
|
523
|
-
b -= (int)*(sp - pix_width + 2);
|
524
|
-
if (has_alpha)
|
525
|
-
a -= (int)*(sp - pix_width + 3);
|
526
|
-
|
527
|
-
r -= (int)*(sp + pix_width);
|
528
|
-
g -= (int)*(sp + pix_width + 1);
|
529
|
-
b -= (int)*(sp + pix_width + 2);
|
530
|
-
if (has_alpha)
|
531
|
-
a -= (int)*(sp + pix_width + 3);
|
532
|
-
|
533
|
-
if (row_only == 0)
|
534
|
-
{
|
535
|
-
r -= (int)*(sp - (s_rowstride));
|
536
|
-
g -= (int)*(sp + 1 - (s_rowstride));
|
537
|
-
b -= (int)*(sp + 2 - (s_rowstride));
|
538
|
-
if (has_alpha)
|
539
|
-
a -= (int)*(sp + 3 - (s_rowstride));
|
540
|
-
|
541
|
-
r -= (int)*(sp + (s_rowstride));
|
542
|
-
g -= (int)*(sp + 1 + (s_rowstride));
|
543
|
-
b -= (int)*(sp + 2 + (s_rowstride));
|
544
|
-
if (has_alpha)
|
545
|
-
a -= (int)*(sp + 3 + (s_rowstride));
|
546
|
-
}
|
547
|
-
|
548
|
-
r = (r & ((~r) >> 16));
|
549
|
-
r = ((r | ((r & 256) - ((r & 256) >> 8))));
|
550
|
-
g = (g & ((~g) >> 16));
|
551
|
-
g = ((g | ((g & 256) - ((g & 256) >> 8))));
|
552
|
-
b = (b & ((~b) >> 16));
|
553
|
-
b = ((b | ((b & 256) - ((b & 256) >> 8))));
|
554
|
-
a = (a & ((~a) >> 16));
|
555
|
-
a = ((a | ((a & 256) - ((a & 256) >> 8))));
|
556
|
-
|
557
|
-
r = 0xff & (MAX(r,0));
|
558
|
-
g = 0xff & (MAX(g,0));
|
559
|
-
b = 0xff & (MAX(b,0));
|
560
|
-
if (has_alpha)
|
561
|
-
a = 0xff & (MAX(a,0));
|
562
|
-
|
563
|
-
r = ((r * strength) + b_r) / (strength + 1);
|
564
|
-
g = ((g * strength) + b_g) / (strength + 1);
|
565
|
-
b = ((b * strength) + b_b) / (strength + 1);
|
566
|
-
if (has_alpha)
|
567
|
-
a = ((a * strength) + b_a) / (strength + 1);
|
568
|
-
|
569
|
-
*(dp++) = r;
|
570
|
-
*(dp++) = g;
|
571
|
-
*(dp++) = b;
|
572
|
-
if (has_alpha)
|
573
|
-
*(dp++) = a;
|
574
|
-
|
575
|
-
sp += pix_width;
|
576
|
-
}
|
577
|
-
}
|
578
|
-
return dest;
|
579
|
-
} // */
|
580
|
-
|
581
|
-
static GdkPixbuf *
|
582
|
-
pixbuf_rotate(GdkPixbuf *src, rotate_angle_t angle)
|
583
|
-
{
|
584
|
-
GdkPixbuf *dest;
|
585
|
-
int has_alpha;
|
586
|
-
int s_width, s_height, s_rowstride;
|
587
|
-
int d_width, d_height, d_rowstride;
|
588
|
-
guchar *s_pix;
|
589
|
-
guchar *d_pix;
|
590
|
-
guchar *sp;
|
591
|
-
guchar *dp;
|
592
|
-
int i, j, pix_width;
|
593
|
-
|
594
|
-
if (!src) return NULL;
|
595
|
-
|
596
|
-
if (angle == ANGLE_0)
|
597
|
-
return gdk_pixbuf_copy(src);
|
598
|
-
|
599
|
-
s_width = gdk_pixbuf_get_width(src);
|
600
|
-
s_height = gdk_pixbuf_get_height(src);
|
601
|
-
has_alpha = gdk_pixbuf_get_has_alpha(src);
|
602
|
-
s_rowstride = gdk_pixbuf_get_rowstride(src);
|
603
|
-
s_pix = gdk_pixbuf_get_pixels(src);
|
604
|
-
|
605
|
-
switch (angle)
|
606
|
-
{
|
607
|
-
case ANGLE_90:
|
608
|
-
case ANGLE_270:
|
609
|
-
d_width = s_height;
|
610
|
-
d_height = s_width;
|
611
|
-
break;
|
612
|
-
default:
|
613
|
-
case ANGLE_0:/* Avoid compiler warnings... */
|
614
|
-
case ANGLE_180:
|
615
|
-
d_width = s_width;
|
616
|
-
d_height = s_height;
|
617
|
-
break;
|
618
|
-
}
|
619
|
-
|
620
|
-
dest = gdk_pixbuf_new(GDK_COLORSPACE_RGB, has_alpha, 8, d_width, d_height);
|
621
|
-
d_rowstride = gdk_pixbuf_get_rowstride(dest);
|
622
|
-
d_pix = gdk_pixbuf_get_pixels(dest);
|
623
|
-
|
624
|
-
pix_width = (has_alpha ? 4 : 3);
|
625
|
-
|
626
|
-
for (i = 0; i < s_height; i++) {
|
627
|
-
sp = s_pix + (i * s_rowstride);
|
628
|
-
for (j = 0; j < s_width; j++) {
|
629
|
-
switch (angle)
|
630
|
-
{
|
631
|
-
case ANGLE_180:
|
632
|
-
dp = d_pix + ((d_height - i - 1) * d_rowstride) + ((d_width - j - 1) * pix_width);
|
633
|
-
break;
|
634
|
-
case ANGLE_90:
|
635
|
-
dp = d_pix + (j * d_rowstride) + ((d_width - i - 1) * pix_width);
|
636
|
-
break;
|
637
|
-
case ANGLE_270:
|
638
|
-
dp = d_pix + ((d_height - j - 1) * d_rowstride) + (i * pix_width);
|
639
|
-
break;
|
640
|
-
default:
|
641
|
-
case ANGLE_0:/* Avoid compiler warnings... */
|
642
|
-
dp = d_pix + (i * d_rowstride) + (j * pix_width);
|
643
|
-
break;
|
644
|
-
}
|
645
|
-
|
646
|
-
*(dp++) = *(sp++); /* red */
|
647
|
-
*(dp++) = *(sp++); /* green */
|
648
|
-
*(dp++) = *(sp++); /* blue */
|
649
|
-
if (has_alpha) *(dp) = *(sp++); /* alpha */
|
650
|
-
}
|
651
|
-
}
|
652
|
-
|
653
|
-
return dest;
|
654
|
-
}
|
655
|
-
|
656
|
-
#include <unistd.h>
|
657
|
-
|
658
|
-
static gboolean pixbuf_save_tiff(GdkPixbuf *pixbuf, char *filename)
|
659
|
-
{
|
660
|
-
long row;
|
661
|
-
TIFF *tif;
|
662
|
-
struct tm *ct;
|
663
|
-
time_t t;
|
664
|
-
int width,
|
665
|
-
height,
|
666
|
-
rowstride;
|
667
|
-
guchar *pixels;
|
668
|
-
short photometric;
|
669
|
-
short samplesperpixel;
|
670
|
-
short bitspersample;
|
671
|
-
static char datetime[40] = "";
|
672
|
-
char hostname[256] = "";
|
673
|
-
|
674
|
-
time(&t);
|
675
|
-
ct = localtime(&t);
|
676
|
-
sprintf(datetime, "%04i:%02i:%02i %02i:%02i:%02i",
|
677
|
-
1900 + ct->tm_year, ct->tm_mon + 1, ct->tm_mday,
|
678
|
-
ct->tm_hour, ct->tm_min, ct->tm_sec);
|
679
|
-
|
680
|
-
tif = TIFFOpen(filename, "w");
|
681
|
-
|
682
|
-
width = gdk_pixbuf_get_width(pixbuf);
|
683
|
-
height = gdk_pixbuf_get_height(pixbuf);
|
684
|
-
samplesperpixel = gdk_pixbuf_get_has_alpha(pixbuf) ? 4 : 3;
|
685
|
-
bitspersample = gdk_pixbuf_get_bits_per_sample(pixbuf);
|
686
|
-
photometric = PHOTOMETRIC_RGB;
|
687
|
-
rowstride = gdk_pixbuf_get_rowstride(pixbuf);
|
688
|
-
pixels = gdk_pixbuf_get_pixels(pixbuf);
|
689
|
-
|
690
|
-
|
691
|
-
TIFFSetField(tif, TIFFTAG_IMAGEWIDTH, width);
|
692
|
-
TIFFSetField(tif, TIFFTAG_IMAGELENGTH, height);
|
693
|
-
TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, bitspersample);
|
694
|
-
TIFFSetField(tif, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT);
|
695
|
-
TIFFSetField(tif, TIFFTAG_COMPRESSION, COMPRESSION_LZW);
|
696
|
-
TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, photometric);
|
697
|
-
/*#TIFFSetField(tif, TIFFTAG_DOCUMENTNAME, inf);*/
|
698
|
-
TIFFSetField(tif, TIFFTAG_IMAGEDESCRIPTION, "Saved from a Gdk::Pixbuf");
|
699
|
-
TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, samplesperpixel);
|
700
|
-
TIFFSetField(tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
|
701
|
-
TIFFSetField(tif, TIFFTAG_SOFTWARE, "LiveLink Photo Kiosk 1.0");
|
702
|
-
TIFFSetField(tif, TIFFTAG_DATETIME, datetime);
|
703
|
-
if(gethostname((char*)&hostname,sizeof(hostname))==0)
|
704
|
-
TIFFSetField(tif, TIFFTAG_HOSTCOMPUTER, hostname);
|
705
|
-
|
706
|
-
for (row = 0; row < height; row++) {
|
707
|
-
if (TIFFWriteScanline(tif, (u_char *) pixels, row, 0) < 0) {
|
708
|
-
fprintf(stderr, "failed a scanline write (%li)\n", row);
|
709
|
-
break;
|
710
|
-
}
|
711
|
-
pixels = GINT_TO_POINTER(GPOINTER_TO_INT(pixels) + rowstride);
|
712
|
-
}
|
713
|
-
TIFFFlushData(tif);
|
714
|
-
TIFFClose(tif);
|
715
|
-
|
716
|
-
return TRUE;
|
717
|
-
}
|
718
|
-
|
719
|
-
#include <math.h>
|
720
|
-
|
721
|
-
static GdkPixbuf *pixbuf_gamma(GdkPixbuf *src, GdkPixbuf *dest, double gamma)
|
722
|
-
{
|
723
|
-
int has_alpha;
|
724
|
-
int s_width, s_height, s_rowstride;
|
725
|
-
int d_width, d_height, d_rowstride;
|
726
|
-
guchar *s_pix;
|
727
|
-
guchar *d_pix;
|
728
|
-
guchar *sp;
|
729
|
-
guchar *dp;
|
730
|
-
int i, j, pix_width;
|
731
|
-
double map[256] = {0.0,};
|
732
|
-
|
733
|
-
for (i=0; i < 256; i++)
|
734
|
-
map[i] = 255 * pow((double) i/255, 1.0/gamma);
|
735
|
-
|
736
|
-
g_return_val_if_fail(src != NULL, NULL);
|
737
|
-
g_return_val_if_fail(dest != NULL, NULL);
|
738
|
-
|
739
|
-
s_width = gdk_pixbuf_get_width(src);
|
740
|
-
s_height = gdk_pixbuf_get_height(src);
|
741
|
-
has_alpha = gdk_pixbuf_get_has_alpha(src);
|
742
|
-
s_rowstride = gdk_pixbuf_get_rowstride(src);
|
743
|
-
s_pix = gdk_pixbuf_get_pixels(src);
|
744
|
-
|
745
|
-
d_width = gdk_pixbuf_get_width(dest);
|
746
|
-
d_height = gdk_pixbuf_get_height(dest);
|
747
|
-
d_rowstride = gdk_pixbuf_get_rowstride(dest);
|
748
|
-
d_pix = gdk_pixbuf_get_pixels(dest);
|
749
|
-
|
750
|
-
g_return_val_if_fail(d_width == s_width, NULL);
|
751
|
-
g_return_val_if_fail(d_height == s_height, NULL);
|
752
|
-
g_return_val_if_fail(has_alpha == gdk_pixbuf_get_has_alpha(dest), NULL);
|
753
|
-
|
754
|
-
pix_width = (has_alpha ? 4 : 3);
|
755
|
-
|
756
|
-
for (i = 0; i < s_height; i++) {
|
757
|
-
sp = s_pix + (i * s_rowstride);
|
758
|
-
dp = d_pix + (i * d_rowstride);
|
759
|
-
for (j = 0; j < s_width; j++) {
|
760
|
-
*(dp++) = map[*(sp++)]; /* red */
|
761
|
-
*(dp++) = map[*(sp++)]; /* green */
|
762
|
-
*(dp++) = map[*(sp++)]; /* blue */
|
763
|
-
if (has_alpha) *(dp++) = map[*(sp++)]; /* alpha */
|
764
|
-
}
|
765
|
-
}
|
766
|
-
|
767
|
-
return dest;
|
768
|
-
}
|
769
|
-
|
770
23
|
#define PIXEL(row, channels, x) ((pixel_t)(row + (channels * x)))
|
771
24
|
|
772
25
|
typedef struct {
|
773
26
|
unsigned char r,g,b,a;
|
774
27
|
} * pixel_t;
|
775
28
|
|
776
|
-
|
777
|
-
#define GLUM (0.6094)
|
778
|
-
#define BLUM (0.0820)
|
779
|
-
|
780
|
-
// Graphica Obscure
|
781
|
-
#define GO_RGB_TO_GREY(r,g,b) ((int)((RLUM * (double)r) + (GLUM * (double)g) + (BLUM * (double)b)))
|
782
|
-
|
783
|
-
// Gimp Values
|
784
|
-
#define GIMP_RGB_TO_GREY(r,g,b) (((77 * r) + (151 * g) + (28 * b)) >> 8)
|
785
|
-
|
786
|
-
static GdkPixbuf *pixbuf_mask(GdkPixbuf *src, GdkPixbuf *mask)
|
787
|
-
{
|
788
|
-
int s_has_alpha, m_has_alpha;
|
789
|
-
int s_width, s_height, s_rowstride;
|
790
|
-
int d_width, d_height, d_rowstride;
|
791
|
-
int m_width, m_height, m_rowstride;
|
792
|
-
guchar *s_pix, *sp;
|
793
|
-
guchar *d_pix, *dp;
|
794
|
-
guchar *m_pix, *mp;
|
795
|
-
int i, j, pix_width, alpha, grey;
|
796
|
-
pixel_t pix;
|
797
|
-
GdkPixbuf *dest;
|
798
|
-
|
799
|
-
g_return_val_if_fail(src != NULL, NULL);
|
800
|
-
|
801
|
-
s_width = gdk_pixbuf_get_width(src);
|
802
|
-
s_height = gdk_pixbuf_get_height(src);
|
803
|
-
s_has_alpha = gdk_pixbuf_get_has_alpha(src);
|
804
|
-
s_rowstride = gdk_pixbuf_get_rowstride(src);
|
805
|
-
s_pix = gdk_pixbuf_get_pixels(src);
|
806
|
-
|
807
|
-
g_return_val_if_fail(mask != NULL, NULL);
|
808
|
-
|
809
|
-
m_width = gdk_pixbuf_get_width(mask);
|
810
|
-
m_height = gdk_pixbuf_get_height(mask);
|
811
|
-
m_has_alpha = gdk_pixbuf_get_has_alpha(mask);
|
812
|
-
m_rowstride = gdk_pixbuf_get_rowstride(mask);
|
813
|
-
m_pix = gdk_pixbuf_get_pixels(mask);
|
814
|
-
|
815
|
-
g_return_val_if_fail(m_width <= s_width, NULL);
|
816
|
-
g_return_val_if_fail(m_height <= s_height, NULL);
|
817
|
-
|
818
|
-
d_width = m_width;
|
819
|
-
d_height = m_height;
|
820
|
-
dest = gdk_pixbuf_new(GDK_COLORSPACE_RGB, TRUE, 8, d_width, d_height);
|
821
|
-
|
822
|
-
g_return_val_if_fail(dest != NULL, NULL);
|
823
|
-
|
824
|
-
d_rowstride = gdk_pixbuf_get_rowstride(dest);
|
825
|
-
d_pix = gdk_pixbuf_get_pixels(dest);
|
826
|
-
|
827
|
-
pix_width = (m_has_alpha ? 4 : 3);
|
828
|
-
|
829
|
-
|
830
|
-
|
831
|
-
for (i = 0; i < m_height; i++) {
|
832
|
-
sp = s_pix + (i * s_rowstride);
|
833
|
-
dp = d_pix + (i * d_rowstride);
|
834
|
-
mp = m_pix + (i * m_rowstride);
|
835
|
-
|
836
|
-
for (j = 0; j < m_width; j++) {
|
837
|
-
*(dp++) = *(sp++); /* red */
|
838
|
-
*(dp++) = *(sp++); /* green */
|
839
|
-
*(dp++) = *(sp++); /* blue */
|
840
|
-
|
841
|
-
if (s_has_alpha)
|
842
|
-
{
|
843
|
-
alpha = *(sp++); /* alpha */
|
844
|
-
}
|
845
|
-
else
|
846
|
-
{
|
847
|
-
alpha = 0xff;
|
848
|
-
}
|
849
|
-
|
850
|
-
pix = PIXEL(mp, pix_width, j);
|
851
|
-
grey = GIMP_RGB_TO_GREY(pix->r, pix->g, pix->b);
|
852
|
-
|
853
|
-
*(dp++) = sqrt(alpha * (255 - grey)); /* alpha */
|
854
|
-
}
|
855
|
-
}
|
856
|
-
|
857
|
-
return dest;
|
858
|
-
}
|
859
|
-
|
860
|
-
static GdkPixbuf *pixbuf_blend5050(GdkPixbuf *src1, GdkPixbuf *src2)
|
861
|
-
{
|
862
|
-
int s1_has_alpha, s2_has_alpha;
|
863
|
-
int s1_width, s1_height, s1_rowstride;
|
864
|
-
int d_width, d_height, d_rowstride;
|
865
|
-
int s2_width, s2_height, s2_rowstride;
|
866
|
-
guchar *s1_pix, *sp;
|
867
|
-
guchar *d_pix, *dp;
|
868
|
-
guchar *s2_pix, *mp;
|
869
|
-
int i, j;
|
870
|
-
GdkPixbuf *dest;
|
871
|
-
|
872
|
-
g_return_val_if_fail(src1 != NULL, NULL);
|
873
|
-
|
874
|
-
s1_width = gdk_pixbuf_get_width(src1);
|
875
|
-
s1_height = gdk_pixbuf_get_height(src1);
|
876
|
-
s1_has_alpha = gdk_pixbuf_get_has_alpha(src1);
|
877
|
-
s1_rowstride = gdk_pixbuf_get_rowstride(src1);
|
878
|
-
s1_pix = gdk_pixbuf_get_pixels(src1);
|
879
|
-
|
880
|
-
g_return_val_if_fail(src2 != NULL, NULL);
|
881
|
-
|
882
|
-
s2_width = gdk_pixbuf_get_width(src2);
|
883
|
-
s2_height = gdk_pixbuf_get_height(src2);
|
884
|
-
s2_has_alpha = gdk_pixbuf_get_has_alpha(src2);
|
885
|
-
s2_rowstride = gdk_pixbuf_get_rowstride(src2);
|
886
|
-
s2_pix = gdk_pixbuf_get_pixels(src2);
|
887
|
-
|
888
|
-
g_return_val_if_fail(s2_width == s1_width, NULL);
|
889
|
-
g_return_val_if_fail(s2_height == s1_height, NULL);
|
890
|
-
g_return_val_if_fail(s2_has_alpha == s1_has_alpha, NULL);
|
891
|
-
|
892
|
-
d_width = s2_width;
|
893
|
-
d_height = s2_height;
|
894
|
-
|
895
|
-
dest = gdk_pixbuf_new(GDK_COLORSPACE_RGB, TRUE, 8, d_width, d_height);
|
896
|
-
|
897
|
-
g_return_val_if_fail(dest != NULL, NULL);
|
898
|
-
|
899
|
-
d_rowstride = gdk_pixbuf_get_rowstride(dest);
|
900
|
-
d_pix = gdk_pixbuf_get_pixels(dest);
|
901
|
-
|
902
|
-
for (i = 0; i < s2_height; i++) {
|
903
|
-
sp = s1_pix + (i * s1_rowstride);
|
904
|
-
mp = s2_pix + (i * s2_rowstride);
|
905
|
-
dp = d_pix + (i * d_rowstride);
|
906
|
-
|
907
|
-
for (j = 0; j < s2_width; j++) {
|
908
|
-
*(dp++) = ((*(sp++)) >> 1) + ((*(mp++)) >> 1); /* red */
|
909
|
-
*(dp++) = ((*(sp++)) >> 1) + ((*(mp++)) >> 1); /* green */
|
910
|
-
*(dp++) = ((*(sp++)) >> 1) + ((*(mp++)) >> 1); /* blue */
|
911
|
-
|
912
|
-
if (s1_has_alpha)
|
913
|
-
*(dp++) = ((*(sp++)) >> 1) + ((*(mp++)) >> 1); /* alpha */
|
914
|
-
else
|
915
|
-
*(dp++) = 0xff; /* alpha */
|
916
|
-
|
917
|
-
}
|
918
|
-
}
|
919
|
-
|
920
|
-
return dest;
|
921
|
-
}
|
922
|
-
|
923
|
-
|
924
|
-
static GdkPixbuf *pixbuf_greyscale(GdkPixbuf *src, GdkPixbuf *dest)
|
925
|
-
{
|
926
|
-
int s_has_alpha, d_has_alpha;
|
927
|
-
int s_width, s_height, s_rowstride;
|
928
|
-
int d_width, d_height, d_rowstride;
|
929
|
-
guchar *s_pix, *sp;
|
930
|
-
guchar *d_pix, *dp;
|
931
|
-
int i, j, pix_width, grey;
|
932
|
-
|
933
|
-
g_return_val_if_fail(src != NULL, NULL);
|
934
|
-
g_return_val_if_fail(dest != NULL, NULL);
|
935
|
-
|
936
|
-
s_width = gdk_pixbuf_get_width(src);
|
937
|
-
s_height = gdk_pixbuf_get_height(src);
|
938
|
-
s_has_alpha = gdk_pixbuf_get_has_alpha(src);
|
939
|
-
s_rowstride = gdk_pixbuf_get_rowstride(src);
|
940
|
-
s_pix = gdk_pixbuf_get_pixels(src);
|
941
|
-
|
942
|
-
d_width = gdk_pixbuf_get_width(dest);
|
943
|
-
d_height = gdk_pixbuf_get_height(dest);
|
944
|
-
d_has_alpha = gdk_pixbuf_get_has_alpha(dest);
|
945
|
-
d_rowstride = gdk_pixbuf_get_rowstride(dest);
|
946
|
-
d_pix = gdk_pixbuf_get_pixels(dest);
|
947
|
-
|
948
|
-
g_return_val_if_fail(d_width == s_width, NULL);
|
949
|
-
g_return_val_if_fail(d_height == s_height, NULL);
|
950
|
-
g_return_val_if_fail(d_has_alpha == s_has_alpha, NULL);
|
951
|
-
|
952
|
-
pix_width = (s_has_alpha ? 4 : 3);
|
953
|
-
|
954
|
-
|
955
|
-
for (i = 0; i < s_height; i++) {
|
956
|
-
sp = s_pix;
|
957
|
-
dp = d_pix;
|
958
|
-
|
959
|
-
for (j = 0; j < s_width; j++) {
|
960
|
-
grey = GIMP_RGB_TO_GREY(sp[0], sp[1], sp[2]);
|
961
|
-
|
962
|
-
dp[0] = grey; /* red */
|
963
|
-
dp[1] = grey; /* green */
|
964
|
-
dp[2] = grey; /* blue */
|
965
|
-
|
966
|
-
if (s_has_alpha)
|
967
|
-
{
|
968
|
-
dp[3] = sp[3]; /* alpha */
|
969
|
-
}
|
970
|
-
|
971
|
-
dp += pix_width;
|
972
|
-
sp += pix_width;
|
973
|
-
}
|
974
|
-
|
975
|
-
d_pix += d_rowstride;
|
976
|
-
s_pix += s_rowstride;
|
977
|
-
}
|
978
|
-
|
979
|
-
return dest;
|
980
|
-
}
|
981
|
-
|
982
|
-
static GdkPixbuf *pixbuf_greyscale_go(GdkPixbuf *src, GdkPixbuf *dest)
|
983
|
-
{
|
984
|
-
int s_has_alpha, d_has_alpha;
|
985
|
-
int s_width, s_height, s_rowstride;
|
986
|
-
int d_width, d_height, d_rowstride;
|
987
|
-
guchar *s_pix, *sp;
|
988
|
-
guchar *d_pix, *dp;
|
989
|
-
int i, j, pix_width, grey;
|
990
|
-
|
991
|
-
g_return_val_if_fail(src != NULL, NULL);
|
992
|
-
g_return_val_if_fail(dest != NULL, NULL);
|
993
|
-
|
994
|
-
s_width = gdk_pixbuf_get_width(src);
|
995
|
-
s_height = gdk_pixbuf_get_height(src);
|
996
|
-
s_has_alpha = gdk_pixbuf_get_has_alpha(src);
|
997
|
-
s_rowstride = gdk_pixbuf_get_rowstride(src);
|
998
|
-
s_pix = gdk_pixbuf_get_pixels(src);
|
999
|
-
|
1000
|
-
d_width = gdk_pixbuf_get_width(dest);
|
1001
|
-
d_height = gdk_pixbuf_get_height(dest);
|
1002
|
-
d_has_alpha = gdk_pixbuf_get_has_alpha(dest);
|
1003
|
-
d_rowstride = gdk_pixbuf_get_rowstride(dest);
|
1004
|
-
d_pix = gdk_pixbuf_get_pixels(dest);
|
1005
|
-
|
1006
|
-
g_return_val_if_fail(d_width == s_width, NULL);
|
1007
|
-
g_return_val_if_fail(d_height == s_height, NULL);
|
1008
|
-
g_return_val_if_fail(d_has_alpha == s_has_alpha, NULL);
|
1009
|
-
|
1010
|
-
pix_width = (s_has_alpha ? 4 : 3);
|
1011
|
-
|
1012
|
-
for (i = 0; i < s_height; i++) {
|
1013
|
-
sp = s_pix;
|
1014
|
-
dp = d_pix;
|
1015
|
-
|
1016
|
-
for (j = 0; j < s_width; j++) {
|
1017
|
-
grey = GO_RGB_TO_GREY(sp[0], sp[1], sp[2]);
|
1018
|
-
|
1019
|
-
dp[0] = grey; /* red */
|
1020
|
-
dp[1] = grey; /* green */
|
1021
|
-
dp[2] = grey; /* blue */
|
1022
|
-
|
1023
|
-
if (s_has_alpha)
|
1024
|
-
{
|
1025
|
-
dp[3] = sp[3]; /* alpha */
|
1026
|
-
}
|
1027
|
-
|
1028
|
-
dp += pix_width;
|
1029
|
-
sp += pix_width;
|
1030
|
-
}
|
1031
|
-
|
1032
|
-
d_pix += d_rowstride;
|
1033
|
-
s_pix += s_rowstride;
|
1034
|
-
}
|
1035
|
-
|
1036
|
-
return dest;
|
1037
|
-
}
|
1038
|
-
|
1039
|
-
static inline unsigned char pu_clamp(int x)
|
1040
|
-
{
|
1041
|
-
unsigned char i = (x > 255) ? 255 : (x < 0 ? 0 : x);
|
1042
|
-
return i;
|
1043
|
-
}
|
1044
|
-
|
1045
|
-
static GdkPixbuf *pixbuf_tint(GdkPixbuf *src, GdkPixbuf *dest, int r, int g, int b, int alpha)
|
1046
|
-
{
|
1047
|
-
int s_has_alpha, d_has_alpha;
|
1048
|
-
int s_width, s_height, s_rowstride;
|
1049
|
-
int d_width, d_height, d_rowstride;
|
1050
|
-
guchar *s_pix, *sp;
|
1051
|
-
guchar *d_pix, *dp;
|
1052
|
-
int i, j, pix_width, grey;
|
1053
|
-
|
1054
|
-
g_return_val_if_fail(src != NULL, NULL);
|
1055
|
-
g_return_val_if_fail(dest != NULL, NULL);
|
1056
|
-
|
1057
|
-
s_width = gdk_pixbuf_get_width(src);
|
1058
|
-
s_height = gdk_pixbuf_get_height(src);
|
1059
|
-
s_has_alpha = gdk_pixbuf_get_has_alpha(src);
|
1060
|
-
s_rowstride = gdk_pixbuf_get_rowstride(src);
|
1061
|
-
s_pix = gdk_pixbuf_get_pixels(src);
|
1062
|
-
|
1063
|
-
d_width = gdk_pixbuf_get_width(dest);
|
1064
|
-
d_height = gdk_pixbuf_get_height(dest);
|
1065
|
-
d_has_alpha = gdk_pixbuf_get_has_alpha(dest);
|
1066
|
-
d_rowstride = gdk_pixbuf_get_rowstride(dest);
|
1067
|
-
d_pix = gdk_pixbuf_get_pixels(dest);
|
1068
|
-
|
1069
|
-
g_return_val_if_fail(d_width == s_width, NULL);
|
1070
|
-
g_return_val_if_fail(d_height == s_height, NULL);
|
1071
|
-
g_return_val_if_fail(d_has_alpha == s_has_alpha, NULL);
|
1072
|
-
|
1073
|
-
pix_width = (s_has_alpha ? 4 : 3);
|
1074
|
-
|
1075
|
-
for (i = 0; i < s_height; i++) {
|
1076
|
-
sp = s_pix;
|
1077
|
-
dp = d_pix;
|
1078
|
-
|
1079
|
-
for (j = 0; j < s_width; j++) {
|
1080
|
-
grey = GO_RGB_TO_GREY(sp[0], sp[1], sp[2]);
|
1081
|
-
|
1082
|
-
dp[0] = pu_clamp(pu_clamp(((int)grey + r) * alpha / 255) + pu_clamp((int)sp[0] * (255 - alpha) / 255)); /* red */
|
1083
|
-
|
1084
|
-
//fprintf(stderr, "alpha=%i, r=%i, grey=%i -> %i + %i = %i\n", alpha, r, grey, pu_clamp(((int)grey + r) * alpha / 255), pu_clamp((int)sp[0] * (255 - alpha) / 255), dp[0]); /* red */
|
1085
|
-
|
1086
|
-
dp[1] = pu_clamp(pu_clamp((grey + g) * alpha / 255) + pu_clamp((int)sp[1] * (255 - alpha) / 255)); /* green */
|
1087
|
-
dp[2] = pu_clamp(pu_clamp((grey + b) * alpha / 255) + pu_clamp((int)sp[2] * (255 - alpha) / 255)); /* blue */
|
1088
|
-
|
1089
|
-
if (s_has_alpha)
|
1090
|
-
{
|
1091
|
-
dp[3] = sp[3]; /* alpha */
|
1092
|
-
}
|
1093
|
-
|
1094
|
-
dp += pix_width;
|
1095
|
-
sp += pix_width;
|
1096
|
-
}
|
1097
|
-
|
1098
|
-
d_pix += d_rowstride;
|
1099
|
-
s_pix += s_rowstride;
|
1100
|
-
}
|
1101
|
-
|
1102
|
-
return dest;
|
1103
|
-
}
|
1104
|
-
|
1105
|
-
static GdkPixbuf *pixbuf_soften_edges(GdkPixbuf *dest, int size)
|
1106
|
-
{
|
1107
|
-
int d_has_alpha;
|
1108
|
-
int d_width, d_height, d_rowstride;
|
1109
|
-
guchar *d_pix, *dp;
|
1110
|
-
int i, j, pix_width;
|
1111
|
-
|
1112
|
-
g_return_val_if_fail(dest != NULL, NULL);
|
1113
|
-
|
1114
|
-
d_width = gdk_pixbuf_get_width(dest);
|
1115
|
-
d_height = gdk_pixbuf_get_height(dest);
|
1116
|
-
d_has_alpha = gdk_pixbuf_get_has_alpha(dest);
|
1117
|
-
d_rowstride = gdk_pixbuf_get_rowstride(dest);
|
1118
|
-
d_pix = gdk_pixbuf_get_pixels(dest);
|
1119
|
-
|
1120
|
-
g_return_val_if_fail(d_has_alpha, NULL);
|
1121
|
-
|
1122
|
-
pix_width = (d_has_alpha ? 4 : 3);
|
29
|
+
extern void Init_pixbufutils(void);
|
1123
30
|
|
1124
|
-
|
1125
|
-
|
1126
|
-
|
1127
|
-
for (j = 0; j < d_width; j++) {
|
1128
|
-
dp[3] = (dp[3] * i) / size; /* alpha */
|
1129
|
-
dp += pix_width;
|
1130
|
-
}
|
1131
|
-
|
1132
|
-
dp = d_pix + ((d_height - i - 1) * d_rowstride);
|
1133
|
-
for (j = 0; j < d_width; j++) {
|
1134
|
-
dp[3] = (dp[3] * i) / size; /* alpha */
|
1135
|
-
dp += pix_width;
|
1136
|
-
}
|
1137
|
-
|
1138
|
-
}
|
1139
|
-
for (j = 0; j < d_height; j++) {
|
1140
|
-
//pix = (pixel_t)GINT_TO_POINTER(GPOINTER_TO_INT(d_pix) + (j * d_rowstride));
|
1141
|
-
dp = d_pix + ((d_height - i - 1) * d_rowstride);
|
1142
|
-
for (i = 0; i < MIN(size, d_width); i++) {
|
1143
|
-
dp[3] = (dp[3] * i) / size; /* alpha */
|
1144
|
-
dp += pix_width;
|
1145
|
-
}
|
1146
|
-
|
1147
|
-
dp = d_pix + (j * d_rowstride) + (pix_width * d_width);
|
1148
|
-
for (i = 0; i < MIN(size, d_width); i++) {
|
1149
|
-
dp[3] = (dp[3] * i) / size; /* alpha */
|
1150
|
-
dp -= pix_width;
|
1151
|
-
}
|
1152
|
-
}
|
31
|
+
#ifndef IGNORE
|
32
|
+
#define IGNORE(x) x=x
|
33
|
+
#endif
|
1153
34
|
|
1154
|
-
|
1155
|
-
|
35
|
+
#include <unistd.h>
|
36
|
+
#include <math.h>
|
1156
37
|
|
38
|
+
#include "extract-alpha.h"
|
39
|
+
#include "blur.h"
|
40
|
+
#include "sharpen.h"
|
41
|
+
#include "greyscale.h"
|
42
|
+
#include "rotate.h"
|
43
|
+
#include "tiff.h"
|
44
|
+
#include "gamma.h"
|
45
|
+
#include "mask.h"
|
46
|
+
#include "blend5050.h"
|
47
|
+
#include "tint.h"
|
48
|
+
#include "soften-edges.h"
|
49
|
+
#include "histogram.h"
|
50
|
+
#include "auto-equalize.h"
|
51
|
+
#include "filter.h"
|
1157
52
|
|
1158
53
|
|
1159
54
|
/*
|
1160
|
-
GdkPixbuf *pixbuf_op(GdkPixbuf *src, GdkPixbuf *dest,
|
55
|
+
GdkPixbuf *pixbuf_op(GdkPixbuf *src, GdkPixbuf *dest,
|
1161
56
|
*/
|
1162
57
|
|
1163
58
|
static GdkPixbuf *pixbuf_perspect_v(GdkPixbuf *src, int top_x1, int top_x2, int bot_x1, int bot_x2)
|
@@ -1177,65 +72,65 @@ static GdkPixbuf *pixbuf_perspect_v(GdkPixbuf *src, int top_x1, int top_x2, int
|
|
1177
72
|
double row_offset2, row_end2;
|
1178
73
|
double left_theta, right_theta;
|
1179
74
|
pixel_t spx[3];
|
1180
|
-
double ex;
|
1181
|
-
|
75
|
+
double ex;
|
76
|
+
|
1182
77
|
s_width = gdk_pixbuf_get_width(src);
|
1183
78
|
s_height = gdk_pixbuf_get_height(src);
|
1184
79
|
has_alpha = gdk_pixbuf_get_has_alpha(src);
|
1185
80
|
s_rowstride = gdk_pixbuf_get_rowstride(src);
|
1186
81
|
s_pix = gdk_pixbuf_get_pixels(src);
|
1187
|
-
|
1188
|
-
|
82
|
+
|
83
|
+
|
1189
84
|
g_return_val_if_fail((top_x2 - top_x1) <= s_width, NULL);
|
1190
85
|
g_return_val_if_fail((bot_x2 - bot_x1) <= s_width, NULL);
|
1191
|
-
|
86
|
+
|
1192
87
|
d_width = s_width;
|
1193
88
|
d_height = s_height;
|
1194
89
|
dest = gdk_pixbuf_new(GDK_COLORSPACE_RGB, TRUE, 8, d_width, d_height);
|
1195
90
|
d_rowstride = gdk_pixbuf_get_rowstride(dest);
|
1196
91
|
d_pix = gdk_pixbuf_get_pixels(dest);
|
1197
|
-
|
92
|
+
|
1198
93
|
// Shortcut ... should be harmless?
|
1199
94
|
// We should really only touch info
|
1200
95
|
// Within the range d_pix + (d_rowstride * y) + ((has_alpha ? 4 : 3) * x)
|
1201
96
|
bzero(d_pix, (d_rowstride * d_height));
|
1202
|
-
|
97
|
+
|
1203
98
|
top_width = top_x2 - top_x1;
|
1204
99
|
bot_width = bot_x2 - bot_x1;
|
1205
|
-
|
100
|
+
|
1206
101
|
min_x = MIN(top_x1, bot_x1);
|
1207
102
|
max_x = MAX(top_x2, bot_x2);
|
1208
|
-
|
103
|
+
|
1209
104
|
s_channels = has_alpha ? 4 : 3;
|
1210
105
|
channels = 4;
|
1211
|
-
|
106
|
+
|
1212
107
|
left_theta = ((double)(min_x == bot_x1 ? top_x1 : bot_x1) - min_x) / (double)d_height;
|
1213
108
|
right_theta = ((double)max_x - ((max_x == bot_x2) ? top_x2 : bot_x2)) / (double)d_height;
|
1214
|
-
|
1215
|
-
|
109
|
+
|
110
|
+
|
1216
111
|
for (y = 0; y < d_height; y++) {
|
1217
112
|
sp = s_pix + (y * s_rowstride);
|
1218
|
-
|
113
|
+
|
1219
114
|
row_offset = min_x;
|
1220
115
|
row_end = max_x;
|
1221
|
-
|
116
|
+
|
1222
117
|
row_offset2 = min_x;
|
1223
118
|
row_end2 = max_x;
|
1224
|
-
|
119
|
+
|
1225
120
|
row_offset += (left_theta * ((min_x == bot_x1) ? (d_height - y - 1) : y));
|
1226
121
|
row_end -= (right_theta * ((max_x == bot_x2) ? (d_height - y - 1) : y));
|
1227
|
-
|
122
|
+
|
1228
123
|
row_offset2 += (left_theta * ((min_x == bot_x1) ? (d_height - y) : y+1));
|
1229
124
|
row_end2 -= (right_theta * ((max_x == bot_x2) ? (d_height - y) : y+1));
|
1230
|
-
|
125
|
+
|
1231
126
|
row_width = ceil(row_end) - floor(row_offset);
|
1232
|
-
|
127
|
+
|
1233
128
|
dp = d_pix + (y * d_rowstride) + ((int)floor(row_offset) * channels);
|
1234
|
-
|
129
|
+
|
1235
130
|
for (x = (int)floor(row_offset); x < (int)ceil(row_end); x++)
|
1236
131
|
{
|
1237
132
|
ex = x - floor(row_offset);
|
1238
|
-
|
133
|
+
|
1239
134
|
if ((x < ceil(row_offset)))
|
1240
135
|
{
|
1241
136
|
alpha = ((int) ((double)255 * (ceil(row_offset) - row_offset)));
|
@@ -1250,11 +145,11 @@ static GdkPixbuf *pixbuf_perspect_v(GdkPixbuf *src, int top_x1, int top_x2, int
|
|
1250
145
|
{
|
1251
146
|
alpha = 0xff;
|
1252
147
|
}
|
1253
|
-
|
148
|
+
|
1254
149
|
spx[0] = PIXEL(sp, s_channels, (int)floor(((ex - 1) * (double)s_width) / (double)row_width));
|
1255
150
|
spx[1] = PIXEL(sp, s_channels, (int)floor((ex * (double)s_width) / (double)row_width));
|
1256
151
|
spx[2] = PIXEL(sp, s_channels, (int)floor(((ex + 1) * (double)s_width) / (double)row_width));
|
1257
|
-
|
152
|
+
|
1258
153
|
*(dp++) = ((spx[1]->r * 14) + ((spx[0]->r + spx[2]->r))) >> 4; /* red */
|
1259
154
|
*(dp++) = ((spx[1]->g * 14) + ((spx[0]->g + spx[2]->g))) >> 4; /* green */
|
1260
155
|
*(dp++) = ((spx[1]->b * 14) + ((spx[0]->b + spx[2]->b))) >> 4; /* blue */
|
@@ -1263,9 +158,9 @@ static GdkPixbuf *pixbuf_perspect_v(GdkPixbuf *src, int top_x1, int top_x2, int
|
|
1263
158
|
else
|
1264
159
|
*(dp++) = alpha; /* alpha */
|
1265
160
|
}
|
1266
|
-
|
161
|
+
|
1267
162
|
}
|
1268
|
-
|
163
|
+
|
1269
164
|
return dest;
|
1270
165
|
}
|
1271
166
|
|
@@ -1277,27 +172,27 @@ static VALUE pixbuf_mask_area(GdkPixbuf *mask, double cutoff)
|
|
1277
172
|
guchar *m_pix, *mp;
|
1278
173
|
long int y, x;
|
1279
174
|
long pix_width;
|
1280
|
-
volatile
|
175
|
+
volatile
|
1281
176
|
double grey;
|
1282
|
-
|
177
|
+
|
1283
178
|
g_return_val_if_fail(mask != NULL, Qnil);
|
1284
|
-
|
179
|
+
|
1285
180
|
m_width = gdk_pixbuf_get_width(mask);
|
1286
181
|
m_height = gdk_pixbuf_get_height(mask);
|
1287
182
|
m_has_alpha = gdk_pixbuf_get_has_alpha(mask);
|
1288
183
|
m_rowstride = gdk_pixbuf_get_rowstride(mask);
|
1289
184
|
m_pix = gdk_pixbuf_get_pixels(mask);
|
1290
|
-
|
185
|
+
|
1291
186
|
pix_width = (m_has_alpha ? 4 : 3);
|
1292
187
|
|
1293
|
-
|
188
|
+
|
1294
189
|
x1 = m_width;
|
1295
190
|
y1 = m_height;
|
1296
|
-
|
191
|
+
|
1297
192
|
for (y = 0; y < m_height; y++)
|
1298
193
|
{
|
1299
194
|
mp = m_pix;
|
1300
|
-
for (x = 0; x < m_width; x++)
|
195
|
+
for (x = 0; x < m_width; x++)
|
1301
196
|
{
|
1302
197
|
grey = GIMP_RGB_TO_GREY(mp[0], mp[1], mp[2]);
|
1303
198
|
if (grey < cutoff)// ie. darker than cutoff
|
@@ -1312,7 +207,7 @@ static VALUE pixbuf_mask_area(GdkPixbuf *mask, double cutoff)
|
|
1312
207
|
x0 = MIN(x0, x);
|
1313
208
|
x1 = MAX(x1, x);
|
1314
209
|
}
|
1315
|
-
|
210
|
+
|
1316
211
|
if (y0 == 0)
|
1317
212
|
{
|
1318
213
|
y0 = MAX(y0, y);
|
@@ -1324,24 +219,24 @@ static VALUE pixbuf_mask_area(GdkPixbuf *mask, double cutoff)
|
|
1324
219
|
y1 = MAX(y1, y);
|
1325
220
|
}
|
1326
221
|
}
|
1327
|
-
|
222
|
+
|
1328
223
|
mp += pix_width;
|
1329
224
|
}
|
1330
225
|
m_pix += m_rowstride;
|
1331
226
|
}
|
1332
|
-
|
227
|
+
|
1333
228
|
return rb_ary_new3(4, INT2NUM(x0), INT2NUM(y0), INT2NUM(x1), INT2NUM(y1));
|
1334
229
|
}
|
1335
230
|
|
1336
|
-
static inline VALUE
|
231
|
+
static inline VALUE
|
1337
232
|
unref_pixbuf(GdkPixbuf *pixbuf)
|
1338
233
|
{
|
1339
234
|
volatile VALUE pb = Qnil;
|
1340
|
-
|
235
|
+
|
1341
236
|
pb = GOBJ2RVAL(pixbuf);
|
1342
|
-
|
237
|
+
|
1343
238
|
g_object_unref(pixbuf);
|
1344
|
-
|
239
|
+
|
1345
240
|
return pb;
|
1346
241
|
}
|
1347
242
|
|
@@ -1379,7 +274,7 @@ module PixbufUtils
|
|
1379
274
|
|
1380
275
|
gdk_pixbuf_fill(dest, pixcol);
|
1381
276
|
gdk_pixbuf_composite(src, dest, 0, 0, w, h, 0, 0, 1.0, 1.0, GDK_INTERP_NEAREST, 0xff);
|
1382
|
-
|
277
|
+
|
1383
278
|
return dest;
|
1384
279
|
end
|
1385
280
|
def unref_pixbuf:self.sharpen(GdkPixbuf *src, int radius)
|
@@ -1394,6 +289,40 @@ module PixbufUtils
|
|
1394
289
|
IGNORE(self);
|
1395
290
|
return pixbuf_blur(gdk_pixbuf_copy(src), radius);
|
1396
291
|
end
|
292
|
+
def unref_pixbuf:self.contrast(GdkPixbuf *src, int adjust)
|
293
|
+
IGNORE(self);
|
294
|
+
return pixbuf_adjust_contrast(src, gdk_pixbuf_copy(src), adjust);
|
295
|
+
end
|
296
|
+
def unref_pixbuf:self.vibrance(GdkPixbuf *src, int adjust)
|
297
|
+
IGNORE(self);
|
298
|
+
return pixbuf_adjust_vibrance(src, gdk_pixbuf_copy(src), adjust);
|
299
|
+
end
|
300
|
+
def unref_pixbuf:self.saturation(GdkPixbuf *src, int adjust)
|
301
|
+
IGNORE(self);
|
302
|
+
return pixbuf_adjust_saturation(src, gdk_pixbuf_copy(src), adjust);
|
303
|
+
end
|
304
|
+
def unref_pixbuf:self.brightness(GdkPixbuf *src, int adjust)
|
305
|
+
IGNORE(self);
|
306
|
+
return pixbuf_adjust_brightness(src, gdk_pixbuf_copy(src), adjust);
|
307
|
+
end
|
308
|
+
def unref_pixbuf:self.filter(GdkPixbuf *src, T_ARRAY filter, double divisor)
|
309
|
+
int matrix_size = RARRAY_LEN(filter), len, i;
|
310
|
+
double *matrix;
|
311
|
+
|
312
|
+
IGNORE(self);
|
313
|
+
len = (int) sqrt((double)matrix_size);
|
314
|
+
|
315
|
+
if ((len * len) != matrix_size) {
|
316
|
+
rb_raise(rb_eArgError, "Invalid matrix size - sqrt(%i)*sqrt(%i) != %i", matrix_size, matrix_size, matrix_size);
|
317
|
+
}
|
318
|
+
matrix = ALLOCA_N(double, matrix_size);
|
319
|
+
|
320
|
+
for (i = 0; i < matrix_size; i ++) {
|
321
|
+
matrix[i] = NUM2DBL(RARRAY_PTR(filter)[i]);
|
322
|
+
}
|
323
|
+
|
324
|
+
return pixbuf_convolution_matrix(src, gdk_pixbuf_copy(src), len, matrix, divisor);
|
325
|
+
end
|
1397
326
|
def unref_pixbuf:self.rotate_90(GdkPixbuf *src, bool counter_clockwise)
|
1398
327
|
IGNORE(self);
|
1399
328
|
return pixbuf_rotate(src, counter_clockwise ? ANGLE_270 : ANGLE_90);
|
@@ -1459,6 +388,10 @@ module PixbufUtils
|
|
1459
388
|
IGNORE(self);
|
1460
389
|
return pixbuf_mask(src, mask);
|
1461
390
|
end
|
391
|
+
def unref_pixbuf:self.auto_equalize(GdkPixbuf *src)
|
392
|
+
IGNORE(self);
|
393
|
+
return auto_equalize(src, gdk_pixbuf_copy(src));
|
394
|
+
end
|
1462
395
|
def unref_pixbuf:self.blend5050(GdkPixbuf *src1, GdkPixbuf *src2)
|
1463
396
|
IGNORE(self);
|
1464
397
|
return pixbuf_blend5050(src1, src2);
|
@@ -1470,7 +403,7 @@ module PixbufUtils
|
|
1470
403
|
def unref_pixbuf:self.scale_max(GdkPixbuf *src, gulong max, GdkInterpType interp = GDK_INTERP_BILINEAR)
|
1471
404
|
gulong width, height, largest;
|
1472
405
|
gdouble scale;
|
1473
|
-
|
406
|
+
|
1474
407
|
IGNORE(self);
|
1475
408
|
width = gdk_pixbuf_get_width(src);
|
1476
409
|
height = gdk_pixbuf_get_height(src);
|
@@ -1479,17 +412,17 @@ module PixbufUtils
|
|
1479
412
|
{
|
1480
413
|
return gdk_pixbuf_copy(src);
|
1481
414
|
}
|
1482
|
-
|
415
|
+
|
1483
416
|
scale = (double)(max) / (double)(largest);
|
1484
|
-
|
417
|
+
|
1485
418
|
return gdk_pixbuf_scale_simple(src, (int)(scale * width), (int)(scale * height), interp);
|
1486
419
|
end
|
1487
|
-
def self.draw_scaled(GdkDrawable *drawable, GdkPixbuf *src, int x, int y,
|
420
|
+
def self.draw_scaled(GdkDrawable *drawable, GdkPixbuf *src, int x, int y,
|
1488
421
|
int width, int height, GdkInterpType interp = GDK_INTERP_BILINEAR)
|
1489
|
-
|
422
|
+
|
1490
423
|
GdkPixbuf *tmp;
|
1491
|
-
|
1492
|
-
|
424
|
+
|
425
|
+
|
1493
426
|
IGNORE(self);
|
1494
427
|
if((width == gdk_pixbuf_get_width(src)) && (height == gdk_pixbuf_get_height(src)))
|
1495
428
|
{
|
@@ -1504,7 +437,7 @@ module PixbufUtils
|
|
1504
437
|
g_object_set_data_full(G_OBJECT(src), "pixbuf_utils_scaled", tmp, g_object_unref);
|
1505
438
|
}
|
1506
439
|
g_return_val_if_fail(tmp != NULL, Qfalse);
|
1507
|
-
|
440
|
+
|
1508
441
|
gdk_draw_pixbuf(/* GdkDrawable *drawable */ drawable,
|
1509
442
|
/* GdkGC *gc */ NULL,
|
1510
443
|
/* GdkPixbuf *pixbuf */ tmp,
|
@@ -1518,14 +451,14 @@ module PixbufUtils
|
|
1518
451
|
/* gint x_dither */ 0,
|
1519
452
|
/* gint y_dither */ 0);
|
1520
453
|
return Qtrue;
|
1521
|
-
|
454
|
+
|
1522
455
|
end
|
1523
|
-
def self.draw_scaled_clip(GdkDrawable *drawable, GdkPixbuf *src, int x, int y,
|
456
|
+
def self.draw_scaled_clip(GdkDrawable *drawable, GdkPixbuf *src, int x, int y,
|
1524
457
|
int width, int height, GdkRectangle *clip_area, GdkInterpType interp = GDK_INTERP_BILINEAR)
|
1525
|
-
|
458
|
+
|
1526
459
|
GdkPixbuf *tmp;
|
1527
460
|
GdkGC *gc;
|
1528
|
-
|
461
|
+
|
1529
462
|
IGNORE(self);
|
1530
463
|
if((width == gdk_pixbuf_get_width(src)) && (height == gdk_pixbuf_get_height(src)))
|
1531
464
|
{
|
@@ -1540,7 +473,7 @@ module PixbufUtils
|
|
1540
473
|
g_object_set_data_full(G_OBJECT(src), "pixbuf_utils_scaled", tmp, g_object_unref);
|
1541
474
|
}
|
1542
475
|
g_return_val_if_fail(tmp != NULL, Qfalse);
|
1543
|
-
|
476
|
+
|
1544
477
|
gc = gdk_gc_new(drawable);
|
1545
478
|
gdk_gc_set_clip_rectangle(GDK_GC(gc), clip_area);
|
1546
479
|
|
@@ -1557,9 +490,9 @@ module PixbufUtils
|
|
1557
490
|
/* gint x_dither */ 0,
|
1558
491
|
/* gint y_dither */ 0);
|
1559
492
|
g_object_unref(gc);
|
1560
|
-
|
493
|
+
|
1561
494
|
return Qtrue;
|
1562
|
-
|
495
|
+
|
1563
496
|
end
|
1564
497
|
end
|
1565
498
|
|