2 * CDE - Common Desktop Environment
4 * Copyright (c) 1993-2012, The Open Group. All rights reserved.
6 * These libraries and programs are free software; you can
7 * redistribute them and/or modify them under the terms of the GNU
8 * Lesser General Public License as published by the Free Software
9 * Foundation; either version 2 of the License, or (at your option)
12 * These libraries and programs are distributed in the hope that
13 * they will be useful, but WITHOUT ANY WARRANTY; without even the
14 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 * PURPOSE. See the GNU Lesser General Public License for more
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with these librararies and programs; if not, write
20 * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
21 * Floor, Boston, MA 02110-1301 USA
23 /* omGeneric.c 1.9 - Fujitsu source for CDEnext 96/04/26 11:20:11 */
24 /* $XConsortium: _falomGeneric.c /main/4 1996/09/27 19:03:50 drk $ */
26 * Copyright 1992, 1993 by TOSHIBA Corp.
28 * Permission to use, copy, modify, and distribute this software and its
29 * documentation for any purpose and without fee is hereby granted, provided
30 * that the above copyright notice appear in all copies and that both that
31 * copyright notice and this permission notice appear in supporting
32 * documentation, and that the name of TOSHIBA not be used in advertising
33 * or publicity pertaining to distribution of the software without specific,
34 * written prior permission. TOSHIBA make no representations about the
35 * suitability of this software for any purpose. It is provided "as is"
36 * without express or implied warranty.
38 * TOSHIBA DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
39 * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
40 * TOSHIBA BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
41 * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
42 * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
43 * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
46 * Author: Katsuhisa Yano TOSHIBA Corp.
47 * mopi@osa.ilab.toshiba.co.jp
50 * Copyright 1995 by FUJITSU LIMITED
51 * This is source code modified by FUJITSU LIMITED under the Joint
52 * Development Agreement for the CDEnext PST.
53 * This is unpublished proprietary source code of FUJITSU LIMITED
55 * Modifier: Takanori Tateno FUJITSU LIMITED
59 #include "_fallibint.h"
60 #include "_falomGeneric.h"
62 #include <X11/Xatom.h>
68 #define PIXEL_SIZE_FIELD 7
69 #define POINT_SIZE_FIELD 8
70 #define CHARSET_ENCODING_FIELD 14
72 extern int _falmbDefaultTextEscapement(), _falwcDefaultTextEscapement();
73 extern int _falmbDefaultTextExtents(), _falwcDefaultTextExtents();
74 extern Status _falmbDefaultTextPerCharExtents(), _falwcDefaultTextPerCharExtents();
75 extern int _falmbDefaultDrawString(), _falwcDefaultDrawString();
76 extern void _falmbDefaultDrawImageString(), _falwcDefaultDrawImageString();
78 extern int _falmbGenericTextEscapement(), _falwcGenericTextEscapement();
79 extern int _falmbGenericTextExtents(), _falwcGenericTextExtents();
80 extern Status _falmbGenericTextPerCharExtents(), _falwcGenericTextPerCharExtents();
81 extern int _falmbGenericDrawString(), _falwcGenericDrawString();
82 extern void _falmbGenericDrawImageString(), _falwcGenericDrawImageString();
84 extern dbg_printValue();
86 /* For VW/UDC start */
89 init_fontdata(font_data, font_data_count)
96 fd = (FontData)Xmalloc(sizeof(FontDataRec) * font_data_count);
97 if(fd == (FontData) NULL)
100 memset(fd, 0x00, sizeof(FontData) * font_data_count);
101 for(i = 0 ; i < font_data_count ; i++)
102 fd[i] = font_data[i];
108 init_vrotate(font_data, font_data_count, type, code_range, code_range_num)
112 CodeRange code_range;
118 if(type == VROTATE_NONE)
119 return (VRotate)NULL;
121 vrotate = (VRotate)Xmalloc(sizeof(VRotateRec) * font_data_count);
122 if(vrotate == (VRotate) NULL)
125 memset(vrotate, 0x00, sizeof(VRotateRec) * font_data_count);
126 for(i = 0 ; i < font_data_count ; i++) {
127 vrotate[i].charset_name = font_data[i].name;
128 vrotate[i].side = font_data[i].side;
129 if(type == VROTATE_PART) {
130 vrotate[i].num_cr = code_range_num;
131 vrotate[i].code_range = code_range;
147 count = XOM_GENERIC(oc->core.om)->data_num;
148 data = XOM_GENERIC(oc->core.om)->data;
150 font_set = (FontSet) Xmalloc(sizeof(FontSetRec) * count);
151 if (font_set == NULL)
153 memset((char *) font_set, 0x00, sizeof(FontSetRec) * count);
155 gen = XOC_GENERIC(oc);
156 gen->font_set_num = count;
157 gen->font_set = font_set;
159 for ( ; count-- > 0; data++, font_set++) {
160 font_set->charset_count = data->charset_count;
161 font_set->charset_list = data->charset_list;
163 if((font_set->font_data = init_fontdata(data->font_data,
164 data->font_data_count)) == NULL)
166 font_set->font_data_count = data->font_data_count;
167 if((font_set->substitute = init_fontdata(data->substitute,
168 data->substitute_num)) == NULL)
170 font_set->substitute_num = data->substitute_num;
171 if((font_set->vmap = init_fontdata(data->vmap,
172 data->vmap_num)) == NULL)
174 font_set->vmap_num = data->vmap_num;
176 if(data->vrotate_type != VROTATE_NONE) {
177 /* A vrotate member is specified primary font data */
178 /* as initial value. */
179 if((font_set->vrotate = init_vrotate(data->font_data,
180 data->font_data_count,
183 data->vrotate_num)) == NULL)
185 font_set->vrotate_num = data->font_data_count;
191 if(font_set->font_data)
192 Xfree(font_set->font_data);
193 if(font_set->substitute)
194 Xfree(font_set->substitute);
196 Xfree(font_set->vmap);
197 if(font_set->vrotate)
198 Xfree(font_set->vrotate);
201 gen->font_set = (FontSet) NULL;
202 gen->font_set_num = 0;
209 get_prop_name(dpy, fs)
215 if (falGetFontProperty(fs, XA_FONT, &fp))
216 return falGetAtomName(dpy, fp);
218 return (char *) NULL;
222 check_charset(font_set, font_name)
228 int count, length, name_len;
230 name_len = strlen(font_name);
231 last = font_name + name_len;
233 count = font_set->font_data_count;
234 font_data = font_set->font_data;
235 for ( ; count-- > 0; font_data++) {
236 length = strlen(font_data->name);
237 if (length > name_len)
240 if (_fallcCompareISOLatin1(last - length, font_data->name) == 0)
244 return (FontData) NULL;
248 check_fontname(oc, name, found_num)
253 Display *dpy = oc->core.om->core.display;
254 XOCGenericPart *gen = XOC_GENERIC(oc);
257 XFontStruct *fs_list;
258 char **fn_list, *fname, *prop_fname = NULL;
259 int list_num, font_set_num, i;
261 char **fn2_list = NULL;
263 fn_list = falListFonts(dpy, name, MAXFONTS, &list_num);
267 for (i = 0; i < list_num; i++) {
270 font_set = gen->font_set;
271 font_set_num = gen->font_set_num;
273 for ( ; font_set_num-- > 0; font_set++) {
274 if (font_set->font_name)
277 if ((data = check_charset(font_set, fname)) == NULL) {
278 if ((fn2_list = falListFontsWithInfo(dpy, name, MAXFONTS,
279 &list2_num, &fs_list))
280 && (prop_fname = get_prop_name(dpy, fs_list))
281 && (data = check_charset(font_set, prop_fname)))
285 font_set->side = data->side;
286 font_set->font_name = (char *) Xmalloc(strlen(fname) + 1);
287 if (font_set->font_name) {
288 strcpy(font_set->font_name, fname);
293 falFreeFontInfo(fn2_list, fs_list, list2_num);
300 if (found_num == gen->font_set_num)
304 falFreeFontNames(fn_list);
309 /* For VW/UDC start */
312 load_fontdata(oc, font_data, font_data_num)
317 Display *dpy = oc->core.om->core.display;
318 FontData fd = font_data;
320 for( ; font_data_num-- ; fd++) {
321 if(fd->xlfd_name != (char *) NULL && fd->font == NULL) {
322 fd->font = falLoadQueryFont(dpy, fd->xlfd_name);
323 if (fd->font == NULL)
335 XOCGenericPart *gen = XOC_GENERIC(oc);
336 FontSet font_set = gen->font_set;
337 int num = gen->font_set_num;
339 for ( ; num-- > 0; font_set++) {
340 if (font_set->font_name == NULL)
343 if(load_fontdata(oc, font_set->font_data,
344 font_set->font_data_count) != True)
347 if(load_fontdata(oc, font_set->substitute,
348 font_set->substitute_num) != True)
351 if(font_set->font_data_count > 0 && font_set->font_data->font) {
352 font_set->font = font_set->font_data->font;
353 } else if(font_set->substitute_num > 0 ) {
354 for(i=0;i<font_set->substitute_num;i++){
355 if(font_set->substitute[i].font != NULL){
356 font_set->font = font_set->substitute[i].font;
361 load_fontdata(oc, font_set->vmap, font_set->vmap_num);
362 load_fontdata(oc, (FontData) font_set->vrotate,
363 font_set->vrotate_num);
365 if (font_set->font->min_byte1 || font_set->font->max_byte1)
366 font_set->is_xchar2b = True;
368 font_set->is_xchar2b = False;
380 Display *dpy = oc->core.om->core.display;
381 XOCGenericPart *gen = XOC_GENERIC(oc);
382 FontSet font_set = gen->font_set;
384 int fn_num, num = gen->font_set_num;
386 for ( ; num-- > 0; font_set++) {
387 if (font_set->font_name == NULL)
390 if (font_set->info == NULL) {
391 fn_list = falListFontsWithInfo(dpy, font_set->font_name, 1, &fn_num,
393 if (font_set->info == NULL)
396 falFreeFontNames(fn_list);
403 /* For Vertical Writing start */
406 check_fontset_extents(overall, logical_ascent, logical_descent, font)
407 XCharStruct *overall;
408 int *logical_ascent, *logical_descent;
411 overall->lbearing = min(overall->lbearing, font->min_bounds.lbearing);
412 overall->rbearing = max(overall->rbearing, font->max_bounds.rbearing);
413 overall->ascent = max(overall->ascent, font->max_bounds.ascent);
414 overall->descent = max(overall->descent, font->max_bounds.descent);
415 overall->width = max(overall->width, font->max_bounds.width);
416 *logical_ascent = max(*logical_ascent, font->ascent);
417 *logical_descent = max(*logical_descent, font->descent);
420 /* For Vertical Writing end */
423 set_fontset_extents(oc)
426 XRectangle *ink = &oc->core.font_set_extents.max_ink_extent;
427 XRectangle *logical = &oc->core.font_set_extents.max_logical_extent;
428 XFontStruct **font_list, *font;
430 int logical_ascent, logical_descent;
431 int num = oc->core.font_info.num_font;
433 font_list = oc->core.font_info.font_struct_list;
435 overall = font->max_bounds;
436 overall.lbearing = font->min_bounds.lbearing;
437 logical_ascent = font->ascent;
438 logical_descent = font->descent;
440 /* For Vertical Writing start */
444 check_fontset_extents(&overall, &logical_ascent, &logical_descent,
449 XOCGenericPart *gen = XOC_GENERIC(oc);
450 FontSet font_set = gen->font_set;
452 int font_set_num = gen->font_set_num;
455 for( ; font_set_num-- ; font_set++) {
456 if(font_set->vmap_num > 0) {
457 font_data = font_set->vmap;
458 font_data_count = font_set->vmap_num;
459 for( ; font_data_count-- ; font_data++) {
460 if(font_data->font != NULL) {
461 check_fontset_extents(&overall, &logical_ascent,
469 if(font_set->vrotate_num > 0) {
470 font_data = (FontData) font_set->vrotate;
471 font_data_count = font_set->vrotate_num;
472 for( ; font_data_count-- ; font_data++) {
473 if(font_data->font != NULL) {
474 check_fontset_extents(&overall, &logical_ascent,
484 /* For Vertical Writing start */
486 ink->x = overall.lbearing;
487 ink->y = -(overall.ascent);
488 ink->width = overall.rbearing - overall.lbearing;
489 ink->height = overall.ascent + overall.descent;
492 logical->y = -(logical_ascent);
493 logical->width = overall.width;
494 logical->height = logical_ascent + logical_descent;
501 XOCGenericPart *gen = XOC_GENERIC(oc);
504 XFontStruct **font_struct_list;
505 char **font_name_list, *font_name_buf;
508 font_set = gen->font_set;
509 font_set_num = gen->font_set_num;
512 for ( ; font_set_num-- > 0; font_set++) {
513 if (font_set->font_name == NULL)
516 length += strlen(font_set->font_name) + 1;
522 font_struct_list = (XFontStruct **) Xmalloc(sizeof(XFontStruct *) * count);
523 if (font_struct_list == NULL)
526 font_name_list = (char **) Xmalloc(sizeof(char *) * count);
527 if (font_name_list == NULL)
530 font_name_buf = (char *) Xmalloc(length);
531 if (font_name_buf == NULL)
534 oc->core.font_info.num_font = count;
535 oc->core.font_info.font_name_list = font_name_list;
536 oc->core.font_info.font_struct_list = font_struct_list;
538 font_set = gen->font_set;
539 font_set_num = gen->font_set_num;
541 for (count = 0; font_set_num-- > 0; font_set++, count++) {
542 if (font_set->font_name == NULL)
545 font_set->id = count;
547 *font_struct_list++ = font_set->font;
549 *font_struct_list++ = font_set->info;
550 strcpy(font_name_buf, font_set->font_name);
551 Xfree(font_set->font_name);
552 *font_name_list++ = font_set->font_name = font_name_buf;
553 font_name_buf += strlen(font_name_buf) + 1;
556 set_fontset_extents(oc);
562 Xfree(font_name_list);
563 Xfree(font_struct_list);
569 get_font_name(oc, pattern)
576 list = falListFonts(oc->core.om->core.display, pattern, 1, &count);
580 name = (char *) Xmalloc(strlen(*list) + 1);
584 falFreeFontNames(list);
589 /* For VW/UDC start*/
592 *get_rotate_fontname(font_name)
595 char *pattern = NULL, *ptr = NULL;
596 char *fields[CHARSET_ENCODING_FIELD];
597 char str_pixel[32], str_point[4];
598 char rotate_font[256];
599 char *rotate_font_ptr = NULL;
601 int field_num = 0, len = 0;
603 if(font_name == (char *) NULL || (len = strlen(font_name)) <= 0)
606 pattern = (char *)Xmalloc(len + 1);
609 strcpy(pattern, font_name);
611 memset(fields, NULL, sizeof(char *) * 14);
613 while(isspace(*ptr)) {
619 for(field_num = 0 ; field_num < CHARSET_ENCODING_FIELD && ptr && *ptr ;
620 ptr++, field_num++) {
621 fields[field_num] = ptr;
623 if(ptr = strchr(ptr, '-')) {
628 if(field_num < CHARSET_ENCODING_FIELD)
631 /* Pixel Size field : fields[6] */
632 for(ptr = fields[PIXEL_SIZE_FIELD - 1] ; ptr && *ptr; ptr++) {
639 pixel_size = atoi(fields[PIXEL_SIZE_FIELD - 1]);
640 sprintf(str_pixel, "[ 0 ~%d %d 0 ]", pixel_size, pixel_size);
641 fields[6] = str_pixel;
643 /* Point Size field : fields[7] */
644 strcpy(str_point, "*");
645 fields[POINT_SIZE_FIELD - 1] = str_point;
647 rotate_font[0] = NULL;
648 for(field_num = 0 ; field_num < CHARSET_ENCODING_FIELD &&
649 fields[field_num] ; field_num++) {
650 sprintf(rotate_font, "%s-%s", rotate_font, fields[field_num]);
656 rotate_font_ptr = (char *)Xmalloc(strlen(rotate_font) + 1);
659 strcpy(rotate_font_ptr, rotate_font);
661 return rotate_font_ptr;
665 is_match_charset(font_data, font_name)
670 int length, name_len;
672 name_len = strlen(font_name);
673 last = font_name + name_len;
675 length = strlen(font_data->name);
676 if (length > name_len)
679 if (_fallcCompareISOLatin1(last - length, font_data->name) == 0)
686 parse_all_name(oc, font_data, pattern)
692 if(is_match_charset(font_data, pattern) != True)
695 font_data->xlfd_name = (char *)Xmalloc(strlen(pattern)+1);
696 if(font_data->xlfd_name == NULL)
699 strcpy(font_data->xlfd_name, pattern);
704 parse_omit_name(oc, font_data, pattern)
709 char *font_name = (char *) NULL;
710 char *last = (char *) NULL;
714 if(is_match_charset(font_data, pattern) == True) {
715 strcpy(buf, pattern);
716 length = strlen(pattern);
717 if (font_name = get_font_name(oc, buf)) {
718 font_data->xlfd_name = (char *)Xmalloc(strlen(font_name) + 1);
719 if(font_data->xlfd_name == NULL) {
723 strcpy(font_data->xlfd_name, font_name);
729 strcpy(buf, pattern);
730 length = strlen(pattern);
731 last = buf + length - 1;
732 if (length > 1 && *last == '*' && *(last - 1) == '-') {
733 if (length > 3 && *(last - 2) == '*' && *(last - 3) == '-')
740 strcpy(last, font_data->name);
741 if (font_name = get_font_name(oc, buf)) {
742 font_data->xlfd_name = (char *)Xmalloc(strlen(font_name) + 1);
743 if(font_data->xlfd_name == NULL) {
747 strcpy(font_data->xlfd_name, font_name);
754 strcpy(last + 2, font_data->name);
755 if (font_name = get_font_name(oc, buf)) {
756 font_data->xlfd_name = (char *)Xmalloc(strlen(font_name) + 1);
757 if(font_data->xlfd_name == NULL) {
761 strcpy(font_data->xlfd_name, font_name);
770 typedef enum{C_PRIMARY, C_SUBSTITUTE, C_VMAP, C_VROTATE } ClassType;
773 parse_fontdata(oc, font_data, font_data_count, name_list, name_list_count,
782 char **cur_name_list = name_list;
783 char *font_name = (char *) NULL;
784 char *pattern = (char *) NULL;
785 int found_num = 0, ret = 0;
786 int fd_count = font_data_count;
787 int count = name_list_count;
788 Bool is_found = False;
790 if(name_list == NULL || count <= 0) {
794 if(font_data == NULL || font_data_count <= 0) {
798 for ( ; font_data_count-- > 0; font_data++) {
800 font_name = (char *) NULL;
801 count = name_list_count;
802 cur_name_list = name_list;
803 while (count-- > 0) {
804 pattern = *cur_name_list++;
805 if (pattern == NULL || *pattern == '\0')
808 /* When the font name is specified a full name. */
809 if (strchr(pattern, '*') == NULL &&
810 (font_name = get_font_name(oc, pattern))) {
811 ret = parse_all_name(oc, font_data, font_name);
815 else if (ret == True) {
823 /* When the font name is specified a omited name. */
824 ret = parse_omit_name(oc, font_data, pattern);
827 else if (ret == True) {
846 if(is_found == True) {
849 if((rotate_name = get_rotate_fontname(font_data->xlfd_name)) !=
851 Xfree(font_data->xlfd_name);
852 font_data->xlfd_name = rotate_name;
855 Xfree(font_data->xlfd_name);
861 if(class == C_PRIMARY && found_num == fd_count)
869 parse_vw(oc, font_set, name_list, count)
875 FontData vmap = font_set->vmap;
876 VRotate vrotate = font_set->vrotate;
877 int vmap_num = font_set->vmap_num;
878 int vrotate_num = font_set->vrotate_num;
882 if(parse_fontdata(oc, vmap, vmap_num, name_list, count, C_VMAP) == -1)
886 if(vrotate_num > 0) {
887 ret = parse_fontdata(oc, (FontData) vrotate, vrotate_num,
888 name_list, count, C_VROTATE);
891 } else if(ret == False) {
892 CodeRange code_range;
894 int sub_num = font_set->substitute_num;
896 code_range = vrotate[i].code_range;
897 num_cr = vrotate[i].num_cr;
898 for(i = 0 ; i < vrotate_num ; i++) {
899 if(vrotate[i].xlfd_name)
900 Xfree(vrotate[i].xlfd_name);
905 vrotate = font_set->vrotate = (VRotate)Xmalloc
906 (sizeof(VRotateRec) * sub_num);
907 if(font_set->vrotate == (VRotate)NULL)
910 for(i = 0 ; i < sub_num ; i++) {
911 vrotate[i].charset_name = font_set->substitute[i].name;
912 vrotate[i].side = font_set->substitute[i].side;
913 vrotate[i].code_range = code_range;
914 vrotate[i].num_cr = num_cr;
916 vrotate_num = font_set->vrotate_num = sub_num;
918 font_set->vrotate = (VRotate)NULL;
921 ret = parse_fontdata(oc, (FontData) vrotate, vrotate_num,
922 name_list, count, C_VROTATE);
935 XOCGenericPart *gen = XOC_GENERIC(oc);
937 char *base_name, **name_list;
938 int font_set_num = 0;
944 name_list = _falParseBaseFontNameList(oc->core.base_name_list, &count);
945 if (name_list == NULL)
948 font_set = gen->font_set;
949 font_set_num = gen->font_set_num;
951 for( ; font_set_num-- > 0 ; font_set++) {
952 if(font_set->font_name)
955 if(font_set->font_data_count > 0) {
956 ret = parse_fontdata(oc, font_set->font_data,
957 font_set->font_data_count,
958 name_list, count, C_PRIMARY);
961 } else if(ret == True) {
962 font_set->font_name = (char *)Xmalloc
963 (strlen(font_set->font_data->xlfd_name) + 1);
964 if(font_set->font_name == (char *) NULL)
966 strcpy(font_set->font_name, font_set->font_data->xlfd_name);
967 font_set->side = font_set->font_data->side;
969 if(parse_vw(oc, font_set, name_list, count) == -1)
973 /* The substitute font is serched, when the primary fonts */
976 /* The primary information is free from FontSet structure */
977 font_set->font_data_count = 0;
978 if(font_set->font_data) {
979 Xfree(font_set->font_data);
980 font_set->font_data = (FontData) NULL;
983 /* A vrotate member is replaced to substitute information */
984 /* from primary information. */
985 font_set->vrotate_num = 0;
986 if(font_set->vrotate) {
987 Xfree(font_set->vrotate);
988 font_set->vrotate = (VRotate) NULL;
991 ret = parse_fontdata(oc, font_set->substitute,
992 font_set->substitute_num,
993 name_list, count, C_SUBSTITUTE);
996 } else if(ret == True) {
997 for(i=0;i<font_set->substitute_num;i++){
998 if(font_set->substitute[i].xlfd_name != NULL){
1002 font_set->font_name = (char *)Xmalloc
1003 (strlen(font_set->substitute[i].xlfd_name) + 1);
1004 if(font_set->font_name == (char *) NULL)
1006 strcpy(font_set->font_name,font_set->substitute[i].xlfd_name);
1007 font_set->side = font_set->substitute[i].side;
1008 if(parse_vw(oc, font_set, name_list, count) == -1)
1013 } else if(font_set->substitute_num > 0) {
1014 ret = parse_fontdata(oc, font_set->substitute,
1015 font_set->substitute_num,
1016 name_list, count, C_SUBSTITUTE);
1019 } else if(ret == True) {
1020 for(i=0;i<font_set->substitute_num;i++){
1021 if(font_set->substitute[i].xlfd_name != NULL){
1025 font_set->font_name = (char *)Xmalloc
1026 (strlen(font_set->substitute[i].xlfd_name) + 1);
1027 if(font_set->font_name == (char *) NULL)
1029 strcpy(font_set->font_name,font_set->substitute[i].xlfd_name);
1030 font_set->side = font_set->substitute[i].side;
1031 if(parse_vw(oc, font_set, name_list, count) == -1)
1039 base_name = (char *) Xmalloc(strlen(oc->core.base_name_list) + 1);
1040 if (base_name == NULL)
1043 strcpy(base_name, oc->core.base_name_list);
1044 oc->core.base_name_list = base_name;
1046 falFreeStringList(name_list);
1051 falFreeStringList(name_list);
1059 set_missing_list(oc)
1062 XOCGenericPart *gen = XOC_GENERIC(oc);
1064 char **charset_list, *charset_buf;
1065 int count, length, font_set_num;
1067 font_set = gen->font_set;
1068 font_set_num = gen->font_set_num;
1071 for ( ; font_set_num-- > 0; font_set++) {
1072 if (font_set->info || font_set->font)
1075 /* Change 1996.01.23 start */
1076 if(font_set->font_data_count <= 0 ||
1077 font_set->font_data == (FontData)NULL) {
1078 if(font_set->substitute_num <= 0 ||
1079 font_set->substitute == (FontData)NULL)
1080 if(font_set->charset_list != NULL){
1082 strlen(font_set->charset_list[0]->encoding_name) + 1;
1087 length += strlen(font_set->substitute->name) + 1;
1089 length += strlen(font_set->font_data->name) + 1;
1091 /* Change 1996.01.23 end */
1098 charset_list = (char **) Xmalloc(sizeof(char *) * count);
1099 if (charset_list == NULL)
1102 charset_buf = (char *) Xmalloc(length);
1103 if (charset_buf == NULL) {
1104 Xfree(charset_list);
1108 oc->core.missing_list.charset_list = charset_list;
1109 oc->core.missing_list.charset_count = count;
1111 font_set = gen->font_set;
1112 font_set_num = gen->font_set_num;
1114 for ( ; font_set_num-- > 0; font_set++) {
1115 if (font_set->info || font_set->font)
1118 /* Change 1996.01.23 start */
1119 if(font_set->font_data_count <= 0 ||
1120 font_set->font_data == (FontData)NULL) {
1121 if(font_set->substitute_num <= 0 ||
1122 font_set->substitute == (FontData)NULL)
1123 if(font_set->charset_list != NULL){
1125 font_set->charset_list[0]->encoding_name);
1127 strcpy(charset_buf, "");
1130 strcpy(charset_buf, font_set->substitute->name);
1132 strcpy(charset_buf, font_set->font_data->name);
1134 /* Change 1996.01.23 end */
1135 *charset_list++ = charset_buf;
1136 charset_buf += strlen(charset_buf) + 1;
1146 XOMGenericPart *gen = XOM_GENERIC(oc->core.om);
1149 if (init_fontset(oc) == False)
1152 found_num = parse_fontname(oc);
1153 if (found_num <= 0) {
1155 set_missing_list(oc);
1159 if (gen->on_demand_loading == True) {
1160 if (load_font_info(oc) == False)
1163 if (load_font(oc) == False)
1167 if (init_core_part(oc) == False)
1170 if (set_missing_list(oc) == False)
1176 /* For VW/UDC start */
1178 free_fontdataOC(dpy,font_data, font_data_count)
1181 int font_data_count;
1183 for( ; font_data_count-- ; font_data++) {
1184 if(font_data->xlfd_name){
1185 Xfree(font_data->xlfd_name);
1186 font_data->xlfd_name = NULL;
1188 if(font_data->font){ /* ADD 1996.01.7 */
1189 if(font_data->font->fid) /* Add 1996.01.23 */
1190 falFreeFont(dpy,font_data->font); /* ADD 1996.01.7 */
1191 else /* Add 1996.01.23 */
1192 falFreeFontInfo(NULL, font_data->font, 1);/* Add 1996.01.23 */
1193 font_data->font = NULL;
1195 /* XOM to kyoutuu shite shiyou sushiteiru ryouiki
1196 kokoha free_fontdataOM() de free sareru
1198 if(font_data->scopes){
1199 Xfree(font_data->scopes);
1200 font_data->scopes = NULL;
1202 if(font_data->name){
1203 Xfree(font_data->name);
1204 font_data->name = NULL;
1211 destroy_fontdata(gen,dpy)
1212 XOCGenericPart *gen ;
1215 FontSet font_set = (FontSet) NULL;
1216 int font_set_num = 0;
1218 if (gen->font_set) {
1219 font_set = gen->font_set;
1220 font_set_num = gen->font_set_num;
1221 for( ; font_set_num-- ; font_set++) {
1222 if(font_set->font_data) {
1223 free_fontdataOC(dpy,
1224 font_set->font_data, font_set->font_data_count);
1225 Xfree(font_set->font_data);
1226 font_set->font_data = NULL;
1228 if(font_set->substitute) {
1229 free_fontdataOC(dpy,
1230 font_set->substitute, font_set->substitute_num);
1231 Xfree(font_set->substitute);
1232 font_set->substitute = NULL;
1234 if(font_set->vmap) {
1235 free_fontdataOC(dpy,
1236 font_set->vmap, font_set->vmap_num);
1237 Xfree(font_set->vmap);
1238 font_set->vmap = NULL;
1240 if(font_set->vrotate) {
1241 free_fontdataOC(dpy,
1242 (FontData)font_set->vrotate,
1243 font_set->vrotate_num);
1244 Xfree(font_set->vrotate);
1245 font_set->vrotate = NULL;
1248 Xfree(gen->font_set);
1249 gen->font_set = NULL;
1252 /* For VW/UDC end */
1258 Display *dpy = oc->core.om->core.display;
1259 XOCGenericPart *gen = XOC_GENERIC(oc);
1260 XFontStruct **font_list, *font;
1261 FontSet font_set = (FontSet) NULL;
1262 int font_set_num = 0;
1266 _fallcCloseConverter(gen->mbs_to_cs);
1269 _fallcCloseConverter(gen->wcs_to_cs);
1271 /* For VW/UDC start */ /* Change 1996.01.8 */
1272 destroy_fontdata(gen,dpy);
1275 /* For VW/UDC end */
1277 if (oc->core.base_name_list)
1278 Xfree(oc->core.base_name_list);
1280 if (oc->core.font_info.font_name_list)
1281 falFreeStringList(oc->core.font_info.font_name_list);
1283 if (font_list = oc->core.font_info.font_struct_list) {
1284 Xfree(oc->core.font_info.font_struct_list);
1287 if (oc->core.missing_list.charset_list)
1288 falFreeStringList(oc->core.missing_list.charset_list);
1291 if (oc->core.res_name)
1292 Xfree(oc->core.res_name);
1293 if (oc->core.res_class)
1294 Xfree(oc->core.res_class);
1301 set_oc_values(oc, args, num_args)
1306 if (oc->core.resources == NULL)
1309 return _fallcSetValues((XPointer) oc, oc->core.resources,
1310 oc->core.num_resources, args, num_args, XlcSetMask);
1314 get_oc_values(oc, args, num_args)
1319 if (oc->core.resources == NULL)
1322 return _fallcGetValues((XPointer) oc, oc->core.resources,
1323 oc->core.num_resources, args, num_args, XlcGetMask);
1326 static XOCMethodsRec oc_default_methods = {
1330 _falmbDefaultTextEscapement,
1331 _falmbDefaultTextExtents,
1332 _falmbDefaultTextPerCharExtents,
1333 _falmbDefaultDrawString,
1334 _falmbDefaultDrawImageString,
1335 _falwcDefaultTextEscapement,
1336 _falwcDefaultTextExtents,
1337 _falwcDefaultTextPerCharExtents,
1338 _falwcDefaultDrawString,
1339 _falwcDefaultDrawImageString
1342 static XOCMethodsRec oc_generic_methods = {
1346 _falmbGenericTextEscapement,
1347 _falmbGenericTextExtents,
1348 _falmbGenericTextPerCharExtents,
1349 _falmbGenericDrawString,
1350 _falmbGenericDrawImageString,
1351 _falwcGenericTextEscapement,
1352 _falwcGenericTextExtents,
1353 _falwcGenericTextPerCharExtents,
1354 _falwcGenericDrawString,
1355 _falwcGenericDrawImageString
1358 typedef struct _XOCMethodsListRec {
1361 } XOCMethodsListRec, *XOCMethodsList;
1363 static XOCMethodsListRec oc_methods_list[] = {
1364 { "default", &oc_default_methods },
1365 { "generic", &oc_generic_methods }
1368 static XlcResource oc_resources[] = {
1369 { XNBaseFontName, NULLQUARK, sizeof(char *),
1370 XOffsetOf(XOCRec, core.base_name_list), XlcCreateMask | XlcGetMask },
1371 { XNOMAutomatic, NULLQUARK, sizeof(Bool),
1372 XOffsetOf(XOCRec, core.om_automatic), XlcGetMask },
1373 { XNMissingCharSet, NULLQUARK, sizeof(XOMCharSetList),
1374 XOffsetOf(XOCRec, core.missing_list), XlcGetMask },
1375 { XNDefaultString, NULLQUARK, sizeof(char *),
1376 XOffsetOf(XOCRec, core.default_string), XlcGetMask },
1377 { XNOrientation, NULLQUARK, sizeof(XOrientation),
1378 XOffsetOf(XOCRec, core.orientation), XlcSetMask | XlcGetMask },
1379 { XNResourceName, NULLQUARK, sizeof(char *),
1380 XOffsetOf(XOCRec, core.res_name), XlcSetMask | XlcGetMask },
1381 { XNResourceClass, NULLQUARK, sizeof(char *),
1382 XOffsetOf(XOCRec, core.res_class), XlcSetMask | XlcGetMask },
1383 { XNFontInfo, NULLQUARK, sizeof(XOMFontInfo),
1384 XOffsetOf(XOCRec, core.font_info), XlcGetMask }
1388 create_oc(om, args, num_args)
1394 XOMGenericPart *gen = XOM_GENERIC(om);
1395 XOCMethodsList methods_list = oc_methods_list;
1398 oc = (XOC) Xmalloc(sizeof(XOCGenericRec));
1401 bzero((char *) oc, sizeof(XOCGenericRec));
1405 if (oc_resources[0].xrm_name == NULLQUARK)
1406 _fallcCompileResourceList(oc_resources, XlcNumber(oc_resources));
1408 if (_fallcSetValues((XPointer) oc, oc_resources, XlcNumber(oc_resources),
1409 args, num_args, XlcCreateMask | XlcDefaultMask))
1412 if (oc->core.base_name_list == NULL)
1415 oc->core.resources = oc_resources;
1416 oc->core.num_resources = XlcNumber(oc_resources);
1418 if (create_fontset(oc) == False)
1421 oc->methods = &oc_generic_methods;
1423 if (gen->object_name) {
1424 count = XlcNumber(oc_methods_list);
1426 for ( ; count-- > 0; methods_list++) {
1427 if (!_fallcCompareISOLatin1(gen->object_name, methods_list->name)) {
1428 oc->methods = methods_list->methods;
1443 free_fontdataOM(font_data, font_data_count)
1445 int font_data_count;
1447 for( ; font_data_count-- ; font_data++) {
1448 if(font_data->name){
1449 Xfree(font_data->name);
1450 font_data->name = NULL;
1452 if(font_data->scopes){
1453 Xfree(font_data->scopes);
1454 font_data->scopes = NULL;
1463 XOMGenericPart *gen = XOM_GENERIC(om);
1467 if (data = gen->data) {
1468 for (count = gen->data_num; count-- > 0; data++) {
1469 if (data->charset_list){
1470 Xfree(data->charset_list);
1471 data->charset_list = NULL;
1473 /* free font_data for om */
1474 if (data->font_data) {
1475 free_fontdataOM(data->font_data,data->font_data_count);
1476 Xfree(data->font_data);
1477 data->font_data = NULL;
1479 /* free substitute for om */
1480 if (data->substitute) {
1481 free_fontdataOM(data->substitute,data->substitute_num);
1482 Xfree(data->substitute);
1483 data->substitute = NULL;
1485 /* free vmap for om */
1487 free_fontdataOM(data->vmap,data->vmap_num);
1491 /* free vrotate for om */
1492 if (data->vrotate) {
1494 free_fontdataOM(data->vrotate,data->vrotate_num);
1495 #endif /* COMMENT */
1496 Xfree(data->vrotate);
1497 data->vrotate = NULL;
1504 if (gen->object_name){
1505 Xfree(gen->object_name);
1506 gen->object_name = NULL;
1509 if (om->core.res_name){
1510 Xfree(om->core.res_name);
1511 om->core.res_name = NULL;
1513 if (om->core.res_class){
1514 Xfree(om->core.res_class);
1515 om->core.res_class = NULL;
1517 if (om->core.required_charset.charset_list &&
1518 om->core.required_charset.charset_count > 0){
1519 falFreeStringList(om->core.required_charset.charset_list);
1520 om->core.required_charset.charset_list = NULL;
1522 Xfree((char*)om->core.required_charset.charset_list);
1523 om->core.required_charset.charset_list = NULL;
1525 if (om->core.orientation_list.orientation){
1526 Xfree(om->core.orientation_list.orientation);
1527 om->core.orientation_list.orientation = NULL;
1536 set_om_values(om, args, num_args)
1541 if (om->core.resources == NULL)
1544 return _fallcSetValues((XPointer) om, om->core.resources,
1545 om->core.num_resources, args, num_args, XlcSetMask);
1549 get_om_values(om, args, num_args)
1554 if (om->core.resources == NULL)
1557 return _fallcGetValues((XPointer) om, om->core.resources,
1558 om->core.num_resources, args, num_args, XlcGetMask);
1561 static XOMMethodsRec methods = {
1568 static XlcResource om_resources[] = {
1569 { XNRequiredCharSet, NULLQUARK, sizeof(XOMCharSetList),
1570 XOffsetOf(XOMRec, core.required_charset), XlcGetMask },
1571 { XNQueryOrientation, NULLQUARK, sizeof(XOMOrientation),
1572 XOffsetOf(XOMRec, core.orientation_list), XlcGetMask },
1573 { XNDirectionalDependentDrawing, NULLQUARK, sizeof(Bool),
1574 XOffsetOf(XOMRec, core.directional_dependent), XlcGetMask },
1575 { XNContextualDrawing, NULLQUARK, sizeof(Bool),
1576 XOffsetOf(XOMRec, core.contextual_drawing), XlcGetMask }
1580 create_om(lcd, dpy, rdb, res_name, res_class)
1589 om = (XOM) Xmalloc(sizeof(XOMGenericRec));
1592 bzero((char *) om, sizeof(XOMGenericRec));
1594 om->methods = &methods;
1596 om->core.display = dpy;
1599 om->core.res_name = (char *) Xmalloc(strlen(res_name) + 1);
1600 if (om->core.res_name == NULL)
1602 strcpy(om->core.res_name, res_name);
1605 om->core.res_class = (char *) Xmalloc(strlen(res_class) + 1);
1606 if (om->core.res_class == NULL)
1608 strcpy(om->core.res_class, res_class);
1611 if (om_resources[0].xrm_name == NULLQUARK)
1612 _fallcCompileResourceList(om_resources, XlcNumber(om_resources));
1614 om->core.resources = om_resources;
1615 om->core.num_resources = XlcNumber(om_resources);
1629 XOMGenericPart *gen = XOM_GENERIC(om);
1633 if (num = gen->data_num)
1634 new = (OMData) Xrealloc(gen->data, (num + 1) * sizeof(OMDataRec));
1636 new = (OMData) Xmalloc(sizeof(OMDataRec));
1641 gen->data_num = num + 1;
1645 bzero((char *) new, sizeof(OMDataRec));
1652 falread_EncodingInfo(count,value)
1656 FontData font_data,ret;
1657 char *buf, *bufptr,*scp;
1660 extern FontScope falparse_scopemaps();
1661 font_data = (FontData) Xmalloc(sizeof(FontDataRec) * count);
1662 if (font_data == NULL)
1664 bzero((char *) font_data, sizeof(FontDataRec) * count);
1667 for ( ; count-- > 0; font_data++) {
1669 strcpy(buf, *value++);
1671 buf = *value; value++;
1672 if (bufptr = strchr(buf, ':')){
1673 len = (int)(bufptr - buf);
1676 font_data->name = (char *) Xmalloc(len + 1);
1677 if (font_data->name == NULL)
1679 strncpy(font_data->name, buf,len);
1680 font_data->name[len] = 0;
1681 if (bufptr && _fallcCompareISOLatin1(bufptr, "GL") == 0)
1682 font_data->side = XlcGL;
1683 else if (bufptr && _fallcCompareISOLatin1(bufptr, "GR") == 0)
1684 font_data->side = XlcGR;
1686 font_data->side = XlcGLGR;
1688 if (bufptr && (scp = strchr(bufptr, '['))){
1689 font_data->scopes = falparse_scopemaps(scp,&(font_data->scopes_num));
1695 static CodeRange read_vrotate(count,value,type,vrotate_num)
1701 FontData font_data,ret;
1702 char *buf, *bufptr,*scp;
1704 extern FontScope falparse_scopemaps();
1705 if(!strcmp(value[0],"all")){
1706 *type = VROTATE_ALL ;
1709 } else if(*(value[0]) == '['){
1710 *type = VROTATE_PART ;
1711 range = (CodeRange)falparse_scopemaps(value[0],vrotate_num);
1714 *type = VROTATE_NONE ;
1720 static read_vw(lcd,font_set,num)
1725 char **value, buf[BUFSIZ], *bufptr;
1728 sprintf(buf, "fs%d.font.vertical_map", num);
1729 _fallcGetResource(lcd, "XLC_FONTSET", buf, &value, &count);
1731 dbg_printValue(buf,value,count);
1732 font_set->vmap_num = count;
1733 font_set->vmap = falread_EncodingInfo(count,value);
1736 sprintf(buf, "fs%d.font.vertical_rotate", num);
1737 _fallcGetResource(lcd, "XLC_FONTSET", buf, &value, &count);
1739 dbg_printValue(buf,value,count);
1740 font_set->vrotate = read_vrotate(count,value,&(font_set->vrotate_type),
1741 &(font_set->vrotate_num));
1749 XLCd lcd = om->core.lcd;
1750 XOMGenericPart *gen = XOM_GENERIC(om);
1752 XlcCharSet *charset_list;
1754 char **required_list;
1755 XOrientation *orientation;
1756 char **value, buf[BUFSIZ], *bufptr;
1757 int count = 0, num = 0, length = 0;
1759 _fallcGetResource(lcd, "XLC_FONTSET", "on_demand_loading", &value, &count);
1760 if (count > 0 && _fallcCompareISOLatin1(*value, "True") == 0)
1761 gen->on_demand_loading = True;
1763 _fallcGetResource(lcd, "XLC_FONTSET", "object_name", &value, &count);
1765 gen->object_name = (char *) Xmalloc(strlen(*value) + 1);
1766 if (gen->object_name == NULL)
1768 strcpy(gen->object_name, *value);
1771 for (num = 0; ; num++) {
1773 sprintf(buf, "fs%d.charset.name", num);
1774 _fallcGetResource(lcd, "XLC_FONTSET", buf, &value, &count);
1777 sprintf(buf, "fs%d.charset", num);
1778 _fallcGetResource(lcd, "XLC_FONTSET", buf, &value, &count);
1783 data = add_data(om);
1787 charset_list = (XlcCharSet *) Xmalloc(sizeof(XlcCharSet) * count);
1788 if (charset_list == NULL)
1790 data->charset_list = charset_list;
1791 data->charset_count = count;
1793 while (count-- > 0){
1794 *charset_list++ = _fallcGetCharSet(*value++);
1796 sprintf(buf, "fs%d.charset.udc_area", num);
1797 _fallcGetResource(lcd, "XLC_FONTSET", buf, &value, &count);
1801 udc = (UDCArea)Xmalloc(count * sizeof(UDCAreaRec));
1804 for(i=0;i<count;i++){
1805 sscanf(value[i],"\\x%lx,\\x%lx", &(udc[i].start), &(udc[i].end));
1807 for(i=0;i<data->charset_count;i++){
1808 if(data->charset_list[i]->udc_area == NULL){
1809 data->charset_list[i]->udc_area = udc;
1810 data->charset_list[i]->udc_area_num = count;
1819 sprintf(buf, "fs%d.font.primary", num);
1820 _fallcGetResource(lcd, "XLC_FONTSET", buf, &value, &count);
1822 sprintf(buf, "fs%d.font", num);
1823 _fallcGetResource(lcd, "XLC_FONTSET", buf, &value, &count);
1828 font_data = falread_EncodingInfo(count,value);
1829 if (font_data == NULL)
1832 data->font_data = font_data;
1833 data->font_data_count = count;
1835 sprintf(buf, "fs%d.font.substitute", num);
1836 _fallcGetResource(lcd, "XLC_FONTSET", buf, &value, &count);
1838 font_data = falread_EncodingInfo(count,value);
1839 if (font_data == NULL)
1841 data->substitute = font_data;
1842 data->substitute_num = count;
1844 sprintf(buf, "fs%d.font", num);
1845 _fallcGetResource(lcd, "XLC_FONTSET", buf, &value, &count);
1847 data->substitute = NULL;
1848 data->substitute_num = 0;
1850 font_data = falread_EncodingInfo(count,value);
1851 data->substitute = font_data;
1852 data->substitute_num = count;
1855 read_vw(lcd,data,num);
1856 length += strlen(data->font_data->name) + 1;
1859 /* required charset list */
1860 required_list = (char **) Xmalloc(sizeof(char *) * gen->data_num);
1861 if (required_list == NULL)
1864 bufptr = (char *) Xmalloc(length);
1865 if (bufptr == NULL) {
1866 Xfree(required_list);
1870 om->core.required_charset.charset_list = required_list;
1871 om->core.required_charset.charset_count = gen->data_num;
1873 count = gen->data_num;
1876 for ( ; count-- > 0; data++) {
1877 strcpy(bufptr, data->font_data->name);
1878 *required_list++ = bufptr;
1879 bufptr += strlen(bufptr) + 1;
1882 /* orientation list */
1883 orientation = (XOrientation *) Xmalloc(sizeof(XOrientation) * 2);
1884 if (orientation == NULL)
1887 orientation[0] = XOMOrientation_LTR_TTB;
1888 orientation[1] = XOMOrientation_TTB_RTL;
1889 om->core.orientation_list.orientation = orientation;
1890 om->core.orientation_list.num_orientation = 2;
1892 /* directional dependent drawing */
1893 om->core.directional_dependent = False;
1895 /* contexual drawing */
1896 om->core.contextual_drawing = False;
1898 /* context dependent */
1899 om->core.context_dependent = False;
1905 #if NeedFunctionPrototypes
1906 _falomGenericOpenOM(XLCd lcd, Display *dpy, XrmDatabase rdb,
1907 _Xconst char *res_name, _Xconst char *res_class)
1909 _falomGenericOpenOM(lcd, dpy, rdb, res_name, res_class)
1919 om = create_om(lcd, dpy, rdb, res_name, res_class);
1923 if (init_om(om) == False)
1938 lcd->methods->open_om = _falomGenericOpenOM;