tioga 1.6 → 1.7
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.
- 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
|
|