omTextPer.c revision 07fb9b8f
11ab64890Smrg/*
21ab64890Smrg * Copyright 1992, 1993 by TOSHIBA Corp.
31ab64890Smrg *
41ab64890Smrg * Permission to use, copy, modify, and distribute this software and its
51ab64890Smrg * documentation for any purpose and without fee is hereby granted, provided
61ab64890Smrg * that the above copyright notice appear in all copies and that both that
71ab64890Smrg * copyright notice and this permission notice appear in supporting
81ab64890Smrg * documentation, and that the name of TOSHIBA not be used in advertising
91ab64890Smrg * or publicity pertaining to distribution of the software without specific,
101ab64890Smrg * written prior permission. TOSHIBA make no representations about the
111ab64890Smrg * suitability of this software for any purpose.  It is provided "as is"
121ab64890Smrg * without express or implied warranty.
131ab64890Smrg *
141ab64890Smrg * TOSHIBA DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
151ab64890Smrg * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
161ab64890Smrg * TOSHIBA BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
171ab64890Smrg * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
181ab64890Smrg * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
191ab64890Smrg * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
201ab64890Smrg * SOFTWARE.
211ab64890Smrg *
221ab64890Smrg * Author: Katsuhisa Yano	TOSHIBA Corp.
231ab64890Smrg *			   	mopi@osa.ilab.toshiba.co.jp
241ab64890Smrg */
251ab64890Smrg
261ab64890Smrg#ifdef HAVE_CONFIG_H
271ab64890Smrg#include <config.h>
281ab64890Smrg#endif
291ab64890Smrg#include "Xlibint.h"
301ab64890Smrg#include "XomGeneric.h"
311ab64890Smrg#include <stdio.h>
321ab64890Smrg
331ab64890Smrgstatic Status
341ab64890Smrg_XomGenericTextPerCharExtents(
351ab64890Smrg    XOC oc,
361ab64890Smrg    XOMTextType type,
371ab64890Smrg    XPointer text,
381ab64890Smrg    int length,
391ab64890Smrg    XRectangle *ink_buf,
401ab64890Smrg    XRectangle *logical_buf,
411ab64890Smrg    int buf_size,
421ab64890Smrg    int *num_chars,
431ab64890Smrg    XRectangle *overall_ink,
441ab64890Smrg    XRectangle *overall_logical)
451ab64890Smrg{
461ab64890Smrg    XlcConv conv;
471ab64890Smrg    XFontStruct *font;
481ab64890Smrg    Bool is_xchar2b;
491ab64890Smrg    XPointer args[2];
501ab64890Smrg    XChar2b xchar2b_buf[BUFSIZ], *xchar2b_ptr;
511ab64890Smrg    char *xchar_ptr = NULL;
521ab64890Smrg    XCharStruct *def, *cs, overall;
531ab64890Smrg    int buf_len, left, require_num;
541ab64890Smrg    int logical_ascent, logical_descent;
551ab64890Smrg    Bool first = True;
561ab64890Smrg
571ab64890Smrg    conv = _XomInitConverter(oc, type);
581ab64890Smrg    if (conv == NULL)
591ab64890Smrg	return 0;
6061b2299dSmrg
611ab64890Smrg    bzero((char *) &overall, sizeof(XCharStruct));
621ab64890Smrg    logical_ascent = logical_descent = require_num = *num_chars = 0;
631ab64890Smrg
641ab64890Smrg    args[0] = (XPointer) &font;
651ab64890Smrg    args[1] = (XPointer) &is_xchar2b;
661ab64890Smrg
671ab64890Smrg    while (length > 0) {
681ab64890Smrg	xchar2b_ptr = xchar2b_buf;
691ab64890Smrg	left = buf_len = BUFSIZ;
701ab64890Smrg
711ab64890Smrg	if (_XomConvert(oc, conv, (XPointer *) &text, &length,
721ab64890Smrg			(XPointer *) &xchar2b_ptr, &left, args, 2) < 0)
731ab64890Smrg	    break;
741ab64890Smrg	buf_len -= left;
751ab64890Smrg
761ab64890Smrg	if (require_num) {
771ab64890Smrg	    require_num += buf_len;
781ab64890Smrg	    continue;
791ab64890Smrg	}
801ab64890Smrg	if (buf_size < buf_len) {
811ab64890Smrg	    require_num = *num_chars + buf_len;
821ab64890Smrg	    continue;
831ab64890Smrg	}
841ab64890Smrg	buf_size -= buf_len;
851ab64890Smrg
861ab64890Smrg	if (first) {
871ab64890Smrg	    logical_ascent = font->ascent;
881ab64890Smrg	    logical_descent = font->descent;
891ab64890Smrg	} else {
901ab64890Smrg	    logical_ascent = max(logical_ascent, font->ascent);
911ab64890Smrg	    logical_descent = max(logical_descent, font->descent);
921ab64890Smrg	}
931ab64890Smrg
941ab64890Smrg	if (is_xchar2b) {
9507fb9b8fSmrg	    CI_GET_DEFAULT_INFO_2D(font, def);
961ab64890Smrg	    xchar2b_ptr = xchar2b_buf;
971ab64890Smrg	} else {
9807fb9b8fSmrg	    CI_GET_DEFAULT_INFO_1D(font, def);
991ab64890Smrg	    xchar_ptr = (char *) xchar2b_buf;
1001ab64890Smrg	}
1011ab64890Smrg
1021ab64890Smrg	while (buf_len-- > 0) {
1031ab64890Smrg	    if (is_xchar2b) {
1041ab64890Smrg		CI_GET_CHAR_INFO_2D(font, xchar2b_ptr->byte1,
10507fb9b8fSmrg				    xchar2b_ptr->byte2, def, cs);
1061ab64890Smrg		xchar2b_ptr++;
1071ab64890Smrg	    } else {
10807fb9b8fSmrg		CI_GET_CHAR_INFO_1D(font, *xchar_ptr, def, cs);
1091ab64890Smrg		xchar_ptr++;
1101ab64890Smrg	    }
1111ab64890Smrg	    if (cs == NULL)
1121ab64890Smrg		continue;
1131ab64890Smrg
1141ab64890Smrg	    ink_buf->x = overall.width + cs->lbearing;
1151ab64890Smrg	    ink_buf->y = -(cs->ascent);
1161ab64890Smrg	    ink_buf->width = cs->rbearing - cs->lbearing;
1171ab64890Smrg	    ink_buf->height = cs->ascent + cs->descent;
1181ab64890Smrg	    ink_buf++;
1191ab64890Smrg
1201ab64890Smrg	    logical_buf->x = overall.width;
1211ab64890Smrg	    logical_buf->y = -(font->ascent);
1221ab64890Smrg	    logical_buf->width = cs->width;
1231ab64890Smrg	    logical_buf->height = font->ascent + font->descent;
1241ab64890Smrg	    logical_buf++;
1251ab64890Smrg
1261ab64890Smrg	    if (first) {
1271ab64890Smrg		overall = *cs;
1281ab64890Smrg		first = False;
1291ab64890Smrg	    } else {
1301ab64890Smrg		overall.ascent = max(overall.ascent, cs->ascent);
1311ab64890Smrg		overall.descent = max(overall.descent, cs->descent);
1321ab64890Smrg		overall.lbearing = min(overall.lbearing,
1331ab64890Smrg				       overall.width + cs->lbearing);
1341ab64890Smrg		overall.rbearing = max(overall.rbearing,
1351ab64890Smrg				       overall.width + cs->rbearing);
1361ab64890Smrg		overall.width += cs->width;
1371ab64890Smrg	    }
1381ab64890Smrg
1391ab64890Smrg	    (*num_chars)++;
1401ab64890Smrg	}
1411ab64890Smrg    }
1421ab64890Smrg
1431ab64890Smrg    if (require_num) {
1441ab64890Smrg	*num_chars = require_num;
1451ab64890Smrg	return 0;
1461ab64890Smrg    } else {
1471ab64890Smrg	if (overall_ink) {
1481ab64890Smrg	    overall_ink->x = overall.lbearing;
1491ab64890Smrg	    overall_ink->y = -(overall.ascent);
1501ab64890Smrg	    overall_ink->width = overall.rbearing - overall.lbearing;
1511ab64890Smrg	    overall_ink->height = overall.ascent + overall.descent;
1521ab64890Smrg	}
1531ab64890Smrg
1541ab64890Smrg	if (overall_logical) {
1551ab64890Smrg	    overall_logical->x = 0;
1561ab64890Smrg	    overall_logical->y = -(logical_ascent);
1571ab64890Smrg	    overall_logical->width = overall.width;
1581ab64890Smrg	    overall_logical->height = logical_ascent + logical_descent;
1591ab64890Smrg	}
1601ab64890Smrg    }
1611ab64890Smrg
1621ab64890Smrg    return 1;
1631ab64890Smrg}
1641ab64890Smrg
1651ab64890SmrgStatus
1661ab64890Smrg_XmbGenericTextPerCharExtents(XOC oc, _Xconst char *text, int length,
1671ab64890Smrg			      XRectangle *ink_buf, XRectangle *logical_buf,
1681ab64890Smrg			      int buf_size, int *num_chars,
1691ab64890Smrg			      XRectangle *overall_ink,
1701ab64890Smrg			      XRectangle *overall_logical)
1711ab64890Smrg{
1721ab64890Smrg    return _XomGenericTextPerCharExtents(oc, XOMMultiByte, (XPointer) text,
1731ab64890Smrg					 length, ink_buf, logical_buf, buf_size,
1741ab64890Smrg					 num_chars, overall_ink,
1751ab64890Smrg					 overall_logical);
1761ab64890Smrg}
1771ab64890Smrg
1781ab64890SmrgStatus
1791ab64890Smrg_XwcGenericTextPerCharExtents(XOC oc, _Xconst wchar_t *text, int length,
1801ab64890Smrg			      XRectangle *ink_buf, XRectangle *logical_buf,
1811ab64890Smrg			      int buf_size, int *num_chars,
1821ab64890Smrg			      XRectangle *overall_ink,
1831ab64890Smrg			      XRectangle *overall_logical)
1841ab64890Smrg{
1851ab64890Smrg    return _XomGenericTextPerCharExtents(oc, XOMWideChar, (XPointer) text,
1861ab64890Smrg					 length, ink_buf, logical_buf, buf_size,
1871ab64890Smrg					 num_chars, overall_ink,
1881ab64890Smrg					 overall_logical);
1891ab64890Smrg}
1901ab64890Smrg
1911ab64890SmrgStatus
1921ab64890Smrg_Xutf8GenericTextPerCharExtents(XOC oc, _Xconst char *text, int length,
1931ab64890Smrg				XRectangle *ink_buf, XRectangle *logical_buf,
1941ab64890Smrg				int buf_size, int *num_chars,
1951ab64890Smrg				XRectangle *overall_ink,
1961ab64890Smrg				XRectangle *overall_logical)
1971ab64890Smrg{
1981ab64890Smrg    return _XomGenericTextPerCharExtents(oc, XOMUtf8String, (XPointer) text,
1991ab64890Smrg					 length, ink_buf, logical_buf, buf_size,
2001ab64890Smrg					 num_chars, overall_ink,
2011ab64890Smrg					 overall_logical);
2021ab64890Smrg}
203