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