omDefault.c revision 1ab64890
11ab64890Smrg/* $Xorg: omDefault.c,v 1.3 2000/08/17 19:45:21 cpqbld Exp $ */ 21ab64890Smrg/* 31ab64890Smrg * Copyright 1992, 1993 by TOSHIBA Corp. 41ab64890Smrg * 51ab64890Smrg * Permission to use, copy, modify, and distribute this software and its 61ab64890Smrg * documentation for any purpose and without fee is hereby granted, provided 71ab64890Smrg * that the above copyright notice appear in all copies and that both that 81ab64890Smrg * copyright notice and this permission notice appear in supporting 91ab64890Smrg * documentation, and that the name of TOSHIBA not be used in advertising 101ab64890Smrg * or publicity pertaining to distribution of the software without specific, 111ab64890Smrg * written prior permission. TOSHIBA make no representations about the 121ab64890Smrg * suitability of this software for any purpose. It is provided "as is" 131ab64890Smrg * without express or implied warranty. 141ab64890Smrg * 151ab64890Smrg * TOSHIBA DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING 161ab64890Smrg * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL 171ab64890Smrg * TOSHIBA BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR 181ab64890Smrg * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, 191ab64890Smrg * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, 201ab64890Smrg * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS 211ab64890Smrg * SOFTWARE. 221ab64890Smrg * 231ab64890Smrg * Author: Katsuhisa Yano TOSHIBA Corp. 241ab64890Smrg * mopi@osa.ilab.toshiba.co.jp 251ab64890Smrg */ 261ab64890Smrg/* 271ab64890Smrg * (c) Copyright 1995 FUJITSU LIMITED 281ab64890Smrg * This is source code modified by FUJITSU LIMITED under the Joint 291ab64890Smrg * Development Agreement for the CDE/Motif PST. 301ab64890Smrg */ 311ab64890Smrg/* $XFree86: xc/lib/X11/omDefault.c,v 1.6 2003/04/13 19:22:22 dawes Exp $ */ 321ab64890Smrg 331ab64890Smrg#ifdef HAVE_CONFIG_H 341ab64890Smrg#include <config.h> 351ab64890Smrg#endif 361ab64890Smrg#include "Xlibint.h" 371ab64890Smrg#include "XomGeneric.h" 381ab64890Smrg#include <X11/Xos.h> 391ab64890Smrg#include <X11/Xatom.h> 401ab64890Smrg#include <stdio.h> 411ab64890Smrg 421ab64890Smrg#define DefineLocalBuf char local_buf[BUFSIZ] 431ab64890Smrg#define AllocLocalBuf(length) (length > BUFSIZ ? (char *)Xmalloc(length) : local_buf) 441ab64890Smrg#define FreeLocalBuf(ptr) if (ptr != local_buf) Xfree(ptr) 451ab64890Smrg 461ab64890Smrgstatic Bool 471ab64890Smrgwcs_to_mbs( 481ab64890Smrg XOC oc, 491ab64890Smrg char *to, 501ab64890Smrg _Xconst wchar_t *from, 511ab64890Smrg int length) 521ab64890Smrg{ 531ab64890Smrg XlcConv conv; 541ab64890Smrg int to_left, ret; 551ab64890Smrg 561ab64890Smrg conv = _XomInitConverter(oc, XOMWideChar); 571ab64890Smrg if (conv == NULL) 581ab64890Smrg return False; 591ab64890Smrg 601ab64890Smrg to_left = length; 611ab64890Smrg ret = _XlcConvert(conv, (XPointer *) &from, &length, (XPointer *) &to, 621ab64890Smrg &to_left, NULL, 0); 631ab64890Smrg if (ret != 0 || length > 0) 641ab64890Smrg return False; 651ab64890Smrg 661ab64890Smrg return True; 671ab64890Smrg} 681ab64890Smrg 691ab64890Smrgstatic Bool 701ab64890Smrgutf8_to_mbs( 711ab64890Smrg XOC oc, 721ab64890Smrg char *to, 731ab64890Smrg _Xconst char *from, 741ab64890Smrg int length) 751ab64890Smrg{ 761ab64890Smrg XlcConv conv; 771ab64890Smrg int to_left, ret; 781ab64890Smrg 791ab64890Smrg conv = _XomInitConverter(oc, XOMUtf8String); 801ab64890Smrg if (conv == NULL) 811ab64890Smrg return False; 821ab64890Smrg 831ab64890Smrg to_left = length; 841ab64890Smrg ret = _XlcConvert(conv, (XPointer *) &from, &length, (XPointer *) &to, 851ab64890Smrg &to_left, NULL, 0); 861ab64890Smrg if (ret != 0 || length > 0) 871ab64890Smrg return False; 881ab64890Smrg 891ab64890Smrg return True; 901ab64890Smrg} 911ab64890Smrg 921ab64890Smrgint 931ab64890Smrg_XmbDefaultTextEscapement(XOC oc, _Xconst char *text, int length) 941ab64890Smrg{ 951ab64890Smrg return XTextWidth(*oc->core.font_info.font_struct_list, text, length); 961ab64890Smrg} 971ab64890Smrg 981ab64890Smrgint 991ab64890Smrg_XwcDefaultTextEscapement(XOC oc, _Xconst wchar_t *text, int length) 1001ab64890Smrg{ 1011ab64890Smrg DefineLocalBuf; 1021ab64890Smrg char *buf = AllocLocalBuf(length); 1031ab64890Smrg int ret; 1041ab64890Smrg 1051ab64890Smrg if (buf == NULL) 1061ab64890Smrg return 0; 1071ab64890Smrg 1081ab64890Smrg if (wcs_to_mbs(oc, buf, text, length) == False) { 1091ab64890Smrg ret = 0; 1101ab64890Smrg goto err; 1111ab64890Smrg } 1121ab64890Smrg 1131ab64890Smrg ret = _XmbDefaultTextEscapement(oc, buf, length); 1141ab64890Smrg 1151ab64890Smrgerr: 1161ab64890Smrg FreeLocalBuf(buf); 1171ab64890Smrg 1181ab64890Smrg return ret; 1191ab64890Smrg} 1201ab64890Smrg 1211ab64890Smrgint 1221ab64890Smrg_Xutf8DefaultTextEscapement(XOC oc, _Xconst char *text, int length) 1231ab64890Smrg{ 1241ab64890Smrg DefineLocalBuf; 1251ab64890Smrg char *buf = AllocLocalBuf(length); 1261ab64890Smrg int ret; 1271ab64890Smrg 1281ab64890Smrg if (buf == NULL) 1291ab64890Smrg return 0; 1301ab64890Smrg 1311ab64890Smrg if (utf8_to_mbs(oc, buf, text, length) == False) { 1321ab64890Smrg ret = 0; 1331ab64890Smrg goto err; 1341ab64890Smrg } 1351ab64890Smrg 1361ab64890Smrg ret = _XmbDefaultTextEscapement(oc, buf, length); 1371ab64890Smrg 1381ab64890Smrgerr: 1391ab64890Smrg FreeLocalBuf(buf); 1401ab64890Smrg 1411ab64890Smrg return ret; 1421ab64890Smrg} 1431ab64890Smrg 1441ab64890Smrgint 1451ab64890Smrg_XmbDefaultTextExtents(XOC oc, _Xconst char *text, int length, 1461ab64890Smrg XRectangle *overall_ink, XRectangle *overall_logical) 1471ab64890Smrg{ 1481ab64890Smrg int direction, logical_ascent, logical_descent; 1491ab64890Smrg XCharStruct overall; 1501ab64890Smrg 1511ab64890Smrg XTextExtents(*oc->core.font_info.font_struct_list, text, length, &direction, 1521ab64890Smrg &logical_ascent, &logical_descent, &overall); 1531ab64890Smrg 1541ab64890Smrg if (overall_ink) { 1551ab64890Smrg overall_ink->x = overall.lbearing; 1561ab64890Smrg overall_ink->y = -(overall.ascent); 1571ab64890Smrg overall_ink->width = overall.rbearing - overall.lbearing; 1581ab64890Smrg overall_ink->height = overall.ascent + overall.descent; 1591ab64890Smrg } 1601ab64890Smrg 1611ab64890Smrg if (overall_logical) { 1621ab64890Smrg overall_logical->x = 0; 1631ab64890Smrg overall_logical->y = -(logical_ascent); 1641ab64890Smrg overall_logical->width = overall.width; 1651ab64890Smrg overall_logical->height = logical_ascent + logical_descent; 1661ab64890Smrg } 1671ab64890Smrg 1681ab64890Smrg return overall.width; 1691ab64890Smrg} 1701ab64890Smrg 1711ab64890Smrgint 1721ab64890Smrg_XwcDefaultTextExtents(XOC oc, _Xconst wchar_t *text, int length, 1731ab64890Smrg XRectangle *overall_ink, XRectangle *overall_logical) 1741ab64890Smrg{ 1751ab64890Smrg DefineLocalBuf; 1761ab64890Smrg char *buf = AllocLocalBuf(length); 1771ab64890Smrg int ret; 1781ab64890Smrg 1791ab64890Smrg if (buf == NULL) 1801ab64890Smrg return 0; 1811ab64890Smrg 1821ab64890Smrg if (wcs_to_mbs(oc, buf, text, length) == False) { 1831ab64890Smrg ret = 0; 1841ab64890Smrg goto err; 1851ab64890Smrg } 1861ab64890Smrg 1871ab64890Smrg ret = _XmbDefaultTextExtents(oc, buf, length, overall_ink, overall_logical); 1881ab64890Smrg 1891ab64890Smrgerr: 1901ab64890Smrg FreeLocalBuf(buf); 1911ab64890Smrg 1921ab64890Smrg return ret; 1931ab64890Smrg} 1941ab64890Smrg 1951ab64890Smrgint 1961ab64890Smrg_Xutf8DefaultTextExtents(XOC oc, _Xconst char *text, int length, 1971ab64890Smrg XRectangle *overall_ink, XRectangle *overall_logical) 1981ab64890Smrg{ 1991ab64890Smrg DefineLocalBuf; 2001ab64890Smrg char *buf = AllocLocalBuf(length); 2011ab64890Smrg int ret; 2021ab64890Smrg 2031ab64890Smrg if (buf == NULL) 2041ab64890Smrg return 0; 2051ab64890Smrg 2061ab64890Smrg if (utf8_to_mbs(oc, buf, text, length) == False) { 2071ab64890Smrg ret = 0; 2081ab64890Smrg goto err; 2091ab64890Smrg } 2101ab64890Smrg 2111ab64890Smrg ret = _XmbDefaultTextExtents(oc, buf, length, overall_ink, overall_logical); 2121ab64890Smrg 2131ab64890Smrgerr: 2141ab64890Smrg FreeLocalBuf(buf); 2151ab64890Smrg 2161ab64890Smrg return ret; 2171ab64890Smrg} 2181ab64890Smrg 2191ab64890SmrgStatus 2201ab64890Smrg_XmbDefaultTextPerCharExtents(XOC oc, _Xconst char *text, int length, 2211ab64890Smrg XRectangle *ink_buf, XRectangle *logical_buf, 2221ab64890Smrg int buf_size, int *num_chars, 2231ab64890Smrg XRectangle *overall_ink, 2241ab64890Smrg XRectangle *overall_logical) 2251ab64890Smrg{ 2261ab64890Smrg XFontStruct *font = *oc->core.font_info.font_struct_list; 2271ab64890Smrg XCharStruct *def, *cs, overall; 2281ab64890Smrg Bool first = True; 2291ab64890Smrg 2301ab64890Smrg if (buf_size < length) 2311ab64890Smrg return 0; 2321ab64890Smrg 2331ab64890Smrg bzero((char *) &overall, sizeof(XCharStruct)); 2341ab64890Smrg *num_chars = 0; 2351ab64890Smrg 2361ab64890Smrg CI_GET_DEFAULT_INFO_1D(font, def) 2371ab64890Smrg 2381ab64890Smrg while (length-- > 0) { 2391ab64890Smrg CI_GET_CHAR_INFO_1D(font, *text, def, cs) 2401ab64890Smrg text++; 2411ab64890Smrg if (cs == NULL) 2421ab64890Smrg continue; 2431ab64890Smrg 2441ab64890Smrg ink_buf->x = overall.width + cs->lbearing; 2451ab64890Smrg ink_buf->y = -(cs->ascent); 2461ab64890Smrg ink_buf->width = cs->rbearing - cs->lbearing; 2471ab64890Smrg ink_buf->height = cs->ascent + cs->descent; 2481ab64890Smrg ink_buf++; 2491ab64890Smrg 2501ab64890Smrg logical_buf->x = overall.width; 2511ab64890Smrg logical_buf->y = -(font->ascent); 2521ab64890Smrg logical_buf->width = cs->width; 2531ab64890Smrg logical_buf->height = font->ascent + font->descent; 2541ab64890Smrg logical_buf++; 2551ab64890Smrg 2561ab64890Smrg if (first) { 2571ab64890Smrg overall = *cs; 2581ab64890Smrg first = False; 2591ab64890Smrg } else { 2601ab64890Smrg overall.ascent = max(overall.ascent, cs->ascent); 2611ab64890Smrg overall.descent = max(overall.descent, cs->descent); 2621ab64890Smrg overall.lbearing = min(overall.lbearing, overall.width + 2631ab64890Smrg cs->lbearing); 2641ab64890Smrg overall.rbearing = max(overall.rbearing, overall.width + 2651ab64890Smrg cs->rbearing); 2661ab64890Smrg overall.width += cs->width; 2671ab64890Smrg } 2681ab64890Smrg 2691ab64890Smrg (*num_chars)++; 2701ab64890Smrg } 2711ab64890Smrg 2721ab64890Smrg if (overall_ink) { 2731ab64890Smrg overall_ink->x = overall.lbearing; 2741ab64890Smrg overall_ink->y = -(overall.ascent); 2751ab64890Smrg overall_ink->width = overall.rbearing - overall.lbearing; 2761ab64890Smrg overall_ink->height = overall.ascent + overall.descent; 2771ab64890Smrg } 2781ab64890Smrg 2791ab64890Smrg if (overall_logical) { 2801ab64890Smrg overall_logical->x = 0; 2811ab64890Smrg overall_logical->y = -(font->ascent); 2821ab64890Smrg overall_logical->width = overall.width; 2831ab64890Smrg overall_logical->height = font->ascent + font->descent; 2841ab64890Smrg } 2851ab64890Smrg 2861ab64890Smrg return 1; 2871ab64890Smrg} 2881ab64890Smrg 2891ab64890SmrgStatus 2901ab64890Smrg_XwcDefaultTextPerCharExtents(XOC oc, _Xconst wchar_t *text, int length, 2911ab64890Smrg XRectangle *ink_buf, XRectangle *logical_buf, 2921ab64890Smrg int buf_size, int *num_chars, 2931ab64890Smrg XRectangle *overall_ink, 2941ab64890Smrg XRectangle *overall_logical) 2951ab64890Smrg{ 2961ab64890Smrg DefineLocalBuf; 2971ab64890Smrg char *buf = AllocLocalBuf(length); 2981ab64890Smrg Status ret; 2991ab64890Smrg 3001ab64890Smrg if (buf == NULL) 3011ab64890Smrg return 0; 3021ab64890Smrg 3031ab64890Smrg if (wcs_to_mbs(oc, buf, text, length) == False) { 3041ab64890Smrg ret = 0; 3051ab64890Smrg goto err; 3061ab64890Smrg } 3071ab64890Smrg 3081ab64890Smrg ret = _XmbDefaultTextPerCharExtents(oc, buf, length, ink_buf, logical_buf, 3091ab64890Smrg buf_size, num_chars, overall_ink, 3101ab64890Smrg overall_logical); 3111ab64890Smrg 3121ab64890Smrgerr: 3131ab64890Smrg FreeLocalBuf(buf); 3141ab64890Smrg 3151ab64890Smrg return ret; 3161ab64890Smrg} 3171ab64890Smrg 3181ab64890SmrgStatus 3191ab64890Smrg_Xutf8DefaultTextPerCharExtents(XOC oc, _Xconst char *text, int length, 3201ab64890Smrg XRectangle *ink_buf, XRectangle *logical_buf, 3211ab64890Smrg int buf_size, int *num_chars, 3221ab64890Smrg XRectangle *overall_ink, 3231ab64890Smrg XRectangle *overall_logical) 3241ab64890Smrg{ 3251ab64890Smrg DefineLocalBuf; 3261ab64890Smrg char *buf = AllocLocalBuf(length); 3271ab64890Smrg Status ret; 3281ab64890Smrg 3291ab64890Smrg if (buf == NULL) 3301ab64890Smrg return 0; 3311ab64890Smrg 3321ab64890Smrg if (utf8_to_mbs(oc, buf, text, length) == False) { 3331ab64890Smrg ret = 0; 3341ab64890Smrg goto err; 3351ab64890Smrg } 3361ab64890Smrg 3371ab64890Smrg ret = _XmbDefaultTextPerCharExtents(oc, buf, length, ink_buf, logical_buf, 3381ab64890Smrg buf_size, num_chars, overall_ink, 3391ab64890Smrg overall_logical); 3401ab64890Smrg 3411ab64890Smrgerr: 3421ab64890Smrg FreeLocalBuf(buf); 3431ab64890Smrg 3441ab64890Smrg return ret; 3451ab64890Smrg} 3461ab64890Smrg 3471ab64890Smrgint 3481ab64890Smrg_XmbDefaultDrawString(Display *dpy, Drawable d, XOC oc, GC gc, int x, int y, 3491ab64890Smrg _Xconst char *text, int length) 3501ab64890Smrg{ 3511ab64890Smrg XFontStruct *font = *oc->core.font_info.font_struct_list; 3521ab64890Smrg 3531ab64890Smrg XSetFont(dpy, gc, font->fid); 3541ab64890Smrg XDrawString(dpy, d, gc, x, y, text, length); 3551ab64890Smrg 3561ab64890Smrg return XTextWidth(font, text, length); 3571ab64890Smrg} 3581ab64890Smrg 3591ab64890Smrgint 3601ab64890Smrg_XwcDefaultDrawString(Display *dpy, Drawable d, XOC oc, GC gc, int x, int y, 3611ab64890Smrg _Xconst wchar_t *text, int length) 3621ab64890Smrg{ 3631ab64890Smrg DefineLocalBuf; 3641ab64890Smrg char *buf = AllocLocalBuf(length); 3651ab64890Smrg int ret; 3661ab64890Smrg 3671ab64890Smrg if (buf == NULL) 3681ab64890Smrg return 0; 3691ab64890Smrg 3701ab64890Smrg if (wcs_to_mbs(oc, buf, text, length) == False) { 3711ab64890Smrg ret = 0; 3721ab64890Smrg goto err; 3731ab64890Smrg } 3741ab64890Smrg 3751ab64890Smrg ret = _XmbDefaultDrawString(dpy, d, oc, gc, x, y, buf, length); 3761ab64890Smrg 3771ab64890Smrgerr: 3781ab64890Smrg FreeLocalBuf(buf); 3791ab64890Smrg 3801ab64890Smrg return ret; 3811ab64890Smrg} 3821ab64890Smrg 3831ab64890Smrgint 3841ab64890Smrg_Xutf8DefaultDrawString(Display *dpy, Drawable d, XOC oc, GC gc, int x, int y, 3851ab64890Smrg _Xconst char *text, int length) 3861ab64890Smrg{ 3871ab64890Smrg DefineLocalBuf; 3881ab64890Smrg char *buf = AllocLocalBuf(length); 3891ab64890Smrg int ret; 3901ab64890Smrg 3911ab64890Smrg if (buf == NULL) 3921ab64890Smrg return 0; 3931ab64890Smrg 3941ab64890Smrg if (utf8_to_mbs(oc, buf, text, length) == False) { 3951ab64890Smrg ret = 0; 3961ab64890Smrg goto err; 3971ab64890Smrg } 3981ab64890Smrg 3991ab64890Smrg ret = _XmbDefaultDrawString(dpy, d, oc, gc, x, y, buf, length); 4001ab64890Smrg 4011ab64890Smrgerr: 4021ab64890Smrg FreeLocalBuf(buf); 4031ab64890Smrg 4041ab64890Smrg return ret; 4051ab64890Smrg} 4061ab64890Smrg 4071ab64890Smrgvoid 4081ab64890Smrg_XmbDefaultDrawImageString(Display *dpy, Drawable d, XOC oc, GC gc, int x, 4091ab64890Smrg int y, _Xconst char *text, int length) 4101ab64890Smrg{ 4111ab64890Smrg XSetFont(dpy, gc, (*oc->core.font_info.font_struct_list)->fid); 4121ab64890Smrg XDrawImageString(dpy, d, gc, x, y, text, length); 4131ab64890Smrg} 4141ab64890Smrg 4151ab64890Smrgvoid 4161ab64890Smrg_XwcDefaultDrawImageString(Display *dpy, Drawable d, XOC oc, GC gc, int x, 4171ab64890Smrg int y, _Xconst wchar_t *text, int length) 4181ab64890Smrg{ 4191ab64890Smrg DefineLocalBuf; 4201ab64890Smrg char *buf = AllocLocalBuf(length); 4211ab64890Smrg 4221ab64890Smrg if (buf == NULL) 4231ab64890Smrg return; 4241ab64890Smrg 4251ab64890Smrg if (wcs_to_mbs(oc, buf, text, length) == False) 4261ab64890Smrg goto err; 4271ab64890Smrg 4281ab64890Smrg _XmbDefaultDrawImageString(dpy, d, oc, gc, x, y, buf, length); 4291ab64890Smrg 4301ab64890Smrgerr: 4311ab64890Smrg FreeLocalBuf(buf); 4321ab64890Smrg} 4331ab64890Smrg 4341ab64890Smrgvoid 4351ab64890Smrg_Xutf8DefaultDrawImageString(Display *dpy, Drawable d, XOC oc, GC gc, int x, 4361ab64890Smrg int y, _Xconst char *text, int length) 4371ab64890Smrg{ 4381ab64890Smrg DefineLocalBuf; 4391ab64890Smrg char *buf = AllocLocalBuf(length); 4401ab64890Smrg 4411ab64890Smrg if (buf == NULL) 4421ab64890Smrg return; 4431ab64890Smrg 4441ab64890Smrg if (utf8_to_mbs(oc, buf, text, length) == False) 4451ab64890Smrg goto err; 4461ab64890Smrg 4471ab64890Smrg _XmbDefaultDrawImageString(dpy, d, oc, gc, x, y, buf, length); 4481ab64890Smrg 4491ab64890Smrgerr: 4501ab64890Smrg FreeLocalBuf(buf); 4511ab64890Smrg} 452