ruby-vips 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,38 @@
1
+ VALUE img_measure_area(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE);
2
+ VALUE img_stats(VALUE);
3
+ VALUE img_max(VALUE);
4
+ VALUE img_min(VALUE);
5
+ VALUE img_avg(VALUE);
6
+ VALUE img_deviate(VALUE);
7
+ VALUE img_maxpos_avg(VALUE);
8
+ VALUE img_maxpos(int, VALUE*, VALUE);
9
+ VALUE img_minpos(int, VALUE*, VALUE);
10
+ VALUE img_bandmean(VALUE);
11
+ VALUE img_add(VALUE, VALUE);
12
+ VALUE img_subtract(VALUE, VALUE);
13
+ VALUE img_invert(VALUE);
14
+ VALUE img_lin(VALUE, VALUE, VALUE);
15
+ VALUE img_multiply(VALUE, VALUE);
16
+ VALUE img_remainder(int, VALUE*, VALUE);
17
+ VALUE img_remainder_binop(VALUE, VALUE);
18
+ VALUE img_divide(VALUE, VALUE);
19
+ VALUE img_recomb(VALUE, VALUE);
20
+ VALUE img_sign(VALUE);
21
+ VALUE img_abs(VALUE);
22
+ VALUE img_floor(VALUE);
23
+ VALUE img_rint(VALUE);
24
+ VALUE img_ceil(VALUE);
25
+ VALUE img_s_linreg(int, VALUE*, VALUE);
26
+ VALUE img_point(VALUE, VALUE, VALUE, VALUE, VALUE);
27
+ VALUE img_pow(int, VALUE*, VALUE);
28
+ VALUE img_pow_binop(int, VALUE*, VALUE);
29
+ VALUE img_expn(int, VALUE*, VALUE);
30
+ VALUE img_log(VALUE);
31
+ VALUE img_log10(VALUE);
32
+ VALUE img_sin(VALUE);
33
+ VALUE img_asin(VALUE);
34
+ VALUE img_cos(VALUE);
35
+ VALUE img_acos(VALUE);
36
+ VALUE img_tan(VALUE);
37
+ VALUE img_atan(VALUE);
38
+ VALUE img_cross_phase(VALUE, VALUE);
@@ -0,0 +1,302 @@
1
+ #include "ruby_vips.h"
2
+ #include "image.h"
3
+
4
+ static VALUE
5
+ img_and_img(VALUE obj, VALUE obj2)
6
+ {
7
+ RUBY_VIPS_BINARY(im_andimage);
8
+ }
9
+
10
+ static VALUE
11
+ img_and_const(int argc, VALUE *argv, VALUE obj)
12
+ {
13
+ int i;
14
+ double *c;
15
+
16
+ GetImg(obj, data, im);
17
+ OutImg(obj, new, data_new, im_new);
18
+
19
+ c = IM_ARRAY(im_new, argc, double);
20
+ for (i = 0; i < argc; i++)
21
+ c[i] = NUM2DBL(argv[i]);
22
+
23
+ if (im_andimage_vec(im, im_new, argc, c))
24
+ vips_lib_error();
25
+
26
+ return new;
27
+ }
28
+
29
+ /*
30
+ * call-seq:
31
+ * im & other_image -> image
32
+ * im & c -> image
33
+ * im & [ c1, ... ] -> image
34
+ *
35
+ * In the first form, this operation calculates the bitwise and between each
36
+ * pixel in this image and <i>other_image</i>. The images must be the same
37
+ * size. They may have any format.
38
+ *
39
+ * If the number of bands differs, one of the images must have one band. In
40
+ * this case, an n-band image is formed from the one-band image by joining n
41
+ * copies of the one-band image together and then the two n-band images are
42
+ * operated upon.
43
+ *
44
+ * In the second form, it calculates the bitwise and of image pixels with a
45
+ * constant. If the image has multiple bands, then the constant is applied to
46
+ * all bands.
47
+ *
48
+ * In the third form, it calculates the bitwise and of image pixels with an
49
+ * array of constants. If the image has one band, then the output will have as
50
+ * many bands as constants. Otherwise, the number of constants must match the
51
+ * number of bands in the image.
52
+ */
53
+
54
+ VALUE
55
+ img_and(int argc, VALUE *argv, VALUE obj)
56
+ {
57
+ if (argc < 1)
58
+ rb_raise(rb_eArgError, "Expected at least one argument");
59
+ else if (argc == 1 && CLASS_OF(argv[0]) == cVIPSImage)
60
+ return img_and_img(obj, argv[0]);
61
+ else
62
+ return img_and_const(argc, argv, obj);
63
+ }
64
+
65
+ VALUE
66
+ img_and_binop(VALUE obj, VALUE arg)
67
+ {
68
+ int argc = 1;
69
+ VALUE *argv = &arg;
70
+
71
+ if (TYPE(arg) == T_ARRAY) {
72
+ argc = RARRAY_LEN(arg);
73
+ argv = RARRAY_PTR(arg);
74
+ }
75
+
76
+ return img_and(argc, argv, obj);
77
+ }
78
+
79
+ static VALUE
80
+ img_or_img(VALUE obj, VALUE obj2)
81
+ {
82
+ RUBY_VIPS_BINARY(im_orimage);
83
+ }
84
+
85
+ static VALUE
86
+ img_or_const(int argc, VALUE *argv, VALUE obj)
87
+ {
88
+ int i;
89
+ double *c;
90
+
91
+ GetImg(obj, data, im);
92
+ OutImg(obj, new, data_new, im_new);
93
+
94
+ c = IM_ARRAY(im_new, argc, double);
95
+ for (i = 0; i < argc; i++)
96
+ c[i] = NUM2DBL(argv[i]);
97
+
98
+ if (im_orimage_vec(im, im_new, argc, c))
99
+ vips_lib_error();
100
+
101
+ return new;
102
+ }
103
+
104
+ /*
105
+ * call-seq:
106
+ * im | other_image -> image
107
+ * im | c -> image
108
+ * im | [ c1, ... ] -> image
109
+ *
110
+ * In the first form, this operation calculates the bitwise or between each
111
+ * pixel in this image and <i>other_image</i>. The images must be the same
112
+ * size. They may have any format.
113
+ *
114
+ * If the number of bands differs, one of the images must have one band. In
115
+ * this case, an n-band image is formed from the one-band image by joining n
116
+ * copies of the one-band image together and then the two n-band images are
117
+ * operated upon.
118
+ *
119
+ * In the second form, it calculates the bitwise or of image pixels with a
120
+ * constant. If the image has multiple bands, then the constant is applied to
121
+ * all bands.
122
+ *
123
+ * In the third form, it calculates the bitwise or of image pixels with an
124
+ * array of constants. If the image has one band, then the output will have as
125
+ * many bands as constants. Otherwise, the number of constants must match the
126
+ * number of bands in the image.
127
+ */
128
+
129
+ VALUE
130
+ img_or(int argc, VALUE *argv, VALUE obj)
131
+ {
132
+ if (argc < 1)
133
+ rb_raise(rb_eArgError, "Expected at least one argument");
134
+ else if (argc == 1 && CLASS_OF(argv[0]) == cVIPSImage)
135
+ return img_or_img(obj, argv[0]);
136
+ else
137
+ return img_or_const(argc, argv, obj);
138
+ }
139
+
140
+ VALUE
141
+ img_or_binop(VALUE obj, VALUE arg)
142
+ {
143
+ int argc = 1;
144
+ VALUE *argv = &arg;
145
+
146
+ if (TYPE(arg) == T_ARRAY) {
147
+ argc = RARRAY_LEN(arg);
148
+ argv = RARRAY_PTR(arg);
149
+ }
150
+
151
+ return img_or(argc, argv, obj);
152
+ }
153
+
154
+ static VALUE
155
+ img_xor_img(VALUE obj, VALUE obj2)
156
+ {
157
+ RUBY_VIPS_BINARY(im_eorimage);
158
+ }
159
+
160
+ static VALUE
161
+ img_xor_const(int argc, VALUE *argv, VALUE obj)
162
+ {
163
+ int i;
164
+ double *c;
165
+
166
+ GetImg(obj, data, im);
167
+ OutImg(obj, new, data_new, im_new);
168
+
169
+ c = IM_ARRAY(im_new, argc, double);
170
+ for (i = 0; i < argc; i++)
171
+ c[i] = NUM2DBL(argv[i]);
172
+
173
+ if (im_eorimage_vec(im, im_new, argc, c))
174
+ vips_lib_error();
175
+
176
+ return new;
177
+ }
178
+
179
+ /*
180
+ * call-seq:
181
+ * im ^ other_image -> image
182
+ * im ^ c -> image
183
+ * im ^ [ c1, ... ] -> image
184
+ *
185
+ * In the first form, this operation calculates the bitwise xor between each
186
+ * pixel in this image and <i>other_image</i>. The images must be the same
187
+ * size. They may have any format.
188
+ *
189
+ * If the number of bands differs, one of the images must have one band. In
190
+ * this case, an n-band image is formed from the one-band image by joining n
191
+ * copies of the one-band image together and then the two n-band images are
192
+ * operated upon.
193
+ *
194
+ * In the second form, it calculates the bitwise xor of image pixels with a
195
+ * constant. If the image has multiple bands, then the constant is applied to
196
+ * all bands.
197
+ *
198
+ * In the third form, it calculates the bitwise xor of image pixels with an
199
+ * array of constants. If the image has one band, then the output will have as
200
+ * many bands as constants. Otherwise, the number of constants must match the
201
+ * number of bands in the image.
202
+ */
203
+
204
+
205
+ VALUE
206
+ img_xor(int argc, VALUE *argv, VALUE obj)
207
+ {
208
+ if (argc < 1)
209
+ rb_raise(rb_eArgError, "Expected at least one argument");
210
+ else if (argc == 1 && CLASS_OF(argv[0]) == cVIPSImage)
211
+ return img_xor_img(obj, argv[0]);
212
+ else
213
+ return img_xor_const(argc, argv, obj);
214
+ }
215
+
216
+ VALUE
217
+ img_xor_binop(VALUE obj, VALUE arg)
218
+ {
219
+ int argc = 1;
220
+ VALUE *argv = &arg;
221
+
222
+ if (TYPE(arg) == T_ARRAY) {
223
+ argc = RARRAY_LEN(arg);
224
+ argv = RARRAY_PTR(arg);
225
+ }
226
+
227
+ return img_xor(argc, argv, obj);
228
+ }
229
+
230
+ /*
231
+ * call-seq:
232
+ * im << c -> image
233
+ * im << [ c1, ... ] -> image
234
+ *
235
+ * Calculates the bitwise left-shift by <i>c</i> bits.
236
+ *
237
+ * If only one constant is given, it calculates the left-shift for all bands
238
+ * in the image. If an array of constants is given, it applies each constant
239
+ * to an image band.
240
+ */
241
+
242
+ VALUE
243
+ img_shiftleft(VALUE obj, VALUE arg)
244
+ {
245
+ double *c;
246
+ int i, len = 1;
247
+ VALUE *argv = &arg;
248
+
249
+ GetImg(obj, data, im);
250
+ OutImg(obj, new, data_new, im_new);
251
+
252
+ if (TYPE(arg) == T_ARRAY) {
253
+ len = RARRAY_LEN(arg);
254
+ argv = RARRAY_PTR(arg);
255
+ }
256
+
257
+ c = IM_ARRAY(im_new, len, double);
258
+ for (i = 0; i < len; i++)
259
+ c[i] = NUM2DBL(argv[i]);
260
+
261
+ if (im_shiftleft_vec(im, im_new, len, c))
262
+ vips_lib_error();
263
+
264
+ return new;
265
+ }
266
+
267
+ /*
268
+ * call-seq:
269
+ * im >> c -> image
270
+ * im >> [ c1, ... ] -> image
271
+ *
272
+ * Calculates the bitwise right-shift by <i>c</i> bits.
273
+ *
274
+ * If only one constant is given, it calculates the right-shift for all bands
275
+ * in the image. If an array of constants is given, it applies each constant
276
+ * to an image band.
277
+ */
278
+
279
+ VALUE
280
+ img_shiftright(VALUE obj, VALUE arg)
281
+ {
282
+ double *c;
283
+ int i, len = 1;
284
+ VALUE *argv = &arg;
285
+
286
+ GetImg(obj, data, im);
287
+ OutImg(obj, new, data_new, im_new);
288
+
289
+ if (TYPE(arg) == T_ARRAY) {
290
+ len = RARRAY_LEN(arg);
291
+ argv = RARRAY_PTR(arg);
292
+ }
293
+
294
+ c = IM_ARRAY(im_new, len, double);
295
+ for (i = 0; i < len; i++)
296
+ c[i] = NUM2DBL(argv[i]);
297
+
298
+ if (im_shiftright_vec(im, im_new, len, c))
299
+ vips_lib_error();
300
+
301
+ return new;
302
+ }
@@ -0,0 +1,8 @@
1
+ VALUE img_and(int, VALUE*, VALUE);
2
+ VALUE img_and_binop(VALUE, VALUE);
3
+ VALUE img_or(int, VALUE*, VALUE);
4
+ VALUE img_or_binop(VALUE, VALUE arg);
5
+ VALUE img_xor(int, VALUE*, VALUE);
6
+ VALUE img_xor_binop(VALUE, VALUE arg);
7
+ VALUE img_shiftleft(int, VALUE*, VALUE);
8
+ VALUE img_shiftright(int, VALUE*, VALUE);
@@ -0,0 +1,593 @@
1
+ #include "ruby_vips.h"
2
+ #include "image.h"
3
+ #include "mask.h"
4
+ #include "image_colour.h"
5
+
6
+ static ID id_perceptual, id_relative_colorimetric, id_saturation,
7
+ id_absolute_colorimetric;
8
+
9
+ /*
10
+ * call-seq:
11
+ * im.lab_to_lch -> image
12
+ *
13
+ * Turn Lab to LCh.
14
+ */
15
+
16
+ VALUE
17
+ img_lab_to_lch(VALUE obj)
18
+ {
19
+ RUBY_VIPS_UNARY(im_Lab2LCh);
20
+ }
21
+
22
+ /*
23
+ * call-seq:
24
+ * im.lch_to_lab -> image
25
+ *
26
+ * Turn LCh to Lab.
27
+ */
28
+
29
+ VALUE
30
+ img_lch_to_lab(VALUE obj)
31
+ {
32
+ RUBY_VIPS_UNARY(im_LCh2Lab);
33
+ }
34
+
35
+ /*
36
+ * call-seq:
37
+ * im.labq_to_xyz -> image
38
+ *
39
+ * Turn LabQ to XYZ.
40
+ */
41
+
42
+ VALUE
43
+ img_labq_to_xyz(VALUE obj)
44
+ {
45
+ RUBY_VIPS_UNARY(im_LabQ2XYZ);
46
+ }
47
+
48
+ /*
49
+ * call-seq:
50
+ * im.rad_to_float -> image
51
+ *
52
+ * Unpack a RAD image to a three-band float image.
53
+ */
54
+
55
+ VALUE
56
+ img_rad_to_float(VALUE obj)
57
+ {
58
+ RUBY_VIPS_UNARY(im_rad2float);
59
+ }
60
+
61
+ /*
62
+ * call-seq:
63
+ * im.float_to_rad -> image
64
+ *
65
+ * Convert a three-band float image to Radiance 32-bit packed format.
66
+ */
67
+
68
+ VALUE
69
+ img_float_to_rad(VALUE obj)
70
+ {
71
+ RUBY_VIPS_UNARY(im_float2rad);
72
+ }
73
+
74
+ /*
75
+ * call-seq:
76
+ * im.lch_to_ucs -> image
77
+ *
78
+ * Turn LCh to UCS.
79
+ */
80
+
81
+ VALUE
82
+ img_lch_to_ucs(VALUE obj)
83
+ {
84
+ RUBY_VIPS_UNARY(im_LCh2UCS);
85
+ }
86
+
87
+ /*
88
+ * call-seq:
89
+ * im.lab_to_labq -> image
90
+ *
91
+ * Turn Lab to LabQ.
92
+ */
93
+
94
+ VALUE
95
+ img_lab_to_labq(VALUE obj)
96
+ {
97
+ RUBY_VIPS_UNARY(im_Lab2LabQ);
98
+ }
99
+
100
+ /*
101
+ * call-seq:
102
+ * im.lab_to_labs -> image
103
+ *
104
+ * Turn Lab to LabS.
105
+ */
106
+
107
+ VALUE
108
+ img_lab_to_labs(VALUE obj)
109
+ {
110
+ RUBY_VIPS_UNARY(im_Lab2LabS);
111
+ }
112
+
113
+ /*
114
+ * call-seq:
115
+ * im.lab_to_xyz -> image
116
+ *
117
+ * Turn Lab to XYZ.
118
+ */
119
+
120
+ VALUE
121
+ img_lab_to_xyz(VALUE obj)
122
+ {
123
+ RUBY_VIPS_UNARY(im_Lab2XYZ);
124
+ }
125
+
126
+ /*
127
+ * call-seq:
128
+ * im.lab_to_xyz_temp(x0, y0, z0) -> image
129
+ *
130
+ * Turn Lab to XYZ. <i>x0</i>, <i>y0</i>, <i>z0</i> give the Lab colour
131
+ * temperature.
132
+ */
133
+
134
+ VALUE
135
+ img_lab_to_xyz_temp(VALUE obj, VALUE x0, VALUE y0, VALUE z0)
136
+ {
137
+ GetImg(obj, data, im);
138
+ OutImg(obj, new, data_new, im_new);
139
+
140
+ if (im_Lab2XYZ_temp(im, im_new, NUM2DBL(x0), NUM2DBL(y0), NUM2DBL(z0)))
141
+ vips_lib_error();
142
+
143
+ return new;
144
+ }
145
+
146
+ /*
147
+ * call-seq:
148
+ * im.lab_to_ucs -> image
149
+ *
150
+ * Turn Lab to UCS.
151
+ */
152
+
153
+ VALUE
154
+ img_lab_to_ucs(VALUE obj)
155
+ {
156
+ RUBY_VIPS_UNARY(im_Lab2UCS);
157
+ }
158
+
159
+ /*
160
+ * call-seq:
161
+ * im.labq_to_lab -> image
162
+ *
163
+ * Turn LabQ to Lab.
164
+ */
165
+
166
+ VALUE
167
+ img_labq_to_lab(VALUE obj)
168
+ {
169
+ RUBY_VIPS_UNARY(im_LabQ2Lab);
170
+ }
171
+
172
+ /*
173
+ * call-seq:
174
+ * im.labq_to_labs -> image
175
+ *
176
+ * Turn LabQ to LabS.
177
+ */
178
+
179
+ VALUE
180
+ img_labq_to_labs(VALUE obj)
181
+ {
182
+ RUBY_VIPS_UNARY(im_LabQ2LabS);
183
+ }
184
+
185
+ /*
186
+ * call-seq:
187
+ * im.labs_to_labq -> image
188
+ *
189
+ * Turn LabS to LabQ.
190
+ */
191
+
192
+ VALUE
193
+ img_labs_to_labq(VALUE obj)
194
+ {
195
+ RUBY_VIPS_UNARY(im_LabS2LabQ);
196
+ }
197
+
198
+ /*
199
+ * call-seq:
200
+ * im.labs_to_lab -> image
201
+ *
202
+ * Turn LabS to Lab.
203
+ */
204
+
205
+ VALUE
206
+ img_labs_to_lab(VALUE obj)
207
+ {
208
+ RUBY_VIPS_UNARY(im_LabS2Lab);
209
+ }
210
+
211
+ /*
212
+ * call-seq:
213
+ * im.ucs_to_xyz -> image
214
+ *
215
+ * Turn UCS to XYZ.
216
+ */
217
+
218
+ VALUE
219
+ img_ucs_to_xyz(VALUE obj)
220
+ {
221
+ RUBY_VIPS_UNARY(im_UCS2XYZ);
222
+ }
223
+
224
+ /*
225
+ * call-seq:
226
+ * im.ucs_to_lch -> image
227
+ *
228
+ * Turn UCS to LCh.
229
+ */
230
+
231
+ VALUE
232
+ img_ucs_to_lch(VALUE obj)
233
+ {
234
+ RUBY_VIPS_UNARY(im_UCS2LCh);
235
+ }
236
+
237
+ /*
238
+ * call-seq:
239
+ * im.ucs_to_lab -> image
240
+ *
241
+ * Turn UCS to Lab.
242
+ */
243
+
244
+ VALUE
245
+ img_ucs_to_lab(VALUE obj)
246
+ {
247
+ RUBY_VIPS_UNARY(im_UCS2Lab);
248
+ }
249
+
250
+ /*
251
+ * call-seq:
252
+ * im.xyz_to_lab -> image
253
+ *
254
+ * Turn XYZ to Lab.
255
+ */
256
+
257
+ VALUE
258
+ img_xyz_to_lab(VALUE obj)
259
+ {
260
+ RUBY_VIPS_UNARY(im_XYZ2Lab);
261
+ }
262
+
263
+ /*
264
+ * call-seq:
265
+ * im.xyz_to_lab_temp(x0, y0, z0) -> image
266
+ *
267
+ * Turn XYZ to LAB. <i>x0</i>, <i>y0</i>, <i>z0</i> give the Lab colour
268
+ * temperature.
269
+ */
270
+
271
+ VALUE
272
+ img_xyz_to_lab_temp(VALUE obj, VALUE x0, VALUE y0, VALUE z0)
273
+ {
274
+ GetImg(obj, data, im);
275
+ OutImg(obj, new, data_new, im_new);
276
+
277
+ if (im_XYZ2Lab_temp(im, im_new, NUM2DBL(x0), NUM2DBL(y0), NUM2DBL(z0)))
278
+ vips_lib_error();
279
+
280
+ return new;
281
+ }
282
+
283
+ /*
284
+ * call-seq:
285
+ * im.xyz_to_ucs -> image
286
+ *
287
+ * Turn XYZ to UCS.
288
+ */
289
+
290
+ VALUE
291
+ img_xyz_to_ucs(VALUE obj)
292
+ {
293
+ RUBY_VIPS_UNARY(im_XYZ2UCS);
294
+ }
295
+
296
+ /*
297
+ * call-seq:
298
+ * im.srgb_to_xyz -> image
299
+ *
300
+ * Turn sRGB to XYZ.
301
+ */
302
+
303
+ VALUE
304
+ img_srgb_to_xyz(VALUE obj)
305
+ {
306
+ RUBY_VIPS_UNARY(im_sRGB2XYZ);
307
+ }
308
+
309
+ /*
310
+ * call-seq:
311
+ * im.xyz_to_srgb -> image
312
+ *
313
+ * Turn XYZ to sRGB.
314
+ */
315
+
316
+ VALUE
317
+ img_xyz_to_srgb(VALUE obj)
318
+ {
319
+ RUBY_VIPS_UNARY(im_XYZ2sRGB);
320
+ }
321
+
322
+ /*
323
+ * call-seq:
324
+ * im.yxy_to_xyz -> image
325
+ *
326
+ * Turn Yxy to XYZ.
327
+ */
328
+
329
+ VALUE
330
+ img_yxy_to_xyz(VALUE obj)
331
+ {
332
+ RUBY_VIPS_UNARY(im_Yxy2XYZ);
333
+ }
334
+
335
+ /*
336
+ * call-seq:
337
+ * im.xyz_to_yxy -> image
338
+ *
339
+ * Turn XYZ to Yxy.
340
+ */
341
+
342
+ VALUE
343
+ img_xyz_to_yxy(VALUE obj)
344
+ {
345
+ RUBY_VIPS_UNARY(im_XYZ2Yxy);
346
+ }
347
+
348
+ /*
349
+ * call-seq:
350
+ * im.decmc_from_lab(other_image) -> image
351
+ *
352
+ * Calculate dE CMC from two Lab images.
353
+ */
354
+
355
+ VALUE
356
+ img_decmc_from_lab(VALUE obj, VALUE obj2)
357
+ {
358
+ RUBY_VIPS_BINARY(im_dECMC_fromLab);
359
+ }
360
+
361
+ /*
362
+ * call-seq:
363
+ * im.de00_from_lab(other_image) -> image
364
+ *
365
+ * Calculate CIE dE00 from two Lab images.
366
+ */
367
+
368
+ VALUE
369
+ img_de00_from_lab(VALUE obj, VALUE obj2)
370
+ {
371
+ RUBY_VIPS_BINARY(im_dE00_fromLab);
372
+ }
373
+
374
+ /*
375
+ * call-seq:
376
+ * im.de_from_xyz(other_image) -> image
377
+ *
378
+ * Calculate CIELAB dE 1976 from a pair of XYZ images.
379
+ */
380
+
381
+ VALUE
382
+ img_de_from_xyz(VALUE obj, VALUE obj2)
383
+ {
384
+ RUBY_VIPS_BINARY(im_dE_fromXYZ);
385
+ }
386
+
387
+ /*
388
+ * call-seq:
389
+ * im.de_from_lab(other_image) -> image
390
+ *
391
+ * Calculate CIE dE 1976 from two Lab images.
392
+ */
393
+
394
+ VALUE
395
+ img_de_from_lab(VALUE obj, VALUE obj2)
396
+ {
397
+ RUBY_VIPS_BINARY(im_dE_fromLab);
398
+ }
399
+
400
+ /*
401
+ * call-seq:
402
+ * im.lab_morph(mask, l_offset, l_scale, a_scale, b_scale) -> image
403
+ *
404
+ * Morph an image in CIELAB colour space. Useful for certain types of gamut
405
+ * mapping, or correction of greyscales on some printers.
406
+ *
407
+ * We perform three adjustments.
408
+ *
409
+ * * cast
410
+ *
411
+ * Pass in <i>mask</i> containing CIELAB readings for a neutral greyscale.
412
+ * For example:
413
+ *
414
+ * mask = [
415
+ * [14.23, 4.8 , -3.95],
416
+ * [18.74, 2.76, -2.62],
417
+ * [23.46, 1.4 , -1.95],
418
+ * [27.46, 1.76, -2.01]
419
+ * ]
420
+ *
421
+ * Interpolation from this makes cast corrector. The top and tail are
422
+ * interpolated towards [0, 0, 0] and [100, 0, 0], intermediate values are
423
+ * interpolated along straight lines fitted between the specified points.
424
+ * Rows may be in any order (ie. they need not be sorted on L*).
425
+ *
426
+ * Each pixel is displaced in a/b by the amount specified for that L in the
427
+ * table.
428
+ *
429
+ * * L*
430
+ *
431
+ * Pass in <i>l_scale</i> and <i>l_offset</i> for L. L' = (L + offset) *
432
+ * scale.
433
+ *
434
+ * * saturation
435
+ *
436
+ * scale a and b by these amounts, eg. 1.5 increases saturation.
437
+ *
438
+ * Find the top two by generating and printing a greyscale. Find the bottom
439
+ * by printing a Macbeth and looking at a/b spread
440
+ */
441
+
442
+ VALUE
443
+ img_lab_morph(VALUE obj, VALUE mask, VALUE l_offset, VALUE l_scale,
444
+ VALUE a_scale, VALUE b_scale)
445
+ {
446
+ DOUBLEMASK *dmask;
447
+
448
+ GetImg(obj, data, im);
449
+ OutImg(obj, new, data_new, im_new);
450
+
451
+ mask_arg2mask(mask, NULL, &dmask);
452
+
453
+ if( im_lab_morph(im, im_new, dmask, NUM2DBL(l_offset),
454
+ NUM2DBL(l_scale), NUM2DBL(a_scale), NUM2DBL(b_scale)) )
455
+ vips_lib_error();
456
+
457
+ return new;
458
+ }
459
+
460
+ VipsIntent
461
+ img_id_to_intent(ID rb)
462
+ {
463
+ if (rb == id_perceptual) return IM_INTENT_PERCEPTUAL;
464
+ else if (rb == id_relative_colorimetric) return IM_INTENT_RELATIVE_COLORIMETRIC;
465
+ else if (rb == id_saturation) return IM_INTENT_SATURATION;
466
+ else if (rb == id_absolute_colorimetric) return IM_INTENT_ABSOLUTE_COLORIMETRIC;
467
+
468
+ return (VipsIntent)NULL;
469
+ }
470
+
471
+ /*
472
+ * call-seq:
473
+ * im.icc_transform(input_filename, output_filename, intent) -> image
474
+ *
475
+ * Transform an image with the ICC library. The input image is moved to
476
+ * profile-connection space with the input profile and then to the output
477
+ * space with the output profile.
478
+ *
479
+ * Use Image#icc_import and Image#icc_export_depth to do either the first or
480
+ * second half of this operation in isolation.
481
+ */
482
+
483
+ VALUE
484
+ img_icc_transform(VALUE obj, VALUE input_profile_filename,
485
+ VALUE output_profile_filename, VALUE intent)
486
+ {
487
+ ID id_intent = SYM2ID(intent);
488
+ GetImg(obj, data, im);
489
+ OutImg(obj, new, data_new, im_new);
490
+
491
+ if (im_icc_transform(im, im_new, StringValuePtr(input_profile_filename),
492
+ StringValuePtr(output_profile_filename), img_id_to_intent(id_intent)))
493
+ vips_lib_error();
494
+
495
+ return new;
496
+ }
497
+
498
+ /*
499
+ * call-seq:
500
+ * im.icc_import(input_filename, intent) -> image
501
+ *
502
+ * Import an image with the ICC library. The input image in device space
503
+ * is moved to D65 LAB with the input profile.
504
+ */
505
+
506
+ VALUE
507
+ img_icc_import(VALUE obj, VALUE input_profile_filename, VALUE intent)
508
+ {
509
+ ID id_intent = SYM2ID(intent);
510
+ GetImg(obj, data, im);
511
+ OutImg(obj, new, data_new, im_new);
512
+
513
+ if (im_icc_import(im, im_new, StringValuePtr(input_profile_filename),
514
+ img_id_to_intent(id_intent)))
515
+ vips_lib_error();
516
+
517
+ return new;
518
+ }
519
+
520
+ /*
521
+ * call-seq:
522
+ * im.icc_import_embedded(intent) -> image
523
+ *
524
+ * Import an image with the ICC library. The input image in device space
525
+ * is moved to D65 LAB with the input profile from the input image header
526
+ * attached.
527
+ */
528
+
529
+ VALUE
530
+ img_icc_import_embedded(VALUE obj, VALUE intent)
531
+ {
532
+ ID id_intent = SYM2ID(intent);
533
+ GetImg(obj, data, im);
534
+ OutImg(obj, new, data_new, im_new);
535
+
536
+ if (im_icc_import_embedded(im, im_new, img_id_to_intent(id_intent)))
537
+ vips_lib_error();
538
+
539
+ return new;
540
+ }
541
+
542
+ /*
543
+ * call-seq:
544
+ * im.icc_export_depth(depth, output_filename, intent) -> image
545
+ *
546
+ * Export an image with the ICC library. The input image in
547
+ * D65 LAB is transformed to device space using the supplied profile.
548
+ * <i>depth</i> can be 8 or 16, for 8 or 16-bit image export.
549
+ */
550
+
551
+ VALUE
552
+ img_icc_export_depth(VALUE obj, VALUE depth, VALUE output_profile_filename,
553
+ VALUE intent)
554
+ {
555
+ ID id_intent = SYM2ID(intent);
556
+ GetImg(obj, data, im);
557
+ OutImg(obj, new, data_new, im_new);
558
+
559
+ if (im_icc_export_depth(im, im_new, NUM2INT(depth),
560
+ StringValuePtr(output_profile_filename), img_id_to_intent(id_intent)))
561
+ vips_lib_error();
562
+
563
+ return new;
564
+ }
565
+
566
+ /*
567
+ * call-seq:
568
+ * im.icc_ac2rc(depth, profile_filename) -> image
569
+ *
570
+ * Transform an image from absolute to relative colorimetry using the
571
+ * MediaWhitePoint stored in the ICC profile.
572
+ */
573
+
574
+ VALUE
575
+ img_icc_ac2rc(VALUE obj, VALUE depth, VALUE profile_filename)
576
+ {
577
+ GetImg(obj, data, im);
578
+ OutImg(obj, new, data_new, im_new);
579
+
580
+ if (im_icc_ac2rc(im, im_new, StringValuePtr(profile_filename)))
581
+ vips_lib_error();
582
+
583
+ return new;
584
+ }
585
+
586
+ void
587
+ init_Image_colour()
588
+ {
589
+ id_perceptual = rb_intern("PERCEPTUAL");
590
+ id_relative_colorimetric = rb_intern("COLORIMETRIC");
591
+ id_saturation = rb_intern("SATURATION");
592
+ id_absolute_colorimetric = rb_intern("ABSOLUTE_COLORIMETRIC");
593
+ }