tioga 1.6 → 1.7
Sign up to get free protection for your applications and to get access to all the features.
- data/Tioga_README +35 -10
- data/split/Dvector/dvector.c +264 -22
- data/split/Dvector/lib/Dvector_extras.rb +30 -2
- data/split/Flate/extconf.rb +1 -1
- data/split/Function/function.c +112 -2
- data/split/Tioga/figures.c +76 -77
- data/split/Tioga/figures.h +375 -490
- data/split/Tioga/generic.c +254 -0
- data/split/Tioga/generic.h +236 -0
- data/split/Tioga/init.c +434 -320
- data/split/Tioga/lib/Creating_Paths.rb +11 -1
- data/split/Tioga/lib/FigMkr.rb +263 -65
- data/split/Tioga/lib/Legends.rb +4 -2
- data/split/Tioga/lib/Markers.rb +3 -2
- data/split/Tioga/lib/Special_Paths.rb +22 -23
- data/split/Tioga/lib/TeX_Text.rb +79 -1
- data/split/Tioga/lib/TexPreamble.rb +14 -0
- data/split/Tioga/lib/Utils.rb +5 -1
- data/split/Tioga/pdfs.h +7 -45
- data/split/Tioga/{axes.c → shared/axes.c} +210 -197
- data/split/Tioga/{makers.c → shared/makers.c} +442 -211
- data/split/Tioga/{pdf_font_dicts.c → shared/pdf_font_dicts.c} +0 -0
- data/split/Tioga/shared/pdfcolor.c +628 -0
- data/split/Tioga/shared/pdfcoords.c +443 -0
- data/split/Tioga/{pdffile.c → shared/pdffile.c} +56 -52
- data/split/Tioga/{pdfimage.c → shared/pdfimage.c} +103 -211
- data/split/Tioga/shared/pdfpath.c +766 -0
- data/split/Tioga/{pdftext.c → shared/pdftext.c} +121 -99
- data/split/Tioga/shared/texout.c +524 -0
- data/split/Tioga/wrappers.c +489 -0
- data/split/Tioga/wrappers.h +259 -0
- data/split/extconf.rb +4 -0
- data/split/mkmf2.rb +12 -1
- data/tests/benchmark_dvector_reads.rb +112 -0
- data/tests/tc_Dvector.rb +35 -3
- data/tests/tc_Function.rb +32 -0
- metadata +65 -52
- data/split/Tioga/pdfcolor.c +0 -486
- data/split/Tioga/pdfcoords.c +0 -523
- data/split/Tioga/pdfpath.c +0 -913
- data/split/Tioga/texout.c +0 -380
@@ -99,14 +99,14 @@ static bool Is_monochrome(int obj_num)
|
|
99
99
|
return false;
|
100
100
|
}
|
101
101
|
|
102
|
-
static void Write_Image_From_File(char *filename, int width, int height, char *out_info, int mask_obj_num)
|
102
|
+
static void Write_Image_From_File(char *filename, int width, int height, char *out_info, int mask_obj_num, int *ierr)
|
103
103
|
{
|
104
104
|
FILE *jpg = fopen(filename, "r");
|
105
|
-
if (jpg == NULL)
|
105
|
+
if (jpg == NULL) { RAISE_ERROR_s("Sorry: cannot open file for showing image (%s)\n", filename, ierr); return; }
|
106
106
|
unsigned char *buff;
|
107
107
|
int len, rd_len;
|
108
108
|
int buff_len = 256000;
|
109
|
-
buff =
|
109
|
+
buff = ALLOC_N_unsigned_char(buff_len);
|
110
110
|
len = 0;
|
111
111
|
while ((rd_len = fread(buff, 1, buff_len, jpg)) == buff_len) len += buff_len;
|
112
112
|
len += rd_len;
|
@@ -129,13 +129,13 @@ static void Write_Image_From_File(char *filename, int width, int height, char *o
|
|
129
129
|
fclose(jpg);
|
130
130
|
}
|
131
131
|
|
132
|
-
void Write_JPG(JPG_Info *xo)
|
132
|
+
void Write_JPG(JPG_Info *xo, int *ierr)
|
133
133
|
{
|
134
134
|
Write_Image_From_File(xo->filename, xo->width, xo->height,
|
135
|
-
"\t/Filter /DCTDecode\n\t/ColorSpace /DeviceRGB\n\t/BitsPerComponent 8\n", xo->mask_obj_num);
|
135
|
+
"\t/Filter /DCTDecode\n\t/ColorSpace /DeviceRGB\n\t/BitsPerComponent 8\n", xo->mask_obj_num, ierr);
|
136
136
|
}
|
137
137
|
|
138
|
-
void Write_Sampled(Sampled_Info *xo)
|
138
|
+
void Write_Sampled(Sampled_Info *xo, int *ierr)
|
139
139
|
{
|
140
140
|
fprintf(OF, "\n\t/Subtype /Image\n");
|
141
141
|
fprintf(OF, "\t/Filter /FlateDecode\n\t/Interpolate %s\n", (xo->interpolate)? "true":"false");
|
@@ -176,8 +176,8 @@ void Write_Sampled(Sampled_Info *xo)
|
|
176
176
|
fprintf(OF, "\t/BitsPerComponent 8\n");
|
177
177
|
}
|
178
178
|
if (xo->mask_obj_num > 0) {
|
179
|
-
if (xo->image_type == MONO_IMAGE)
|
180
|
-
|
179
|
+
if (xo->image_type == MONO_IMAGE) {
|
180
|
+
RAISE_ERROR("Sorry: monochrome images must not have masks", ierr); return; }
|
181
181
|
if (!Is_monochrome(xo->mask_obj_num)) fprintf(OF, "\t/SMask %i 0 R\n", xo->mask_obj_num);
|
182
182
|
else fprintf(OF, "\t/Mask %i 0 R\n", xo->mask_obj_num);
|
183
183
|
}
|
@@ -185,20 +185,21 @@ void Write_Sampled(Sampled_Info *xo)
|
|
185
185
|
xo->value_mask_min <= 255 && xo->value_mask_max <= 255 && xo->value_mask_min <= xo->value_mask_max)
|
186
186
|
fprintf(OF, "\t/Mask [%i %i]\n", xo->value_mask_min, xo->value_mask_max);
|
187
187
|
new_len = (xo->length * 11)/10 + 100;
|
188
|
-
buffer =
|
189
|
-
if (
|
188
|
+
buffer = ALLOC_N_unsigned_char(new_len);
|
189
|
+
if (do_flate_compress(buffer, &new_len, xo->image_data, xo->length) != FLATE_OK) {
|
190
190
|
free(buffer);
|
191
|
-
|
191
|
+
RAISE_ERROR("Error compressing image data", ierr);
|
192
|
+
return;
|
192
193
|
}
|
193
194
|
fprintf(OF, "\t/Length %li\n", new_len);
|
194
195
|
fprintf(OF, "\t>>\nstream\n");
|
195
|
-
if (fwrite(buffer, 1, new_len, OF) < new_len)
|
196
|
-
|
196
|
+
if (fwrite(buffer, 1, new_len, OF) < new_len) {
|
197
|
+
RAISE_ERROR("Error writing image data", ierr); return; }
|
197
198
|
free(buffer);
|
198
199
|
fprintf(OF, "\nendstream\nendobj\n");
|
199
200
|
}
|
200
201
|
|
201
|
-
void Create_Transform_from_Points( // transform maps (0,0), (1,0), and (0,1) to the given points
|
202
|
+
static void Create_Transform_from_Points( // transform maps (0,0), (1,0), and (0,1) to the given points
|
202
203
|
double llx, double lly, double lrx, double lry, double ulx, double uly,
|
203
204
|
double *a, double *b, double *c, double *d, double *e, double *f)
|
204
205
|
{
|
@@ -206,25 +207,27 @@ void Create_Transform_from_Points( // transform maps (0,0), (1,0), and (0,1) to
|
|
206
207
|
*a = lrx; *b = lry; *c = ulx; *d = uly;
|
207
208
|
}
|
208
209
|
|
209
|
-
void Get_Image_Dest(FM *p,
|
210
|
+
static void Get_Image_Dest(FM *p, OBJ_PTR image_destination, double *dest, int *ierr)
|
210
211
|
{
|
211
|
-
|
212
|
-
if (
|
213
|
-
|
212
|
+
int len = Array_Len(image_destination,ierr);
|
213
|
+
if (*ierr != 0) return;
|
214
|
+
if (len != 6) {
|
215
|
+
RAISE_ERROR("Sorry: invalid image destination array: must have 6 entries", ierr); return; }
|
214
216
|
int i;
|
215
217
|
for (i = 0; i < 6; i++) {
|
216
|
-
|
217
|
-
|
218
|
+
OBJ_PTR entry = Array_Entry(image_destination, i, ierr);
|
219
|
+
if (*ierr != 0) return;
|
218
220
|
if (i % 2 == 0)
|
219
|
-
dest[i] = convert_figure_to_output_x(p,
|
221
|
+
dest[i] = convert_figure_to_output_x(p,Number_to_double(entry, ierr));
|
220
222
|
else
|
221
|
-
dest[i] = convert_figure_to_output_y(p,
|
223
|
+
dest[i] = convert_figure_to_output_y(p,Number_to_double(entry, ierr));
|
224
|
+
if (*ierr != 0) return;
|
222
225
|
}
|
223
226
|
}
|
224
227
|
|
225
228
|
static void Show_JPEG(FM *p, char *filename, int width, int height, double *dest, int subtype, int mask_obj_num)
|
226
229
|
{
|
227
|
-
JPG_Info *xo =
|
230
|
+
JPG_Info *xo = (JPG_Info *)calloc(1,sizeof(JPG_Info));
|
228
231
|
xo->xobj_subtype = subtype;
|
229
232
|
double llx = dest[0], lly = dest[1], lrx = dest[2], lry = dest[3], ulx = dest[4], uly = dest[5];
|
230
233
|
double a, b, c, d, e, f; // the transform to position the image
|
@@ -232,7 +235,7 @@ static void Show_JPEG(FM *p, char *filename, int width, int height, double *dest
|
|
232
235
|
xobj_list = (XObject_Info *)xo;
|
233
236
|
xo->xo_num = next_available_xo_number++;
|
234
237
|
xo->obj_num = next_available_object_number++;
|
235
|
-
xo->filename =
|
238
|
+
xo->filename = ALLOC_N_char(strlen(filename)+1);
|
236
239
|
strcpy(xo->filename, filename);
|
237
240
|
xo->width = width;
|
238
241
|
xo->height = height;
|
@@ -245,112 +248,91 @@ static void Show_JPEG(FM *p, char *filename, int width, int height, double *dest
|
|
245
248
|
update_bbox(p, lrx+ulx-llx, lry+uly-lly);
|
246
249
|
}
|
247
250
|
|
248
|
-
void
|
249
|
-
{
|
250
|
-
Show_JPEG(p, filename, width, height, dest, JPG_SUBTYPE, mask_obj_num);
|
251
|
-
}
|
252
|
-
|
253
|
-
VALUE FM_private_show_jpg(VALUE fmkr, VALUE filename, VALUE width, VALUE height, VALUE image_destination, VALUE mask_obj_num)
|
254
|
-
{
|
251
|
+
void c_private_show_jpg(OBJ_PTR fmkr, FM *p, char *filename,
|
252
|
+
int width, int height, OBJ_PTR image_destination, int mask_obj_num, int *ierr) {
|
255
253
|
double dest[6];
|
256
|
-
|
257
|
-
|
258
|
-
Get_Image_Dest(p, image_destination, dest);
|
259
|
-
|
260
|
-
height
|
261
|
-
mask_obj_num = rb_Integer(mask_obj_num);
|
262
|
-
filename = rb_String(filename);
|
263
|
-
c_show_jpg(p, RSTRING_PTR(filename), NUM2INT(width), NUM2INT(height), dest, NUM2INT(mask_obj_num));
|
264
|
-
return fmkr;
|
254
|
+
if (constructing_path) {
|
255
|
+
RAISE_ERROR("Sorry: must finish with current path before calling show_jpg", ierr); return; }
|
256
|
+
Get_Image_Dest(p, image_destination, dest, ierr);
|
257
|
+
if (*ierr != 0) return;
|
258
|
+
Show_JPEG(p, filename, width, height, dest, JPG_SUBTYPE, mask_obj_num);
|
265
259
|
}
|
266
260
|
|
267
|
-
|
261
|
+
OBJ_PTR c_private_create_image_data(OBJ_PTR fmkr, FM *p, OBJ_PTR table,
|
268
262
|
int first_row, int last_row, int first_column, int last_column,
|
269
|
-
double
|
263
|
+
double min_val, double max_val, int max_code, int if_below_range, int if_above_range, int *ierr)
|
270
264
|
{
|
265
|
+
long num_cols, num_rows;
|
266
|
+
double **data = Table_Data_for_Read(table, &num_cols, &num_rows, ierr);
|
267
|
+
if (*ierr != 0) RETURN_NIL;
|
271
268
|
if (first_column < 0) first_column += num_cols;
|
272
269
|
if (first_column < 0 || first_column >= num_cols)
|
273
|
-
|
270
|
+
RAISE_ERROR_i("Sorry: invalid first_column specification (%i)", first_column, ierr);
|
274
271
|
if (last_column < 0) last_column += num_cols;
|
275
272
|
if (last_column < 0 || last_column >= num_cols)
|
276
|
-
|
273
|
+
RAISE_ERROR_i("Sorry: invalid last_column specification (%i)", last_column, ierr);
|
277
274
|
if (first_row < 0) first_row += num_rows;
|
278
275
|
if (first_row < 0 || first_row >= num_rows)
|
279
|
-
|
276
|
+
RAISE_ERROR_i("Sorry: invalid first_row specification (%i)", first_row, ierr);
|
280
277
|
if (last_row < 0) last_row += num_rows;
|
281
278
|
if (last_row < 0 || last_row >= num_rows)
|
282
|
-
|
283
|
-
if (
|
284
|
-
|
279
|
+
RAISE_ERROR_i("Sorry: invalid last_row specification (%i)", last_row, ierr);
|
280
|
+
if (min_val >= max_val)
|
281
|
+
RAISE_ERROR_gg("Sorry: invalid range specification: min %g max %g", min_val, max_val, ierr);
|
285
282
|
if (max_code <= 0 || max_code > 255)
|
286
|
-
|
283
|
+
RAISE_ERROR_i("Sorry: invalid max_code specification (%i)", max_code, ierr);
|
287
284
|
if (if_below_range < 0 || if_below_range > 255)
|
288
|
-
|
285
|
+
RAISE_ERROR_i("Sorry: invalid if_below_range specification (%i)", if_below_range, ierr);
|
289
286
|
if (if_above_range < 0 || if_above_range > 255)
|
290
|
-
|
287
|
+
RAISE_ERROR_i("Sorry: invalid if_above_range specification (%i)", if_above_range, ierr);
|
291
288
|
int i, j, k, width = last_column - first_column + 1, height = last_row - first_row + 1;
|
292
289
|
int sz = width * height;
|
293
|
-
if (sz <= 0)
|
294
|
-
|
290
|
+
if (sz <= 0) RAISE_ERROR_ii("Sorry: invalid data specification: width (%i) height (%i)", width, height, ierr);
|
291
|
+
if (*ierr != 0) RETURN_NIL;
|
292
|
+
char *buff = ALLOC_N_char(sz);
|
295
293
|
for (k = 0, i = first_row; i <= last_row; i++) {
|
296
294
|
double *row = data[i];
|
297
295
|
for (j = first_column; j <= last_column; j++) {
|
298
296
|
double val = row[j];
|
299
|
-
if (val <
|
300
|
-
else if (val >
|
297
|
+
if (val < min_val) buff[k++] = if_below_range;
|
298
|
+
else if (val > max_val) buff[k++] = if_above_range;
|
301
299
|
else {
|
302
|
-
val = max_code * (val -
|
300
|
+
val = max_code * (val - min_val)/(max_val - min_val);
|
303
301
|
buff[k++] = ROUND(val);
|
304
302
|
}
|
305
303
|
}
|
306
304
|
}
|
307
|
-
|
305
|
+
OBJ_PTR result = String_New(buff, sz);
|
308
306
|
free(buff);
|
309
307
|
return result;
|
310
308
|
}
|
311
309
|
|
312
|
-
VALUE FM_private_create_image_data(VALUE fmkr, VALUE data,
|
313
|
-
VALUE first_row, VALUE last_row, VALUE first_column, VALUE last_column,
|
314
|
-
VALUE min_value, VALUE max_value, VALUE max_code, VALUE if_below_range, VALUE if_above_range)
|
315
|
-
{
|
316
|
-
FM *p = Get_FM(fmkr);
|
317
|
-
long num_cols, num_rows;
|
318
|
-
double **ary = Dtable_Ptr(data, &num_cols, &num_rows);
|
319
|
-
first_row = rb_Integer(first_row);
|
320
|
-
last_row = rb_Integer(last_row);
|
321
|
-
first_column = rb_Integer(first_column);
|
322
|
-
last_column = rb_Integer(last_column);
|
323
|
-
max_code = rb_Integer(max_code);
|
324
|
-
if_below_range = rb_Integer(if_below_range);
|
325
|
-
if_above_range = rb_Integer(if_above_range);
|
326
|
-
min_value = rb_Float(min_value);
|
327
|
-
max_value = rb_Float(max_value);
|
328
|
-
return c_private_create_image_data(p, ary, num_cols, num_rows,
|
329
|
-
NUM2INT(first_row), NUM2INT(last_row), NUM2INT(first_column), NUM2INT(last_column),
|
330
|
-
NUM2DBL(min_value), NUM2DBL(max_value), NUM2INT(max_code), NUM2INT(if_below_range), NUM2INT(if_above_range));
|
331
|
-
}
|
332
310
|
|
333
|
-
|
311
|
+
OBJ_PTR c_private_create_monochrome_image_data(OBJ_PTR fmkr, FM *p, OBJ_PTR table,
|
334
312
|
int first_row, int last_row, int first_column, int last_column,
|
335
|
-
double boundary, bool reversed)
|
313
|
+
double boundary, bool reversed, int *ierr)
|
336
314
|
{
|
315
|
+
long num_cols, num_rows;
|
316
|
+
double **data = Table_Data_for_Read(table, &num_cols, &num_rows, ierr);
|
317
|
+
if (*ierr != 0) RETURN_NIL;
|
337
318
|
if (first_column < 0) first_column += num_cols;
|
338
319
|
if (first_column < 0 || first_column >= num_cols)
|
339
|
-
|
320
|
+
RAISE_ERROR_i("Sorry: invalid first_column specification (%i)", first_column, ierr);
|
340
321
|
if (last_column < 0) last_column += num_cols;
|
341
322
|
if (last_column < 0 || last_column >= num_cols)
|
342
|
-
|
323
|
+
RAISE_ERROR_i("Sorry: invalid last_column specification (%i)", last_column, ierr);
|
343
324
|
if (first_row < 0) first_row += num_rows;
|
344
325
|
if (first_row < 0 || first_row >= num_rows)
|
345
|
-
|
326
|
+
RAISE_ERROR_i("Sorry: invalid first_row specification (%i)", first_row, ierr);
|
346
327
|
if (last_row < 0) last_row += num_rows;
|
347
328
|
if (last_row < 0 || last_row >= num_rows)
|
348
|
-
|
329
|
+
RAISE_ERROR_i("Sorry: invalid last_row specification (%i)", last_row, ierr);
|
349
330
|
int i, j, k, width = last_column - first_column + 1, height = last_row - first_row + 1, bytes_per_row = (width+7)/8;
|
350
331
|
int sz = bytes_per_row * 8 * height;
|
351
|
-
if (sz <= 0)
|
332
|
+
if (sz <= 0) RAISE_ERROR_ii("Sorry: invalid data specification: width (%i) height (%i)", width, height, ierr);
|
333
|
+
if (*ierr != 0) RETURN_NIL;
|
352
334
|
// to simplify the process, do it in two stages: first get the values and then pack the bits
|
353
|
-
char *buff =
|
335
|
+
char *buff = ALLOC_N_char(sz);
|
354
336
|
for (k = 0, i = first_row; i <= last_row; i++) {
|
355
337
|
double *row = data[i];
|
356
338
|
for (j = first_column; j <= last_column; j++) {
|
@@ -362,7 +344,7 @@ static VALUE c_private_create_monochrome_image_data(FM *p, double **data, long n
|
|
362
344
|
}
|
363
345
|
}
|
364
346
|
int num_bytes = (sz+7) >> 3;
|
365
|
-
char *bits =
|
347
|
+
char *bits = ALLOC_N_char(num_bytes), c = 0;
|
366
348
|
int num_bits = num_bytes << 3;
|
367
349
|
for (i = 0, k = -1; i < num_bits; i++) {
|
368
350
|
int bit = (i < sz)? buff[i] : 0;
|
@@ -374,163 +356,73 @@ static VALUE c_private_create_monochrome_image_data(FM *p, double **data, long n
|
|
374
356
|
}
|
375
357
|
}
|
376
358
|
bits[k] = c;
|
377
|
-
|
359
|
+
OBJ_PTR result = String_New(bits, num_bytes);
|
378
360
|
free(bits); free(buff);
|
379
361
|
return result;
|
380
362
|
}
|
381
363
|
|
382
|
-
VALUE FM_private_create_monochrome_image_data(VALUE fmkr, VALUE data,
|
383
|
-
VALUE first_row, VALUE last_row, VALUE first_column, VALUE last_column,
|
384
|
-
VALUE boundary, VALUE reverse)
|
385
|
-
{
|
386
|
-
FM *p = Get_FM(fmkr);
|
387
|
-
long num_cols, num_rows;
|
388
|
-
double **ary = Dtable_Ptr(data, &num_cols, &num_rows);
|
389
|
-
first_row = rb_Integer(first_row);
|
390
|
-
last_row = rb_Integer(last_row);
|
391
|
-
first_column = rb_Integer(first_column);
|
392
|
-
last_column = rb_Integer(last_column);
|
393
|
-
boundary = rb_Float(boundary);
|
394
|
-
return c_private_create_monochrome_image_data(p, ary, num_cols, num_rows,
|
395
|
-
NUM2INT(first_row), NUM2INT(last_row), NUM2INT(first_column), NUM2INT(last_column),
|
396
|
-
NUM2DBL(boundary), reverse != Qfalse);
|
397
|
-
}
|
398
364
|
|
399
|
-
|
400
|
-
|
365
|
+
OBJ_PTR c_private_show_image(OBJ_PTR fmkr, FM *p, int image_type, double llx, double lly, double lrx, double lry,
|
366
|
+
double ulx, double uly, bool interpolate, bool reversed, int w, int h, unsigned char* data, long len,
|
367
|
+
OBJ_PTR mask_min, OBJ_PTR mask_max, OBJ_PTR hivalue, OBJ_PTR lookup_data, int mask_obj_num, int *ierr)
|
401
368
|
{
|
402
|
-
|
369
|
+
unsigned char *lookup=NULL;
|
370
|
+
int value_mask_min = 256, value_mask_max = 256, lookup_len=0, hival=0;
|
371
|
+
if (constructing_path) { RAISE_ERROR("Sorry: must finish with current path before calling show_image", ierr); RETURN_NIL; }
|
372
|
+
if (image_type == COLORMAP_IMAGE) {
|
373
|
+
value_mask_min = Number_to_int(mask_min, ierr);
|
374
|
+
value_mask_max = Number_to_int(mask_max, ierr);
|
375
|
+
hival = Number_to_int(hivalue, ierr);
|
376
|
+
lookup = (unsigned char *)(String_Ptr(lookup_data, ierr));
|
377
|
+
lookup_len = String_Len(lookup_data, ierr);
|
378
|
+
if (*ierr != 0) RETURN_NIL;
|
379
|
+
}
|
380
|
+
|
381
|
+
llx = convert_figure_to_output_x(p,llx);
|
382
|
+
lly = convert_figure_to_output_y(p,lly);
|
383
|
+
lrx = convert_figure_to_output_x(p,lrx);
|
384
|
+
lry = convert_figure_to_output_y(p,lry);
|
385
|
+
ulx = convert_figure_to_output_x(p,ulx);
|
386
|
+
uly = convert_figure_to_output_y(p,uly);
|
387
|
+
|
388
|
+
Sampled_Info *xo = (Sampled_Info *)calloc(1,sizeof(Sampled_Info));
|
403
389
|
xo->xobj_subtype = SAMPLED_SUBTYPE;
|
404
|
-
double llx = dest[0], lly = dest[1], lrx = dest[2], lry = dest[3], ulx = dest[4], uly = dest[5];
|
405
390
|
double a, b, c, d, e, f; // the transform to position the image
|
406
391
|
int ir, ic, id;
|
407
392
|
xo->next = xobj_list;
|
408
393
|
xobj_list = (XObject_Info *)xo;
|
409
394
|
xo->xo_num = next_available_xo_number++;
|
410
395
|
xo->obj_num = next_available_object_number++;
|
411
|
-
xo->image_data =
|
396
|
+
xo->image_data = ALLOC_N_unsigned_char(len);
|
412
397
|
xo->length = len;
|
413
398
|
xo->interpolate = interpolate;
|
414
399
|
xo->reversed = reversed;
|
415
|
-
|
400
|
+
memcpy(xo->image_data, data, len);
|
416
401
|
xo->image_type = image_type;
|
417
402
|
if (image_type != COLORMAP_IMAGE) xo->lookup = NULL;
|
418
403
|
else {
|
419
|
-
if ((hival+1)*3 > lookup_len)
|
420
|
-
|
404
|
+
if ((hival+1)*3 > lookup_len) {
|
405
|
+
RAISE_ERROR_ii("Sorry: color space hival (%i) is too large for length of lookup table (%i)", hival, lookup_len, ierr);
|
406
|
+
RETURN_NIL;
|
407
|
+
}
|
421
408
|
xo->hival = hival;
|
422
409
|
lookup_len = (hival+1) * 3;
|
423
|
-
xo->lookup =
|
410
|
+
xo->lookup = ALLOC_N_unsigned_char(lookup_len);
|
424
411
|
xo->lookup_len = lookup_len;
|
425
|
-
|
412
|
+
memcpy(xo->lookup, lookup, lookup_len);
|
426
413
|
}
|
427
414
|
xo->width = w;
|
428
|
-
xo->height = h;
|
429
|
-
|
430
|
-
if (0) {
|
431
|
-
printf("len=%i w=%i h=%i\ndata\n\n", len, w, h);
|
432
|
-
for (ir=0; ir<h; ir++) {
|
433
|
-
for (ic=0; ic<w; ic++) {
|
434
|
-
id = (int)data[ir*h+ic];
|
435
|
-
printf("%3i ",id);
|
436
|
-
}
|
437
|
-
printf("\n");
|
438
|
-
}
|
439
|
-
|
440
|
-
|
441
|
-
printf("\n\nxo->image_data\n");
|
442
|
-
for (ir=0; ir<h; ir++) {
|
443
|
-
for (ic=0; ic<w; ic++) {
|
444
|
-
id = (int)xo->image_data[ir*h+ic];
|
445
|
-
printf("%3i ",id);
|
446
|
-
}
|
447
|
-
printf("\n\n");
|
448
|
-
}
|
449
|
-
}
|
450
|
-
|
451
|
-
|
415
|
+
xo->height = h;
|
452
416
|
xo->value_mask_min = value_mask_min;
|
453
417
|
xo->value_mask_max = value_mask_max;
|
454
418
|
xo->mask_obj_num = mask_obj_num;
|
455
|
-
if (mask_obj_num == -1) return xo->obj_num; // this image is being used as an opacity mask
|
419
|
+
if (mask_obj_num == -1) return Integer_New(xo->obj_num); // this image is being used as an opacity mask
|
456
420
|
Create_Transform_from_Points(llx, lly, lrx, lry, ulx, uly, &a, &b, &c, &d, &e, &f);
|
457
421
|
fprintf(TF, "q %0.2f %0.2f %0.2f %0.2f %0.2f %0.2f cm /XObj%i Do Q\n", a, b, c, d, e, f, xo->xo_num);
|
458
422
|
update_bbox(p, llx, lly);
|
459
423
|
update_bbox(p, lrx, lry);
|
460
424
|
update_bbox(p, ulx, uly);
|
461
425
|
update_bbox(p, lrx+ulx-llx, lry+uly-lly);
|
462
|
-
return xo->obj_num;
|
463
|
-
}
|
464
|
-
|
465
|
-
static VALUE private_show_image(int image_type, VALUE fmkr, VALUE llx, VALUE lly, VALUE lrx, VALUE lry,
|
466
|
-
VALUE ulx, VALUE uly, VALUE interpolate, VALUE reversed, VALUE w, VALUE h, VALUE data, VALUE value_mask_min, VALUE value_mask_max,
|
467
|
-
VALUE hival, VALUE lookup, VALUE mask_obj_num)
|
468
|
-
{
|
469
|
-
double dest[6];
|
470
|
-
unsigned char *lookup_str=NULL;
|
471
|
-
int mask_min = 256, mask_max = 256, lookup_len=0, hivalue=0;
|
472
|
-
FM *p = Get_FM(fmkr);
|
473
|
-
if (constructing_path) rb_raise(rb_eArgError, "Sorry: must finish with current path before calling show_image");
|
474
|
-
data = rb_String(data);
|
475
|
-
llx = rb_Float(llx);
|
476
|
-
lly = rb_Float(lly);
|
477
|
-
lrx = rb_Float(lrx);
|
478
|
-
lry = rb_Float(lry);
|
479
|
-
ulx = rb_Float(ulx);
|
480
|
-
uly = rb_Float(uly);
|
481
|
-
w = rb_Integer(w);
|
482
|
-
h = rb_Integer(h);
|
483
|
-
mask_obj_num = rb_Integer(mask_obj_num);
|
484
|
-
if (image_type == COLORMAP_IMAGE) {
|
485
|
-
value_mask_min = rb_Integer(value_mask_min); mask_min = NUM2INT(value_mask_min);
|
486
|
-
value_mask_max = rb_Integer(value_mask_max); mask_max = NUM2INT(value_mask_max);
|
487
|
-
hival = rb_Integer(hival);
|
488
|
-
hivalue = NUM2INT(hival);
|
489
|
-
lookup = rb_String(lookup);
|
490
|
-
lookup_str = (unsigned char *)(RSTRING_PTR(lookup));
|
491
|
-
lookup_len = RSTRING_LEN(lookup);
|
492
|
-
}
|
493
|
-
dest[0] = convert_figure_to_output_x(p,NUM2DBL(llx));
|
494
|
-
dest[1] = convert_figure_to_output_y(p,NUM2DBL(lly));
|
495
|
-
dest[2] = convert_figure_to_output_x(p,NUM2DBL(lrx));
|
496
|
-
dest[3] = convert_figure_to_output_y(p,NUM2DBL(lry));
|
497
|
-
dest[4] = convert_figure_to_output_x(p,NUM2DBL(ulx));
|
498
|
-
dest[5] = convert_figure_to_output_y(p,NUM2DBL(uly));
|
499
|
-
int obj_num = c_private_show_image(p, image_type, dest, (interpolate != Qfalse), (reversed == Qtrue), NUM2INT(w), NUM2INT(h),
|
500
|
-
(unsigned char *)RSTRING_PTR(data), RSTRING_LEN(data), mask_min, mask_max, hivalue, lookup_str, lookup_len, NUM2INT(mask_obj_num));
|
501
|
-
return INT2FIX(obj_num);
|
502
|
-
}
|
503
|
-
|
504
|
-
VALUE FM_private_show_rgb_image(VALUE fmkr, VALUE llx, VALUE lly, VALUE lrx, VALUE lry,
|
505
|
-
VALUE ulx, VALUE uly, VALUE interpolate, VALUE w, VALUE h, VALUE data, VALUE mask_obj_num)
|
506
|
-
{
|
507
|
-
return private_show_image(RGB_IMAGE, fmkr, llx, lly, lrx, lry, ulx, uly, interpolate, Qfalse, w, h, data, Qnil, Qnil, Qnil, Qnil, mask_obj_num);
|
508
|
-
}
|
509
|
-
|
510
|
-
VALUE FM_private_show_cmyk_image(VALUE fmkr, VALUE llx, VALUE lly, VALUE lrx, VALUE lry,
|
511
|
-
VALUE ulx, VALUE uly, VALUE interpolate, VALUE w, VALUE h, VALUE data, VALUE mask_obj_num)
|
512
|
-
{
|
513
|
-
return private_show_image(CMYK_IMAGE, fmkr, llx, lly, lrx, lry, ulx, uly, interpolate, Qfalse, w, h, data, Qnil, Qnil, Qnil, Qnil, mask_obj_num);
|
514
|
-
}
|
515
|
-
|
516
|
-
VALUE FM_private_show_grayscale_image(VALUE fmkr, VALUE llx, VALUE lly, VALUE lrx, VALUE lry,
|
517
|
-
VALUE ulx, VALUE uly, VALUE interpolate, VALUE w, VALUE h, VALUE data, VALUE mask_obj_num)
|
518
|
-
{
|
519
|
-
return private_show_image(GRAY_IMAGE, fmkr, llx, lly, lrx, lry, ulx, uly, interpolate, Qfalse, w, h, data, Qnil, Qnil, Qnil, Qnil, mask_obj_num);
|
520
|
-
}
|
521
|
-
|
522
|
-
VALUE FM_private_show_monochrome_image(VALUE fmkr, VALUE llx, VALUE lly, VALUE lrx, VALUE lry,
|
523
|
-
VALUE ulx, VALUE uly, VALUE interpolate, VALUE reversed, VALUE w, VALUE h, VALUE data, VALUE mask_obj_num)
|
524
|
-
{
|
525
|
-
return private_show_image(MONO_IMAGE, fmkr, llx, lly, lrx, lry, ulx, uly, interpolate, reversed,
|
526
|
-
w, h, data, Qnil, Qnil, Qnil, Qnil, mask_obj_num);
|
527
|
-
}
|
528
|
-
|
529
|
-
VALUE FM_private_show_image(VALUE fmkr, VALUE llx, VALUE lly, VALUE lrx, VALUE lry,
|
530
|
-
VALUE ulx, VALUE uly, VALUE interpolate, VALUE w, VALUE h, VALUE data,
|
531
|
-
VALUE value_mask_min, VALUE value_mask_max, VALUE hival, VALUE lookup, VALUE mask_obj_num)
|
532
|
-
{
|
533
|
-
return private_show_image(COLORMAP_IMAGE, fmkr, llx, lly, lrx, lry, ulx, uly, interpolate, Qfalse, w, h, data,
|
534
|
-
value_mask_min, value_mask_max, hival, lookup, mask_obj_num);
|
426
|
+
return Integer_New(xo->obj_num);
|
535
427
|
}
|
536
428
|
|