omTextPer.c revision 1ab64890
11ab64890Smrg/* $Xorg: omTextPer.c,v 1.3 2000/08/17 19:45:22 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/* $XFree86: xc/lib/X11/omTextPer.c,v 1.6 2003/04/13 19:22:22 dawes Exp $ */ 271ab64890Smrg 281ab64890Smrg#ifdef HAVE_CONFIG_H 291ab64890Smrg#include <config.h> 301ab64890Smrg#endif 311ab64890Smrg#include "Xlibint.h" 321ab64890Smrg#include "XomGeneric.h" 331ab64890Smrg#include <stdio.h> 341ab64890Smrg 351ab64890Smrgstatic Status 361ab64890Smrg_XomGenericTextPerCharExtents( 371ab64890Smrg XOC oc, 381ab64890Smrg XOMTextType type, 391ab64890Smrg XPointer text, 401ab64890Smrg int length, 411ab64890Smrg XRectangle *ink_buf, 421ab64890Smrg XRectangle *logical_buf, 431ab64890Smrg int buf_size, 441ab64890Smrg int *num_chars, 451ab64890Smrg XRectangle *overall_ink, 461ab64890Smrg XRectangle *overall_logical) 471ab64890Smrg{ 481ab64890Smrg XlcConv conv; 491ab64890Smrg XFontStruct *font; 501ab64890Smrg Bool is_xchar2b; 511ab64890Smrg XPointer args[2]; 521ab64890Smrg XChar2b xchar2b_buf[BUFSIZ], *xchar2b_ptr; 531ab64890Smrg char *xchar_ptr = NULL; 541ab64890Smrg XCharStruct *def, *cs, overall; 551ab64890Smrg int buf_len, left, require_num; 561ab64890Smrg int logical_ascent, logical_descent; 571ab64890Smrg Bool first = True; 581ab64890Smrg 591ab64890Smrg conv = _XomInitConverter(oc, type); 601ab64890Smrg if (conv == NULL) 611ab64890Smrg return 0; 621ab64890Smrg 631ab64890Smrg bzero((char *) &overall, sizeof(XCharStruct)); 641ab64890Smrg logical_ascent = logical_descent = require_num = *num_chars = 0; 651ab64890Smrg 661ab64890Smrg args[0] = (XPointer) &font; 671ab64890Smrg args[1] = (XPointer) &is_xchar2b; 681ab64890Smrg 691ab64890Smrg while (length > 0) { 701ab64890Smrg xchar2b_ptr = xchar2b_buf; 711ab64890Smrg left = buf_len = BUFSIZ; 721ab64890Smrg 731ab64890Smrg if (_XomConvert(oc, conv, (XPointer *) &text, &length, 741ab64890Smrg (XPointer *) &xchar2b_ptr, &left, args, 2) < 0) 751ab64890Smrg break; 761ab64890Smrg buf_len -= left; 771ab64890Smrg 781ab64890Smrg if (require_num) { 791ab64890Smrg require_num += buf_len; 801ab64890Smrg continue; 811ab64890Smrg } 821ab64890Smrg if (buf_size < buf_len) { 831ab64890Smrg require_num = *num_chars + buf_len; 841ab64890Smrg continue; 851ab64890Smrg } 861ab64890Smrg buf_size -= buf_len; 871ab64890Smrg 881ab64890Smrg if (first) { 891ab64890Smrg logical_ascent = font->ascent; 901ab64890Smrg logical_descent = font->descent; 911ab64890Smrg } else { 921ab64890Smrg logical_ascent = max(logical_ascent, font->ascent); 931ab64890Smrg logical_descent = max(logical_descent, font->descent); 941ab64890Smrg } 951ab64890Smrg 961ab64890Smrg if (is_xchar2b) { 971ab64890Smrg CI_GET_DEFAULT_INFO_2D(font, def) 981ab64890Smrg xchar2b_ptr = xchar2b_buf; 991ab64890Smrg } else { 1001ab64890Smrg CI_GET_DEFAULT_INFO_1D(font, def) 1011ab64890Smrg xchar_ptr = (char *) xchar2b_buf; 1021ab64890Smrg } 1031ab64890Smrg 1041ab64890Smrg while (buf_len-- > 0) { 1051ab64890Smrg if (is_xchar2b) { 1061ab64890Smrg CI_GET_CHAR_INFO_2D(font, xchar2b_ptr->byte1, 1071ab64890Smrg xchar2b_ptr->byte2, def, cs) 1081ab64890Smrg xchar2b_ptr++; 1091ab64890Smrg } else { 1101ab64890Smrg CI_GET_CHAR_INFO_1D(font, *xchar_ptr, def, cs) 1111ab64890Smrg xchar_ptr++; 1121ab64890Smrg } 1131ab64890Smrg if (cs == NULL) 1141ab64890Smrg continue; 1151ab64890Smrg 1161ab64890Smrg ink_buf->x = overall.width + cs->lbearing; 1171ab64890Smrg ink_buf->y = -(cs->ascent); 1181ab64890Smrg ink_buf->width = cs->rbearing - cs->lbearing; 1191ab64890Smrg ink_buf->height = cs->ascent + cs->descent; 1201ab64890Smrg ink_buf++; 1211ab64890Smrg 1221ab64890Smrg logical_buf->x = overall.width; 1231ab64890Smrg logical_buf->y = -(font->ascent); 1241ab64890Smrg logical_buf->width = cs->width; 1251ab64890Smrg logical_buf->height = font->ascent + font->descent; 1261ab64890Smrg logical_buf++; 1271ab64890Smrg 1281ab64890Smrg if (first) { 1291ab64890Smrg overall = *cs; 1301ab64890Smrg first = False; 1311ab64890Smrg } else { 1321ab64890Smrg overall.ascent = max(overall.ascent, cs->ascent); 1331ab64890Smrg overall.descent = max(overall.descent, cs->descent); 1341ab64890Smrg overall.lbearing = min(overall.lbearing, 1351ab64890Smrg overall.width + cs->lbearing); 1361ab64890Smrg overall.rbearing = max(overall.rbearing, 1371ab64890Smrg overall.width + cs->rbearing); 1381ab64890Smrg overall.width += cs->width; 1391ab64890Smrg } 1401ab64890Smrg 1411ab64890Smrg (*num_chars)++; 1421ab64890Smrg } 1431ab64890Smrg } 1441ab64890Smrg 1451ab64890Smrg if (require_num) { 1461ab64890Smrg *num_chars = require_num; 1471ab64890Smrg return 0; 1481ab64890Smrg } else { 1491ab64890Smrg if (overall_ink) { 1501ab64890Smrg overall_ink->x = overall.lbearing; 1511ab64890Smrg overall_ink->y = -(overall.ascent); 1521ab64890Smrg overall_ink->width = overall.rbearing - overall.lbearing; 1531ab64890Smrg overall_ink->height = overall.ascent + overall.descent; 1541ab64890Smrg } 1551ab64890Smrg 1561ab64890Smrg if (overall_logical) { 1571ab64890Smrg overall_logical->x = 0; 1581ab64890Smrg overall_logical->y = -(logical_ascent); 1591ab64890Smrg overall_logical->width = overall.width; 1601ab64890Smrg overall_logical->height = logical_ascent + logical_descent; 1611ab64890Smrg } 1621ab64890Smrg } 1631ab64890Smrg 1641ab64890Smrg return 1; 1651ab64890Smrg} 1661ab64890Smrg 1671ab64890SmrgStatus 1681ab64890Smrg_XmbGenericTextPerCharExtents(XOC oc, _Xconst char *text, int length, 1691ab64890Smrg XRectangle *ink_buf, XRectangle *logical_buf, 1701ab64890Smrg int buf_size, int *num_chars, 1711ab64890Smrg XRectangle *overall_ink, 1721ab64890Smrg XRectangle *overall_logical) 1731ab64890Smrg{ 1741ab64890Smrg return _XomGenericTextPerCharExtents(oc, XOMMultiByte, (XPointer) text, 1751ab64890Smrg length, ink_buf, logical_buf, buf_size, 1761ab64890Smrg num_chars, overall_ink, 1771ab64890Smrg overall_logical); 1781ab64890Smrg} 1791ab64890Smrg 1801ab64890SmrgStatus 1811ab64890Smrg_XwcGenericTextPerCharExtents(XOC oc, _Xconst wchar_t *text, int length, 1821ab64890Smrg XRectangle *ink_buf, XRectangle *logical_buf, 1831ab64890Smrg int buf_size, int *num_chars, 1841ab64890Smrg XRectangle *overall_ink, 1851ab64890Smrg XRectangle *overall_logical) 1861ab64890Smrg{ 1871ab64890Smrg return _XomGenericTextPerCharExtents(oc, XOMWideChar, (XPointer) text, 1881ab64890Smrg length, ink_buf, logical_buf, buf_size, 1891ab64890Smrg num_chars, overall_ink, 1901ab64890Smrg overall_logical); 1911ab64890Smrg} 1921ab64890Smrg 1931ab64890SmrgStatus 1941ab64890Smrg_Xutf8GenericTextPerCharExtents(XOC oc, _Xconst char *text, int length, 1951ab64890Smrg XRectangle *ink_buf, XRectangle *logical_buf, 1961ab64890Smrg int buf_size, int *num_chars, 1971ab64890Smrg XRectangle *overall_ink, 1981ab64890Smrg XRectangle *overall_logical) 1991ab64890Smrg{ 2001ab64890Smrg return _XomGenericTextPerCharExtents(oc, XOMUtf8String, (XPointer) text, 2011ab64890Smrg length, ink_buf, logical_buf, buf_size, 2021ab64890Smrg num_chars, overall_ink, 2031ab64890Smrg overall_logical); 2041ab64890Smrg} 205