Line data Source code
1 : /* -*- coding: utf-8 -*- */
2 : /* Copyright (C) 2007-2012 by George Williams */
3 : /*
4 : * Redistribution and use in source and binary forms, with or without
5 : * modification, are permitted provided that the following conditions are met:
6 :
7 : * Redistributions of source code must retain the above copyright notice, this
8 : * list of conditions and the following disclaimer.
9 :
10 : * Redistributions in binary form must reproduce the above copyright notice,
11 : * this list of conditions and the following disclaimer in the documentation
12 : * and/or other materials provided with the distribution.
13 :
14 : * The name of the author may not be used to endorse or promote products
15 : * derived from this software without specific prior written permission.
16 :
17 : * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
18 : * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19 : * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
20 : * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 : * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
22 : * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
23 : * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24 : * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
25 : * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
26 : * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 : */
28 : #include "autohint.h"
29 : #include "cvundoes.h"
30 : #include "dumppfa.h"
31 : #include "fontforgeui.h"
32 : #include "scstyles.h"
33 : #include <ustring.h>
34 : #include <utype.h>
35 : #include <gkeysym.h>
36 : #include <math.h>
37 :
38 : /* Code for various stylistic changes embolden/thin, condense/extend, oblique */
39 :
40 :
41 : /* ************************************************************************** */
42 : /* ***************************** Condense/Extend **************************** */
43 : /* ************************************************************************** */
44 :
45 0 : static void CVCondenseExtend(CharView *cv,struct counterinfo *ci) {
46 0 : SplineChar *sc = cv->b.sc;
47 :
48 0 : if ( cv->b.drawmode == dm_grid )
49 0 : return;
50 :
51 0 : SCCondenseExtend(ci, sc, CVLayer((CharViewBase *) cv),true);
52 :
53 0 : free( ci->zones[0]);
54 0 : free( ci->zones[1]);
55 : }
56 :
57 : typedef struct styledlg {
58 : int done;
59 : GWindow gw;
60 : CharView *cv;
61 : FontView *fv;
62 : SplineFont *sf;
63 : int layer;
64 : struct smallcaps *small;
65 : enum glyphchange_type gc;
66 : bigreal scale;
67 : } StyleDlg;
68 :
69 : #define CID_C_Factor 1001
70 : #define CID_C_Add 1002
71 : #define CID_SB_Factor 1003
72 : #define CID_SB_Add 1004
73 : #define CID_CorrectItalic 1005
74 :
75 : static struct counterinfo last_ci = {
76 : 90, 0, 90, 0, true,
77 : /* initializers below are dummy... will be set later */
78 : BLUEDATA_EMPTY, 0, NULL, 0, DBOUNDS_EMPTY, 0.0, 0.0, 0.0, 0,
79 : { 0, 0 }, /* cnts */
80 : { 0, 0 }, /* maxes */
81 : { NULL, NULL } /* zones */
82 : };
83 :
84 0 : static int CondenseExtend_OK(GGadget *g, GEvent *e) {
85 : struct counterinfo ci;
86 0 : int err = false;
87 :
88 0 : if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) {
89 0 : GWindow ew = GGadgetGetWindow(g);
90 0 : StyleDlg *ed = GDrawGetUserData(ew);
91 0 : memset(&ci,0,sizeof(ci));
92 0 : err = false;
93 0 : ci.c_factor = GetReal8(ew,CID_C_Factor,_("Counter Expansion Factor"),&err);
94 0 : ci.c_add = GetReal8(ew,CID_C_Add,_("Counter Addition"),&err);
95 0 : ci.sb_factor = GetReal8(ew,CID_SB_Factor,_("Side Bearing Expansion Factor"),&err);
96 0 : ci.sb_add = GetReal8(ew,CID_SB_Add,_("Side Bearing Addition"),&err);
97 0 : ci.correct_italic= GGadgetIsChecked( GWidgetGetControl(ew,CID_CorrectItalic));
98 0 : if ( err )
99 0 : return( true );
100 :
101 0 : last_ci = ci;
102 :
103 0 : CI_Init(&ci,ed->sf);
104 0 : if ( ed->fv!=NULL )
105 0 : FVCondenseExtend((FontViewBase *) ed->fv, &ci);
106 : else
107 0 : CVCondenseExtend(ed->cv, &ci);
108 0 : ed->done = true;
109 : }
110 0 : return( true );
111 : }
112 :
113 0 : static int CondenseExtend_Cancel(GGadget *g, GEvent *e) {
114 0 : if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) {
115 0 : StyleDlg *ed = GDrawGetUserData(GGadgetGetWindow(g));
116 0 : ed->done = true;
117 : }
118 0 : return( true );
119 : }
120 :
121 0 : static int style_e_h(GWindow gw, GEvent *event) {
122 0 : if ( event->type==et_close ) {
123 0 : StyleDlg *ed = GDrawGetUserData(gw);
124 0 : ed->done = true;
125 0 : } else if ( event->type == et_char ) {
126 0 : if ( event->u.chr.keysym == GK_F1 || event->u.chr.keysym == GK_Help ) {
127 0 : help("Styles.html");
128 0 : return( true );
129 : }
130 0 : return( false );
131 : }
132 0 : return( true );
133 : }
134 :
135 0 : void CondenseExtendDlg(FontView *fv, CharView *cv) {
136 : StyleDlg ed;
137 0 : SplineFont *sf = fv!=NULL ? fv->b.sf : cv->b.sc->parent;
138 : GRect pos;
139 : GWindow gw;
140 : GWindowAttrs wattrs;
141 : GGadgetCreateData gcd[15], boxes[6], *barray[8], *hvarray[31];
142 : GTextInfo label[15];
143 : int k;
144 : char c_factor[40], c_add[40], sb_factor[40], sb_add[40];
145 :
146 0 : memset(&ed,0,sizeof(ed));
147 0 : ed.fv = fv;
148 0 : ed.cv = cv;
149 0 : ed.sf = sf;
150 :
151 0 : memset(&wattrs,0,sizeof(wattrs));
152 0 : wattrs.mask = wam_events|wam_cursor|wam_utf8_wtitle|wam_undercursor|wam_isdlg|wam_restrict;
153 0 : wattrs.event_masks = ~(1<<et_charup);
154 0 : wattrs.restrict_input_to_me = 1;
155 0 : wattrs.undercursor = 1;
156 0 : wattrs.cursor = ct_pointer;
157 0 : wattrs.utf8_window_title = _("Condense/Extend");
158 0 : wattrs.is_dlg = true;
159 0 : pos.x = pos.y = 0;
160 0 : pos.width = 100;
161 0 : pos.height = 100;
162 0 : ed.gw = gw = GDrawCreateTopWindow(NULL,&pos,style_e_h,&ed,&wattrs);
163 :
164 :
165 0 : k=0;
166 :
167 0 : memset(gcd,0,sizeof(gcd));
168 0 : memset(boxes,0,sizeof(boxes));
169 0 : memset(label,0,sizeof(label));
170 :
171 0 : hvarray[0] = GCD_Glue;
172 :
173 0 : label[k].text = (unichar_t *) _("Scale By");
174 0 : label[k].text_is_1byte = true;
175 0 : label[k].text_in_resource = true;
176 0 : gcd[k].gd.label = &label[k];
177 0 : gcd[k].gd.flags = gg_enabled | gg_visible;
178 0 : gcd[k++].creator = GLabelCreate;
179 0 : hvarray[1] = &gcd[k-1];
180 0 : hvarray[2] = GCD_Glue;
181 :
182 0 : label[k].text = (unichar_t *) _("Add");
183 0 : label[k].text_is_1byte = true;
184 0 : label[k].text_in_resource = true;
185 0 : gcd[k].gd.label = &label[k];
186 0 : gcd[k].gd.flags = gg_enabled | gg_visible;
187 0 : gcd[k++].creator = GLabelCreate;
188 0 : hvarray[3] = &gcd[k-1];
189 0 : hvarray[4] = NULL;
190 :
191 0 : label[k].text = (unichar_t *) _("Counters:");
192 0 : label[k].text_is_1byte = true;
193 0 : label[k].text_in_resource = true;
194 0 : gcd[k].gd.label = &label[k];
195 0 : gcd[k].gd.flags = gg_enabled | gg_visible;
196 0 : gcd[k++].creator = GLabelCreate;
197 0 : hvarray[5] = &gcd[k-1];
198 :
199 0 : sprintf( c_factor, "%g", last_ci.c_factor );
200 0 : label[k].text = (unichar_t *) c_factor;
201 0 : label[k].text_is_1byte = true;
202 0 : gcd[k].gd.label = &label[k];
203 0 : gcd[k].gd.pos.width = 60;
204 0 : gcd[k].gd.flags = gg_enabled | gg_visible;
205 0 : gcd[k].gd.cid = CID_C_Factor;
206 0 : gcd[k++].creator = GNumericFieldCreate;
207 0 : hvarray[6] = &gcd[k-1];
208 :
209 0 : label[k].text = (unichar_t *) " % + ";
210 0 : label[k].text_is_1byte = true;
211 0 : label[k].text_in_resource = true;
212 0 : gcd[k].gd.label = &label[k];
213 0 : gcd[k].gd.flags = gg_enabled | gg_visible;
214 0 : gcd[k++].creator = GLabelCreate;
215 0 : hvarray[7] = &gcd[k-1];
216 :
217 0 : sprintf( c_add, "%g", last_ci.c_add );
218 0 : label[k].text = (unichar_t *) c_add;
219 0 : label[k].text_is_1byte = true;
220 0 : gcd[k].gd.label = &label[k];
221 0 : gcd[k].gd.pos.width = 60;
222 0 : gcd[k].gd.flags = gg_enabled | gg_visible;
223 0 : gcd[k].gd.cid = CID_C_Add;
224 0 : gcd[k++].creator = GNumericFieldCreate;
225 0 : hvarray[8] = &gcd[k-1];
226 0 : hvarray[9] = NULL;
227 :
228 0 : label[k].text = (unichar_t *) _("Side Bearings:");
229 0 : label[k].text_is_1byte = true;
230 0 : label[k].text_in_resource = true;
231 0 : gcd[k].gd.label = &label[k];
232 0 : gcd[k].gd.flags = gg_enabled | gg_visible;
233 0 : gcd[k++].creator = GLabelCreate;
234 0 : hvarray[10] = &gcd[k-1];
235 :
236 0 : sprintf( sb_factor, "%g", last_ci.sb_factor );
237 0 : label[k].text = (unichar_t *) sb_factor;
238 0 : label[k].text_is_1byte = true;
239 0 : gcd[k].gd.label = &label[k];
240 0 : gcd[k].gd.pos.width = 60;
241 0 : gcd[k].gd.flags = gg_enabled | gg_visible;
242 0 : gcd[k].gd.cid = CID_SB_Factor;
243 0 : gcd[k++].creator = GNumericFieldCreate;
244 0 : hvarray[11] = &gcd[k-1];
245 :
246 0 : label[k].text = (unichar_t *) " % + ";
247 0 : label[k].text_is_1byte = true;
248 0 : label[k].text_in_resource = true;
249 0 : gcd[k].gd.label = &label[k];
250 0 : gcd[k].gd.flags = gg_enabled | gg_visible;
251 0 : gcd[k++].creator = GLabelCreate;
252 0 : hvarray[12] = &gcd[k-1];
253 :
254 0 : sprintf( sb_add, "%g", last_ci.sb_add );
255 0 : label[k].text = (unichar_t *) sb_add;
256 0 : label[k].text_is_1byte = true;
257 0 : gcd[k].gd.label = &label[k];
258 0 : gcd[k].gd.pos.width = 60;
259 0 : gcd[k].gd.flags = gg_enabled | gg_visible;
260 0 : gcd[k].gd.cid = CID_SB_Add;
261 0 : gcd[k++].creator = GNumericFieldCreate;
262 0 : hvarray[13] = &gcd[k-1];
263 0 : hvarray[14] = NULL;
264 :
265 0 : label[k].text = (unichar_t *) _("Correct for Italic Angle");
266 0 : label[k].text_is_1byte = true;
267 0 : label[k].text_in_resource = true;
268 0 : gcd[k].gd.label = &label[k];
269 0 : gcd[k].gd.flags = gg_enabled | gg_visible | gg_utf8_popup | (last_ci.correct_italic?gg_cb_on:0);
270 0 : gcd[k].gd.cid = CID_CorrectItalic;
271 0 : gcd[k].gd.popup_msg = (unichar_t *) _("When FontForge detects that an expanded stroke will self-intersect,\nthen setting this option will cause it to try to make things nice\nby removing the intersections");
272 0 : gcd[k++].creator = GCheckBoxCreate;
273 0 : hvarray[15] = &gcd[k-1];
274 0 : hvarray[16] = hvarray[17] = hvarray[18] = GCD_ColSpan; hvarray[19] = NULL;
275 0 : if ( sf->italicangle==0 )
276 0 : gcd[k-1].gd.flags = ~gg_enabled;
277 :
278 0 : hvarray[20] = hvarray[21] = hvarray[22] = hvarray[23] = GCD_ColSpan; hvarray[24] = NULL;
279 :
280 0 : gcd[k].gd.pos.x = 30-3; gcd[k].gd.pos.y = 5;
281 0 : gcd[k].gd.pos.width = -1;
282 0 : gcd[k].gd.flags = gg_visible | gg_enabled | gg_but_default;
283 0 : label[k].text = (unichar_t *) _("_OK");
284 0 : label[k].text_is_1byte = true;
285 0 : label[k].text_in_resource = true;
286 0 : gcd[k].gd.label = &label[k];
287 0 : gcd[k].gd.handle_controlevent = CondenseExtend_OK;
288 0 : gcd[k++].creator = GButtonCreate;
289 0 : barray[0] = GCD_Glue; barray[1] = &gcd[k-1]; barray[2] = GCD_Glue;
290 :
291 0 : gcd[k].gd.pos.x = -30; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+3;
292 0 : gcd[k].gd.pos.width = -1;
293 0 : gcd[k].gd.flags = gg_visible | gg_enabled | gg_but_cancel;
294 0 : label[k].text = (unichar_t *) _("_Cancel");
295 0 : label[k].text_is_1byte = true;
296 0 : label[k].text_in_resource = true;
297 0 : gcd[k].gd.label = &label[k];
298 0 : gcd[k].gd.handle_controlevent = CondenseExtend_Cancel;
299 0 : gcd[k].creator = GButtonCreate;
300 0 : barray[3] = GCD_Glue; barray[4] = &gcd[k]; barray[5] = GCD_Glue;
301 0 : barray[6] = NULL;
302 :
303 0 : boxes[3].gd.flags = gg_enabled|gg_visible;
304 0 : boxes[3].gd.u.boxelements = barray;
305 0 : boxes[3].creator = GHBoxCreate;
306 0 : hvarray[25] = &boxes[3];
307 0 : hvarray[26] = hvarray[27] = hvarray[28] = GCD_ColSpan; hvarray[29] = NULL;
308 0 : hvarray[30] = NULL;
309 :
310 0 : boxes[0].gd.pos.x = boxes[0].gd.pos.y = 2;
311 0 : boxes[0].gd.flags = gg_enabled|gg_visible;
312 0 : boxes[0].gd.u.boxelements = hvarray;
313 0 : boxes[0].creator = GHVGroupCreate;
314 :
315 0 : GGadgetsCreate(gw,boxes);
316 0 : GHVBoxSetExpandableRow(boxes[0].ret,gb_expandglue);
317 0 : GHVBoxSetExpandableCol(boxes[3].ret,gb_expandgluesame);
318 0 : GHVBoxFitWindow(boxes[0].ret);
319 0 : GDrawSetVisible(gw,true);
320 :
321 0 : while ( !ed.done )
322 0 : GDrawProcessOneEvent(NULL);
323 0 : GDrawDestroyWindow(gw);
324 0 : }
325 :
326 : /* ************************************************************************** */
327 : /* ************************* Generic Change Dialog ************************** */
328 : /* ************************************************************************** */
329 :
330 : #undef CID_Letter_Ext
331 : #undef CID_Symbol_Ext
332 : #undef CID_Symbols_Too
333 :
334 : #undef CID_HScale
335 : #undef CID_VScale
336 :
337 : #define CID_Feature 1001
338 : #define CID_Extension 1002
339 : #define CID_StemsUniform 1003
340 : #define CID_Stems_H_V 1004
341 : #define CID_Stems_by_Width 1005
342 : #define CID_StemThreshold 1006
343 : #define CID_StemHeight 1007
344 : #define CID_StemHeightLabel 1008
345 : #define CID_StemWidth 1009
346 : #define CID_StemWidthLabel 1010
347 : #define CID_StemHeightAdd 1011
348 : #define CID_StemWidthAdd 1012
349 : #define CID_DStemOn 1013
350 :
351 : #define CID_Counter_SameAdvance 1020
352 : #define CID_Counter_PropAdvance 1021
353 : #define CID_Counter_is_SideB 1022
354 : #define CID_Counter_isnt_SideB 1023
355 : #define CID_CounterPercent 1024
356 : #define CID_CounterAdd 1025
357 : #define CID_LSBPercent 1026
358 : #define CID_LSBAdd 1027
359 : #define CID_RSBPercent 1028
360 : #define CID_RSBAdd 1029
361 :
362 : #define CID_UseVerticalCounters 1040
363 : #define CID_VCounterPercent 1041
364 : #define CID_VCounterAdd 1042
365 : #define CID_UseVerticalMappings 1043
366 : #define CID_VerticalScale 1044
367 : #define CID_VMappings 1045
368 :
369 : #define CID_VerticalOff 1060
370 :
371 : #define CID_Letter_Ext 1081
372 : #define CID_Symbol_Ext 1082
373 : #define CID_Symbols_Too 1083
374 : #define CID_SmallCaps 1084
375 : #define CID_PetiteCaps 1085
376 :
377 : #define CID_TabSet 1100
378 :
379 : static GTextInfo ss_features[] = {
380 : { (unichar_t *) N_("Superscript"), NULL, 0, 0, (void *) CHR('s','u','p','s'), NULL, 0, 0, 0, 0, 0, 0, 1, 0, 0, '\0'},
381 : { (unichar_t *) N_("Scientific Inferiors"), NULL, 0, 0, (void *) CHR('s','i','n','f'), NULL, 0, 0, 0, 0, 0, 0, 1, 0, 0, '\0'},
382 : { (unichar_t *) N_("Subscript"), NULL, 0, 0, (void *) CHR('s','u','b','s'), NULL, 0, 0, 0, 0, 0, 0, 1, 0, 0, '\0'},
383 : { (unichar_t *) N_("Denominators"), NULL, 0, 0, (void *) CHR('d','n','o','m'), NULL, 0, 0, 0, 0, 0, 0, 1, 0, 0, '\0'},
384 : { (unichar_t *) N_("Numerators"), NULL, 0, 0, (void *) CHR('n','u','m','r'), NULL, 0, 0, 0, 0, 0, 0, 1, 0, 0, '\0'},
385 : GTEXTINFO_EMPTY
386 : };
387 : /* Not translated */
388 : static char *ss_extensions[] = {
389 : "superior",
390 : "inferior",
391 : "subscript",
392 : "denominator",
393 : "numerator",
394 : NULL
395 : };
396 : static int ss_percent_xh_up[] = {
397 : 90,
398 : -100,
399 : -70,
400 : -50,
401 : 50
402 : };
403 :
404 0 : static double GuessStemThreshold(SplineFont *sf) {
405 0 : double stdvw = 0, stdhw = 0, avg;
406 : char *ret;
407 :
408 0 : if ( sf->private!=NULL ) {
409 0 : if ((ret=PSDictHasEntry(sf->private,"StdVW"))!=NULL ) {
410 0 : if ( ret[0] == '[' ) ret++;
411 0 : stdvw = strtod(ret,NULL);
412 : }
413 0 : if ((ret=PSDictHasEntry(sf->private,"StdHW"))!=NULL ) {
414 0 : if ( ret[0] == '[' ) ret++;
415 0 : stdhw = strtod(ret,NULL);
416 : }
417 : }
418 0 : avg = (stdvw + stdhw)/2;
419 0 : if ( avg<=0 )
420 0 : avg = (sf->ascent+sf->descent)/25;
421 0 : return( avg );
422 : }
423 :
424 0 : static int SS_Feature_Changed(GGadget *g, GEvent *e) {
425 :
426 0 : if ( e->type==et_controlevent && e->u.control.subtype == et_textchanged &&
427 0 : e->u.control.u.tf_changed.from_pulldown!=-1 ) {
428 0 : GWindow ew = GGadgetGetWindow(g);
429 0 : StyleDlg *ed = GDrawGetUserData(ew);
430 0 : int index = e->u.control.u.tf_changed.from_pulldown;
431 0 : uint32 tag = (intpt) ss_features[index].userdata;
432 : char tagbuf[5], offset[40];
433 :
434 0 : tagbuf[0] = tag>>24; tagbuf[1] = tag>>16; tagbuf[2] = tag>>8; tagbuf[3] = tag; tagbuf[4] = 0;
435 0 : GGadgetSetTitle8(g,tagbuf);
436 0 : GGadgetSetTitle8(GWidgetGetControl(ew,CID_Extension), ss_extensions[index]);
437 :
438 0 : sprintf( offset, "%g", rint( ed->small->xheight*ss_percent_xh_up[index]/100.0 ));
439 0 : GGadgetSetTitle8(GWidgetGetControl(ew,CID_VerticalOff), offset);
440 : }
441 0 : return( true );
442 : }
443 :
444 0 : static int GlyphChange_OK(GGadget *g, GEvent *e) {
445 0 : int err = false;
446 :
447 0 : if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) {
448 0 : GWindow ew = GGadgetGetWindow(g);
449 0 : StyleDlg *ed = GDrawGetUserData(ew);
450 : struct genericchange genchange;
451 0 : int stem_xy_same = GGadgetIsChecked(GWidgetGetControl(ew,CID_StemsUniform));
452 0 : int stem_bywidth = GGadgetIsChecked(GWidgetGetControl(ew,CID_Stems_by_Width));
453 0 : enum glyphchange_type gc = ed->gc;
454 :
455 0 : memset(&genchange,0,sizeof(genchange));
456 0 : genchange.gc = gc;
457 0 : genchange.small = ed->small;
458 0 : genchange.stem_height_scale = GetReal8(ew,CID_StemHeight,_("Horizontal Stem Height Scale"),&err)/100.;
459 0 : genchange.stem_height_add = GetReal8(ew,CID_StemHeightAdd,_("Horizontal Stem Height Add"),&err);
460 0 : genchange.stem_threshold = stem_bywidth ? GetReal8(ew,CID_StemThreshold,_("Threshold between Thin and Thick Stems"),&err) : 0;
461 0 : if ( stem_xy_same ) {
462 0 : genchange.stem_width_scale = genchange.stem_height_scale;
463 0 : genchange.stem_width_add = genchange.stem_height_add;
464 : } else {
465 0 : genchange.stem_width_scale = GetReal8(ew,CID_StemWidth,_("Vertical Stem Width Scale"),&err)/100.;
466 0 : genchange.stem_width_add = stem_bywidth ? genchange.stem_height_add : GetReal8(ew,CID_StemWidthAdd,_("Vertical Stem Width Add"),&err);
467 : }
468 0 : genchange.dstem_control = GGadgetIsChecked(GWidgetGetControl(ew,CID_DStemOn));
469 0 : if ( err )
470 0 : return( true );
471 0 : if (stem_bywidth && genchange.stem_threshold <= 0)
472 0 : ff_post_error(_("Unlikely stem threshold"), _("Stem threshold should be positive"));
473 0 : if ( genchange.stem_width_scale<.03 || genchange.stem_width_scale>10 ||
474 0 : genchange.stem_height_scale<.03 || genchange.stem_height_scale>10 ) {
475 0 : ff_post_error(_("Unlikely scale factor"), _("Scale factors must be between 3 and 1000 percent"));
476 0 : return( true );
477 : }
478 0 : if ( genchange.stem_height_add!=genchange.stem_width_add ) {
479 0 : if (( genchange.stem_height_add==0 && genchange.stem_width_add!=0 ) ||
480 0 : ( genchange.stem_height_add!=0 && genchange.stem_width_add==0 )) {
481 0 : ff_post_error(_("Bad stem add"), _("The horizontal and vertical stem add amounts must either both be zero, or neither may be 0"));
482 0 : return( true );
483 : }
484 : /* if width_add has a different sign than height_add that's also */
485 : /* a problem, but this test will catch that too */
486 0 : if (( genchange.stem_height_add/genchange.stem_width_add>4 ) ||
487 0 : ( genchange.stem_height_add/genchange.stem_width_add<.25 )) {
488 0 : ff_post_error(_("Bad stem add"), _("The horizontal and vertical stem add amounts may not differ by more than a factor of 4"));
489 0 : return( true );
490 : }
491 : }
492 0 : if ( gc==gc_subsuper ) {
493 0 : const unichar_t *tag_str = _GGadgetGetTitle(GWidgetGetControl(ew,CID_Feature));
494 : char tag[4];
495 :
496 0 : memset(tag,' ',sizeof(tag));
497 0 : if ( *tag_str=='\0' )
498 0 : genchange.feature_tag = 0; /* Perfectly valid to have no tag */
499 : else {
500 0 : tag[0] = *tag_str;
501 0 : if ( tag_str[1]!='\0' ) {
502 0 : tag[1] = tag_str[1];
503 0 : if ( tag_str[2]!='\0' ) {
504 0 : tag[2] = tag_str[2];
505 0 : if ( tag_str[3]!='\0' ) {
506 0 : tag[3] = tag_str[3];
507 0 : if ( tag_str[4]!='\0' ) {
508 0 : ff_post_error(_("Bad tag"), _("Feature tags are limited to 4 letters"));
509 0 : return( true );
510 : }
511 : }
512 : }
513 : }
514 0 : genchange.feature_tag = (tag[0]<<24) | (tag[1]<<16) | (tag[2]<<8) | tag[3];
515 : }
516 0 : genchange.glyph_extension = GGadgetGetTitle8(GWidgetGetControl(ew,CID_Extension));
517 0 : if ( *genchange.glyph_extension=='\0' ) {
518 0 : ff_post_error(_("Missing glyph extension"),_("You must specify a glyph extension"));
519 0 : free(genchange.glyph_extension);
520 0 : return( true );
521 : }
522 0 : genchange.vertical_offset = GetReal8(ew,CID_VerticalOff,_("Vertical Offset"),&err);
523 0 : if ( err )
524 0 : return( true );
525 0 : } else if ( gc==gc_smallcaps ) {
526 0 : genchange.do_smallcap_symbols = GGadgetIsChecked(GWidgetGetControl(ew,CID_Symbols_Too));
527 0 : genchange.petite = GGadgetIsChecked(GWidgetGetControl(ew,CID_PetiteCaps));
528 0 : genchange.extension_for_letters = GGadgetGetTitle8(GWidgetGetControl(ew,CID_Letter_Ext));
529 0 : genchange.extension_for_symbols = GGadgetGetTitle8(GWidgetGetControl(ew,CID_Symbol_Ext));
530 0 : if ( *genchange.extension_for_letters=='\0' || (*genchange.extension_for_symbols=='\0' && genchange.do_smallcap_symbols )) {
531 0 : free( genchange.extension_for_letters );
532 0 : free( genchange.extension_for_symbols );
533 0 : ff_post_error(_("Missing extension"),_("You must provide a glyph extension"));
534 0 : return( true );
535 : }
536 : }
537 :
538 0 : if (GGadgetIsChecked(GWidgetGetControl(ew,CID_Counter_SameAdvance)))
539 0 : genchange.center_in_hor_advance = 1;
540 0 : else if (GGadgetIsChecked(GWidgetGetControl(ew,CID_Counter_PropAdvance)))
541 0 : genchange.center_in_hor_advance = 2;
542 : else
543 0 : genchange.center_in_hor_advance = 0;
544 0 : genchange.hcounter_scale = GetReal8(ew,CID_CounterPercent,_("Horizontal Counter Scale"),&err)/100.;
545 0 : genchange.hcounter_add = GetReal8(ew,CID_CounterAdd,_("Horizontal Counter Add"),&err);
546 0 : if ( GGadgetIsChecked(GWidgetGetControl(ew,CID_Counter_is_SideB)) ) {
547 0 : genchange.lsb_scale = genchange.hcounter_scale;
548 0 : genchange.lsb_add = genchange.hcounter_add;
549 0 : genchange.rsb_scale = genchange.hcounter_scale;
550 0 : genchange.rsb_add = genchange.hcounter_add;
551 : } else {
552 0 : genchange.lsb_scale = GetReal8(ew,CID_LSBPercent,_("Left Side Bearing Scale"),&err)/100.;
553 0 : genchange.lsb_add = GetReal8(ew,CID_LSBAdd,_("Left Side Bearing Add"),&err);
554 0 : genchange.rsb_scale = GetReal8(ew,CID_RSBPercent,_("Right Side Bearing Scale"),&err)/100.;
555 0 : genchange.rsb_add = GetReal8(ew,CID_RSBAdd,_("Right Side Bearing Add"),&err);
556 : }
557 0 : if ( err )
558 0 : return( true );
559 :
560 0 : genchange.use_vert_mapping = GGadgetIsChecked(GWidgetGetControl(ew,CID_UseVerticalMappings));
561 0 : if ( genchange.use_vert_mapping ) {
562 0 : GGadget *map = GWidgetGetControl(ew,CID_VMappings);
563 : int i,j;
564 0 : int rows, cols = GMatrixEditGetColCnt(map);
565 0 : struct matrix_data *mappings = GMatrixEditGet(map, &rows);
566 :
567 0 : genchange.v_scale = GetReal8(ew,CID_VerticalScale,_("Vertical Scale"),&err)/100.;
568 0 : if ( err )
569 0 : return( true );
570 0 : genchange.m.cnt = rows;
571 0 : genchange.m.maps = malloc(rows*sizeof(struct position_maps));
572 0 : for ( i=0; i<rows; ++i ) {
573 0 : genchange.m.maps[i].current = mappings[cols*i+0].u.md_real;
574 0 : genchange.m.maps[i].desired = mappings[cols*i+2].u.md_real;
575 0 : genchange.m.maps[i].cur_width = mappings[cols*i+1].u.md_real;
576 : }
577 : /* Order maps */
578 0 : for ( i=0; i<rows; ++i ) for ( j=i+1; j<rows; ++j ) {
579 0 : if ( genchange.m.maps[i].current > genchange.m.maps[j].current ) {
580 : struct position_maps temp;
581 0 : temp = genchange.m.maps[i];
582 0 : genchange.m.maps[i] = genchange.m.maps[j];
583 0 : genchange.m.maps[j] = temp;
584 : }
585 : }
586 : } else {
587 0 : genchange.vcounter_scale = GetReal8(ew,CID_VCounterPercent,_("Vertical Counter Scale"),&err)/100.;
588 0 : genchange.vcounter_add = GetReal8(ew,CID_VCounterAdd,_("Vertical Counter Add"),&err);
589 0 : if ( err )
590 0 : return( true );
591 : }
592 0 : if ( ed->gc == gc_smallcaps )
593 0 : FVAddSmallCaps( (FontViewBase *) ed->fv, &genchange );
594 0 : else if ( ed->fv!=NULL )
595 0 : FVGenericChange( (FontViewBase *) ed->fv, &genchange );
596 : else
597 0 : CVGenericChange( (CharViewBase *) ed->cv, &genchange );
598 0 : free(genchange.glyph_extension);
599 0 : free(genchange.m.maps);
600 0 : free( genchange.extension_for_letters );
601 0 : free( genchange.extension_for_symbols );
602 0 : ed->done = true;
603 : }
604 0 : return( true );
605 : }
606 :
607 : static GTextInfo stemwidth[] = {
608 : { (unichar_t *) N_("Width of Vertical Stems:"), NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 1, 0, 0, '\0'},
609 : { (unichar_t *) N_("Width/Height of Thick Stems:"), NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 1, 0, 0, '\0'},
610 : GTEXTINFO_EMPTY
611 : };
612 : static GTextInfo stemheight[] = {
613 : { (unichar_t *) N_("Height of Horizontal Stems:"), NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 1, 0, 0, '\0'},
614 : { (unichar_t *) N_("Width/Height of Thin Stems:"), NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 1, 0, 0, '\0'},
615 : GTEXTINFO_EMPTY
616 : };
617 :
618 0 : static int CG_SameAs_Changed(GGadget *g, GEvent *e) {
619 :
620 0 : if ( e==NULL || (e->type==et_controlevent && e->u.control.subtype == et_radiochanged )) {
621 0 : GWindow ew = GGadgetGetWindow(g);
622 0 : int uniform = GGadgetIsChecked(GWidgetGetControl(ew,CID_StemsUniform));
623 0 : int by_dir = GGadgetIsChecked(GWidgetGetControl(ew,CID_Stems_H_V));
624 0 : int by_width = GGadgetIsChecked(GWidgetGetControl(ew,CID_Stems_by_Width));
625 0 : unichar_t *v_label = by_width ? stemwidth[1].text : stemwidth[0].text;
626 0 : unichar_t *h_label = by_width ? stemheight[1].text : stemheight[0].text;
627 :
628 0 : GGadgetSetEnabled(GWidgetGetControl(ew,CID_StemWidth), !uniform);
629 0 : GGadgetSetEnabled(GWidgetGetControl(ew,CID_StemWidthAdd), by_dir);
630 0 : GGadgetSetEnabled(GWidgetGetControl(ew,CID_StemThreshold), by_width);
631 0 : if ( uniform ) {
632 0 : GGadgetSetTitle(GWidgetGetControl(ew,CID_StemWidth),
633 0 : _GGadgetGetTitle(GWidgetGetControl(ew,CID_StemHeight)));
634 0 : GGadgetSetTitle(GWidgetGetControl(ew,CID_StemWidthAdd),
635 0 : _GGadgetGetTitle(GWidgetGetControl(ew,CID_StemHeightAdd)));
636 0 : } else if ( by_width ) {
637 0 : GGadgetSetTitle(GWidgetGetControl(ew,CID_StemWidthAdd),
638 0 : _GGadgetGetTitle(GWidgetGetControl(ew,CID_StemHeightAdd)));
639 : }
640 :
641 0 : GGadgetSetTitle8(GWidgetGetControl(ew,CID_StemWidthLabel), (char *) v_label);
642 0 : GGadgetSetTitle8(GWidgetGetControl(ew,CID_StemHeightLabel), (char *) h_label);
643 : }
644 0 : return( true );
645 : }
646 :
647 0 : static int CG_VStem_Changed(GGadget *g, GEvent *e) {
648 :
649 0 : if ( e->type==et_controlevent && e->u.control.subtype == et_textchanged ) {
650 0 : GWindow ew = GGadgetGetWindow(g);
651 0 : if ( GGadgetIsChecked(GWidgetGetControl(ew,CID_StemsUniform))) {
652 0 : GGadgetSetTitle(GWidgetGetControl(ew,CID_StemWidth),
653 0 : _GGadgetGetTitle(GWidgetGetControl(ew,CID_StemHeight)));
654 0 : GGadgetSetTitle(GWidgetGetControl(ew,CID_StemWidthAdd),
655 0 : _GGadgetGetTitle(GWidgetGetControl(ew,CID_StemHeightAdd)));
656 :
657 0 : } else if ( GGadgetIsChecked(GWidgetGetControl(ew,CID_Stems_by_Width))) {
658 0 : GGadgetSetTitle(GWidgetGetControl(ew,CID_StemWidthAdd),
659 0 : _GGadgetGetTitle(GWidgetGetControl(ew,CID_StemHeightAdd)));
660 :
661 : }
662 : }
663 0 : return( true );
664 : }
665 :
666 0 : static int CG_CounterSameAs_Changed(GGadget *g, GEvent *e) {
667 :
668 0 : if ( e==NULL || (e->type==et_controlevent && e->u.control.subtype == et_radiochanged )) {
669 0 : GWindow ew = GGadgetGetWindow(g);
670 0 : int on = GGadgetIsChecked(GWidgetGetControl(ew,CID_Counter_is_SideB));
671 0 : int enabled = GGadgetIsChecked(GWidgetGetControl(ew,CID_Counter_isnt_SideB));
672 0 : GGadgetSetEnabled(GWidgetGetControl(ew,CID_LSBPercent), enabled);
673 0 : GGadgetSetEnabled(GWidgetGetControl(ew,CID_LSBAdd), enabled);
674 0 : GGadgetSetEnabled(GWidgetGetControl(ew,CID_RSBPercent), enabled);
675 0 : GGadgetSetEnabled(GWidgetGetControl(ew,CID_RSBAdd), enabled);
676 0 : if ( on ) {
677 0 : GGadgetSetTitle(GWidgetGetControl(ew,CID_LSBPercent),
678 0 : _GGadgetGetTitle(GWidgetGetControl(ew,CID_CounterPercent)));
679 0 : GGadgetSetTitle(GWidgetGetControl(ew,CID_LSBAdd),
680 0 : _GGadgetGetTitle(GWidgetGetControl(ew,CID_CounterAdd)));
681 0 : GGadgetSetTitle(GWidgetGetControl(ew,CID_RSBPercent),
682 0 : _GGadgetGetTitle(GWidgetGetControl(ew,CID_CounterPercent)));
683 0 : GGadgetSetTitle(GWidgetGetControl(ew,CID_RSBAdd),
684 0 : _GGadgetGetTitle(GWidgetGetControl(ew,CID_CounterAdd)));
685 : }
686 : }
687 0 : return( true );
688 : }
689 :
690 0 : static int CG_Counter_Changed(GGadget *g, GEvent *e) {
691 :
692 0 : if ( e->type==et_controlevent && e->u.control.subtype == et_textchanged ) {
693 0 : GWindow ew = GGadgetGetWindow(g);
694 0 : if ( GGadgetIsChecked(GWidgetGetControl(ew,CID_Counter_is_SideB))) {
695 0 : GGadgetSetTitle(GWidgetGetControl(ew,CID_LSBPercent),
696 0 : _GGadgetGetTitle(GWidgetGetControl(ew,CID_CounterPercent)));
697 0 : GGadgetSetTitle(GWidgetGetControl(ew,CID_LSBAdd),
698 0 : _GGadgetGetTitle(GWidgetGetControl(ew,CID_CounterAdd)));
699 0 : GGadgetSetTitle(GWidgetGetControl(ew,CID_RSBPercent),
700 0 : _GGadgetGetTitle(GWidgetGetControl(ew,CID_CounterPercent)));
701 0 : GGadgetSetTitle(GWidgetGetControl(ew,CID_RSBAdd),
702 0 : _GGadgetGetTitle(GWidgetGetControl(ew,CID_CounterAdd)));
703 : }
704 : }
705 0 : return( true );
706 : }
707 :
708 0 : static int CG_UseVCounters(GGadget *g, GEvent *e) {
709 :
710 0 : if ( e==NULL || (e->type==et_controlevent && e->u.control.subtype == et_radiochanged )) {
711 0 : GWindow ew = GGadgetGetWindow(g);
712 0 : int on = GGadgetIsChecked(GWidgetGetControl(ew,CID_UseVerticalCounters));
713 0 : GGadgetSetEnabled(GWidgetGetControl(ew,CID_VCounterPercent), on);
714 0 : GGadgetSetEnabled(GWidgetGetControl(ew,CID_VCounterAdd), on);
715 0 : GGadgetSetEnabled(GWidgetGetControl(ew,CID_VerticalScale), !on);
716 0 : GGadgetSetEnabled(GWidgetGetControl(ew,CID_VMappings), !on);
717 : }
718 0 : return( true );
719 : }
720 :
721 0 : static int CG_VScale_Changed(GGadget *g, GEvent *e) {
722 :
723 0 : if ( e->type==et_controlevent && e->u.control.subtype == et_textchanged ) {
724 0 : GWindow ew = GGadgetGetWindow(g);
725 0 : StyleDlg *ed = GDrawGetUserData(ew);
726 0 : int err=0;
727 : bigreal scale;
728 0 : GGadget *map = GWidgetGetControl(ew,CID_VMappings);
729 0 : int rows, cols = GMatrixEditGetColCnt(map);
730 0 : struct matrix_data *mappings = GMatrixEditGet(map, &rows);
731 : int i;
732 :
733 0 : scale = GetCalmReal8(ew,CID_VerticalScale,"unused",&err)/100.0;
734 0 : if ( err || scale<=0 || RealNear(ed->scale,scale) )
735 0 : return( true );
736 0 : for ( i=0; i<rows; ++i ) {
737 0 : bigreal offset = mappings[cols*i+2].u.md_real - rint(ed->scale*mappings[cols*i+0].u.md_real);
738 0 : mappings[cols*i+2].u.md_real =
739 0 : rint(scale * mappings[cols*i+0].u.md_real) + offset;
740 : }
741 0 : ed->scale = scale;
742 0 : GGadgetRedraw(map);
743 : }
744 0 : return( true );
745 : }
746 :
747 0 : static int CG_PetiteCapsChange(GGadget *g, GEvent *e) {
748 :
749 0 : if ( e->type==et_controlevent && e->u.control.subtype == et_radiochanged ) {
750 0 : GWindow ew = GGadgetGetWindow(g);
751 0 : int petite = GGadgetIsChecked(GWidgetGetControl(ew,CID_PetiteCaps));
752 0 : GGadgetSetTitle8(GWidgetGetControl(ew,CID_Letter_Ext), petite ? "pc" : "sc" );
753 : }
754 0 : return( true );
755 : }
756 :
757 0 : static int CG_SmallCapSymbols(GGadget *g, GEvent *e) {
758 :
759 0 : if ( e->type==et_controlevent && e->u.control.subtype == et_radiochanged ) {
760 0 : GWindow ew = GGadgetGetWindow(g);
761 0 : int on = GGadgetIsChecked(g);
762 0 : GGadgetSetEnabled(GWidgetGetControl(ew,CID_Symbol_Ext), on);
763 : }
764 0 : return( true );
765 : }
766 :
767 0 : static int ParseBlue(double blues[14],struct psdict *private,char *key) {
768 : int i;
769 : char *val, *end;
770 :
771 0 : if ( private==NULL )
772 0 : return( 0 );
773 0 : if ( (val = PSDictHasEntry(private,key))==NULL )
774 0 : return( 0 );
775 0 : while ( isspace( *val ) || *val=='[' ) ++val;
776 :
777 0 : for ( i=0; i<14; ++i ) {
778 0 : while ( isspace( *val )) ++val;
779 0 : if ( *val==']' || *val=='\0' )
780 0 : return( i );
781 0 : blues[i] = strtod(val,&end);
782 0 : if ( end==val ) /* Not a number */
783 0 : return( 0 );
784 0 : val = end;
785 : }
786 0 : return( i );
787 : }
788 :
789 : static struct col_init mapci[5] = {
790 : { me_real, NULL, NULL, NULL, N_("Original Y Position") },
791 : { me_real, NULL, NULL, NULL, N_("Extent") },
792 : { me_real, NULL, NULL, NULL, N_("Resultant Y Position") },
793 : };
794 0 : static void MappingMatrixInit(struct matrixinit *mi,SplineFont *sf,
795 : double xheight, double capheight, double scale) {
796 : struct matrix_data *md;
797 : int cnt;
798 : double blues[14], others[14];
799 0 : int b=0,o=0,i,j;
800 :
801 0 : memset(mi,0,sizeof(*mi));
802 0 : mi->col_cnt = 3;
803 0 : mi->col_init = mapci;
804 :
805 0 : if ( sf->private!=NULL ) {
806 0 : b = ParseBlue(blues,sf->private,"BlueValues");
807 0 : o = ParseBlue(others,sf->private,"OtherBlues");
808 : }
809 :
810 0 : if ( (b>1 && (b&1)==0) || (o>1 && (o&1)==0)) {
811 0 : b>>=1; o>>=1;
812 0 : md = calloc(3*(b+o),sizeof(struct matrix_data));
813 0 : mi->initial_row_cnt = b+o;
814 0 : mi->matrix_data = md;
815 :
816 0 : for ( i=0; i<o; ++i ) {
817 0 : md[3*i+0].u.md_real = others[2*i+1];
818 0 : md[3*i+1].u.md_real = others[2*i] - others[2*i+1];
819 0 : md[3*i+2].u.md_real = rint(scale*md[3*i+0].u.md_real);
820 : }
821 0 : for ( j=0; j<b; ++j ) {
822 0 : if ( j==0 ) {
823 0 : md[3*(i+j)+0].u.md_real = blues[1];
824 0 : md[3*(i+j)+1].u.md_real = blues[0] - blues[1];
825 : } else {
826 0 : md[3*(i+j)+0].u.md_real = blues[2*j];
827 0 : md[3*(i+j)+1].u.md_real = blues[2*j+1] - blues[2*j];
828 : }
829 0 : md[3*(i+j)+2].u.md_real = rint(scale*md[3*(i+j)+0].u.md_real);
830 : }
831 0 : } else if ( xheight==0 && capheight==0 ) {
832 0 : md = calloc(3,sizeof(struct matrix_data));
833 0 : mi->initial_row_cnt = 1;
834 0 : mi->matrix_data = md;
835 : } else {
836 0 : cnt = 1; /* For the baseline */
837 0 : if ( xheight!=0 )
838 0 : ++cnt;
839 0 : if ( capheight!=0 )
840 0 : ++cnt;
841 0 : md = calloc(3*cnt,sizeof(struct matrix_data));
842 0 : mi->initial_row_cnt = cnt;
843 0 : mi->matrix_data = md;
844 0 : md[3*0+1].u.md_real = -1;
845 0 : cnt = 1;
846 0 : if ( xheight!=0 ) {
847 0 : md[3*cnt+0].u.md_real = xheight;
848 0 : md[3*cnt+1].u.md_real = 1;
849 0 : md[3*cnt+2].u.md_real = scale*xheight;
850 0 : ++cnt;
851 : }
852 0 : if ( capheight!=0 ) {
853 0 : md[3*cnt+0].u.md_real = capheight;
854 0 : md[3*cnt+1].u.md_real = 1;
855 0 : md[3*cnt+2].u.md_real = scale*capheight;
856 0 : ++cnt;
857 : }
858 : }
859 0 : }
860 :
861 0 : static int GlyphChange_Default(GGadget *g, GEvent *e) {
862 :
863 0 : if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) {
864 0 : GWindow ew = GGadgetGetWindow(g);
865 0 : StyleDlg *ed = GDrawGetUserData(ew);
866 0 : enum glyphchange_type gc = ed->gc;
867 0 : bigreal glyph_scale = 1.0, stem_scale=1.0;
868 : char glyph_factor[40], stem_factor[40];
869 : struct matrixinit mapmi;
870 :
871 0 : if ( gc==gc_subsuper ) {
872 0 : GGadgetSetTitle8(GWidgetGetControl(ew,CID_Feature),"");
873 0 : GGadgetSetTitle8(GWidgetGetControl(ew,CID_Extension),"");
874 0 : GGadgetSetTitle8(GWidgetGetControl(ew,CID_VerticalOff),"");
875 :
876 0 : glyph_scale = 2.0/3.0;
877 0 : stem_scale = 3.0/4.0;
878 0 : } else if ( gc == gc_smallcaps ) {
879 0 : GGadgetSetTitle8(GWidgetGetControl(ew,CID_Letter_Ext),"sc");
880 0 : GGadgetSetTitle8(GWidgetGetControl(ew,CID_Symbol_Ext),"taboldstyle");
881 0 : GGadgetSetChecked(GWidgetGetControl(ew,CID_Symbols_Too),false);
882 0 : GGadgetSetChecked(GWidgetGetControl(ew,CID_SmallCaps),true);
883 :
884 0 : if ( ed->small->xheight!=0 && ed->small->capheight!=0 )
885 0 : glyph_scale = ed->small->xheight/ed->small->capheight;
886 0 : if ( ed->small->lc_stem_width!=0 && ed->small->uc_stem_width!=0 )
887 0 : stem_scale = ed->small->lc_stem_width/ed->small->uc_stem_width;
888 : }
889 0 : ed->scale = glyph_scale;
890 0 : sprintf( glyph_factor, "%.2f", (double) (100*glyph_scale) );
891 0 : sprintf( stem_factor , "%.2f", (double) (100* stem_scale) );
892 :
893 0 : GGadgetSetChecked(GWidgetGetControl(ew,CID_StemsUniform),true);
894 0 : GGadgetSetTitle8(GWidgetGetControl(ew,CID_StemHeight),stem_factor);
895 0 : GGadgetSetTitle8(GWidgetGetControl(ew,CID_StemHeightAdd),"0");
896 0 : GGadgetSetTitle8(GWidgetGetControl(ew,CID_StemWidth),stem_factor);
897 0 : GGadgetSetTitle8(GWidgetGetControl(ew,CID_StemWidthAdd),"0");
898 0 : GGadgetSetChecked(GWidgetGetControl(ew,CID_DStemOn),true);
899 :
900 0 : GGadgetSetChecked(GWidgetGetControl(ew,CID_Counter_is_SideB),true);
901 0 : GGadgetSetTitle8(GWidgetGetControl(ew,CID_CounterPercent),glyph_factor);
902 0 : GGadgetSetTitle8(GWidgetGetControl(ew,CID_CounterAdd),"0");
903 0 : GGadgetSetTitle8(GWidgetGetControl(ew,CID_LSBPercent),glyph_factor);
904 0 : GGadgetSetTitle8(GWidgetGetControl(ew,CID_LSBAdd),"0");
905 0 : GGadgetSetTitle8(GWidgetGetControl(ew,CID_RSBPercent),glyph_factor);
906 0 : GGadgetSetTitle8(GWidgetGetControl(ew,CID_RSBAdd),"0");
907 :
908 0 : GGadgetSetChecked(GWidgetGetControl(ew,CID_UseVerticalMappings),true);
909 0 : GGadgetSetTitle8(GWidgetGetControl(ew,CID_VCounterPercent),glyph_factor);
910 0 : GGadgetSetTitle8(GWidgetGetControl(ew,CID_VCounterAdd),"0");
911 0 : GGadgetSetTitle8(GWidgetGetControl(ew,CID_VerticalScale),glyph_factor);
912 :
913 0 : MappingMatrixInit(&mapmi,
914 : ed->sf,
915 0 : gc==gc_smallcaps?0:ed->small->xheight,
916 0 : ed->small->capheight,glyph_scale);
917 0 : GMatrixEditSet(GWidgetGetControl(ew,CID_VMappings),
918 : mapmi.matrix_data,mapmi.initial_row_cnt,false);
919 :
920 0 : CG_SameAs_Changed(GWidgetGetControl(ew,CID_StemsUniform),NULL);
921 0 : CG_CounterSameAs_Changed(GWidgetGetControl(ew,CID_Counter_is_SideB),NULL);
922 0 : CG_UseVCounters(GWidgetGetControl(ew,CID_UseVerticalMappings),NULL);
923 : }
924 0 : return( true );
925 : }
926 :
927 0 : void GlyphChangeDlg(FontView *fv,CharView *cv, enum glyphchange_type gc) {
928 : StyleDlg ed;
929 0 : SplineFont *sf = fv!=NULL ? fv->b.sf : cv->b.sc->parent;
930 : GRect pos;
931 : GWindow gw;
932 : GWindowAttrs wattrs;
933 : GGadgetCreateData gcd[64], boxes[19], *barray[11], *stemarray[22], *stemtarray[6],
934 : *stemarrayhc[20], *stemarrayvc[8], *varrayi[16], *varrays[15],
935 : *varrayhc[14], *varrayvc[12], *pcarray[4],
936 : *varray[7], *harray[6], *voarray[6], *extarray[7], *exarray[6];
937 : GTextInfo label[64];
938 : GTabInfo aspects[5];
939 : int i,k,l,s, a;
940 : struct smallcaps small;
941 : struct matrixinit mapmi;
942 0 : bigreal glyph_scale = 1.0, stem_scale=1.0;
943 : char glyph_factor[40], stem_factor[40], stem_threshold[10];
944 0 : int layer = fv!=NULL ? fv->b.active_layer : CVLayer((CharViewBase *) cv);
945 : static GWindow last_dlg[gc_max] = { NULL };
946 : static SplineFont *last_sf[gc_max] = { NULL };
947 : static int intldone = false;
948 :
949 0 : memset(&ed,0,sizeof(ed));
950 0 : ed.fv = fv;
951 0 : ed.cv = cv;
952 0 : ed.sf = sf;
953 0 : ed.small = &small;
954 0 : ed.gc = gc;
955 :
956 0 : if (!intldone) {
957 0 : intldone = true;
958 0 : for ( i=0; stemwidth[i].text; ++i )
959 0 : stemwidth[i].text = (unichar_t *) _((char *) stemwidth[i].text);
960 0 : for ( i=0; stemheight[i].text; ++i )
961 0 : stemheight[i].text = (unichar_t *) _((char *) stemheight[i].text);
962 : }
963 :
964 0 : SmallCapsFindConstants(&small,sf,layer); /* I want to know the xheight... */
965 :
966 0 : if ( last_dlg[gc] == NULL || last_sf[gc] != sf ) {
967 0 : if ( last_dlg[gc]!=NULL )
968 0 : GDrawDestroyWindow(last_dlg[gc]);
969 :
970 0 : memset(&wattrs,0,sizeof(wattrs));
971 0 : wattrs.mask = wam_events|wam_cursor|wam_utf8_wtitle|wam_undercursor|wam_isdlg|wam_restrict;
972 0 : wattrs.event_masks = ~(1<<et_charup);
973 0 : wattrs.restrict_input_to_me = 1;
974 0 : wattrs.undercursor = 1;
975 0 : wattrs.cursor = ct_pointer;
976 0 : wattrs.utf8_window_title = gc==gc_subsuper ? _("Create Subscript/Superscript") :
977 : gc==gc_smallcaps ? _("Create Small Caps") :
978 : _("Change Glyphs");
979 0 : wattrs.is_dlg = true;
980 0 : pos.x = pos.y = 0;
981 0 : pos.width = 100;
982 0 : pos.height = 100;
983 0 : ed.gw = gw = GDrawCreateTopWindow(NULL,&pos,style_e_h,&ed,&wattrs);
984 :
985 :
986 0 : k=l=s=a=0;
987 :
988 0 : memset(aspects,0,sizeof(aspects));
989 0 : memset(gcd,0,sizeof(gcd));
990 0 : memset(boxes,0,sizeof(boxes));
991 0 : memset(label,0,sizeof(label));
992 0 : memset(stemarray,0,sizeof(stemarray));
993 :
994 0 : if ( gc==gc_subsuper ) {
995 0 : label[k].text = (unichar_t *) _(
996 : "Unlike most commands this one does not work directly on the\n"
997 : "selected glyphs. Instead, if you select a glyph FontForge will\n"
998 : "create (or reuse) another glyph named by appending the extension\n"
999 : "to the original name, and it will copy a modified version of\n"
1000 : "the original glyph into the new one.");
1001 0 : label[k].text_is_1byte = true;
1002 0 : label[k].text_in_resource = true;
1003 0 : gcd[k].gd.label = &label[k];
1004 0 : gcd[k].gd.flags = gg_enabled | gg_visible;
1005 0 : gcd[k++].creator = GLabelCreate;
1006 0 : varrayi[l++] = &gcd[k-1]; varrayi[l++] = NULL;
1007 :
1008 :
1009 0 : gcd[k].gd.pos.width = 10; gcd[k].gd.pos.height = 10;
1010 0 : gcd[k].gd.flags = gg_enabled | gg_visible;
1011 0 : gcd[k++].creator = GSpacerCreate;
1012 0 : varrayi[l++] = &gcd[k-1]; varrayi[l++] = NULL;
1013 :
1014 0 : label[k].text = (unichar_t *) _("Feature Tag:");
1015 0 : label[k].text_is_1byte = true;
1016 0 : label[k].text_in_resource = true;
1017 0 : gcd[k].gd.label = &label[k];
1018 0 : gcd[k].gd.pos.x = 5; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+31;
1019 0 : gcd[k].gd.flags = gg_enabled | gg_visible;
1020 0 : gcd[k++].creator = GLabelCreate;
1021 0 : extarray[0] = &gcd[k-1];
1022 :
1023 0 : label[k].text = (unichar_t *) "";
1024 0 : label[k].text_is_1byte = true;
1025 0 : gcd[k].gd.label = &label[k];
1026 0 : gcd[k].gd.flags = gg_enabled | gg_visible;
1027 0 : gcd[k].gd.cid = CID_Feature;
1028 0 : gcd[k].gd.u.list = ss_features;
1029 0 : gcd[k].gd.handle_controlevent = SS_Feature_Changed;
1030 0 : gcd[k++].creator = GListFieldCreate;
1031 0 : extarray[1] = &gcd[k-1];
1032 :
1033 0 : label[k].text = (unichar_t *) _("Glyph Extension:");
1034 0 : label[k].text_is_1byte = true;
1035 0 : label[k].text_in_resource = true;
1036 0 : gcd[k].gd.label = &label[k];
1037 0 : gcd[k].gd.pos.x = 5; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+31;
1038 0 : gcd[k].gd.flags = gg_enabled | gg_visible;
1039 0 : gcd[k++].creator = GLabelCreate;
1040 0 : extarray[2] = &gcd[k-1];
1041 :
1042 0 : label[k].text = (unichar_t *) "";
1043 0 : label[k].text_is_1byte = true;
1044 0 : gcd[k].gd.label = &label[k];
1045 0 : gcd[k].gd.flags = gg_enabled | gg_visible;
1046 0 : gcd[k].gd.cid = CID_Extension;
1047 0 : gcd[k++].creator = GTextFieldCreate;
1048 0 : extarray[3] = &gcd[k-1]; extarray[4] = NULL;
1049 :
1050 0 : boxes[2].gd.flags = gg_enabled|gg_visible;
1051 0 : boxes[2].gd.u.boxelements = extarray;
1052 0 : boxes[2].creator = GHBoxCreate;
1053 0 : varrayi[l++] = &boxes[2]; varrayi[l++] = NULL;
1054 :
1055 0 : label[k].text = (unichar_t *) _("Vertical Offset:");
1056 0 : label[k].text_is_1byte = true;
1057 0 : label[k].text_in_resource = true;
1058 0 : gcd[k].gd.label = &label[k];
1059 0 : gcd[k].gd.pos.x = 5; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+31;
1060 0 : gcd[k].gd.flags = gg_enabled | gg_visible;
1061 0 : gcd[k++].creator = GLabelCreate;
1062 0 : voarray[0] = &gcd[k-1];
1063 :
1064 0 : label[k].text = (unichar_t *) "0";
1065 0 : label[k].text_is_1byte = true;
1066 0 : gcd[k].gd.label = &label[k];
1067 0 : gcd[k].gd.flags = gg_enabled | gg_visible;
1068 0 : gcd[k].gd.pos.width = 60;
1069 0 : gcd[k].gd.cid = CID_VerticalOff;
1070 0 : gcd[k++].creator = GTextFieldCreate;
1071 0 : voarray[1]= &gcd[k-1]; voarray[2] = GCD_Glue; voarray[3] = NULL;
1072 :
1073 0 : boxes[3].gd.flags = gg_enabled|gg_visible;
1074 0 : boxes[3].gd.u.boxelements = voarray;
1075 0 : boxes[3].creator = GHBoxCreate;
1076 0 : varrayi[l++] = &boxes[3]; varrayi[l++] = NULL;
1077 0 : varrayi[l++] = GCD_Glue; varrayi[l++] = NULL; varrayi[l++] = NULL;
1078 :
1079 0 : boxes[4].gd.flags = gg_enabled|gg_visible;
1080 0 : boxes[4].gd.u.boxelements = varrayi;
1081 0 : boxes[4].creator = GHVBoxCreate;
1082 :
1083 0 : aspects[a].text = (unichar_t *) _("Introduction");
1084 0 : aspects[a].text_is_1byte = true;
1085 0 : aspects[a++].gcd = &boxes[4];
1086 :
1087 0 : glyph_scale = 2.0/3.0;
1088 0 : stem_scale = 3.0/4.0;
1089 0 : } else if ( gc == gc_smallcaps ) {
1090 0 : label[k].text = (unichar_t *) _(
1091 : "Unlike most commands this one does not work directly on the\n"
1092 : "selected glyphs. Instead, if you select an \"A\" (or an \"a\")\n"
1093 : "FontForge will create (or reuse) a glyph named \"a.sc\", and\n"
1094 : "it will copy a modified version of the \"A\" glyph into \"a.sc\".");
1095 0 : label[k].text_is_1byte = true;
1096 0 : label[k].text_in_resource = true;
1097 0 : gcd[k].gd.label = &label[k];
1098 0 : gcd[k].gd.flags = gg_enabled | gg_visible;
1099 0 : gcd[k++].creator = GLabelCreate;
1100 0 : varrayi[l++] = &gcd[k-1]; varrayi[l++] = NULL;
1101 :
1102 0 : gcd[k].gd.pos.width = 10; gcd[k].gd.pos.height = 10;
1103 0 : gcd[k].gd.flags = gg_enabled | gg_visible;
1104 0 : gcd[k++].creator = GSpacerCreate;
1105 0 : varrayi[l++] = &gcd[k-1]; varrayi[l++] = NULL;
1106 :
1107 0 : label[k].text = (unichar_t *) _("Small Caps");
1108 0 : label[k].text_is_1byte = true;
1109 0 : label[k].text_in_resource = true;
1110 0 : gcd[k].gd.label = &label[k];
1111 0 : gcd[k].gd.pos.x = 5; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+31;
1112 0 : gcd[k].gd.flags = gg_visible | gg_enabled | gg_cb_on;
1113 0 : gcd[k].gd.handle_controlevent = CG_PetiteCapsChange;
1114 0 : gcd[k].gd.cid = CID_SmallCaps;
1115 0 : gcd[k++].creator = GRadioCreate;
1116 0 : pcarray[0] = &gcd[k-1];
1117 :
1118 0 : label[k].text = (unichar_t *) _("Petite Caps");
1119 0 : label[k].text_is_1byte = true;
1120 0 : label[k].text_in_resource = true;
1121 0 : gcd[k].gd.label = &label[k];
1122 0 : gcd[k].gd.pos.x = 5; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+31;
1123 0 : gcd[k].gd.flags = gg_visible | gg_enabled ;
1124 0 : gcd[k].gd.handle_controlevent = CG_PetiteCapsChange;
1125 0 : gcd[k].gd.cid = CID_PetiteCaps;
1126 0 : gcd[k++].creator = GRadioCreate;
1127 0 : pcarray[1] = &gcd[k-1]; pcarray[2] = GCD_Glue; pcarray[3] = NULL;
1128 :
1129 0 : boxes[2].gd.flags = gg_enabled|gg_visible;
1130 0 : boxes[2].gd.u.boxelements = pcarray;
1131 0 : boxes[2].creator = GHBoxCreate;
1132 0 : varrayi[l++] = &boxes[2]; varrayi[l++] = NULL;
1133 :
1134 0 : label[k].text = (unichar_t *) _("Glyph Extensions");
1135 0 : label[k].text_is_1byte = true;
1136 0 : label[k].text_in_resource = true;
1137 0 : gcd[k].gd.label = &label[k];
1138 0 : gcd[k].gd.pos.x = 5; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+31;
1139 0 : gcd[k].gd.flags = gg_visible | gg_enabled;
1140 0 : gcd[k++].creator = GLabelCreate;
1141 0 : varrayi[l++] = &gcd[k-1]; varrayi[l++] = NULL;
1142 :
1143 0 : label[k].text = (unichar_t *) _("Letters:");
1144 0 : label[k].text_is_1byte = true;
1145 0 : label[k].text_in_resource = true;
1146 0 : gcd[k].gd.label = &label[k];
1147 0 : gcd[k].gd.pos.x = 5; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+31;
1148 0 : gcd[k].gd.flags = gg_visible | gg_enabled;
1149 0 : gcd[k++].creator = GLabelCreate;
1150 :
1151 0 : label[k].text = (unichar_t *) "sc";
1152 0 : label[k].text_is_1byte = true;
1153 0 : gcd[k].gd.label = &label[k];
1154 0 : gcd[k].gd.pos.width = 80;
1155 0 : gcd[k].gd.flags = gg_visible | gg_enabled;
1156 0 : gcd[k].gd.cid = CID_Letter_Ext;
1157 0 : gcd[k++].creator = GTextFieldCreate;
1158 :
1159 0 : label[k].text = (unichar_t *) _("Symbols:");
1160 0 : label[k].text_is_1byte = true;
1161 0 : label[k].text_in_resource = true;
1162 0 : gcd[k].gd.label = &label[k];
1163 0 : gcd[k].gd.pos.x = 5; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+31;
1164 0 : gcd[k].gd.flags = gg_visible | gg_enabled;
1165 0 : gcd[k++].creator = GLabelCreate;
1166 :
1167 0 : label[k].text = (unichar_t *) "taboldstyle";
1168 0 : label[k].text_is_1byte = true;
1169 0 : gcd[k].gd.label = &label[k];
1170 0 : gcd[k].gd.pos.width = 80;
1171 0 : gcd[k].gd.flags = gg_visible;
1172 0 : gcd[k].gd.cid = CID_Symbol_Ext;
1173 0 : gcd[k++].creator = GTextFieldCreate;
1174 0 : exarray[0] = &gcd[k-4]; exarray[1] = &gcd[k-3]; exarray[2] = &gcd[k-2]; exarray[3] = &gcd[k-1];
1175 0 : exarray[4] = NULL;
1176 :
1177 0 : boxes[3].gd.flags = gg_enabled|gg_visible;
1178 0 : boxes[3].gd.u.boxelements = exarray;
1179 0 : boxes[3].creator = GHBoxCreate;
1180 0 : varrayi[l++] = &boxes[3]; varrayi[l++] = NULL;
1181 :
1182 0 : label[k].text = (unichar_t *) _("Create small caps variants for symbols as well as letters");
1183 0 : label[k].text_is_1byte = true;
1184 0 : label[k].text_in_resource = true;
1185 0 : gcd[k].gd.label = &label[k];
1186 0 : gcd[k].gd.pos.x = 5; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+31;
1187 0 : gcd[k].gd.flags = gg_enabled | gg_visible;
1188 0 : gcd[k].gd.handle_controlevent = CG_SmallCapSymbols;
1189 0 : gcd[k].gd.cid = CID_Symbols_Too;
1190 0 : gcd[k++].creator = GCheckBoxCreate;
1191 0 : varrayi[l++] = &gcd[k-1]; varrayi[l++] = NULL;
1192 0 : varrayi[l++] = GCD_Glue; varrayi[l++] = NULL; varrayi[l++] = NULL;
1193 :
1194 0 : boxes[4].gd.flags = gg_enabled|gg_visible;
1195 0 : boxes[4].gd.u.boxelements = varrayi;
1196 0 : boxes[4].creator = GHVBoxCreate;
1197 :
1198 0 : aspects[a].text = (unichar_t *) _("Introduction");
1199 0 : aspects[a].text_is_1byte = true;
1200 0 : aspects[a++].gcd = &boxes[4];
1201 :
1202 0 : if ( small.xheight!=0 && small.capheight!=0 )
1203 0 : glyph_scale = small.xheight/small.capheight;
1204 0 : if ( small.lc_stem_width!=0 && small.uc_stem_width!=0 )
1205 0 : stem_scale = small.lc_stem_width/small.uc_stem_width;
1206 : }
1207 :
1208 0 : l = 0;
1209 :
1210 0 : ed.scale = glyph_scale;
1211 0 : sprintf( glyph_factor, "%.2f", (double) (100*glyph_scale) );
1212 0 : sprintf( stem_factor , "%.2f", (double) (100* stem_scale) );
1213 :
1214 0 : label[k].text = (unichar_t *) _("Uniform scaling for stems of any width and direction");
1215 0 : label[k].text_is_1byte = true;
1216 0 : label[k].text_in_resource = true;
1217 0 : gcd[k].gd.label = &label[k];
1218 0 : gcd[k].gd.pos.x = 5; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+31;
1219 0 : gcd[k].gd.flags = gg_enabled | gg_visible | gg_cb_on;
1220 0 : gcd[k].gd.cid = CID_StemsUniform;
1221 0 : gcd[k].gd.handle_controlevent = CG_SameAs_Changed;
1222 0 : gcd[k++].creator = GRadioCreate;
1223 0 : varrays[l++] = &gcd[k-1]; varrays[l++] = NULL;
1224 :
1225 0 : label[k].text = (unichar_t *) _("Separate ratios for thin and thick stems");
1226 0 : label[k].text_is_1byte = true;
1227 0 : label[k].text_in_resource = true;
1228 0 : gcd[k].gd.label = &label[k];
1229 0 : gcd[k].gd.pos.x = 5; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+31;
1230 0 : gcd[k].gd.flags = gg_enabled | gg_visible;
1231 0 : gcd[k].gd.cid = CID_Stems_by_Width;
1232 0 : gcd[k].gd.handle_controlevent = CG_SameAs_Changed;
1233 0 : gcd[k++].creator = GRadioCreate;
1234 0 : varrays[l++] = &gcd[k-1]; varrays[l++] = NULL;
1235 :
1236 0 : label[k].text = (unichar_t *) _("Threshold between \"thin\" and \"thick\":");
1237 0 : label[k].text_is_1byte = true;
1238 0 : label[k].text_in_resource = true;
1239 0 : gcd[k].gd.label = &label[k];
1240 0 : gcd[k].gd.pos.x = 5; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+31;
1241 0 : gcd[k].gd.flags = gg_enabled | gg_visible;
1242 0 : gcd[k++].creator = GLabelCreate;
1243 0 : stemtarray[s++] = &gcd[k-1];
1244 :
1245 0 : sprintf(stem_threshold,"%.0f",GuessStemThreshold(sf));
1246 0 : label[k].text = (unichar_t *) stem_threshold;
1247 0 : label[k].text_is_1byte = true;
1248 0 : gcd[k].gd.label = &label[k];
1249 0 : gcd[k].gd.flags = gg_visible;
1250 0 : gcd[k].gd.cid = CID_StemThreshold;
1251 0 : gcd[k].gd.pos.width = 60;
1252 0 : gcd[k++].creator = GTextFieldCreate;
1253 0 : stemtarray[s++] = &gcd[k-1];
1254 :
1255 0 : label[k].text = (unichar_t *) _("em-units");
1256 0 : label[k].text_is_1byte = true;
1257 0 : label[k].text_in_resource = true;
1258 0 : gcd[k].gd.label = &label[k];
1259 0 : gcd[k].gd.pos.x = 5; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+31;
1260 0 : gcd[k].gd.flags = gg_enabled | gg_visible;
1261 0 : gcd[k++].creator = GLabelCreate;
1262 0 : stemtarray[s++] = &gcd[k-1];
1263 0 : stemtarray[s++] = NULL;
1264 0 : stemtarray[s++] = NULL;
1265 :
1266 0 : boxes[6].gd.flags = gg_enabled|gg_visible;
1267 0 : boxes[6].gd.u.boxelements = stemtarray;
1268 0 : boxes[6].creator = GHVBoxCreate;
1269 0 : varrays[l++] = &boxes[6]; varrays[l++] = NULL;
1270 :
1271 0 : label[k].text = (unichar_t *) _("Separate ratios for horizontal and vertical stems");
1272 0 : label[k].text_is_1byte = true;
1273 0 : label[k].text_in_resource = true;
1274 0 : gcd[k].gd.label = &label[k];
1275 0 : gcd[k].gd.pos.x = 5; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+31;
1276 0 : gcd[k].gd.flags = gg_enabled | gg_visible | gg_rad_continueold;
1277 0 : gcd[k].gd.cid = CID_Stems_H_V;
1278 0 : gcd[k].gd.handle_controlevent = CG_SameAs_Changed;
1279 0 : gcd[k++].creator = GRadioCreate;
1280 0 : varrays[l++] = &gcd[k-1]; varrays[l++] = NULL;
1281 :
1282 0 : s = 0;
1283 0 : gcd[k].gd.pos.x = 5; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+31;
1284 0 : gcd[k].gd.flags = gg_enabled | gg_visible;
1285 0 : gcd[k].gd.cid = CID_StemHeightLabel;
1286 0 : gcd[k].gd.u.list = stemheight;
1287 0 : gcd[k++].creator = GLabelCreate;
1288 0 : stemarray[s++] = &gcd[k-1];
1289 :
1290 0 : label[k].text = (unichar_t *) stem_factor;
1291 0 : label[k].text_is_1byte = true;
1292 0 : gcd[k].gd.label = &label[k];
1293 0 : gcd[k].gd.flags = gg_enabled | gg_visible;
1294 0 : gcd[k].gd.cid = CID_StemHeight;
1295 0 : gcd[k].gd.handle_controlevent = CG_VStem_Changed;
1296 0 : gcd[k].gd.pos.width = 60;
1297 0 : gcd[k++].creator = GTextFieldCreate;
1298 0 : stemarray[s++] = &gcd[k-1];
1299 :
1300 0 : label[k].text = (unichar_t *) _("% +");
1301 0 : label[k].text_is_1byte = true;
1302 0 : label[k].text_in_resource = true;
1303 0 : gcd[k].gd.label = &label[k];
1304 0 : gcd[k].gd.pos.x = 5; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+31;
1305 0 : gcd[k].gd.flags = gg_enabled | gg_visible;
1306 0 : gcd[k++].creator = GLabelCreate;
1307 0 : stemarray[s++] = &gcd[k-1];
1308 :
1309 0 : label[k].text = (unichar_t *) "0";
1310 0 : label[k].text_is_1byte = true;
1311 0 : gcd[k].gd.label = &label[k];
1312 0 : gcd[k].gd.flags = gg_enabled | gg_visible;
1313 0 : gcd[k].gd.pos.width = 60;
1314 0 : gcd[k].gd.cid = CID_StemHeightAdd;
1315 0 : gcd[k].gd.handle_controlevent = CG_VStem_Changed;
1316 0 : gcd[k++].creator = GTextFieldCreate;
1317 0 : stemarray[s++] = &gcd[k-1];
1318 :
1319 0 : label[k].text = (unichar_t *) _("em-units");
1320 0 : label[k].text_is_1byte = true;
1321 0 : label[k].text_in_resource = true;
1322 0 : gcd[k].gd.label = &label[k];
1323 0 : gcd[k].gd.pos.x = 5; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+31;
1324 0 : gcd[k].gd.flags = gg_enabled | gg_visible;
1325 0 : gcd[k++].creator = GLabelCreate;
1326 0 : stemarray[s++] = &gcd[k-1];
1327 0 : stemarray[s++] = NULL;
1328 :
1329 0 : gcd[k].gd.pos.x = 5; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+31;
1330 0 : gcd[k].gd.flags = gg_enabled | gg_visible;
1331 0 : gcd[k].gd.cid = CID_StemWidthLabel;
1332 0 : gcd[k].gd.u.list = stemwidth;
1333 0 : gcd[k++].creator = GLabelCreate;
1334 0 : stemarray[s++] = &gcd[k-1];
1335 :
1336 0 : label[k].text = (unichar_t *) stem_factor;
1337 0 : label[k].text_is_1byte = true;
1338 0 : gcd[k].gd.label = &label[k];
1339 0 : gcd[k].gd.flags = gg_visible;
1340 0 : gcd[k].gd.cid = CID_StemWidth;
1341 0 : gcd[k].gd.pos.width = 60;
1342 0 : gcd[k++].creator = GTextFieldCreate;
1343 0 : stemarray[s++] = &gcd[k-1];
1344 :
1345 0 : label[k].text = (unichar_t *) _("% +");
1346 0 : label[k].text_is_1byte = true;
1347 0 : label[k].text_in_resource = true;
1348 0 : gcd[k].gd.label = &label[k];
1349 0 : gcd[k].gd.pos.x = 5; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+31;
1350 0 : gcd[k].gd.flags = gg_enabled | gg_visible;
1351 0 : gcd[k++].creator = GLabelCreate;
1352 0 : stemarray[s++] = &gcd[k-1];
1353 :
1354 0 : label[k].text = (unichar_t *) "0";
1355 0 : label[k].text_is_1byte = true;
1356 0 : gcd[k].gd.label = &label[k];
1357 0 : gcd[k].gd.flags = gg_visible;
1358 0 : gcd[k].gd.pos.width = 60;
1359 0 : gcd[k].gd.cid = CID_StemWidthAdd;
1360 0 : gcd[k++].creator = GTextFieldCreate;
1361 0 : stemarray[s++] = &gcd[k-1];
1362 :
1363 0 : label[k].text = (unichar_t *) _("em-units");
1364 0 : label[k].text_is_1byte = true;
1365 0 : label[k].text_in_resource = true;
1366 0 : gcd[k].gd.label = &label[k];
1367 0 : gcd[k].gd.pos.x = 5; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+31;
1368 0 : gcd[k].gd.flags = gg_enabled | gg_visible;
1369 0 : gcd[k++].creator = GLabelCreate;
1370 0 : stemarray[s++] = &gcd[k-1];
1371 0 : stemarray[s++] = NULL;
1372 0 : stemarray[s++] = NULL;
1373 :
1374 0 : boxes[7].gd.flags = gg_enabled|gg_visible;
1375 0 : boxes[7].gd.u.boxelements = stemarray;
1376 0 : boxes[7].creator = GHVBoxCreate;
1377 0 : varrays[l++] = &boxes[7]; varrays[l++] = NULL;
1378 :
1379 0 : label[k].text = (unichar_t *) _("Activate diagonal stem processing");
1380 0 : label[k].text_is_1byte = true;
1381 0 : label[k].text_in_resource = true;
1382 0 : gcd[k].gd.label = &label[k];
1383 0 : gcd[k].gd.pos.x = 5; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+31;
1384 0 : gcd[k].gd.flags = gg_enabled | gg_visible | gg_cb_on;
1385 0 : gcd[k].gd.cid = CID_DStemOn;
1386 0 : gcd[k++].creator = GCheckBoxCreate;
1387 0 : varrays[l++] = &gcd[k-1]; varrays[l++] = NULL;
1388 0 : varrays[l++] = GCD_Glue; varrays[l++] = NULL; varrays[l++] = NULL;
1389 :
1390 0 : boxes[8].gd.flags = gg_enabled|gg_visible;
1391 0 : boxes[8].gd.u.boxelements = varrays;
1392 0 : boxes[8].creator = GHVBoxCreate;
1393 :
1394 0 : aspects[a].text = (unichar_t *) _("Stems");
1395 0 : aspects[a].text_is_1byte = true;
1396 0 : aspects[a++].gcd = &boxes[8];
1397 :
1398 0 : l=s=0;
1399 :
1400 0 : label[k].text = (unichar_t *) _("Retain current advance width, center glyph within that width");
1401 0 : label[k].text_is_1byte = true;
1402 0 : label[k].text_in_resource = true;
1403 0 : gcd[k].gd.label = &label[k];
1404 0 : gcd[k].gd.pos.x = 5; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+31;
1405 0 : gcd[k].gd.flags = gg_enabled | gg_visible;
1406 0 : gcd[k].gd.cid = CID_Counter_SameAdvance;
1407 0 : gcd[k].gd.handle_controlevent = CG_CounterSameAs_Changed;
1408 0 : gcd[k++].creator = GRadioCreate;
1409 0 : varrayhc[l++] = &gcd[k-1]; varrayhc[l++] = NULL;
1410 :
1411 0 : label[k].text = (unichar_t *) _("Retain current advance width, scale side bearings proportionally");
1412 0 : label[k].text_is_1byte = true;
1413 0 : label[k].text_in_resource = true;
1414 0 : gcd[k].gd.label = &label[k];
1415 0 : gcd[k].gd.pos.x = 5; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+31;
1416 0 : gcd[k].gd.flags = gg_enabled | gg_visible;
1417 0 : gcd[k].gd.cid = CID_Counter_PropAdvance;
1418 0 : gcd[k].gd.handle_controlevent = CG_CounterSameAs_Changed;
1419 0 : gcd[k++].creator = GRadioCreate;
1420 0 : varrayhc[l++] = &gcd[k-1]; varrayhc[l++] = NULL;
1421 :
1422 0 : label[k].text = (unichar_t *) _("Uniform scaling for horizontal counters and side bearings");
1423 0 : label[k].text_is_1byte = true;
1424 0 : label[k].text_in_resource = true;
1425 0 : gcd[k].gd.label = &label[k];
1426 0 : gcd[k].gd.pos.x = 5; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+31;
1427 0 : gcd[k].gd.flags = gg_enabled | gg_visible | gg_cb_on;
1428 0 : gcd[k].gd.cid = CID_Counter_is_SideB;
1429 0 : gcd[k].gd.handle_controlevent = CG_CounterSameAs_Changed;
1430 0 : gcd[k++].creator = GRadioCreate;
1431 0 : varrayhc[l++] = &gcd[k-1]; varrayhc[l++] = NULL;
1432 :
1433 0 : label[k].text = (unichar_t *) _("Non uniform scaling for horizontal counters and side bearings");
1434 0 : label[k].text_is_1byte = true;
1435 0 : label[k].text_in_resource = true;
1436 0 : gcd[k].gd.label = &label[k];
1437 0 : gcd[k].gd.pos.x = 5; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+31;
1438 0 : gcd[k].gd.flags = gg_enabled | gg_visible;
1439 0 : gcd[k].gd.cid = CID_Counter_isnt_SideB;
1440 0 : gcd[k].gd.handle_controlevent = CG_CounterSameAs_Changed;
1441 0 : gcd[k++].creator = GRadioCreate;
1442 0 : varrayhc[l++] = &gcd[k-1]; varrayhc[l++] = NULL;
1443 :
1444 0 : label[k].text = (unichar_t *) _("Counter Size:");
1445 0 : label[k].text_is_1byte = true;
1446 0 : label[k].text_in_resource = true;
1447 0 : gcd[k].gd.label = &label[k];
1448 0 : gcd[k].gd.flags = gg_enabled | gg_visible;
1449 0 : gcd[k++].creator = GLabelCreate;
1450 0 : stemarrayhc[s++] = &gcd[k-1];
1451 :
1452 0 : label[k].text = (unichar_t *) glyph_factor;
1453 0 : label[k].text_is_1byte = true;
1454 0 : gcd[k].gd.label = &label[k];
1455 0 : gcd[k].gd.flags = gg_enabled | gg_visible;
1456 0 : gcd[k].gd.cid = CID_CounterPercent;
1457 0 : gcd[k].gd.handle_controlevent = CG_Counter_Changed;
1458 0 : gcd[k].gd.pos.width = 60;
1459 0 : gcd[k++].creator = GTextFieldCreate;
1460 0 : stemarrayhc[s++] = &gcd[k-1];
1461 :
1462 0 : label[k].text = (unichar_t *) _("% +");
1463 0 : label[k].text_is_1byte = true;
1464 0 : label[k].text_in_resource = true;
1465 0 : gcd[k].gd.label = &label[k];
1466 0 : gcd[k].gd.flags = gg_enabled | gg_visible;
1467 0 : gcd[k++].creator = GLabelCreate;
1468 0 : stemarrayhc[s++] = &gcd[k-1];
1469 :
1470 0 : label[k].text = (unichar_t *) "0";
1471 0 : label[k].text_is_1byte = true;
1472 0 : gcd[k].gd.label = &label[k];
1473 0 : gcd[k].gd.flags = gg_enabled | gg_visible;
1474 0 : gcd[k].gd.pos.width = 60;
1475 0 : gcd[k].gd.cid = CID_CounterAdd;
1476 0 : gcd[k].gd.handle_controlevent = CG_Counter_Changed;
1477 0 : gcd[k++].creator = GTextFieldCreate;
1478 0 : stemarrayhc[s++] = &gcd[k-1];
1479 :
1480 0 : label[k].text = (unichar_t *) _("em-units");
1481 0 : label[k].text_is_1byte = true;
1482 0 : label[k].text_in_resource = true;
1483 0 : gcd[k].gd.label = &label[k];
1484 0 : gcd[k].gd.flags = gg_enabled | gg_visible;
1485 0 : gcd[k++].creator = GLabelCreate;
1486 0 : stemarrayhc[s++] = &gcd[k-1];
1487 0 : stemarrayhc[s++] = NULL;
1488 :
1489 0 : label[k].text = (unichar_t *) _("Left Side Bearing:");
1490 0 : label[k].text_is_1byte = true;
1491 0 : label[k].text_in_resource = true;
1492 0 : gcd[k].gd.label = &label[k];
1493 0 : gcd[k].gd.flags = gg_enabled | gg_visible;
1494 0 : gcd[k++].creator = GLabelCreate;
1495 0 : stemarrayhc[s++] = &gcd[k-1];
1496 :
1497 0 : label[k].text = (unichar_t *) glyph_factor;
1498 0 : label[k].text_is_1byte = true;
1499 0 : gcd[k].gd.label = &label[k];
1500 0 : gcd[k].gd.flags = gg_visible;
1501 0 : gcd[k].gd.cid = CID_LSBPercent;
1502 0 : gcd[k].gd.pos.width = 60;
1503 0 : gcd[k++].creator = GTextFieldCreate;
1504 0 : stemarrayhc[s++] = &gcd[k-1];
1505 :
1506 0 : label[k].text = (unichar_t *) _("% +");
1507 0 : label[k].text_is_1byte = true;
1508 0 : label[k].text_in_resource = true;
1509 0 : gcd[k].gd.label = &label[k];
1510 0 : gcd[k].gd.flags = gg_enabled | gg_visible;
1511 0 : gcd[k++].creator = GLabelCreate;
1512 0 : stemarrayhc[s++] = &gcd[k-1];
1513 :
1514 0 : label[k].text = (unichar_t *) "0";
1515 0 : label[k].text_is_1byte = true;
1516 0 : gcd[k].gd.label = &label[k];
1517 0 : gcd[k].gd.flags = gg_visible;
1518 0 : gcd[k].gd.pos.width = 60;
1519 0 : gcd[k].gd.cid = CID_LSBAdd;
1520 0 : gcd[k++].creator = GTextFieldCreate;
1521 0 : stemarrayhc[s++] = &gcd[k-1];
1522 :
1523 0 : label[k].text = (unichar_t *) _("em-units");
1524 0 : label[k].text_is_1byte = true;
1525 0 : label[k].text_in_resource = true;
1526 0 : gcd[k].gd.label = &label[k];
1527 0 : gcd[k].gd.flags = gg_enabled | gg_visible;
1528 0 : gcd[k++].creator = GLabelCreate;
1529 0 : stemarrayhc[s++] = &gcd[k-1];
1530 0 : stemarrayhc[s++] = NULL;
1531 :
1532 0 : label[k].text = (unichar_t *) _("Right Side Bearing:");
1533 0 : label[k].text_is_1byte = true;
1534 0 : label[k].text_in_resource = true;
1535 0 : gcd[k].gd.label = &label[k];
1536 0 : gcd[k].gd.flags = gg_enabled | gg_visible;
1537 0 : gcd[k++].creator = GLabelCreate;
1538 0 : stemarrayhc[s++] = &gcd[k-1];
1539 :
1540 0 : label[k].text = (unichar_t *) glyph_factor;
1541 0 : label[k].text_is_1byte = true;
1542 0 : gcd[k].gd.label = &label[k];
1543 0 : gcd[k].gd.flags = gg_visible;
1544 0 : gcd[k].gd.cid = CID_RSBPercent;
1545 0 : gcd[k].gd.pos.width = 60;
1546 0 : gcd[k++].creator = GTextFieldCreate;
1547 0 : stemarrayhc[s++] = &gcd[k-1];
1548 :
1549 0 : label[k].text = (unichar_t *) _("% +");
1550 0 : label[k].text_is_1byte = true;
1551 0 : label[k].text_in_resource = true;
1552 0 : gcd[k].gd.label = &label[k];
1553 0 : gcd[k].gd.flags = gg_enabled | gg_visible;
1554 0 : gcd[k++].creator = GLabelCreate;
1555 0 : stemarrayhc[s++] = &gcd[k-1];
1556 :
1557 0 : label[k].text = (unichar_t *) "0";
1558 0 : label[k].text_is_1byte = true;
1559 0 : gcd[k].gd.label = &label[k];
1560 0 : gcd[k].gd.flags = gg_visible;
1561 0 : gcd[k].gd.pos.width = 60;
1562 0 : gcd[k].gd.cid = CID_RSBAdd;
1563 0 : gcd[k++].creator = GTextFieldCreate;
1564 0 : stemarrayhc[s++] = &gcd[k-1];
1565 :
1566 0 : label[k].text = (unichar_t *) _("em-units");
1567 0 : label[k].text_is_1byte = true;
1568 0 : label[k].text_in_resource = true;
1569 0 : gcd[k].gd.label = &label[k];
1570 0 : gcd[k].gd.flags = gg_enabled | gg_visible;
1571 0 : gcd[k++].creator = GLabelCreate;
1572 0 : stemarrayhc[s++] = &gcd[k-1];
1573 0 : stemarrayhc[s++] = NULL;
1574 0 : stemarrayhc[s++] = NULL;
1575 :
1576 0 : boxes[10].gd.flags = gg_enabled|gg_visible;
1577 0 : boxes[10].gd.u.boxelements = stemarrayhc;
1578 0 : boxes[10].creator = GHVBoxCreate;
1579 0 : varrayhc[l++] = &boxes[10]; varrayhc[l++] = NULL;
1580 0 : varrayhc[l++] = GCD_Glue; varrayhc[l++] = NULL; varrayhc[l++] = NULL;
1581 :
1582 0 : boxes[11].gd.flags = gg_enabled|gg_visible;
1583 0 : boxes[11].gd.u.boxelements = varrayhc;
1584 0 : boxes[11].creator = GHVBoxCreate;
1585 :
1586 0 : aspects[a].text = (unichar_t *) _("Horizontal");
1587 0 : aspects[a].text_is_1byte = true;
1588 0 : aspects[a++].gcd = &boxes[11];
1589 :
1590 0 : l=s=0;
1591 :
1592 0 : label[k].text = (unichar_t *) _("Control Vertical Counters (use for CJK)");
1593 0 : label[k].text_is_1byte = true;
1594 0 : label[k].text_in_resource = true;
1595 0 : gcd[k].gd.label = &label[k];
1596 0 : gcd[k].gd.flags = gg_enabled | gg_visible;
1597 0 : gcd[k].gd.handle_controlevent = CG_UseVCounters;
1598 0 : gcd[k].gd.cid = CID_UseVerticalCounters;
1599 0 : gcd[k++].creator = GRadioCreate;
1600 0 : varrayvc[l++] = &gcd[k-1]; varrayvc[l++] = NULL;
1601 :
1602 0 : label[k].text = (unichar_t *) _("Vertical Counters:");
1603 0 : label[k].text_is_1byte = true;
1604 0 : label[k].text_in_resource = true;
1605 0 : gcd[k].gd.label = &label[k];
1606 0 : gcd[k].gd.flags = gg_enabled | gg_visible;
1607 0 : gcd[k++].creator = GLabelCreate;
1608 0 : stemarrayvc[s++] = &gcd[k-1];
1609 :
1610 0 : label[k].text = (unichar_t *) glyph_factor;
1611 0 : label[k].text_is_1byte = true;
1612 0 : gcd[k].gd.label = &label[k];
1613 0 : gcd[k].gd.flags = gg_visible;
1614 0 : gcd[k].gd.cid = CID_VCounterPercent;
1615 0 : gcd[k].gd.pos.width = 60;
1616 0 : gcd[k++].creator = GTextFieldCreate;
1617 0 : stemarrayvc[s++] = &gcd[k-1];
1618 :
1619 0 : label[k].text = (unichar_t *) _("% +");
1620 0 : label[k].text_is_1byte = true;
1621 0 : label[k].text_in_resource = true;
1622 0 : gcd[k].gd.label = &label[k];
1623 0 : gcd[k].gd.flags = gg_enabled | gg_visible;
1624 0 : gcd[k++].creator = GLabelCreate;
1625 0 : stemarrayvc[s++] = &gcd[k-1];
1626 :
1627 0 : label[k].text = (unichar_t *) "0";
1628 0 : label[k].text_is_1byte = true;
1629 0 : gcd[k].gd.label = &label[k];
1630 0 : gcd[k].gd.flags = gg_visible;
1631 0 : gcd[k].gd.pos.width = 60;
1632 0 : gcd[k].gd.cid = CID_VCounterAdd;
1633 0 : gcd[k++].creator = GTextFieldCreate;
1634 0 : stemarrayvc[s++] = &gcd[k-1];
1635 :
1636 0 : label[k].text = (unichar_t *) _("em-units");
1637 0 : label[k].text_is_1byte = true;
1638 0 : label[k].text_in_resource = true;
1639 0 : gcd[k].gd.label = &label[k];
1640 0 : gcd[k].gd.flags = gg_enabled | gg_visible;
1641 0 : gcd[k++].creator = GLabelCreate;
1642 0 : stemarrayvc[s++] = &gcd[k-1];
1643 0 : stemarrayvc[s++] = NULL; stemarrayvc[s++] = NULL;
1644 :
1645 0 : if ( s > sizeof(stemarrayvc)/sizeof(stemarrayvc[0]) )
1646 0 : IError( "Increase size of stemarrayvc" );
1647 :
1648 0 : boxes[13].gd.flags = gg_enabled|gg_visible;
1649 0 : boxes[13].gd.u.boxelements = stemarrayvc;
1650 0 : boxes[13].creator = GHBoxCreate;
1651 0 : varrayvc[l++] = &boxes[13]; varrayvc[l++] = NULL;
1652 :
1653 0 : label[k].text = (unichar_t *) _("Control Vertical Mapping (use for Latin, Greek, Cyrillic)");
1654 0 : label[k].text_is_1byte = true;
1655 0 : label[k].text_in_resource = true;
1656 0 : gcd[k].gd.label = &label[k];
1657 0 : gcd[k].gd.flags = gg_enabled | gg_visible | gg_utf8_popup | gg_cb_on | gg_rad_continueold;
1658 0 : gcd[k].gd.popup_msg = (unichar_t *) _("These mappings may be used to fix certain standard heights.");
1659 0 : gcd[k].gd.cid = CID_UseVerticalMappings;
1660 0 : gcd[k].gd.handle_controlevent = CG_UseVCounters;
1661 0 : gcd[k++].creator = GRadioCreate;
1662 0 : varrayvc[l++] = &gcd[k-1]; varrayvc[l++] = NULL;
1663 :
1664 0 : s = 0;
1665 0 : label[k].text = (unichar_t *) _("Vertical Scale:");
1666 0 : label[k].text_is_1byte = true;
1667 0 : label[k].text_in_resource = true;
1668 0 : gcd[k].gd.label = &label[k];
1669 0 : gcd[k].gd.flags = gg_enabled | gg_visible;
1670 0 : gcd[k++].creator = GLabelCreate;
1671 0 : harray[s++] = &gcd[k-1];
1672 :
1673 0 : label[k].text = (unichar_t *) glyph_factor;
1674 0 : label[k].text_is_1byte = true;
1675 0 : gcd[k].gd.label = &label[k];
1676 0 : gcd[k].gd.flags = gg_enabled | gg_visible;
1677 0 : gcd[k].gd.cid = CID_VerticalScale;
1678 0 : gcd[k].gd.pos.width = 60;
1679 0 : gcd[k].gd.handle_controlevent = CG_VScale_Changed;
1680 0 : gcd[k++].creator = GTextFieldCreate;
1681 0 : harray[s++] = &gcd[k-1];
1682 :
1683 0 : label[k].text = (unichar_t *) _("%");
1684 0 : label[k].text_is_1byte = true;
1685 0 : label[k].text_in_resource = true;
1686 0 : gcd[k].gd.label = &label[k];
1687 0 : gcd[k].gd.flags = gg_enabled | gg_visible;
1688 0 : gcd[k++].creator = GLabelCreate;
1689 0 : harray[s++] = &gcd[k-1]; harray[s++] = GCD_Glue; harray[s++] = NULL;
1690 :
1691 0 : boxes[14].gd.flags = gg_enabled|gg_visible;
1692 0 : boxes[14].gd.u.boxelements = harray;
1693 0 : boxes[14].creator = GHBoxCreate;
1694 0 : varrayvc[l++] = &boxes[14]; varrayvc[l++] = NULL;
1695 :
1696 :
1697 0 : MappingMatrixInit(&mapmi,
1698 : sf,
1699 : gc==gc_smallcaps?0:small.xheight,
1700 : small.capheight,glyph_scale);
1701 :
1702 0 : gcd[k].gd.flags = gg_enabled | gg_visible;
1703 0 : gcd[k].gd.cid = CID_VMappings;
1704 0 : gcd[k].gd.u.matrix = &mapmi;
1705 0 : gcd[k++].creator = GMatrixEditCreate;
1706 0 : varrayvc[l++] = &gcd[k-1]; varrayvc[l++] = NULL; varrayvc[l++] = NULL;
1707 :
1708 0 : boxes[15].gd.flags = gg_enabled|gg_visible;
1709 0 : boxes[15].gd.u.boxelements = varrayvc;
1710 0 : boxes[15].creator = GHVBoxCreate;
1711 :
1712 0 : aspects[a].text = (unichar_t *) _("Vertical");
1713 0 : aspects[a].text_is_1byte = true;
1714 0 : aspects[a++].gcd = &boxes[15];
1715 :
1716 0 : l=0;
1717 :
1718 0 : gcd[k].gd.u.tabs = aspects;
1719 0 : gcd[k].gd.flags = gg_visible | gg_enabled | gg_tabset_scroll;
1720 0 : gcd[k].gd.cid = CID_TabSet;
1721 0 : gcd[k++].creator = GTabSetCreate;
1722 0 : varray[l++] = &gcd[k-1]; varray[l++] = NULL;
1723 :
1724 :
1725 0 : gcd[k].gd.pos.x = 30-3; gcd[k].gd.pos.y = 5;
1726 0 : gcd[k].gd.pos.width = -1;
1727 0 : gcd[k].gd.flags = gg_visible | gg_enabled | gg_but_default;
1728 0 : label[k].text = (unichar_t *) _("_OK");
1729 0 : label[k].text_is_1byte = true;
1730 0 : label[k].text_in_resource = true;
1731 0 : gcd[k].gd.label = &label[k];
1732 0 : gcd[k].gd.handle_controlevent = GlyphChange_OK;
1733 0 : gcd[k++].creator = GButtonCreate;
1734 0 : barray[0] = GCD_Glue; barray[1] = &gcd[k-1]; barray[2] = GCD_Glue;
1735 :
1736 0 : gcd[k].gd.flags = gg_visible | gg_enabled | gg_utf8_popup;
1737 0 : gcd[k].gd.popup_msg = (unichar_t *) _("Everything to its default value");
1738 0 : label[k].text = (unichar_t *) _("Reset");
1739 0 : label[k].text_is_1byte = true;
1740 0 : label[k].text_in_resource = true;
1741 0 : gcd[k].gd.label = &label[k];
1742 0 : gcd[k].gd.handle_controlevent = GlyphChange_Default;
1743 0 : gcd[k++].creator = GButtonCreate;
1744 0 : barray[3] = GCD_Glue; barray[4] = &gcd[k-1]; barray[5] = GCD_Glue;
1745 :
1746 0 : gcd[k].gd.pos.x = -30; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+3;
1747 0 : gcd[k].gd.pos.width = -1;
1748 0 : gcd[k].gd.flags = gg_visible | gg_enabled | gg_but_cancel;
1749 0 : label[k].text = (unichar_t *) _("_Cancel");
1750 0 : label[k].text_is_1byte = true;
1751 0 : label[k].text_in_resource = true;
1752 0 : gcd[k].gd.label = &label[k];
1753 0 : gcd[k].gd.handle_controlevent = CondenseExtend_Cancel;
1754 0 : gcd[k].creator = GButtonCreate;
1755 0 : barray[6] = GCD_Glue; barray[7] = &gcd[k]; barray[8] = GCD_Glue;
1756 0 : barray[9] = NULL;
1757 :
1758 0 : boxes[17].gd.flags = gg_enabled|gg_visible;
1759 0 : boxes[17].gd.u.boxelements = barray;
1760 0 : boxes[17].creator = GHBoxCreate;
1761 0 : varray[l++] = &boxes[17]; varray[l++] = NULL; varray[l++] = NULL;
1762 :
1763 0 : if ( l>=sizeof(varray)/sizeof(varray[0]))
1764 0 : IError("Increase size of varray" );
1765 0 : if ( k>=sizeof(gcd)/sizeof(gcd[0]))
1766 0 : IError("Increase size of gcd" );
1767 0 : if ( k>=sizeof(label)/sizeof(label[0]))
1768 0 : IError("Increase size of label" );
1769 :
1770 0 : boxes[0].gd.pos.x = boxes[0].gd.pos.y = 2;
1771 0 : boxes[0].gd.flags = gg_enabled|gg_visible;
1772 0 : boxes[0].gd.u.boxelements = varray;
1773 0 : boxes[0].creator = GHVGroupCreate;
1774 :
1775 0 : GGadgetsCreate(gw,boxes);
1776 0 : GHVBoxSetExpandableCol(boxes[13].ret,gb_expandglue);
1777 0 : if ( boxes[2].ret!=NULL )
1778 0 : GHVBoxSetExpandableCol(boxes[2].ret,gb_expandglue);
1779 0 : if ( boxes[3].ret!=NULL )
1780 0 : GHVBoxSetExpandableCol(boxes[3].ret,gb_expandglue);
1781 0 : if ( boxes[4].ret!=NULL )
1782 0 : GHVBoxSetExpandableRow(boxes[4].ret,gb_expandglue);
1783 0 : GHVBoxSetExpandableRow(boxes[8].ret,gb_expandglue);
1784 0 : GHVBoxSetExpandableRow(boxes[11].ret,gb_expandglue);
1785 0 : GHVBoxSetExpandableRow(boxes[15].ret,4);
1786 0 : GHVBoxSetExpandableCol(boxes[17].ret,gb_expandgluesame);
1787 0 : GHVBoxSetExpandableRow(boxes[0].ret,0);
1788 0 : GHVBoxFitWindow(boxes[0].ret);
1789 : /* if ( gc==gc_subsuper ) */
1790 : /* GMatrixEditShowColumn(GWidgetGetControl(gw,CID_VMappings),2,false);*/
1791 0 : last_dlg[gc] = gw;
1792 0 : last_sf[gc] = sf;
1793 : } else {
1794 0 : int err = false;
1795 0 : ed.gw = gw = last_dlg[gc];
1796 0 : ed.scale = GetCalmReal8(gw,CID_VerticalScale,"unused",&err)/100.0;
1797 0 : if ( err )
1798 0 : ed.scale = 1;
1799 0 : GDrawSetUserData(last_dlg[gc],&ed);
1800 0 : GDrawSetTransientFor(last_dlg[gc],(GWindow) -1);
1801 : }
1802 0 : GDrawSetVisible(gw,true);
1803 :
1804 0 : while ( !ed.done )
1805 0 : GDrawProcessOneEvent(NULL);
1806 0 : GDrawSetVisible(gw,false);
1807 0 : }
1808 :
1809 : /* ************************************************************************** */
1810 : /* ***************************** Embolden Dialog **************************** */
1811 : /* ************************************************************************** */
1812 :
1813 : #define CID_EmBdWidth 1001
1814 : #define CID_LCG 1002
1815 : #define CID_CJK 1003
1816 : #define CID_Auto 1004
1817 : #define CID_Custom 1005
1818 : #define CID_TopZone 1006
1819 : #define CID_BottomZone 1007
1820 : #define CID_CleanupSelfIntersect 1008
1821 : #define CID_TopHint 1009
1822 : #define CID_BottomHint 1010
1823 : #define CID_Squish 1011
1824 : #define CID_Retain 1012
1825 : #define CID_CounterAuto 1013
1826 : #define CID_SerifHeight 1014
1827 : #define CID_SerifHFuzz 1015
1828 :
1829 : static SplineFont *lastsf = NULL;
1830 : static enum embolden_type last_type = embolden_auto;
1831 : static struct lcg_zones last_zones;
1832 : static int last_width;
1833 : static int last_overlap = true;
1834 :
1835 0 : static int Embolden_OK(GGadget *g, GEvent *e) {
1836 : enum embolden_type type;
1837 : struct lcg_zones zones;
1838 0 : int err = false;
1839 :
1840 0 : if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) {
1841 0 : GWindow ew = GGadgetGetWindow(g);
1842 0 : StyleDlg *ed = GDrawGetUserData(ew);
1843 0 : memset(&zones,0,sizeof(zones));
1844 0 : err = false;
1845 0 : zones.stroke_width = GetReal8(ew,CID_EmBdWidth,_("Embolden by"),&err);
1846 0 : type = GGadgetIsChecked( GWidgetGetControl(ew,CID_LCG)) ? embolden_lcg :
1847 0 : GGadgetIsChecked( GWidgetGetControl(ew,CID_CJK)) ? embolden_cjk :
1848 0 : GGadgetIsChecked( GWidgetGetControl(ew,CID_Auto)) ? embolden_auto :
1849 : embolden_custom;
1850 0 : zones.serif_height = GetReal8(ew,CID_SerifHeight,_("Serif Height"),&err);
1851 0 : zones.serif_fuzz = GetReal8(ew,CID_SerifHFuzz,_("Serif Height Fuzz"),&err);
1852 0 : if ( type == embolden_custom ) {
1853 0 : zones.top_zone = GetReal8(ew,CID_TopZone,_("Top Zone"),&err);
1854 0 : zones.bottom_zone = GetReal8(ew,CID_BottomZone,_("Bottom Zone"),&err);
1855 0 : zones.top_bound = GetReal8(ew,CID_TopHint,_("Top Hint"),&err);
1856 0 : zones.bottom_bound = GetReal8(ew,CID_BottomHint,_("Bottom Hint"),&err);
1857 : }
1858 0 : if ( err )
1859 0 : return( true );
1860 0 : zones.counter_type = GGadgetIsChecked( GWidgetGetControl(ew,CID_Squish)) ? ct_squish :
1861 0 : GGadgetIsChecked( GWidgetGetControl(ew,CID_Retain)) ? ct_retain :
1862 : ct_auto;
1863 :
1864 0 : lastsf = ed->sf;
1865 0 : last_type = type;
1866 0 : last_width = zones.stroke_width;
1867 0 : last_overlap = zones.removeoverlap = GGadgetIsChecked( GWidgetGetControl(ew,CID_CleanupSelfIntersect));
1868 0 : if ( type == embolden_custom )
1869 0 : last_zones = zones;
1870 :
1871 0 : if ( ed->fv!=NULL )
1872 0 : FVEmbolden((FontViewBase *) ed->fv, type, &zones);
1873 : else
1874 0 : CVEmbolden((CharViewBase *) ed->cv, type, &zones);
1875 0 : ed->done = true;
1876 : }
1877 0 : return( true );
1878 : }
1879 :
1880 0 : static int Embolden_Cancel(GGadget *g, GEvent *e) {
1881 0 : if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) {
1882 0 : StyleDlg *ed = GDrawGetUserData(GGadgetGetWindow(g));
1883 0 : ed->done = true;
1884 : }
1885 0 : return( true );
1886 : }
1887 :
1888 0 : static int Embolden_Radio(GGadget *g, GEvent *e) {
1889 0 : if ( e->type==et_controlevent && e->u.control.subtype == et_radiochanged ) {
1890 0 : StyleDlg *ed = GDrawGetUserData(GGadgetGetWindow(g));
1891 : int en;
1892 0 : en = GGadgetIsChecked( GWidgetGetControl(ed->gw,CID_Custom));
1893 0 : GGadgetSetEnabled(GWidgetGetControl(ed->gw,CID_TopZone),en);
1894 0 : GGadgetSetEnabled(GWidgetGetControl(ed->gw,CID_BottomZone),en);
1895 0 : GGadgetSetEnabled(GWidgetGetControl(ed->gw,CID_TopHint),en);
1896 0 : GGadgetSetEnabled(GWidgetGetControl(ed->gw,CID_BottomHint),en);
1897 : }
1898 0 : return( true );
1899 : }
1900 :
1901 0 : void EmboldenDlg(FontView *fv, CharView *cv) {
1902 : StyleDlg ed;
1903 0 : SplineFont *sf = fv!=NULL ? fv->b.sf : cv->b.sc->parent;
1904 : BlueData bd;
1905 : GRect pos;
1906 : GWindow gw;
1907 : GWindowAttrs wattrs;
1908 : GGadgetCreateData gcd[27], boxes[6], *barray[8], *rarray[6], *carray[6], *hvarray[10][5];
1909 : GTextInfo label[27];
1910 : int k;
1911 : char topzone[40], botzone[40], emb_width[40], tophint[40], bothint[40], serifh[40];
1912 :
1913 0 : memset(&ed,0,sizeof(ed));
1914 0 : ed.fv = fv;
1915 0 : ed.cv = cv;
1916 0 : ed.sf = sf;
1917 0 : ed.layer = cv==NULL ? fv->b.active_layer : CVLayer((CharViewBase *) cv);
1918 :
1919 0 : QuickBlues(sf, ed.layer, &bd);
1920 :
1921 0 : memset(&wattrs,0,sizeof(wattrs));
1922 0 : wattrs.mask = wam_events|wam_cursor|wam_utf8_wtitle|wam_undercursor|wam_isdlg|wam_restrict;
1923 0 : wattrs.event_masks = ~(1<<et_charup);
1924 0 : wattrs.restrict_input_to_me = 1;
1925 0 : wattrs.undercursor = 1;
1926 0 : wattrs.cursor = ct_pointer;
1927 0 : wattrs.utf8_window_title = _("Change Weight");
1928 0 : wattrs.is_dlg = true;
1929 0 : pos.x = pos.y = 0;
1930 0 : pos.width = 100;
1931 0 : pos.height = 100;
1932 0 : ed.gw = gw = GDrawCreateTopWindow(NULL,&pos,style_e_h,&ed,&wattrs);
1933 :
1934 :
1935 0 : k=0;
1936 :
1937 0 : memset(gcd,0,sizeof(gcd));
1938 0 : memset(boxes,0,sizeof(boxes));
1939 0 : memset(label,0,sizeof(label));
1940 0 : label[k].text = (unichar_t *) _("Embolden by:");
1941 0 : label[k].text_is_1byte = true;
1942 0 : label[k].text_in_resource = true;
1943 0 : gcd[k].gd.label = &label[k];
1944 0 : gcd[k].gd.flags = gg_enabled | gg_visible;
1945 0 : gcd[k++].creator = GLabelCreate;
1946 0 : hvarray[0][0] = &gcd[k-1];
1947 :
1948 0 : sprintf( emb_width, "%d", sf==lastsf ? last_width : (sf->ascent+sf->descent)/20 );
1949 0 : label[k].text = (unichar_t *) emb_width;
1950 0 : label[k].text_is_1byte = true;
1951 0 : gcd[k].gd.label = &label[k];
1952 0 : gcd[k].gd.pos.width = 60;
1953 0 : gcd[k].gd.flags = gg_enabled | gg_visible;
1954 0 : gcd[k].gd.cid = CID_EmBdWidth;
1955 0 : gcd[k++].creator = GNumericFieldCreate;
1956 0 : hvarray[0][1] = &gcd[k-1];
1957 :
1958 0 : label[k].text = (unichar_t *) _("em units");
1959 0 : label[k].text_is_1byte = true;
1960 0 : label[k].text_in_resource = true;
1961 0 : gcd[k].gd.label = &label[k];
1962 0 : gcd[k].gd.pos.x = 5; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+31;
1963 0 : gcd[k].gd.flags = gg_enabled | gg_visible;
1964 0 : gcd[k++].creator = GLabelCreate;
1965 0 : hvarray[0][2] = &gcd[k-1];
1966 0 : hvarray[0][3] = GCD_Glue; hvarray[0][4] = NULL;
1967 :
1968 0 : label[k].text = (unichar_t *) _("_LCG");
1969 0 : gcd[k].gd.popup_msg = (unichar_t *) _("Embolden as appropriate for Latin, Cyrillic and Greek scripts");
1970 0 : label[k].text_is_1byte = true;
1971 0 : label[k].text_in_resource = true;
1972 0 : gcd[k].gd.label = &label[k];
1973 0 : gcd[k].gd.flags = gg_enabled | gg_visible | gg_utf8_popup;
1974 0 : gcd[k].gd.cid = CID_LCG;
1975 0 : gcd[k].gd.handle_controlevent = Embolden_Radio;
1976 0 : gcd[k++].creator = GRadioCreate;
1977 0 : rarray[0] = &gcd[k-1];
1978 :
1979 0 : label[k].text = (unichar_t *) _("_CJK");
1980 0 : gcd[k].gd.popup_msg = (unichar_t *) _("Embolden as appropriate for Chinese, Japanese, Korean scripts");
1981 0 : label[k].text_is_1byte = true;
1982 0 : label[k].text_in_resource = true;
1983 0 : gcd[k].gd.label = &label[k];
1984 0 : gcd[k].gd.flags = gg_enabled | gg_visible | gg_utf8_popup;
1985 0 : gcd[k].gd.cid = CID_CJK;
1986 0 : gcd[k].gd.handle_controlevent = Embolden_Radio;
1987 0 : gcd[k++].creator = GRadioCreate;
1988 0 : rarray[1] = &gcd[k-1];
1989 :
1990 0 : label[k].text = (unichar_t *) _("_Auto");
1991 0 : gcd[k].gd.popup_msg = (unichar_t *) _("Choose the appropriate method depending on the glyph's script");
1992 0 : label[k].text_is_1byte = true;
1993 0 : label[k].text_in_resource = true;
1994 0 : gcd[k].gd.label = &label[k];
1995 0 : gcd[k].gd.flags = gg_enabled | gg_visible | gg_utf8_popup;
1996 0 : gcd[k].gd.cid = CID_Auto;
1997 0 : gcd[k].gd.handle_controlevent = Embolden_Radio;
1998 0 : gcd[k++].creator = GRadioCreate;
1999 0 : rarray[2] = &gcd[k-1];
2000 :
2001 0 : label[k].text = (unichar_t *) _("C_ustom");
2002 0 : gcd[k].gd.popup_msg = (unichar_t *) _("User controls the emboldening with the next two fields");
2003 0 : label[k].text_is_1byte = true;
2004 0 : label[k].text_in_resource = true;
2005 0 : gcd[k].gd.label = &label[k];
2006 0 : gcd[k].gd.flags = gg_enabled | gg_visible | gg_utf8_popup;
2007 0 : gcd[k].gd.cid = CID_Custom;
2008 0 : gcd[k].gd.handle_controlevent = Embolden_Radio;
2009 0 : gcd[k++].creator = GRadioCreate;
2010 0 : rarray[3] = &gcd[k-1]; rarray[4] = GCD_Glue; rarray[5] = NULL;
2011 :
2012 0 : if ( lastsf!=sf )
2013 0 : gcd[k-4 + embolden_auto].gd.flags |= gg_cb_on;
2014 : else
2015 0 : gcd[k-4 + last_type].gd.flags |= gg_cb_on;
2016 :
2017 0 : boxes[3].gd.flags = gg_enabled|gg_visible;
2018 0 : boxes[3].gd.u.boxelements = rarray;
2019 0 : boxes[3].creator = GHBoxCreate;
2020 0 : hvarray[1][0] = &boxes[3]; hvarray[1][1] = hvarray[1][2] = hvarray[1][3] = GCD_ColSpan; hvarray[1][4] = NULL;
2021 :
2022 0 : label[k].text = (unichar_t *) _("_Top hint:");
2023 0 : label[k].text_is_1byte = true;
2024 0 : label[k].text_in_resource = true;
2025 0 : gcd[k].gd.label = &label[k];
2026 0 : gcd[k].gd.pos.x = 5; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+31;
2027 0 : gcd[k].gd.flags = gg_enabled | gg_visible;
2028 0 : gcd[k++].creator = GLabelCreate;
2029 0 : hvarray[2][0] = &gcd[k-1];
2030 :
2031 0 : sprintf( tophint, "%d", lastsf==sf && last_type==embolden_custom ? last_zones.top_bound :
2032 0 : (int) rint(bd.xheight>0 ? bd.xheight : bd.caph>0 ? 2*bd.caph/3 :
2033 0 : sf->ascent/2 ));
2034 0 : label[k].text = (unichar_t *) tophint;
2035 0 : label[k].text_is_1byte = true;
2036 0 : gcd[k].gd.label = &label[k];
2037 0 : gcd[k].gd.pos.x = 80; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y-3;
2038 0 : gcd[k].gd.pos.width = 60;
2039 0 : gcd[k].gd.flags = gg_visible;
2040 0 : gcd[k].gd.cid = CID_TopHint;
2041 0 : gcd[k++].creator = GNumericFieldCreate;
2042 0 : hvarray[2][1] = &gcd[k-1];
2043 :
2044 0 : label[k].text = (unichar_t *) _("_Zone:");
2045 0 : label[k].text_is_1byte = true;
2046 0 : label[k].text_in_resource = true;
2047 0 : gcd[k].gd.label = &label[k];
2048 0 : gcd[k].gd.pos.x = 5; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+31;
2049 0 : gcd[k].gd.flags = gg_enabled | gg_visible;
2050 0 : gcd[k++].creator = GLabelCreate;
2051 0 : hvarray[2][2] = &gcd[k-1];
2052 :
2053 0 : sprintf( topzone, "%d", lastsf==sf && last_type==embolden_custom ? last_zones.top_zone :
2054 0 : (int) rint(bd.xheight>0 ? 2*bd.xheight/3 :
2055 0 : bd.caph>0 ? 2*bd.caph/3 :
2056 0 : (sf->ascent/3)) );
2057 0 : label[k].text = (unichar_t *) topzone;
2058 0 : label[k].text_is_1byte = true;
2059 0 : gcd[k].gd.label = &label[k];
2060 0 : gcd[k].gd.pos.x = 80; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y-3;
2061 0 : gcd[k].gd.pos.width = 60;
2062 0 : gcd[k].gd.flags = gg_visible;
2063 0 : gcd[k].gd.cid = CID_TopZone;
2064 0 : gcd[k++].creator = GNumericFieldCreate;
2065 0 : hvarray[2][3] = &gcd[k-1]; hvarray[2][4] = NULL;
2066 :
2067 0 : label[k].text = (unichar_t *) _("_Bottom hint:");
2068 0 : label[k].text_is_1byte = true;
2069 0 : label[k].text_in_resource = true;
2070 0 : gcd[k].gd.label = &label[k];
2071 0 : gcd[k].gd.pos.x = 5; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+31;
2072 0 : gcd[k].gd.flags = gg_enabled | gg_visible;
2073 0 : gcd[k++].creator = GLabelCreate;
2074 0 : hvarray[3][0] = &gcd[k-1];
2075 :
2076 0 : sprintf( bothint, "%d", lastsf==sf && last_type==embolden_custom ? last_zones.bottom_bound :
2077 : 0 );
2078 0 : label[k].text = (unichar_t *) bothint;
2079 0 : label[k].text_is_1byte = true;
2080 0 : gcd[k].gd.label = &label[k];
2081 0 : gcd[k].gd.pos.x = 80; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y-3;
2082 0 : gcd[k].gd.pos.width = 60;
2083 0 : gcd[k].gd.flags = gg_visible;
2084 0 : gcd[k].gd.cid = CID_BottomHint;
2085 0 : gcd[k++].creator = GNumericFieldCreate;
2086 0 : hvarray[3][1] = &gcd[k-1];
2087 :
2088 0 : label[k].text = (unichar_t *) _("Zone:");
2089 0 : label[k].text_is_1byte = true;
2090 0 : label[k].text_in_resource = true;
2091 0 : gcd[k].gd.label = &label[k];
2092 0 : gcd[k].gd.pos.x = 5; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+31;
2093 0 : gcd[k].gd.flags = gg_enabled | gg_visible;
2094 0 : gcd[k++].creator = GLabelCreate;
2095 0 : hvarray[3][2] = &gcd[k-1];
2096 :
2097 0 : sprintf( botzone, "%d", lastsf==sf && last_type==embolden_custom ? last_zones.bottom_zone :
2098 0 : (int) rint(bd.xheight>0 ? bd.xheight/3 :
2099 0 : bd.caph>0 ? bd.caph/3 :
2100 0 : (sf->ascent/4)) );
2101 0 : label[k].text = (unichar_t *) botzone;
2102 0 : label[k].text_is_1byte = true;
2103 0 : gcd[k].gd.label = &label[k];
2104 0 : gcd[k].gd.pos.x = 80; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y-3;
2105 0 : gcd[k].gd.pos.width = 60;
2106 0 : gcd[k].gd.flags = gg_visible;
2107 0 : gcd[k].gd.cid = CID_BottomZone;
2108 0 : gcd[k++].creator = GNumericFieldCreate;
2109 0 : hvarray[3][3] = &gcd[k-1]; hvarray[3][4] = NULL;
2110 :
2111 0 : label[k].text = (unichar_t *) _("Serif Height");
2112 0 : label[k].text_is_1byte = true;
2113 0 : label[k].text_in_resource = true;
2114 0 : gcd[k].gd.label = &label[k];
2115 0 : gcd[k].gd.flags = gg_enabled | gg_visible | gg_utf8_popup ;
2116 0 : gcd[k].gd.popup_msg = (unichar_t *) _("Any points this high will be assumed to be on serifs,\nand will remain at that height after processing.\n(So serifs should remain the same size).\n(If you do wish the serifs to grow, set this to 0)");
2117 0 : gcd[k++].creator = GLabelCreate;
2118 0 : hvarray[4][0] = &gcd[k-1];
2119 :
2120 0 : sprintf( serifh, "%g", SFSerifHeight(sf));
2121 0 : label[k].text = (unichar_t *) serifh;
2122 0 : label[k].text_is_1byte = true;
2123 0 : gcd[k].gd.label = &label[k];
2124 0 : gcd[k].gd.pos.x = 80; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y-3;
2125 0 : gcd[k].gd.pos.width = 60;
2126 0 : gcd[k].gd.flags = gg_enabled | gg_visible | gg_utf8_popup;
2127 0 : gcd[k].gd.cid = CID_SerifHeight;
2128 0 : gcd[k].gd.popup_msg = gcd[k-1].gd.popup_msg;
2129 0 : gcd[k++].creator = GNumericFieldCreate;
2130 0 : hvarray[4][1] = &gcd[k-1];
2131 :
2132 0 : label[k].text = (unichar_t *) _("Fuzz");
2133 0 : label[k].text_is_1byte = true;
2134 0 : label[k].text_in_resource = true;
2135 0 : gcd[k].gd.label = &label[k];
2136 0 : gcd[k].gd.flags = gg_enabled | gg_visible | gg_utf8_popup ;
2137 0 : gcd[k].gd.popup_msg = (unichar_t *) _("Allow the height match to differ by this much");
2138 0 : gcd[k++].creator = GLabelCreate;
2139 0 : hvarray[4][2] = &gcd[k-1];
2140 :
2141 0 : label[k].text = (unichar_t *) ".9";
2142 0 : label[k].text_is_1byte = true;
2143 0 : gcd[k].gd.label = &label[k];
2144 0 : gcd[k].gd.pos.x = 80; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y-3;
2145 0 : gcd[k].gd.pos.width = 60;
2146 0 : gcd[k].gd.flags = gg_enabled | gg_visible | gg_utf8_popup;
2147 0 : gcd[k].gd.cid = CID_SerifHFuzz;
2148 0 : gcd[k].gd.popup_msg = gcd[k-1].gd.popup_msg;
2149 0 : gcd[k++].creator = GNumericFieldCreate;
2150 0 : hvarray[4][3] = &gcd[k-1];
2151 0 : hvarray[4][4] = NULL;
2152 :
2153 0 : label[k].text = (unichar_t *) _("Counters:");
2154 0 : gcd[k].gd.popup_msg = (unichar_t *) _("The simple application of this algorithm will squeeze counters\nThat is not normally seen in bold latin fonts");
2155 0 : label[k].text_is_1byte = true;
2156 0 : label[k].text_in_resource = true;
2157 0 : gcd[k].gd.label = &label[k];
2158 0 : gcd[k].gd.flags = gg_enabled | gg_visible | gg_utf8_popup;
2159 0 : gcd[k++].creator = GLabelCreate;
2160 0 : carray[0] = &gcd[k-1];
2161 :
2162 0 : label[k].text = (unichar_t *) _("Squish");
2163 0 : gcd[k].gd.popup_msg = (unichar_t *) _("Make the counters narrower");
2164 0 : label[k].text_is_1byte = true;
2165 0 : label[k].text_in_resource = true;
2166 0 : gcd[k].gd.label = &label[k];
2167 0 : gcd[k].gd.flags = gg_enabled | gg_visible | gg_utf8_popup;
2168 0 : gcd[k].gd.cid = CID_Squish;
2169 : /*gcd[k].gd.handle_controlevent = Embolden_Counter;*/
2170 0 : gcd[k++].creator = GRadioCreate;
2171 0 : carray[1] = &gcd[k-1];
2172 :
2173 0 : label[k].text = (unichar_t *) _("Retain");
2174 0 : gcd[k].gd.popup_msg = (unichar_t *) _("Try to insure that the counters are as wide\nafterward as they were before");
2175 0 : label[k].text_is_1byte = true;
2176 0 : label[k].text_in_resource = true;
2177 0 : gcd[k].gd.label = &label[k];
2178 0 : gcd[k].gd.flags = gg_enabled | gg_visible | gg_utf8_popup;
2179 0 : gcd[k].gd.cid = CID_Retain;
2180 : /*gcd[k].gd.handle_controlevent = Embolden_Counter;*/
2181 0 : gcd[k++].creator = GRadioCreate;
2182 0 : carray[2] = &gcd[k-1];
2183 :
2184 0 : label[k].text = (unichar_t *) _("Auto");
2185 0 : gcd[k].gd.popup_msg = (unichar_t *) _("Retain counter size for glyphs using latin algorithm\nSquish them for those using CJK." );
2186 0 : label[k].text_is_1byte = true;
2187 0 : label[k].text_in_resource = true;
2188 0 : gcd[k].gd.label = &label[k];
2189 0 : gcd[k].gd.flags = gg_enabled | gg_visible | gg_utf8_popup | gg_cb_on;
2190 0 : gcd[k].gd.cid = CID_CounterAuto;
2191 : /* gcd[k].gd.handle_controlevent = Embolden_Counter;*/
2192 0 : gcd[k++].creator = GRadioCreate;
2193 0 : carray[3] = &gcd[k-1];
2194 0 : carray[4] = GCD_Glue; carray[5] = NULL;
2195 :
2196 0 : boxes[5].gd.flags = gg_enabled|gg_visible;
2197 0 : boxes[5].gd.u.boxelements = carray;
2198 0 : boxes[5].creator = GHBoxCreate;
2199 0 : hvarray[5][0] = &boxes[5]; hvarray[5][1] = hvarray[5][2] = hvarray[5][3] = GCD_ColSpan; hvarray[5][4] = NULL;
2200 :
2201 0 : label[k].text = (unichar_t *) _("Cleanup Self Intersect");
2202 0 : label[k].text_is_1byte = true;
2203 0 : label[k].text_in_resource = true;
2204 0 : gcd[k].gd.label = &label[k];
2205 0 : gcd[k].gd.flags = gg_enabled | gg_visible | gg_utf8_popup | (last_overlap?gg_cb_on:0);
2206 0 : gcd[k].gd.cid = CID_CleanupSelfIntersect;
2207 0 : gcd[k].gd.popup_msg = (unichar_t *) _("When FontForge detects that an expanded stroke will self-intersect,\nthen setting this option will cause it to try to make things nice\nby removing the intersections");
2208 0 : gcd[k++].creator = GCheckBoxCreate;
2209 0 : hvarray[6][0] = &gcd[k-1]; hvarray[6][1] = hvarray[6][2] = hvarray[6][3] = GCD_ColSpan; hvarray[6][4] = NULL;
2210 :
2211 0 : hvarray[7][0] = hvarray[7][1] = hvarray[7][2] = hvarray[7][3] = GCD_Glue; hvarray[7][4] = NULL;
2212 :
2213 0 : gcd[k].gd.pos.x = 30-3; gcd[k].gd.pos.y = 5;
2214 0 : gcd[k].gd.pos.width = -1;
2215 0 : gcd[k].gd.flags = gg_visible | gg_enabled | gg_but_default;
2216 0 : label[k].text = (unichar_t *) _("_OK");
2217 0 : label[k].text_is_1byte = true;
2218 0 : label[k].text_in_resource = true;
2219 0 : gcd[k].gd.label = &label[k];
2220 0 : gcd[k].gd.handle_controlevent = Embolden_OK;
2221 0 : gcd[k++].creator = GButtonCreate;
2222 0 : barray[0] = GCD_Glue; barray[1] = &gcd[k-1]; barray[2] = GCD_Glue;
2223 :
2224 0 : gcd[k].gd.pos.x = -30; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+3;
2225 0 : gcd[k].gd.pos.width = -1;
2226 0 : gcd[k].gd.flags = gg_visible | gg_enabled | gg_but_cancel;
2227 0 : label[k].text = (unichar_t *) _("_Cancel");
2228 0 : label[k].text_is_1byte = true;
2229 0 : label[k].text_in_resource = true;
2230 0 : gcd[k].gd.label = &label[k];
2231 0 : gcd[k].gd.handle_controlevent = Embolden_Cancel;
2232 0 : gcd[k].creator = GButtonCreate;
2233 0 : barray[3] = GCD_Glue; barray[4] = &gcd[k]; barray[5] = GCD_Glue;
2234 0 : barray[6] = NULL;
2235 :
2236 0 : boxes[4].gd.flags = gg_enabled|gg_visible;
2237 0 : boxes[4].gd.u.boxelements = barray;
2238 0 : boxes[4].creator = GHBoxCreate;
2239 0 : hvarray[8][0] = &boxes[4]; hvarray[8][1] = hvarray[8][2] = hvarray[8][3] = GCD_ColSpan; hvarray[8][4] = NULL;
2240 0 : hvarray[9][0] = NULL;
2241 :
2242 0 : boxes[0].gd.pos.x = boxes[0].gd.pos.y = 2;
2243 0 : boxes[0].gd.flags = gg_enabled|gg_visible;
2244 0 : boxes[0].gd.u.boxelements = hvarray[0];
2245 0 : boxes[0].creator = GHVGroupCreate;
2246 :
2247 0 : GGadgetsCreate(gw,boxes);
2248 0 : GHVBoxSetExpandableRow(boxes[0].ret,gb_expandglue);
2249 0 : GHVBoxSetExpandableCol(boxes[3].ret,gb_expandglue);
2250 0 : GHVBoxSetExpandableCol(boxes[4].ret,gb_expandgluesame);
2251 0 : GHVBoxSetExpandableCol(boxes[5].ret,gb_expandglue);
2252 0 : GHVBoxFitWindow(boxes[0].ret);
2253 0 : GDrawSetVisible(gw,true);
2254 :
2255 0 : while ( !ed.done )
2256 0 : GDrawProcessOneEvent(NULL);
2257 0 : GDrawDestroyWindow(gw);
2258 0 : }
2259 :
2260 : /* ************************************************************************** */
2261 : /* ***************************** Oblique Dialog ***************************** */
2262 : /* ************************************************************************** */
2263 :
2264 : static ItalicInfo last_ii = {
2265 : -13, /* Italic angle (in degrees) */
2266 : .95, /* xheight percent */
2267 : /* horizontal squash, lsb, stemsize, countersize, rsb */
2268 : { .91, .89, .90, .91 }, /* For lower case */
2269 : { .91, .93, .93, .91 }, /* For upper case */
2270 : { .91, .93, .93, .91 }, /* For things which are neither upper nor lower case */
2271 : srf_flat, /* Secondary serifs (initial, medial on "m", descender on "p", "q" */
2272 : true, /* Transform bottom serifs */
2273 : true, /* Transform serifs at x-height */
2274 : false, /* Transform serifs on ascenders */
2275 : true, /* Transform serifs on diagonal stems at baseline and x-height */
2276 :
2277 : true, /* Change the shape of an "a" to look like a "d" without ascender */
2278 : false, /* Change the shape of "f" so it descends below baseline (straight down no flag at end) */
2279 : true, /* Change the shape of "f" so the bottom looks like the top */
2280 : true, /* Remove serifs from the bottom of descenders */
2281 :
2282 : true, /* Make the cyrillic "phi" glyph have a top like an "f" */
2283 : true, /* Make the cyrillic "i" glyph look like a latin "u" */
2284 : true, /* Make the cyrillic "pi" glyph look like a latin "n" */
2285 : true, /* Make the cyrillic "te" glyph look like a latin "m" */
2286 : true, /* Make the cyrillic "sha" glyph look like a latin "m" rotated 180 */
2287 : true, /* Make the cyrillic "dje" glyph look like a latin smallcaps T (not implemented) */
2288 : true, /* Make the cyrillic "dzhe" glyph look like a latin "u" (same glyph used for cyrillic "i") */
2289 :
2290 : ITALICINFO_REMAINDER
2291 : };
2292 :
2293 0 : void ObliqueDlg(FontView *fv, CharView *cv) {
2294 : bigreal temp;
2295 : char def[40], *ret, *end;
2296 : real transform[6];
2297 :
2298 0 : sprintf( def, "%g", last_ii.italic_angle );
2299 0 : ret = gwwv_ask_string(_("Oblique Slant..."),def,_("By what angle (in degrees) do you want to slant the font?"));
2300 0 : if ( ret==NULL )
2301 0 : return;
2302 0 : temp = strtod(ret,&end);
2303 0 : if ( *end || temp>90 || temp<-90 ) {
2304 0 : free(ret);
2305 0 : ff_post_error( _("Bad Number"),_("Bad Number") );
2306 0 : return;
2307 : }
2308 :
2309 0 : last_ii.italic_angle = temp;
2310 0 : memset(transform,0,sizeof(transform));
2311 0 : transform[0] = transform[3] = 1;
2312 0 : transform[2] = -tan( last_ii.italic_angle * 3.1415926535897932/180.0 );
2313 0 : if ( cv!=NULL ) {
2314 0 : CVPreserveState((CharViewBase *) cv);
2315 0 : CVTransFunc(cv,transform,fvt_dontmovewidth);
2316 0 : CVCharChangedUpdate(&cv->b);
2317 : } else {
2318 : int i, gid;
2319 : SplineChar *sc;
2320 :
2321 0 : for ( i=0; i<fv->b.map->enccount; ++i ) if ( fv->b.selected[i] &&
2322 0 : (gid = fv->b.map->map[i])!=-1 && (sc=fv->b.sf->glyphs[gid])!=NULL ) {
2323 0 : FVTrans((FontViewBase *) fv,sc,transform,NULL,fvt_dontmovewidth);
2324 : }
2325 : }
2326 : }
2327 :
2328 :
2329 : /* ************************************************************************** */
2330 : /* ********************************* Italic ********************************* */
2331 : /* ************************************************************************** */
2332 :
2333 : #define CID_A 1001
2334 : #define CID_F 1002
2335 : #define CID_F2 1003
2336 : #define CID_P 1004
2337 : #define CID_Cyrl_I 1011
2338 : #define CID_Cyrl_Pi 1012
2339 : #define CID_Cyrl_Te 1013
2340 : #define CID_Cyrl_Phi 1014
2341 : #define CID_Cyrl_Sha 1015
2342 : #define CID_Cyrl_Dje 1016
2343 : #define CID_Cyrl_Dzhe 1017
2344 : #define CID_BottomSerifs 2001
2345 : #define CID_XHeightSerifs 2002
2346 : #define CID_AscenderSerifs 2003
2347 : #define CID_DiagSerifs 2004
2348 : #define CID_Flat 2011
2349 : #define CID_Slanted 2012
2350 : #define CID_PenSlant 2013
2351 : #define CID_CompressLSB 3001 /* for lc, 3011 for uc, 3021 for others */
2352 : #define CID_CompressStem 3002 /* for lc, 3012 for uc, 3022 for others */
2353 : #define CID_CompressCounter 3003 /* for lc, 3013 for uc, 3023 for others */
2354 : #define CID_CompressRSB 3004 /* for lc, 3014 for uc, 3024 for others */
2355 : #define CID_XHeightPercent 4001
2356 : #define CID_ItalicAngle 4002
2357 :
2358 0 : static int Ital_Ok(GGadget *g, GEvent *e) {
2359 0 : if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) {
2360 0 : GWindow ew = GGadgetGetWindow(g);
2361 0 : StyleDlg *ed = GDrawGetUserData(ew);
2362 : ItalicInfo ii;
2363 0 : int err = false, i;
2364 :
2365 0 : memset(&ii,0,sizeof(ii));
2366 0 : for ( i=0; i<3; ++i ) {
2367 0 : struct hsquash *hs = &(&ii.lc)[i];
2368 0 : hs->lsb_percent = GetReal8(ew,CID_CompressLSB+i*10,_("LSB Compression Percent"),&err)/100.0;
2369 0 : hs->stem_percent = GetReal8(ew,CID_CompressStem+i*10,_("Stem Compression Percent"),&err)/100.0;
2370 0 : hs->counter_percent = GetReal8(ew,CID_CompressCounter+i*10,_("Counter Compression Percent"),&err)/100.0;
2371 0 : hs->rsb_percent = GetReal8(ew,CID_CompressRSB+i*10,_("RSB Compression Percent"),&err)/100.0;
2372 0 : if ( err )
2373 0 : return( true );
2374 : }
2375 0 : ii.xheight_percent = GetReal8(ew,CID_XHeightPercent,_("XHeight Percent"),&err)/100;
2376 0 : ii.italic_angle = GetReal8(ew,CID_ItalicAngle,_("Italic Angle"),&err);
2377 0 : if ( err )
2378 0 : return( true );
2379 :
2380 0 : ii.secondary_serif = GGadgetIsChecked(GWidgetGetControl(ew,CID_Flat)) ? srf_flat :
2381 0 : GGadgetIsChecked(GWidgetGetControl(ew,CID_Slanted)) ? srf_simpleslant :
2382 : srf_complexslant;
2383 :
2384 0 : ii.transform_bottom_serifs= GGadgetIsChecked(GWidgetGetControl(ew,CID_BottomSerifs));
2385 0 : ii.transform_top_xh_serifs= GGadgetIsChecked(GWidgetGetControl(ew,CID_XHeightSerifs));
2386 0 : ii.transform_top_as_serifs= GGadgetIsChecked(GWidgetGetControl(ew,CID_AscenderSerifs));
2387 0 : ii.transform_diagon_serifs= GGadgetIsChecked(GWidgetGetControl(ew,CID_DiagSerifs));
2388 :
2389 0 : ii.a_from_d = GGadgetIsChecked(GWidgetGetControl(ew,CID_A));
2390 0 : ii.f_rotate_top = GGadgetIsChecked(GWidgetGetControl(ew,CID_F));
2391 0 : ii.f_long_tail = GGadgetIsChecked(GWidgetGetControl(ew,CID_F2));
2392 0 : ii.pq_deserif = GGadgetIsChecked(GWidgetGetControl(ew,CID_P));
2393 0 : if ( ii.f_rotate_top && ii.f_long_tail ) {
2394 0 : ff_post_error(_("Bad setting"),_("You may not select both variants of 'f'"));
2395 0 : return( true );
2396 : }
2397 :
2398 0 : ii.cyrl_i = GGadgetIsChecked(GWidgetGetControl(ew,CID_Cyrl_I));
2399 0 : ii.cyrl_pi = GGadgetIsChecked(GWidgetGetControl(ew,CID_Cyrl_Pi));
2400 0 : ii.cyrl_te = GGadgetIsChecked(GWidgetGetControl(ew,CID_Cyrl_Te));
2401 0 : ii.cyrl_phi = GGadgetIsChecked(GWidgetGetControl(ew,CID_Cyrl_Phi));
2402 0 : ii.cyrl_sha = GGadgetIsChecked(GWidgetGetControl(ew,CID_Cyrl_Sha));
2403 0 : ii.cyrl_dje = GGadgetIsChecked(GWidgetGetControl(ew,CID_Cyrl_Dje));
2404 0 : ii.cyrl_dzhe = GGadgetIsChecked(GWidgetGetControl(ew,CID_Cyrl_Dzhe));
2405 :
2406 0 : last_ii = ii;
2407 0 : MakeItalic((FontViewBase *) ed->fv,(CharViewBase *) ed->cv,&ii);
2408 0 : ed->done = true;
2409 : }
2410 0 : return( true );
2411 : }
2412 :
2413 0 : void ItalicDlg(FontView *fv, CharView *cv) {
2414 : StyleDlg ed;
2415 0 : SplineFont *sf = fv!=NULL ? fv->b.sf : cv->b.sc->parent;
2416 : GRect pos;
2417 : GWindow gw;
2418 : GWindowAttrs wattrs;
2419 : GGadgetCreateData gcd[54], boxes[7], *forms[30], *compress[5][6], *sarray[5],
2420 : *iaarray[3][3], *barray[10], *varray[39];
2421 : GTextInfo label[54];
2422 : int k,f,r,i;
2423 : char lsb[3][40], stems[3][40], counters[3][40], rsb[3][40], ia[40], xp[40];
2424 :
2425 0 : memset(&ed,0,sizeof(ed));
2426 0 : ed.fv = fv;
2427 0 : ed.cv = cv;
2428 0 : ed.sf = sf;
2429 :
2430 0 : memset(&wattrs,0,sizeof(wattrs));
2431 0 : wattrs.mask = wam_events|wam_cursor|wam_utf8_wtitle|wam_undercursor|wam_isdlg|wam_restrict;
2432 0 : wattrs.event_masks = ~(1<<et_charup);
2433 0 : wattrs.restrict_input_to_me = 1;
2434 0 : wattrs.undercursor = 1;
2435 0 : wattrs.cursor = ct_pointer;
2436 0 : wattrs.utf8_window_title = _("Italic");
2437 0 : wattrs.is_dlg = true;
2438 0 : pos.x = pos.y = 0;
2439 0 : pos.width = 100;
2440 0 : pos.height = 100;
2441 0 : ed.gw = gw = GDrawCreateTopWindow(NULL,&pos,style_e_h,&ed,&wattrs);
2442 :
2443 0 : k=f=r=0;
2444 :
2445 0 : memset(gcd,0,sizeof(gcd));
2446 0 : memset(boxes,0,sizeof(boxes));
2447 0 : memset(label,0,sizeof(label));
2448 :
2449 0 : label[k].image = &GIcon_aItalic;
2450 0 : gcd[k].gd.label = &label[k];
2451 0 : gcd[k].gd.flags = gg_enabled | gg_visible;
2452 0 : if ( last_ii.a_from_d ) gcd[k].gd.flags |= gg_cb_on;
2453 0 : gcd[k].gd.cid = CID_A;
2454 0 : gcd[k++].creator = GCheckBoxCreate;
2455 0 : forms[f++] = &gcd[k-1];
2456 :
2457 0 : label[k].image = &GIcon_fItalic;
2458 0 : gcd[k].gd.label = &label[k];
2459 0 : gcd[k].gd.flags = gg_enabled | gg_visible;
2460 0 : if ( last_ii.f_rotate_top ) gcd[k].gd.flags |= gg_cb_on;
2461 0 : gcd[k].gd.cid = CID_F;
2462 0 : gcd[k++].creator = GCheckBoxCreate;
2463 0 : forms[f++] = &gcd[k-1];
2464 :
2465 0 : label[k].image = &GIcon_f2Italic;
2466 0 : gcd[k].gd.label = &label[k];
2467 0 : gcd[k].gd.flags = gg_enabled | gg_visible;
2468 0 : if ( last_ii.f_long_tail ) gcd[k].gd.flags |= gg_cb_on;
2469 0 : gcd[k].gd.cid = CID_F2;
2470 0 : gcd[k++].creator = GCheckBoxCreate;
2471 0 : forms[f++] = &gcd[k-1];
2472 0 : forms[f++] = GCD_Glue; forms[f++] = NULL;
2473 :
2474 0 : gcd[k].gd.pos.width = 10; gcd[k].gd.pos.height = 10;
2475 0 : gcd[k].gd.flags = gg_enabled | gg_visible;
2476 0 : gcd[k++].creator = GSpacerCreate;
2477 0 : forms[f++] = GCD_Glue;
2478 0 : forms[f++] = GCD_Glue; forms[f++] = GCD_Glue;
2479 0 : forms[f++] = GCD_Glue; forms[f++] = NULL;
2480 :
2481 0 : label[k].image = &GIcon_u438Italic;
2482 0 : gcd[k].gd.label = &label[k];
2483 0 : gcd[k].gd.flags = gg_enabled | gg_visible;
2484 0 : if ( last_ii.cyrl_i ) gcd[k].gd.flags |= gg_cb_on;
2485 0 : gcd[k].gd.cid = CID_Cyrl_I;
2486 0 : gcd[k++].creator = GCheckBoxCreate;
2487 0 : forms[f++] = &gcd[k-1];
2488 :
2489 0 : label[k].image = &GIcon_u43fItalic;
2490 0 : gcd[k].gd.label = &label[k];
2491 0 : gcd[k].gd.flags = gg_enabled | gg_visible;
2492 0 : if ( last_ii.cyrl_pi ) gcd[k].gd.flags |= gg_cb_on;
2493 0 : gcd[k].gd.cid = CID_Cyrl_Pi;
2494 0 : gcd[k++].creator = GCheckBoxCreate;
2495 0 : forms[f++] = &gcd[k-1];
2496 :
2497 0 : label[k].image = &GIcon_u442Italic;
2498 0 : gcd[k].gd.label = &label[k];
2499 0 : gcd[k].gd.flags = gg_enabled | gg_visible;
2500 0 : if ( last_ii.cyrl_te ) gcd[k].gd.flags |= gg_cb_on;
2501 0 : gcd[k].gd.cid = CID_Cyrl_Te;
2502 0 : gcd[k++].creator = GCheckBoxCreate;
2503 0 : forms[f++] = &gcd[k-1];
2504 0 : forms[f++] = GCD_Glue; forms[f++] = NULL;
2505 :
2506 0 : label[k].image = &GIcon_u444Italic;
2507 0 : gcd[k].gd.label = &label[k];
2508 0 : gcd[k].gd.flags = gg_enabled | gg_visible;
2509 0 : if ( last_ii.cyrl_phi ) gcd[k].gd.flags |= gg_cb_on;
2510 0 : gcd[k].gd.cid = CID_Cyrl_Phi;
2511 0 : gcd[k++].creator = GCheckBoxCreate;
2512 0 : forms[f++] = &gcd[k-1];
2513 :
2514 0 : label[k].image = &GIcon_u448Italic;
2515 0 : gcd[k].gd.label = &label[k];
2516 0 : gcd[k].gd.flags = gg_enabled | gg_visible;
2517 0 : if ( last_ii.cyrl_sha ) gcd[k].gd.flags |= gg_cb_on;
2518 0 : gcd[k].gd.cid = CID_Cyrl_Sha;
2519 0 : gcd[k++].creator = GCheckBoxCreate;
2520 0 : forms[f++] = &gcd[k-1];
2521 :
2522 0 : label[k].image = &GIcon_u452Italic;
2523 0 : gcd[k].gd.label = &label[k];
2524 0 : gcd[k].gd.flags = gg_enabled | gg_visible;
2525 0 : if ( last_ii.cyrl_dje ) gcd[k].gd.flags |= gg_cb_on;
2526 0 : gcd[k].gd.cid = CID_Cyrl_Dje;
2527 0 : gcd[k++].creator = GCheckBoxCreate;
2528 0 : forms[f++] = &gcd[k-1];
2529 0 : forms[f++] = GCD_Glue; forms[f++] = NULL;
2530 :
2531 0 : label[k].image = &GIcon_u45fItalic;
2532 0 : gcd[k].gd.label = &label[k];
2533 0 : gcd[k].gd.flags = gg_enabled | gg_visible;
2534 0 : if ( last_ii.cyrl_dzhe ) gcd[k].gd.flags |= gg_cb_on;
2535 0 : gcd[k].gd.cid = CID_Cyrl_Dzhe;
2536 0 : gcd[k++].creator = GCheckBoxCreate;
2537 0 : forms[f++] = &gcd[k-1];
2538 0 : forms[f++] = GCD_Glue; forms[f++] = GCD_Glue; forms[f++] = GCD_Glue; forms[f++] = NULL;
2539 0 : forms[f++] = NULL;
2540 :
2541 0 : boxes[2].gd.flags = gg_enabled|gg_visible;
2542 0 : boxes[2].gd.u.boxelements = forms;
2543 0 : boxes[2].creator = GHVBoxCreate;
2544 0 : varray[r++] = &boxes[2]; varray[r++] = NULL;
2545 :
2546 0 : gcd[k].gd.flags = gg_visible|gg_enabled ;
2547 0 : gcd[k].gd.pos.height = 5; gcd[k].gd.pos.width = 20;
2548 0 : gcd[k++].creator = GSpacerCreate;
2549 0 : varray[r++] = &gcd[k-1]; varray[r++] = NULL;
2550 :
2551 0 : label[k].text = (unichar_t *) _("Transform baseline serifs");
2552 0 : label[k].text_is_1byte = true;
2553 0 : label[k].text_in_resource = true;
2554 0 : label[k].image_precedes = true;
2555 0 : label[k].image = &GIcon_BottomSerifs;
2556 0 : gcd[k].gd.label = &label[k];
2557 0 : gcd[k].gd.flags = gg_enabled | gg_visible;
2558 0 : if ( last_ii.transform_bottom_serifs ) gcd[k].gd.flags |= gg_cb_on;
2559 0 : gcd[k].gd.cid = CID_BottomSerifs;
2560 0 : gcd[k++].creator = GCheckBoxCreate;
2561 0 : varray[r++] = &gcd[k-1]; varray[r++] = NULL;
2562 :
2563 0 : label[k].text = (unichar_t *) _("Transform x-height serifs");
2564 0 : label[k].text_is_1byte = true;
2565 0 : label[k].text_in_resource = true;
2566 0 : label[k].image_precedes = true;
2567 0 : label[k].image = &GIcon_TopSerifs;
2568 0 : gcd[k].gd.label = &label[k];
2569 0 : gcd[k].gd.flags = gg_enabled | gg_visible;
2570 0 : if ( last_ii.transform_top_xh_serifs ) gcd[k].gd.flags |= gg_cb_on;
2571 0 : gcd[k].gd.cid = CID_XHeightSerifs;
2572 0 : gcd[k++].creator = GCheckBoxCreate;
2573 0 : varray[r++] = &gcd[k-1]; varray[r++] = NULL;
2574 :
2575 0 : label[k].text = (unichar_t *) _("Transform ascender serifs");
2576 0 : label[k].text_is_1byte = true;
2577 0 : label[k].text_in_resource = true;
2578 0 : label[k].image_precedes = true;
2579 0 : label[k].image = &GIcon_TopSerifs;
2580 0 : gcd[k].gd.label = &label[k];
2581 0 : gcd[k].gd.flags = gg_enabled | gg_visible;
2582 0 : if ( last_ii.transform_top_as_serifs ) gcd[k].gd.flags |= gg_cb_on;
2583 0 : gcd[k].gd.cid = CID_AscenderSerifs;
2584 0 : gcd[k++].creator = GCheckBoxCreate;
2585 0 : varray[r++] = &gcd[k-1]; varray[r++] = NULL;
2586 :
2587 0 : label[k].text = (unichar_t *) _("Transform descender serifs");
2588 0 : label[k].text_is_1byte = true;
2589 0 : label[k].text_in_resource = true;
2590 0 : label[k].image_precedes = true;
2591 0 : label[k].image = &GIcon_pItalic;
2592 0 : gcd[k].gd.label = &label[k];
2593 0 : gcd[k].gd.flags = gg_enabled | gg_visible;
2594 0 : if ( last_ii.pq_deserif ) gcd[k].gd.flags |= gg_cb_on;
2595 0 : gcd[k].gd.cid = CID_P;
2596 0 : gcd[k++].creator = GCheckBoxCreate;
2597 0 : varray[r++] = &gcd[k-1]; varray[r++] = NULL;
2598 :
2599 0 : label[k].text = (unichar_t *) _("Transform diagonal serifs");
2600 0 : label[k].text_is_1byte = true;
2601 0 : label[k].text_in_resource = true;
2602 0 : label[k].image_precedes = true;
2603 0 : label[k].image = &GIcon_DiagSerifs;
2604 0 : gcd[k].gd.label = &label[k];
2605 0 : gcd[k].gd.flags = gg_enabled | gg_visible;
2606 0 : if ( last_ii.transform_diagon_serifs ) gcd[k].gd.flags |= gg_cb_on;
2607 0 : gcd[k].gd.cid = CID_DiagSerifs;
2608 0 : gcd[k++].creator = GCheckBoxCreate;
2609 0 : varray[r++] = &gcd[k-1]; varray[r++] = NULL;
2610 :
2611 0 : label[k].text = (unichar_t *) _("When serifs are removed (as first two in \"m\"), replace with:");
2612 0 : label[k].text_is_1byte = true;
2613 0 : gcd[k].gd.label = &label[k];
2614 0 : gcd[k].gd.flags = gg_enabled | gg_visible;
2615 0 : gcd[k++].creator = GLabelCreate;
2616 0 : varray[r++] = &gcd[k-1]; varray[r++] = NULL;
2617 :
2618 0 : label[k].text = (unichar_t *) _("Flat");
2619 0 : label[k].text_is_1byte = true;
2620 0 : label[k].text_in_resource = true;
2621 0 : label[k].image_precedes = true;
2622 0 : label[k].image = &GIcon_FlatSerif;
2623 0 : gcd[k].gd.label = &label[k];
2624 0 : gcd[k].gd.flags = gg_enabled | gg_visible;
2625 0 : if ( last_ii.secondary_serif==srf_flat ) gcd[k].gd.flags |= gg_cb_on;
2626 0 : gcd[k].gd.cid = CID_Flat;
2627 0 : gcd[k++].creator = GRadioCreate;
2628 0 : sarray[0] = &gcd[k-1];
2629 :
2630 0 : label[k].text = (unichar_t *) _("Slanted");
2631 0 : label[k].text_is_1byte = true;
2632 0 : label[k].text_in_resource = true;
2633 0 : label[k].image_precedes = true;
2634 0 : label[k].image = &GIcon_SlantSerif;
2635 0 : gcd[k].gd.label = &label[k];
2636 0 : gcd[k].gd.flags = gg_enabled | gg_visible;
2637 0 : if ( last_ii.secondary_serif==srf_simpleslant ) gcd[k].gd.flags |= gg_cb_on;
2638 0 : gcd[k].gd.cid = CID_Slanted;
2639 0 : gcd[k++].creator = GRadioCreate;
2640 0 : sarray[1] = &gcd[k-1];
2641 :
2642 0 : label[k].text = (unichar_t *) _("Pen Slanted");
2643 0 : label[k].text_is_1byte = true;
2644 0 : label[k].text_in_resource = true;
2645 0 : label[k].image_precedes = true;
2646 0 : label[k].image = &GIcon_PenSerif;
2647 0 : gcd[k].gd.label = &label[k];
2648 0 : gcd[k].gd.flags = gg_enabled | gg_visible;
2649 0 : if ( last_ii.secondary_serif==srf_complexslant ) gcd[k].gd.flags |= gg_cb_on;
2650 0 : gcd[k].gd.cid = CID_PenSlant;
2651 0 : gcd[k++].creator = GRadioCreate;
2652 0 : sarray[2] = &gcd[k-1]; sarray[3] = GCD_Glue; sarray[4] = NULL;
2653 :
2654 0 : boxes[3].gd.flags = gg_enabled|gg_visible;
2655 0 : boxes[3].gd.u.boxelements = sarray;
2656 0 : boxes[3].creator = GHBoxCreate;
2657 0 : varray[r++] = &boxes[3]; varray[r++] = NULL;
2658 :
2659 0 : gcd[k].gd.flags = gg_visible|gg_enabled ;
2660 0 : gcd[k].gd.pos.height = 5; gcd[k].gd.pos.width = 20;
2661 0 : gcd[k++].creator = GSpacerCreate;
2662 0 : varray[r++] = &gcd[k-1]; varray[r++] = NULL;
2663 :
2664 0 : label[k].text = (unichar_t *) _("Compress (as a percentage)");
2665 0 : label[k].text_is_1byte = true;
2666 0 : gcd[k].gd.label = &label[k];
2667 0 : gcd[k].gd.flags = gg_enabled | gg_visible;
2668 0 : gcd[k++].creator = GLabelCreate;
2669 0 : varray[r++] = &gcd[k-1]; varray[r++] = NULL;
2670 :
2671 0 : compress[0][0] = GCD_Glue;
2672 :
2673 0 : label[k].text = (unichar_t *) _("LSB");
2674 0 : label[k].text_is_1byte = true;
2675 0 : gcd[k].gd.label = &label[k];
2676 0 : gcd[k].gd.flags = gg_enabled | gg_visible | gg_utf8_popup;
2677 0 : gcd[k].gd.popup_msg = (unichar_t *) _("Left Side Bearing");
2678 0 : gcd[k++].creator = GLabelCreate;
2679 0 : compress[0][1] = &gcd[k-1];
2680 :
2681 0 : label[k].text = (unichar_t *) _("Stems");
2682 0 : label[k].text_is_1byte = true;
2683 0 : gcd[k].gd.label = &label[k];
2684 0 : gcd[k].gd.flags = gg_enabled | gg_visible | gg_utf8_popup;
2685 0 : gcd[k++].creator = GLabelCreate;
2686 0 : compress[0][2] = &gcd[k-1];
2687 :
2688 0 : label[k].text = (unichar_t *) _("Counters");
2689 0 : label[k].text_is_1byte = true;
2690 0 : gcd[k].gd.label = &label[k];
2691 0 : gcd[k].gd.flags = gg_enabled | gg_visible | gg_utf8_popup;
2692 0 : gcd[k++].creator = GLabelCreate;
2693 0 : compress[0][3] = &gcd[k-1];
2694 :
2695 0 : label[k].text = (unichar_t *) _("RSB");
2696 0 : label[k].text_is_1byte = true;
2697 0 : gcd[k].gd.label = &label[k];
2698 0 : gcd[k].gd.flags = gg_enabled | gg_visible | gg_utf8_popup;
2699 0 : gcd[k].gd.popup_msg = (unichar_t *) _("Right Side Bearing");
2700 0 : gcd[k++].creator = GLabelCreate;
2701 0 : compress[0][4] = &gcd[k-1]; compress[0][5] = NULL;
2702 :
2703 0 : for ( i=0; i<3; ++i ) {
2704 0 : struct hsquash *hs = &(&last_ii.lc)[i];
2705 :
2706 0 : label[k].text = (unichar_t *) (i==0 ? _("Lower Case") : i==1 ? _("Upper Case") : _("Others"));
2707 0 : label[k].text_is_1byte = true;
2708 0 : gcd[k].gd.label = &label[k];
2709 0 : gcd[k].gd.flags = gg_enabled | gg_visible | gg_utf8_popup;
2710 0 : gcd[k++].creator = GLabelCreate;
2711 0 : compress[i+1][0] = &gcd[k-1];
2712 :
2713 0 : sprintf( lsb[i], "%g", 100.0* hs->lsb_percent );
2714 0 : label[k].text = (unichar_t *) lsb[i];
2715 0 : label[k].text_is_1byte = true;
2716 0 : gcd[k].gd.label = &label[k];
2717 0 : gcd[k].gd.pos.width = 50;
2718 0 : gcd[k].gd.flags = gg_enabled|gg_visible|gg_utf8_popup;
2719 0 : gcd[k].gd.cid = CID_CompressLSB+10*i;
2720 0 : gcd[k++].creator = GTextFieldCreate;
2721 0 : compress[i+1][1] = &gcd[k-1];
2722 :
2723 0 : sprintf( stems[i], "%g", 100.0* hs->stem_percent );
2724 0 : label[k].text = (unichar_t *) stems[i];
2725 0 : label[k].text_is_1byte = true;
2726 0 : gcd[k].gd.label = &label[k];
2727 0 : gcd[k].gd.pos.width = 50;
2728 0 : gcd[k].gd.flags = gg_enabled|gg_visible|gg_utf8_popup;
2729 0 : gcd[k].gd.cid = CID_CompressStem+10*i;
2730 0 : gcd[k++].creator = GTextFieldCreate;
2731 0 : compress[i+1][2] = &gcd[k-1];
2732 :
2733 0 : sprintf( counters[i], "%g", 100.0* hs->counter_percent );
2734 0 : label[k].text = (unichar_t *) counters[i];
2735 0 : label[k].text_is_1byte = true;
2736 0 : gcd[k].gd.label = &label[k];
2737 0 : gcd[k].gd.pos.width = 50;
2738 0 : gcd[k].gd.flags = gg_enabled|gg_visible|gg_utf8_popup;
2739 0 : gcd[k].gd.cid = CID_CompressCounter+10*i;
2740 0 : gcd[k++].creator = GTextFieldCreate;
2741 0 : compress[i+1][3] = &gcd[k-1];
2742 :
2743 0 : sprintf( rsb[i], "%g", 100.0* hs->rsb_percent );
2744 0 : label[k].text = (unichar_t *) rsb[i];
2745 0 : label[k].text_is_1byte = true;
2746 0 : gcd[k].gd.label = &label[k];
2747 0 : gcd[k].gd.pos.width = 50;
2748 0 : gcd[k].gd.flags = gg_enabled|gg_visible|gg_utf8_popup;
2749 0 : gcd[k].gd.cid = CID_CompressRSB+10*i;
2750 0 : gcd[k++].creator = GTextFieldCreate;
2751 0 : compress[i+1][4] = &gcd[k-1]; compress[i+1][5] = NULL;
2752 : }
2753 0 : compress[i+1][0] = NULL;
2754 :
2755 0 : boxes[4].gd.flags = gg_enabled|gg_visible;
2756 0 : boxes[4].gd.u.boxelements = compress[0];
2757 0 : boxes[4].creator = GHVBoxCreate;
2758 0 : varray[r++] = &boxes[4]; varray[r++] = NULL;
2759 :
2760 0 : gcd[k].gd.flags = gg_visible|gg_enabled ;
2761 0 : gcd[k].gd.pos.height = 5; gcd[k].gd.pos.width = 20;
2762 0 : gcd[k++].creator = GSpacerCreate;
2763 0 : varray[r++] = &gcd[k-1]; varray[r++] = NULL;
2764 :
2765 0 : label[k].text = (unichar_t *) _("XHeight Percent:");
2766 0 : label[k].text_is_1byte = true;
2767 0 : gcd[k].gd.label = &label[k];
2768 0 : gcd[k].gd.flags = gg_enabled | gg_visible | gg_utf8_popup;
2769 0 : gcd[k++].creator = GLabelCreate;
2770 0 : iaarray[0][0] = &gcd[k-1];
2771 :
2772 0 : sprintf( xp, "%g", rint(last_ii.xheight_percent*100) );
2773 0 : label[k].text = (unichar_t *) xp;
2774 0 : label[k].text_is_1byte = true;
2775 0 : gcd[k].gd.label = &label[k];
2776 0 : gcd[k].gd.pos.width = 50;
2777 0 : gcd[k].gd.flags = gg_enabled|gg_visible|gg_utf8_popup;
2778 0 : gcd[k].gd.cid = CID_XHeightPercent;
2779 0 : gcd[k].gd.popup_msg = (unichar_t *) _("Traditionally the x-height of an italic face is slightly less\nthan the x-height of the companion roman");
2780 0 : gcd[k++].creator = GTextFieldCreate;
2781 0 : iaarray[0][1] = &gcd[k-1]; iaarray[0][2] = NULL;
2782 :
2783 0 : label[k].text = (unichar_t *) _("Italic Angle:");
2784 0 : label[k].text_is_1byte = true;
2785 0 : gcd[k].gd.label = &label[k];
2786 0 : gcd[k].gd.flags = gg_enabled | gg_visible | gg_utf8_popup;
2787 0 : gcd[k++].creator = GLabelCreate;
2788 0 : iaarray[1][0] = &gcd[k-1];
2789 :
2790 0 : sprintf( ia, "%g", last_ii.italic_angle );
2791 0 : label[k].text = (unichar_t *) ia;
2792 0 : label[k].text_is_1byte = true;
2793 0 : gcd[k].gd.label = &label[k];
2794 0 : gcd[k].gd.pos.width = 50;
2795 0 : gcd[k].gd.flags = gg_enabled|gg_visible|gg_utf8_popup;
2796 0 : gcd[k].gd.cid = CID_ItalicAngle;
2797 0 : gcd[k++].creator = GTextFieldCreate;
2798 0 : iaarray[1][1] = &gcd[k-1]; iaarray[1][2] = NULL; iaarray[2][0] = NULL;
2799 :
2800 0 : boxes[5].gd.flags = gg_enabled|gg_visible;
2801 0 : boxes[5].gd.u.boxelements = iaarray[0];
2802 0 : boxes[5].creator = GHVBoxCreate;
2803 0 : varray[r++] = &boxes[5]; varray[r++] = NULL;
2804 :
2805 0 : gcd[k].gd.pos.x = 5; gcd[k].gd.pos.y = 17+31+16;
2806 0 : gcd[k].gd.pos.width = 190-10;
2807 0 : gcd[k].gd.flags = gg_enabled|gg_visible;
2808 0 : gcd[k++].creator = GLineCreate;
2809 0 : varray[r++] = &gcd[k-1]; varray[r++] = NULL;
2810 :
2811 0 : label[k].text = (unichar_t *) U_(
2812 : "This italic conversion will be incomplete!\n"
2813 : "You will probably want to do manual fixups on e, g, k, and v-z\n"
2814 : "And on в, г, д, е, ж, л, м, ц, щ, ъ, ђ\n"
2815 : "And on all Greek lower case letters. And maybe everything else.");
2816 0 : label[k].text_is_1byte = true;
2817 0 : gcd[k].gd.label = &label[k];
2818 0 : gcd[k].gd.flags = gg_enabled | gg_visible | gg_utf8_popup;
2819 0 : gcd[k++].creator = GLabelCreate;
2820 0 : varray[r++] = &gcd[k-1]; varray[r++] = NULL;
2821 :
2822 0 : gcd[k].gd.pos.x = 5; gcd[k].gd.pos.y = 17+31+16;
2823 0 : gcd[k].gd.pos.width = 190-10;
2824 0 : gcd[k].gd.flags = gg_enabled|gg_visible;
2825 0 : gcd[k++].creator = GLineCreate;
2826 0 : varray[r++] = &gcd[k-1]; varray[r++] = NULL;
2827 :
2828 0 : label[k].text = (unichar_t *) _("_OK");
2829 0 : label[k].text_is_1byte = true;
2830 0 : label[k].text_in_resource = true;
2831 0 : gcd[k].gd.label = &label[k];
2832 0 : gcd[k].gd.flags = gg_enabled|gg_visible|gg_but_default;
2833 0 : gcd[k].gd.handle_controlevent = Ital_Ok;
2834 0 : gcd[k++].creator = GButtonCreate;
2835 :
2836 0 : label[k].text = (unichar_t *) _("_Cancel");
2837 0 : label[k].text_is_1byte = true;
2838 0 : label[k].text_in_resource = true;
2839 0 : gcd[k].gd.label = &label[k];
2840 0 : gcd[k].gd.flags = gg_enabled|gg_visible|gg_but_cancel;
2841 0 : gcd[k].gd.handle_controlevent = CondenseExtend_Cancel;
2842 0 : gcd[k++].creator = GButtonCreate;
2843 :
2844 0 : if ( k>sizeof(gcd)/sizeof(gcd[0]) )
2845 0 : IError( "Too many options in Italic Dlg");
2846 :
2847 0 : barray[0] = GCD_Glue; barray[1] = &gcd[k-2]; barray[2] = GCD_Glue;
2848 0 : barray[3] = GCD_Glue; barray[4] = &gcd[k-1]; barray[5] = GCD_Glue;
2849 0 : barray[6] = NULL;
2850 :
2851 0 : boxes[6].gd.flags = gg_enabled|gg_visible;
2852 0 : boxes[6].gd.u.boxelements = barray;
2853 0 : boxes[6].creator = GHBoxCreate;
2854 0 : varray[r++] = &boxes[6]; varray[r++] = NULL;
2855 0 : varray[r++] = NULL;
2856 0 : if ( r>sizeof(varray)/sizeof(varray[0]) )
2857 0 : IError( "Too many rows in Italic Dlg");
2858 :
2859 0 : boxes[0].gd.pos.x = boxes[0].gd.pos.y = 2;
2860 0 : boxes[0].gd.flags = gg_enabled|gg_visible;
2861 0 : boxes[0].gd.u.boxelements = varray;
2862 0 : boxes[0].creator = GHVGroupCreate;
2863 :
2864 0 : GGadgetsCreate(gw,boxes);
2865 :
2866 0 : GHVBoxSetExpandableCol(boxes[2].ret,gb_expandglue);
2867 0 : GHVBoxSetExpandableCol(boxes[3].ret,gb_expandglue);
2868 0 : GHVBoxSetExpandableCol(boxes[5].ret,gb_expandglue);
2869 0 : GHVBoxSetExpandableCol(boxes[6].ret,gb_expandgluesame);
2870 0 : GHVBoxFitWindow(boxes[0].ret);
2871 :
2872 0 : GDrawSetVisible(gw,true);
2873 :
2874 0 : while ( !ed.done )
2875 0 : GDrawProcessOneEvent(NULL);
2876 :
2877 0 : GDrawDestroyWindow(gw);
2878 0 : }
2879 :
2880 : /* ************************************************************************** */
2881 : /* ************************* Change XHeight Dialog ************************** */
2882 : /* ************************************************************************** */
2883 : #define CID_XHeight_Current 1001
2884 : #define CID_XHeight_Desired 1002
2885 : #define CID_Serif_Height 1003
2886 :
2887 0 : static int XHeight_OK(GGadget *g, GEvent *e) {
2888 0 : int err = false;
2889 : struct xheightinfo xi;
2890 :
2891 0 : if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) {
2892 0 : GWindow ew = GGadgetGetWindow(g);
2893 0 : StyleDlg *ed = GDrawGetUserData(ew);
2894 0 : xi.xheight_current = GetReal8(ew,CID_XHeight_Current,_("Current X-Height"),&err);
2895 0 : xi.xheight_desired = GetReal8(ew,CID_XHeight_Desired,_("Desired X-Height"),&err);
2896 0 : xi.serif_height = GetReal8(ew,CID_Serif_Height ,_("Serif Height"),&err);
2897 0 : if ( err )
2898 0 : return( true );
2899 :
2900 0 : ChangeXHeight( (FontViewBase *) ed->fv, (CharViewBase *) ed->cv, &xi );
2901 0 : ed->done = true;
2902 : }
2903 0 : return( true );
2904 : }
2905 :
2906 0 : void ChangeXHeightDlg(FontView *fv,CharView *cv) {
2907 : StyleDlg ed;
2908 0 : SplineFont *sf = fv!=NULL ? fv->b.sf : cv->b.sc->parent;
2909 : GRect pos;
2910 : GWindow gw;
2911 : GWindowAttrs wattrs;
2912 : GGadgetCreateData gcd[31], boxes[7], *barray[8], *hvarray[40];
2913 : GTextInfo label[31];
2914 : int k;
2915 : char xh_c[40], xh_d[40], sh[40];
2916 : struct xheightinfo xi;
2917 :
2918 0 : memset(&ed,0,sizeof(ed));
2919 0 : ed.fv = fv;
2920 0 : ed.cv = cv;
2921 0 : ed.sf = sf;
2922 :
2923 0 : InitXHeightInfo(sf,fv!=NULL ? fv->b.active_layer: CVLayer((CharViewBase *) cv),&xi);
2924 :
2925 0 : memset(&wattrs,0,sizeof(wattrs));
2926 0 : wattrs.mask = wam_events|wam_cursor|wam_utf8_wtitle|wam_undercursor|wam_isdlg|wam_restrict;
2927 0 : wattrs.event_masks = ~(1<<et_charup);
2928 0 : wattrs.restrict_input_to_me = 1;
2929 0 : wattrs.undercursor = 1;
2930 0 : wattrs.cursor = ct_pointer;
2931 0 : wattrs.utf8_window_title = _("Change XHeight");
2932 0 : wattrs.is_dlg = true;
2933 0 : pos.x = pos.y = 0;
2934 0 : pos.width = 100;
2935 0 : pos.height = 100;
2936 0 : ed.gw = gw = GDrawCreateTopWindow(NULL,&pos,style_e_h,&ed,&wattrs);
2937 :
2938 :
2939 0 : k=0;
2940 :
2941 0 : memset(gcd,0,sizeof(gcd));
2942 0 : memset(boxes,0,sizeof(boxes));
2943 0 : memset(label,0,sizeof(label));
2944 :
2945 0 : label[k].text = (unichar_t *) _("Current x-height:");
2946 0 : label[k].text_is_1byte = true;
2947 0 : label[k].text_in_resource = true;
2948 0 : gcd[k].gd.label = &label[k];
2949 0 : gcd[k].gd.pos.x = 5; gcd[k].gd.pos.y = 0;
2950 0 : gcd[k].gd.flags = gg_visible | gg_enabled ;
2951 0 : gcd[k++].creator = GLabelCreate;
2952 :
2953 0 : sprintf( xh_c, "%g", rint( xi.xheight_current ));
2954 0 : label[k].text = (unichar_t *) xh_c;
2955 0 : label[k].text_is_1byte = true;
2956 0 : gcd[k].gd.label = &label[k];
2957 0 : gcd[k].gd.flags = gg_visible | gg_enabled;
2958 0 : gcd[k].gd.cid = CID_XHeight_Current;
2959 0 : gcd[k++].creator = GTextFieldCreate;
2960 0 : hvarray[0] = &gcd[k-2]; hvarray[1] = &gcd[k-1]; hvarray[2] = NULL;
2961 :
2962 0 : label[k].text = (unichar_t *) _("Desired x-height:");
2963 0 : label[k].text_is_1byte = true;
2964 0 : label[k].text_in_resource = true;
2965 0 : gcd[k].gd.label = &label[k];
2966 0 : gcd[k].gd.pos.x = 5; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+31;
2967 0 : gcd[k].gd.flags = gg_visible | gg_enabled;
2968 0 : gcd[k++].creator = GLabelCreate;
2969 :
2970 0 : sprintf( xh_d, "%g", rint( xi.xheight_current ));
2971 0 : label[k].text = (unichar_t *) xh_d;
2972 0 : label[k].text_is_1byte = true;
2973 0 : gcd[k].gd.label = &label[k];
2974 0 : gcd[k].gd.flags = gg_visible | gg_enabled;
2975 0 : gcd[k].gd.cid = CID_XHeight_Desired;
2976 0 : gcd[k++].creator = GTextFieldCreate;
2977 0 : hvarray[3] = &gcd[k-2]; hvarray[4] = &gcd[k-1]; hvarray[5] = NULL;
2978 :
2979 0 : label[k].text = (unichar_t *) _("Serif height:");
2980 0 : label[k].text_is_1byte = true;
2981 0 : label[k].text_in_resource = true;
2982 0 : gcd[k].gd.label = &label[k];
2983 0 : gcd[k].gd.pos.x = 5; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+31;
2984 0 : gcd[k].gd.flags = gg_visible | gg_enabled;
2985 0 : gcd[k++].creator = GLabelCreate;
2986 :
2987 0 : sprintf( sh, "%g", rint( xi.xheight_desired ));
2988 0 : label[k].text = (unichar_t *) sh;
2989 0 : label[k].text_is_1byte = true;
2990 0 : gcd[k].gd.label = &label[k];
2991 0 : gcd[k].gd.flags = gg_visible | gg_enabled;
2992 0 : gcd[k].gd.cid = CID_Serif_Height;
2993 0 : gcd[k++].creator = GTextFieldCreate;
2994 0 : hvarray[6] = &gcd[k-2]; hvarray[7] = &gcd[k-1]; hvarray[8] = NULL;
2995 :
2996 0 : gcd[k].gd.pos.x = 30-3; gcd[k].gd.pos.y = 5;
2997 0 : gcd[k].gd.pos.width = -1;
2998 0 : gcd[k].gd.flags = gg_visible | gg_enabled | gg_but_default;
2999 0 : label[k].text = (unichar_t *) _("_OK");
3000 0 : label[k].text_is_1byte = true;
3001 0 : label[k].text_in_resource = true;
3002 0 : gcd[k].gd.label = &label[k];
3003 0 : gcd[k].gd.handle_controlevent = XHeight_OK;
3004 0 : gcd[k++].creator = GButtonCreate;
3005 0 : barray[0] = GCD_Glue; barray[1] = &gcd[k-1]; barray[2] = GCD_Glue;
3006 :
3007 0 : gcd[k].gd.pos.x = -30; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+3;
3008 0 : gcd[k].gd.pos.width = -1;
3009 0 : gcd[k].gd.flags = gg_visible | gg_enabled | gg_but_cancel;
3010 0 : label[k].text = (unichar_t *) _("_Cancel");
3011 0 : label[k].text_is_1byte = true;
3012 0 : label[k].text_in_resource = true;
3013 0 : gcd[k].gd.label = &label[k];
3014 0 : gcd[k].gd.handle_controlevent = CondenseExtend_Cancel;
3015 0 : gcd[k].creator = GButtonCreate;
3016 0 : barray[3] = GCD_Glue; barray[4] = &gcd[k]; barray[5] = GCD_Glue;
3017 0 : barray[6] = NULL;
3018 :
3019 0 : boxes[3].gd.flags = gg_enabled|gg_visible;
3020 0 : boxes[3].gd.u.boxelements = barray;
3021 0 : boxes[3].creator = GHBoxCreate;
3022 0 : hvarray[9] = &boxes[3]; hvarray[10] = GCD_ColSpan; hvarray[11] = NULL;
3023 0 : hvarray[12] = NULL;
3024 :
3025 0 : boxes[0].gd.pos.x = boxes[0].gd.pos.y = 2;
3026 0 : boxes[0].gd.flags = gg_enabled|gg_visible;
3027 0 : boxes[0].gd.u.boxelements = hvarray;
3028 0 : boxes[0].creator = GHVGroupCreate;
3029 :
3030 0 : GGadgetsCreate(gw,boxes);
3031 0 : GHVBoxSetExpandableCol(boxes[3].ret,gb_expandgluesame);
3032 0 : GHVBoxFitWindow(boxes[0].ret);
3033 0 : GDrawSetVisible(gw,true);
3034 :
3035 0 : while ( !ed.done )
3036 0 : GDrawProcessOneEvent(NULL);
3037 0 : GDrawDestroyWindow(gw);
3038 0 : }
|