tioga 1.7 → 1.8

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.
File without changes
@@ -22,11 +22,14 @@
22
22
  #include "figures.h"
23
23
  #include "pdfs.h"
24
24
 
25
- void Init_Font_Dictionary(void) {
25
+
26
+ void
27
+ Init_Font_Dictionary(void)
28
+ {
26
29
  int i, num_fonts = num_pdf_standard_fonts;
27
30
  Font_Dictionary *font_info;
28
31
  for (i = 0; i < num_fonts; i++) {
29
- font_info = (Font_Dictionary *)calloc(1,sizeof(Font_Dictionary));
32
+ font_info = (Font_Dictionary *)calloc(1, sizeof(Font_Dictionary));
30
33
  font_info->afm = &afm_array[i];
31
34
  font_info->font_num = font_info->afm->font_num;
32
35
  font_info->in_use = false;
@@ -35,34 +38,38 @@ void Init_Font_Dictionary(void) {
35
38
  }
36
39
  }
37
40
 
38
- static void Write_Font_Dictionary(FILE *file, Old_Font_Dictionary *fi) {
41
+
42
+ static void
43
+ Write_Font_Dictionary(FILE *file, Old_Font_Dictionary *fi)
44
+ {
39
45
  int i;
40
46
  fprintf(file, "{\n");
41
47
  fprintf(file, "\t%i, // font_num\n", fi->font_num);
42
48
  fprintf(file, "\t\"%s\", // font_name\n", fi->font_name);
43
49
  fprintf(file, "\t%4i, // firstChar\n", fi->firstChar);
44
50
  fprintf(file, "\t%4i, // lastChar\n", fi->lastChar);
45
-
51
+
46
52
  fprintf(file, "\t{ // char_width\n");
47
- for (i=0; i<255; i++) fprintf(file, "\t\t%4i, // %i\n", fi->char_width[i], i);
53
+ for (i=0; i<255; i++)
54
+ fprintf(file, "\t\t%4i, // %i\n", fi->char_width[i], i);
48
55
  fprintf(file, "\t\t%4i }, // char_width\n", fi->char_width[255]);
49
-
56
+
50
57
  fprintf(file, "\t{ // char_llx\n");
51
58
  for (i=0; i<255; i++) fprintf(file, "\t\t%4i, // %i\n", fi->char_llx[i], i);
52
59
  fprintf(file, "\t\t%4i }, // char_llx\n", fi->char_llx[255]);
53
-
60
+
54
61
  fprintf(file, "\t{ // char_lly\n");
55
62
  for (i=0; i<255; i++) fprintf(file, "\t\t%4i, // %i\n", fi->char_lly[i], i);
56
63
  fprintf(file, "\t\t4%i }, // char_lly\n", fi->char_lly[255]);
57
-
64
+
58
65
  fprintf(file, "\t{ // char_urx\n");
59
66
  for (i=0; i<255; i++) fprintf(file, "\t\t%4i, // %i\n", fi->char_urx[i], i);
60
67
  fprintf(file, "\t\t%4i }, // char_urx\n", fi->char_urx[255]);
61
-
68
+
62
69
  fprintf(file, "\t{ // char_ury\n");
63
70
  for (i=0; i<255; i++) fprintf(file, "\t\t%4i, // %i\n", fi->char_ury[i], i);
64
71
  fprintf(file, "\t\t%4i }, // char_ury\n", fi->char_ury[255]);
65
-
72
+
66
73
  fprintf(file, "\t%i, // flags\n", fi->flags);
67
74
  fprintf(file, "\t%i, // fnt_llx\n", fi->fnt_llx);
68
75
  fprintf(file, "\t%i, // fnt_lly\n", fi->fnt_lly);
@@ -77,12 +84,17 @@ static void Write_Font_Dictionary(FILE *file, Old_Font_Dictionary *fi) {
77
84
  fprintf(file, "} // %s\n", fi->font_name);
78
85
  }
79
86
 
80
- static void WriteFontDictsToFile(void) {
87
+
88
+ static void
89
+ WriteFontDictsToFile(void)
90
+ {
81
91
  Old_Font_Dictionary *font_info;
82
92
  FILE *file;
83
93
  file = fopen("pdf_font_dicts.c", "w");
84
- fprintf(file, "Font_Dict_Array font_dictionaries[] = { // afm info for PDF fonts \n");
85
- for (font_info = old_font_dictionaries; font_info != NULL; font_info = font_info->next) {
94
+ fprintf(file, "Font_Dict_Array font_dictionaries[]"
95
+ " = { // afm info for PDF fonts \n");
96
+ for (font_info = old_font_dictionaries; font_info != NULL;
97
+ font_info = font_info->next) {
86
98
  Write_Font_Dictionary(file, font_info);
87
99
  if (font_info->next != NULL) fprintf(file, ",\n");
88
100
  }
@@ -90,7 +102,9 @@ static void WriteFontDictsToFile(void) {
90
102
  fclose(file);
91
103
  }
92
104
 
93
- static void Record_Font_In_Use(Font_Dictionary *font_info, int font_number)
105
+
106
+ static void
107
+ Record_Font_In_Use(Font_Dictionary *font_info, int font_number)
94
108
  {
95
109
  if (font_info->in_use) return;
96
110
  font_info->afm->font_num = font_number;
@@ -102,11 +116,16 @@ static void Record_Font_In_Use(Font_Dictionary *font_info, int font_number)
102
116
  }
103
117
  }
104
118
 
119
+
105
120
  #define DEBUG 0
106
121
  #define MAXSTR 100
107
- static Font_Dictionary *GetFontDict(char *font_name, int font_number, int *ierr) {
122
+
123
+ static Font_Dictionary *
124
+ GetFontDict(char *font_name, int font_number, int *ierr)
125
+ {
108
126
  Font_Dictionary *font_info;
109
- for (font_info = font_dictionaries; font_info != NULL; font_info = font_info->next) {
127
+ for (font_info = font_dictionaries; font_info != NULL;
128
+ font_info = font_info->next) {
110
129
  if (strcmp(font_name, font_info->afm->font_name) == 0) {
111
130
  Record_Font_In_Use(font_info, font_number);
112
131
  return font_info;
@@ -116,38 +135,51 @@ static Font_Dictionary *GetFontDict(char *font_name, int font_number, int *ierr)
116
135
  return NULL;
117
136
  }
118
137
 
119
- static Font_Dictionary *GetFontInfo(int font_number, int *ierr)
138
+
139
+ static Font_Dictionary *
140
+ GetFontInfo(int font_number, int *ierr)
120
141
  {
121
142
  Font_Dictionary *f;
122
143
  for (f = font_dictionaries; f != NULL; f = f->next) {
123
- if (f->font_num == font_number) { Record_Font_In_Use(f, font_number); return f; }
144
+ if (f->font_num == font_number) {
145
+ Record_Font_In_Use(f, font_number);
146
+ return f;
147
+ }
124
148
  }
125
149
  if (font_number > 0 && font_number <= num_predefined_fonts)
126
150
  return GetFontDict(predefined_Fonts[font_number], font_number, ierr);
127
151
  return NULL;
128
152
  }
129
153
 
130
- OBJ_PTR c_register_font(OBJ_PTR fmkr, FM *p, char *font_name, int *ierr) {
154
+
155
+ OBJ_PTR
156
+ c_register_font(OBJ_PTR fmkr, FM *p, char *font_name, int *ierr)
157
+ {
131
158
  Font_Dictionary *f;
132
159
  int i;
133
160
  for (f = font_dictionaries; f != NULL; f = f->next) {
134
- if (strcmp(f->afm->font_name, font_name)==0) return f->afm->font_num;
161
+ if (strcmp(f->afm->font_name, font_name) == 0)
162
+ return Integer_New(f->afm->font_num);
135
163
  }
136
164
  for (i = 1; i <= num_predefined_fonts; i++) {
137
165
  if (strcmp(predefined_Fonts[i], font_name)==0) {
138
166
  f = GetFontDict(font_name, i, ierr);
139
- if (f == NULL) RAISE_ERROR_s("Error in reading font metrics for %s", font_name, ierr);
140
- return i;
167
+ if (f == NULL)
168
+ RAISE_ERROR_s("Error in reading font metrics for %s", font_name,
169
+ ierr);
170
+ return Integer_New(i);
141
171
  }
142
172
  }
143
173
  f = GetFontDict(font_name, next_available_font_number, ierr);
144
- if (f == NULL) RAISE_ERROR_s("Error in reading font metrics for %s", font_name, ierr);
174
+ if (f == NULL) RAISE_ERROR_s("Error in reading font metrics for %s",
175
+ font_name, ierr);
145
176
  next_available_font_number++;
146
177
  return Integer_New(next_available_font_number);
147
178
  }
148
179
 
149
180
 
150
- bool Used_Any_Fonts(void)
181
+ bool
182
+ Used_Any_Fonts(void)
151
183
  {
152
184
  Font_Dictionary *f;
153
185
  for (f = font_dictionaries; f != NULL; f = f->next) {
@@ -156,7 +188,9 @@ bool Used_Any_Fonts(void)
156
188
  return false;
157
189
  }
158
190
 
159
- void Clear_Fonts_In_Use_Flags(void)
191
+
192
+ void
193
+ Clear_Fonts_In_Use_Flags(void)
160
194
  {
161
195
  Font_Dictionary *f;
162
196
  for (f = font_dictionaries; f != NULL; f = f->next) {
@@ -164,22 +198,29 @@ void Clear_Fonts_In_Use_Flags(void)
164
198
  }
165
199
  }
166
200
 
167
- void Write_Font_Descriptors(void)
201
+
202
+ void
203
+ Write_Font_Descriptors(void)
168
204
  {
169
205
  Font_Dictionary *f;
170
206
  for (f = font_dictionaries; f != NULL; f = f->next) {
171
207
  if (!f->in_use || f->font_num <= num_pdf_standard_fonts) continue;
172
208
  Record_Object_Offset(f->descriptor_obj_num);
173
- fprintf(OF, "%i 0 obj << /Type /FontDescriptor /FontName /%s\n", f->descriptor_obj_num, f->afm->font_name);
209
+ fprintf(OF, "%i 0 obj << /Type /FontDescriptor /FontName /%s\n",
210
+ f->descriptor_obj_num, f->afm->font_name);
174
211
  fprintf(OF, " /Flags %i /FontBBox [ %i %i %i %i ]\n",
175
- f->afm->flags, f->afm->fnt_llx, f->afm->fnt_lly, f->afm->fnt_urx, f->afm->fnt_ury);
176
- fprintf(OF, " /ItalicAngle %i /Ascent %i /Descent %i /CapHeight %i /StemV %i\n",
177
- f->afm->italicAngle, f->afm->ascent, f->afm->descent, f->afm->capHeight, f->afm->stemV);
212
+ f->afm->flags, f->afm->fnt_llx, f->afm->fnt_lly, f->afm->fnt_urx,
213
+ f->afm->fnt_ury);
214
+ fprintf(OF, " /ItalicAngle %i /Ascent %i /Descent %i "
215
+ "/CapHeight %i /StemV %i\n", f->afm->italicAngle, f->afm->ascent,
216
+ f->afm->descent, f->afm->capHeight, f->afm->stemV);
178
217
  fprintf(OF, ">> endobj\n");
179
218
  }
180
219
  }
181
220
 
182
- void Write_Font_Widths(void)
221
+
222
+ void
223
+ Write_Font_Widths(void)
183
224
  {
184
225
  Font_Dictionary *f;
185
226
  int i, cnt = 0;
@@ -189,37 +230,49 @@ void Write_Font_Widths(void)
189
230
  fprintf(OF, "%i 0 obj [\n ", f->widths_obj_num);
190
231
  for (i = f->afm->firstChar; i <= f->afm->lastChar; i++) {
191
232
  fprintf(OF, "%i ", f->afm->char_width[i]);
192
- if (++cnt % 16 == 0) fprintf(OF, "\n ");
233
+ if (++cnt % 16 == 0) fprintf(OF, "\n ");
193
234
  }
194
235
  fprintf(OF, "\n] endobj\n");
195
236
  }
196
237
  }
197
238
 
198
- void Write_Font_Dictionaries(void)
239
+
240
+ void
241
+ Write_Font_Dictionaries(void)
199
242
  {
200
- if (0) WriteFontDictsToFile(); // creates pdf_font_dicts.c
243
+ if (0) WriteFontDictsToFile(); // creates pdf_font_dicts.c
201
244
  Font_Dictionary *f;
202
245
  for (f = font_dictionaries; f != NULL; f = f->next) {
203
246
  if (!f->in_use) continue;
204
247
  Record_Object_Offset(f->obj_num);
205
- fprintf(OF, "%i 0 obj << /Type /Font /Subtype /Type1 /BaseFont /%s", f->obj_num, f->afm->font_name);
206
- if (strcmp(f->afm->font_name,"Symbol")!=0 && strcmp(f->afm->font_name,"ZapfDingbats")!=0)
248
+ fprintf(OF, "%i 0 obj << /Type /Font /Subtype /Type1 /BaseFont /%s",
249
+ f->obj_num, f->afm->font_name);
250
+ if (strcmp(f->afm->font_name,"Symbol") != 0
251
+ && strcmp(f->afm->font_name,"ZapfDingbats") != 0)
207
252
  fprintf(OF, " /Encoding /MacRomanEncoding\n");
208
253
  else
209
254
  fprintf(OF, "\n");
210
255
  if (f->font_num > num_pdf_standard_fonts)
211
- fprintf(OF, " /FirstChar %i /LastChar %i /Widths %i 0 R /FontDescriptor %i 0 R\n",
212
- f->afm->firstChar, f->afm->lastChar, f->widths_obj_num, f->descriptor_obj_num);
256
+ fprintf(OF, " /FirstChar %i /LastChar %i /Widths %i 0 R "
257
+ "/FontDescriptor %i 0 R\n", f->afm->firstChar,
258
+ f->afm->lastChar, f->widths_obj_num, f->descriptor_obj_num);
213
259
  fprintf(OF, ">> endobj\n");
214
260
  }
215
261
  }
216
262
 
217
- static void GetStringInfo(FM *p, int font_number, unsigned char *text, double ft_ht,
218
- double *llx_ptr, double *lly_ptr, double *urx_ptr, double *ury_ptr, double *width_ptr, int *ierr) {
263
+
264
+ static void
265
+ GetStringInfo(FM *p, int font_number, unsigned char *text, double ft_ht,
266
+ double *llx_ptr, double *lly_ptr, double *urx_ptr,
267
+ double *ury_ptr, double *width_ptr, int *ierr)
268
+ {
219
269
  Font_Dictionary *fontinfo = GetFontInfo(font_number, ierr);
220
270
  if (*ierr != 0) return;
221
271
  if (fontinfo == NULL) {
222
- RAISE_ERROR_i("Sorry: invalid font number (%i): must register font before use it.", font_number, ierr); return; }
272
+ RAISE_ERROR_i("Sorry: invalid font number (%i): "
273
+ "must register font before use it.", font_number, ierr);
274
+ return;
275
+ }
223
276
  unsigned char *c_ptr = text, c;
224
277
  double width = 0, llx, lly, urx, ury;
225
278
  if (fontinfo == NULL || text == NULL || text[0] == '\0') {
@@ -240,89 +293,123 @@ static void GetStringInfo(FM *p, int font_number, unsigned char *text, double ft
240
293
  *llx_ptr = ft_ht * 1e-3 * llx;
241
294
  *lly_ptr = ft_ht * 1e-3 * lly;
242
295
  *ury_ptr = ft_ht * 1e-3 * ury;
243
- *urx_ptr = ft_ht * 1e-3 * (urx-70.0); // adjust for extra white space on right
296
+ *urx_ptr = ft_ht * 1e-3 * (urx - 70.0); // adjust for extra white
297
+ // space on right
244
298
  }
245
299
 
246
- OBJ_PTR c_marker_string_info(OBJ_PTR fmkr, FM *p, int fnt, unsigned char *text, double scale, int *ierr) {
247
- double ft_ht = p->default_text_scale * scale * p->default_font_size * ENLARGE;
300
+
301
+ OBJ_PTR
302
+ c_marker_string_info(OBJ_PTR fmkr, FM *p, int fnt, unsigned char *text,
303
+ double scale, int *ierr)
304
+ {
305
+ double ft_ht = (p->default_text_scale * scale * p->default_font_size
306
+ * ENLARGE);
248
307
  int ft_height = ROUND(ft_ht);
249
308
  ft_ht = ft_height;
250
309
  double llx, lly, urx, ury, width;
251
310
  GetStringInfo(p, fnt, text, ft_ht, &llx, &lly, &urx, &ury, &width, ierr);
252
311
  if (*ierr != 0) RETURN_NIL;
253
312
  OBJ_PTR result = Array_New(5);
254
- width = convert_output_to_figure_dx(p,width);
255
- llx = convert_output_to_figure_dx(p,llx);
256
- urx = convert_output_to_figure_dx(p,urx);
257
- lly = convert_output_to_figure_dy(p,lly);
258
- ury = convert_output_to_figure_dy(p,ury);
313
+ width = convert_output_to_figure_dx(p, width);
314
+ llx = convert_output_to_figure_dx(p, llx);
315
+ urx = convert_output_to_figure_dx(p, urx);
316
+ lly = convert_output_to_figure_dy(p, lly);
317
+ ury = convert_output_to_figure_dy(p, ury);
259
318
  Array_Store(result, 0, Float_New(width), ierr);
260
319
  Array_Store(result, 1, Float_New(llx), ierr);
261
320
  Array_Store(result, 2, Float_New(lly), ierr);
262
321
  Array_Store(result, 3, Float_New(urx), ierr);
263
322
  Array_Store(result, 4, Float_New(ury), ierr);
264
-
265
- return result;
323
+ return result;
266
324
  }
267
325
 
326
+
268
327
  #define TRANSFORM_VEC(dx,dy) tmp = dx; dx = (dx) * a + (dy) * c; dy = tmp * b + (dy) * d;
269
328
 
270
- static void c_rotated_string_at_points(
271
- OBJ_PTR fmkr, FM *p, double rotation, int font_number, unsigned char *text, double scale,
272
- int n, double *xs, double *ys, int alignment, int just,
273
- double horizontal_scaling, double vertical_scaling,
274
- double italic_angle, double ascent_angle, int *ierr)
329
+
330
+ static void
331
+ c_rotated_string_at_points(OBJ_PTR fmkr, FM *p, double rotation,
332
+ int font_number, unsigned char *text, double scale,
333
+ int n, double *xs, double *ys, int alignment,
334
+ int just, double horizontal_scaling,
335
+ double vertical_scaling, double italic_angle,
336
+ double ascent_angle, int *ierr)
275
337
  {
276
- double ft_ht = p->default_text_scale * scale * p->default_font_size * ENLARGE;
277
- int i, ft_height = ROUND(ft_ht), justification = just-1;
338
+ double ft_ht = (p->default_text_scale * scale * p->default_font_size
339
+ * ENLARGE);
340
+ int i, ft_height = ROUND(ft_ht), justification = just - 1;
278
341
  ft_ht = ft_height;
279
- if (constructing_path) { RAISE_ERROR("Sorry: must not be constructing a path when show marker", ierr); return; }
342
+ if (constructing_path) {
343
+ RAISE_ERROR("Sorry: must not be constructing a path when show marker",
344
+ ierr);
345
+ return;
346
+ }
280
347
  double llx, lly, urx, ury, width, shiftx, shifty, tmp;
281
- double a=horizontal_scaling, b=0.0, c=0.0, d=vertical_scaling; // the initial transform
282
- GetStringInfo(p, font_number, text, ft_ht, &llx, &lly, &urx, &ury, &width, ierr);
348
+ // the initial transform
349
+ double a = horizontal_scaling, b = 0.0, c = 0.0, d = vertical_scaling;
350
+ GetStringInfo(p, font_number, text, ft_ht, &llx, &lly, &urx, &ury, &width,
351
+ ierr);
283
352
  if (*ierr != 0) return;
284
353
  // translate according to justification and alignment
285
- // note that we use the bbox to calculate shifts so 'center' means center of bbox
354
+ // note that we use the bbox to calculate shifts so 'center' means
355
+ // center of bbox
286
356
  if (italic_angle != 0) {
287
357
  double skew = sin(italic_angle / RADIANS_TO_DEGREES);
288
- c -= skew*a; d -= skew*b;
358
+ c -= skew * a;
359
+ d -= skew * b;
289
360
  }
290
361
  if (ascent_angle != 0) {
291
362
  double skew = sin(ascent_angle / RADIANS_TO_DEGREES);
292
- a += skew*c; b += skew*d;
363
+ a += skew * c;
364
+ b += skew * d;
293
365
  }
294
366
  if (rotation != 0) {
295
367
  double xa, xb, xc, xd; // new transform
296
- double cs = cos(rotation / RADIANS_TO_DEGREES), sn = sin(rotation / RADIANS_TO_DEGREES);
297
- xa = cs*a + sn*c; xb = cs*b + sn*d; xc = -sn*a + cs*c; xd = -sn*b + cs*d;
298
- a = xa; b = xb; c = xc; d = xd;
368
+ double cs = cos(rotation / RADIANS_TO_DEGREES);
369
+ double sn = sin(rotation / RADIANS_TO_DEGREES);
370
+ xa = cs * a + sn * c;
371
+ xb = cs * b + sn * d;
372
+ xc = -sn * a + cs * c;
373
+ xd = -sn * b + cs * d;
374
+ a = xa;
375
+ b = xb;
376
+ c = xc;
377
+ d = xd;
299
378
  }
300
379
  switch (justification) {
301
- case LEFT_JUSTIFIED: shiftx = 0; break;
302
- case CENTERED: shiftx = -(urx+llx)/2; break; // CENTERED for marker means centered on BBOX
380
+ case LEFT_JUSTIFIED:
381
+ shiftx = 0; break;
382
+ case CENTERED: // CENTERED for marker means centered on BBOX
383
+ shiftx = -(urx + llx) / 2;
384
+ break;
303
385
  case RIGHT_JUSTIFIED:
304
386
  shiftx = -width;
305
- // the following hack compensates for Arrowhead bbox in ZaphDingbats
306
- // needed to make tip of arrowhead fall on the reference point correctly
307
- if (font_number == 14 && strlen((char *)text) == 1 && text[0] == 0344) {
387
+ // the following hack compensates for Arrowhead bbox in
388
+ // ZaphDingbats needed to make tip of arrowhead fall on the
389
+ // reference point correctly
390
+ if (font_number == 14 && strlen((char *)text) == 1
391
+ && text[0] == 0344) {
308
392
  shiftx *= 0.9;
309
393
  }
310
394
  break;
311
395
  default:
312
- RAISE_ERROR_i("Sorry: invalid setting for marker justification (%i)", justification, ierr);
396
+ RAISE_ERROR_i("Sorry: invalid setting for marker justification (%i)",
397
+ justification, ierr);
313
398
  return;
314
399
  }
315
400
  switch (alignment) {
316
401
  case ALIGNED_AT_TOP: shifty = -ury; break;
317
- case ALIGNED_AT_MIDHEIGHT: shifty = -(ury+lly)/2; break;
402
+ case ALIGNED_AT_MIDHEIGHT: shifty = -(ury + lly)/2; break;
318
403
  case ALIGNED_AT_BASELINE: shifty = 0; break;
319
404
  case ALIGNED_AT_BOTTOM: shifty = -lly; break;
320
405
  default:
321
- RAISE_ERROR_i("Sorry: invalid setting for marker alignment (%i)", alignment, ierr);
406
+ RAISE_ERROR_i("Sorry: invalid setting for marker alignment (%i)",
407
+ alignment, ierr);
322
408
  return;
323
409
  }
324
410
  // transform the bbox
325
- double llx2 = llx, lly2 = lly, urx2 = urx, ury2 = ury; // if we're rotated we'll need all 4 corners of bbox
411
+ // if we're rotated we'll need all 4 corners of bbox
412
+ double llx2 = llx, lly2 = lly, urx2 = urx, ury2 = ury;
326
413
  TRANSFORM_VEC(llx, lly)
327
414
  TRANSFORM_VEC(urx, ury)
328
415
  TRANSFORM_VEC(llx2, ury2)
@@ -330,22 +417,21 @@ static void c_rotated_string_at_points(
330
417
  TRANSFORM_VEC(shiftx, shifty)
331
418
  fprintf(TF, "BT /F%i %i Tf\n", font_number, ft_height);
332
419
  if (0 && horizontal_scaling != 1.0) {
333
- fprintf(TF, "%d Tz\n", ROUND(100*ABS(horizontal_scaling)));
420
+ fprintf(TF, "%d Tz\n", ROUND(100 * ABS(horizontal_scaling)));
334
421
  }
335
- double x, y, prev_x=0, prev_y=0, dx, dy;
336
- int idx, idy;
422
+ double x, y, prev_x = 0, prev_y = 0, dx, dy;
423
+ //int idx, idy;
337
424
  for (i = 0; i < n; i++) {
338
425
  unsigned char *cp = text, char_code;
339
- x = convert_figure_to_output_x(p,xs[i]) + shiftx;
340
- y = convert_figure_to_output_y(p,ys[i]) + shifty;
341
- if(!is_okay_number(x) || ! is_okay_number(y))
342
- continue; /* we forget this point if at least one coordinate is not
343
- 'real'
344
- */
345
- update_bbox(p,x+llx, y+lly);
346
- update_bbox(p,x+urx, y+ury);
347
- update_bbox(p,x+llx2, y+ury2);
348
- update_bbox(p,x+urx2, y+lly2);
426
+ x = convert_figure_to_output_x(p, xs[i]) + shiftx;
427
+ y = convert_figure_to_output_y(p, ys[i]) + shifty;
428
+ if(!is_okay_number(x) || !is_okay_number(y))
429
+ continue; // we forget this point if at least one coordinate
430
+ // is not 'real'
431
+ update_bbox(p, x + llx, y + lly);
432
+ update_bbox(p, x + urx, y + ury);
433
+ update_bbox(p, x + llx2, y + ury2);
434
+ update_bbox(p, x + urx2, y + lly2);
349
435
  dx = x - prev_x; dy = y - prev_y;
350
436
  //idx = ROUND(dx); idy = ROUND(dy);
351
437
  //prev_x = prev_x + idx; prev_y = prev_y + idy;
@@ -353,8 +439,10 @@ static void c_rotated_string_at_points(
353
439
  if (b == 0 && c == 0 && a == 1 && d == 1) {
354
440
  //fprintf(TF, "%i %i Td (", idx, idy);
355
441
  fprintf(TF, "%0.6f %0.6f Td (", dx, dy);
356
- } else { // need high precision when doing rotations
357
- fprintf(TF, "%0.6f %0.6f %0.6f %0.6f %0.6f %0.6f Tm (", a, b, c, d, x, y);
442
+ }
443
+ else { // need high precision when doing rotations
444
+ fprintf(TF, "%0.6f %0.6f %0.6f %0.6f %0.6f %0.6f Tm (",
445
+ a, b, c, d, x, y);
358
446
  }
359
447
  while ((char_code = *cp++) != '\0') {
360
448
  if (char_code == '\\')
@@ -369,19 +457,25 @@ static void c_rotated_string_at_points(
369
457
  fprintf(TF, "ET\n");
370
458
  }
371
459
 
372
- void c_private_show_marker(
373
- OBJ_PTR fmkr, FM *p, int int_args, OBJ_PTR stroke_width, OBJ_PTR string,
374
- OBJ_PTR x, OBJ_PTR y, OBJ_PTR x_vec, OBJ_PTR y_vec,
375
- double h_scale, double v_scale, double scale, double it_angle, double ascent_angle, double angle,
376
- OBJ_PTR fill_color, OBJ_PTR stroke_color, int *ierr) {
460
+
461
+ void
462
+ c_private_show_marker(OBJ_PTR fmkr, FM *p, int int_args,
463
+ OBJ_PTR stroke_width, OBJ_PTR string,
464
+ OBJ_PTR x, OBJ_PTR y, OBJ_PTR x_vec, OBJ_PTR y_vec,
465
+ double h_scale, double v_scale, double scale,
466
+ double it_angle, double ascent_angle, double angle,
467
+ OBJ_PTR fill_color, OBJ_PTR stroke_color, int *ierr)
468
+ {
377
469
  int c, alignment, justification, fnt_num, n, mode;
378
470
  unsigned char *text = NULL, buff[2];
379
471
  double *xs, *ys, xloc, yloc, prev_line_width = -1;
380
472
  bool restore_fill_color = false, restore_stroke_color = false;
381
- double stroke_color_R=0.0, stroke_color_G=0.0, stroke_color_B=0.0;
382
- double prev_stroke_color_R, prev_stroke_color_G, prev_stroke_color_B;
383
- double fill_color_R=0.0, fill_color_G=0.0, fill_color_B=0.0;
384
- double prev_fill_color_R, prev_fill_color_G, prev_fill_color_B;
473
+ double stroke_color_R = 0.0, stroke_color_G = 0.0, stroke_color_B = 0.0;
474
+ double prev_stroke_color_R = 0.0, prev_stroke_color_G = 0.0,
475
+ prev_stroke_color_B = 0.0;
476
+ double fill_color_R = 0.0, fill_color_G = 0.0, fill_color_B = 0.0;
477
+ double prev_fill_color_R = 0.0, prev_fill_color_G = 0.0,
478
+ prev_fill_color_B = 0.0;
385
479
  c = int_args / 100000; int_args -= c * 100000;
386
480
  fnt_num = int_args / 1000; int_args -= fnt_num * 1000;
387
481
  mode = int_args / 100; int_args -= mode * 100;
@@ -389,52 +483,58 @@ void c_private_show_marker(
389
483
  justification = int_args;
390
484
  if (string == OBJ_NIL) {
391
485
  if (c < 0 || c > 255) {
392
- RAISE_ERROR_i("Sorry: invalid character code (%i) : must be between 0 and 255", c, ierr);
486
+ RAISE_ERROR_i("Sorry: invalid character code (%i) : "
487
+ "must be between 0 and 255", c, ierr);
393
488
  return;
394
489
  }
395
- text = buff; text[0] = c; text[1] = '\0';
490
+ text = buff; text[0] = c; text[1] = '\0';
396
491
  if (stroke_width != OBJ_NIL) {
397
492
  double width = Number_to_double(stroke_width, ierr);
398
493
  if (*ierr != 0) return;
399
494
  prev_line_width = p->line_width; // restore it later
400
495
  fprintf(TF, "%0.6f w\n", width * ENLARGE);
401
496
  }
402
- } else {
403
- text = (unsigned char *)(String_Ptr(string,ierr));
497
+ }
498
+ else {
499
+ text = (unsigned char *)(String_Ptr(string, ierr));
404
500
  if (*ierr != 0) return;
405
501
  }
406
502
  fprintf(TF, "%d Tr\n", mode);
407
503
  if (stroke_color != OBJ_NIL &&
408
- (mode == STROKE || mode == FILL_AND_STROKE ||
409
- mode == STROKE_AND_CLIP || mode == FILL_STROKE_AND_CLIP)) {
410
- Unpack_RGB(stroke_color, &stroke_color_R, &stroke_color_G, &stroke_color_B, ierr);
411
- if (*ierr != 0) return;
412
- if (stroke_color_R != p->stroke_color_R ||
413
- stroke_color_G != p->stroke_color_G ||
414
- stroke_color_B != p->stroke_color_B) {
415
- prev_stroke_color_R = p->stroke_color_R;
416
- prev_stroke_color_G = p->stroke_color_G;
417
- prev_stroke_color_B = p->stroke_color_B;
418
- restore_stroke_color = true;
419
- c_stroke_color_set_RGB(fmkr, p, stroke_color_R, stroke_color_G, stroke_color_B, ierr);
420
- if (*ierr != 0) return;
421
- }
504
+ (mode == STROKE || mode == FILL_AND_STROKE
505
+ || mode == STROKE_AND_CLIP || mode == FILL_STROKE_AND_CLIP)) {
506
+ Unpack_RGB(stroke_color, &stroke_color_R, &stroke_color_G,
507
+ &stroke_color_B, ierr);
508
+ if (*ierr != 0) return;
509
+ if (stroke_color_R != p->stroke_color_R
510
+ || stroke_color_G != p->stroke_color_G
511
+ || stroke_color_B != p->stroke_color_B) {
512
+ prev_stroke_color_R = p->stroke_color_R;
513
+ prev_stroke_color_G = p->stroke_color_G;
514
+ prev_stroke_color_B = p->stroke_color_B;
515
+ restore_stroke_color = true;
516
+ c_stroke_color_set_RGB(fmkr, p, stroke_color_R, stroke_color_G,
517
+ stroke_color_B, ierr);
518
+ if (*ierr != 0) return;
519
+ }
422
520
  }
423
521
  if (fill_color != OBJ_NIL &&
424
- (mode == FILL || mode == FILL_AND_STROKE ||
425
- mode == FILL_AND_CLIP || mode == FILL_STROKE_AND_CLIP)) {
426
- Unpack_RGB(fill_color, &fill_color_R, &fill_color_G, &fill_color_B, ierr);
427
- if (*ierr != 0) return;
428
- if (fill_color_R != p->fill_color_R ||
429
- fill_color_G != p->fill_color_G ||
430
- fill_color_B != p->fill_color_B) {
431
- prev_fill_color_R = p->fill_color_R;
432
- prev_fill_color_G = p->fill_color_G;
433
- prev_fill_color_B = p->fill_color_B;
434
- restore_fill_color = true;
435
- c_fill_color_set_RGB(fmkr, p, fill_color_R, fill_color_G, fill_color_B, ierr);
436
- if (*ierr != 0) return;
437
- }
522
+ (mode == FILL || mode == FILL_AND_STROKE
523
+ || mode == FILL_AND_CLIP || mode == FILL_STROKE_AND_CLIP)) {
524
+ Unpack_RGB(fill_color, &fill_color_R, &fill_color_G, &fill_color_B,
525
+ ierr);
526
+ if (*ierr != 0) return;
527
+ if (fill_color_R != p->fill_color_R
528
+ || fill_color_G != p->fill_color_G
529
+ || fill_color_B != p->fill_color_B) {
530
+ prev_fill_color_R = p->fill_color_R;
531
+ prev_fill_color_G = p->fill_color_G;
532
+ prev_fill_color_B = p->fill_color_B;
533
+ restore_fill_color = true;
534
+ c_fill_color_set_RGB(fmkr, p, fill_color_R, fill_color_G,
535
+ fill_color_B, ierr);
536
+ if (*ierr != 0) return;
537
+ }
438
538
  }
439
539
  if (x == OBJ_NIL) {
440
540
  long xlen, ylen;
@@ -443,20 +543,27 @@ void c_private_show_marker(
443
543
  ys = Vector_Data_for_Read(y_vec, &ylen, ierr);
444
544
  if (*ierr != 0) return;
445
545
  if (xlen != ylen) {
446
- RAISE_ERROR("Sorry: must have same number xs and ys for showing markers", ierr); return; }
546
+ RAISE_ERROR("Sorry: must have same number xs and ys "
547
+ "for showing markers", ierr);
548
+ return;
549
+ }
447
550
  if (xlen <= 0) return;
448
551
  n = xlen;
449
- } else {
552
+ }
553
+ else {
450
554
  xloc = Number_to_double(x, ierr); xs = &xloc;
451
555
  yloc = Number_to_double(y, ierr); ys = &yloc;
452
556
  if (*ierr != 0) return;
453
557
  n = 1;
454
558
  }
455
559
  c_rotated_string_at_points(fmkr, p, angle, fnt_num, text, scale, n, xs, ys,
456
- alignment, justification, h_scale, v_scale, it_angle, ascent_angle, ierr);
560
+ alignment, justification, h_scale, v_scale,
561
+ it_angle, ascent_angle, ierr);
457
562
  if (prev_line_width >= 0) c_line_width_set(fmkr, p, prev_line_width, ierr);
458
563
  if (restore_fill_color)
459
- c_fill_color_set_RGB(fmkr, p, prev_fill_color_R, prev_fill_color_G, prev_fill_color_B, ierr);
460
- if (restore_stroke_color)
461
- c_stroke_color_set_RGB(fmkr, p, prev_stroke_color_R, prev_stroke_color_G, prev_stroke_color_B, ierr);
564
+ c_fill_color_set_RGB(fmkr, p, prev_fill_color_R, prev_fill_color_G,
565
+ prev_fill_color_B, ierr);
566
+ if (restore_stroke_color)
567
+ c_stroke_color_set_RGB(fmkr, p, prev_stroke_color_R, prev_stroke_color_G,
568
+ prev_stroke_color_B, ierr);
462
569
  }