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