sync code with last improvements from OpenBSD
This commit is contained in:
commit
88965415ff
26235 changed files with 29195616 additions and 0 deletions
202
lib/libX11/modules/om/generic/omTextPer.c
Normal file
202
lib/libX11/modules/om/generic/omTextPer.c
Normal file
|
@ -0,0 +1,202 @@
|
|||
/*
|
||||
* Copyright 1992, 1993 by TOSHIBA Corp.
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this software and its
|
||||
* documentation for any purpose and without fee is hereby granted, provided
|
||||
* that the above copyright notice appear in all copies and that both that
|
||||
* copyright notice and this permission notice appear in supporting
|
||||
* documentation, and that the name of TOSHIBA not be used in advertising
|
||||
* or publicity pertaining to distribution of the software without specific,
|
||||
* written prior permission. TOSHIBA make no representations about the
|
||||
* suitability of this software for any purpose. It is provided "as is"
|
||||
* without express or implied warranty.
|
||||
*
|
||||
* TOSHIBA DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
|
||||
* ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
|
||||
* TOSHIBA BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
|
||||
* ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
||||
* WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
|
||||
* ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
||||
* SOFTWARE.
|
||||
*
|
||||
* Author: Katsuhisa Yano TOSHIBA Corp.
|
||||
* mopi@osa.ilab.toshiba.co.jp
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include <config.h>
|
||||
#endif
|
||||
#include "Xlibint.h"
|
||||
#include "XomGeneric.h"
|
||||
#include <stdio.h>
|
||||
|
||||
static Status
|
||||
_XomGenericTextPerCharExtents(
|
||||
XOC oc,
|
||||
XOMTextType type,
|
||||
XPointer text,
|
||||
int length,
|
||||
XRectangle *ink_buf,
|
||||
XRectangle *logical_buf,
|
||||
int buf_size,
|
||||
int *num_chars,
|
||||
XRectangle *overall_ink,
|
||||
XRectangle *overall_logical)
|
||||
{
|
||||
XlcConv conv;
|
||||
XFontStruct *font;
|
||||
Bool is_xchar2b;
|
||||
XPointer args[2];
|
||||
XChar2b xchar2b_buf[BUFSIZ], *xchar2b_ptr;
|
||||
char *xchar_ptr = NULL;
|
||||
XCharStruct *def, *cs, overall;
|
||||
int buf_len, left, require_num;
|
||||
int logical_ascent, logical_descent;
|
||||
Bool first = True;
|
||||
|
||||
conv = _XomInitConverter(oc, type);
|
||||
if (conv == NULL)
|
||||
return 0;
|
||||
|
||||
bzero((char *) &overall, sizeof(XCharStruct));
|
||||
logical_ascent = logical_descent = require_num = *num_chars = 0;
|
||||
|
||||
args[0] = (XPointer) &font;
|
||||
args[1] = (XPointer) &is_xchar2b;
|
||||
|
||||
while (length > 0) {
|
||||
xchar2b_ptr = xchar2b_buf;
|
||||
left = buf_len = BUFSIZ;
|
||||
|
||||
if (_XomConvert(oc, conv, (XPointer *) &text, &length,
|
||||
(XPointer *) &xchar2b_ptr, &left, args, 2) < 0)
|
||||
break;
|
||||
buf_len -= left;
|
||||
|
||||
if (require_num) {
|
||||
require_num += buf_len;
|
||||
continue;
|
||||
}
|
||||
if (buf_size < buf_len) {
|
||||
require_num = *num_chars + buf_len;
|
||||
continue;
|
||||
}
|
||||
buf_size -= buf_len;
|
||||
|
||||
if (first) {
|
||||
logical_ascent = font->ascent;
|
||||
logical_descent = font->descent;
|
||||
} else {
|
||||
logical_ascent = max(logical_ascent, font->ascent);
|
||||
logical_descent = max(logical_descent, font->descent);
|
||||
}
|
||||
|
||||
if (is_xchar2b) {
|
||||
CI_GET_DEFAULT_INFO_2D(font, def)
|
||||
xchar2b_ptr = xchar2b_buf;
|
||||
} else {
|
||||
CI_GET_DEFAULT_INFO_1D(font, def)
|
||||
xchar_ptr = (char *) xchar2b_buf;
|
||||
}
|
||||
|
||||
while (buf_len-- > 0) {
|
||||
if (is_xchar2b) {
|
||||
CI_GET_CHAR_INFO_2D(font, xchar2b_ptr->byte1,
|
||||
xchar2b_ptr->byte2, def, cs)
|
||||
xchar2b_ptr++;
|
||||
} else {
|
||||
CI_GET_CHAR_INFO_1D(font, *xchar_ptr, def, cs)
|
||||
xchar_ptr++;
|
||||
}
|
||||
if (cs == NULL)
|
||||
continue;
|
||||
|
||||
ink_buf->x = overall.width + cs->lbearing;
|
||||
ink_buf->y = -(cs->ascent);
|
||||
ink_buf->width = cs->rbearing - cs->lbearing;
|
||||
ink_buf->height = cs->ascent + cs->descent;
|
||||
ink_buf++;
|
||||
|
||||
logical_buf->x = overall.width;
|
||||
logical_buf->y = -(font->ascent);
|
||||
logical_buf->width = cs->width;
|
||||
logical_buf->height = font->ascent + font->descent;
|
||||
logical_buf++;
|
||||
|
||||
if (first) {
|
||||
overall = *cs;
|
||||
first = False;
|
||||
} else {
|
||||
overall.ascent = max(overall.ascent, cs->ascent);
|
||||
overall.descent = max(overall.descent, cs->descent);
|
||||
overall.lbearing = min(overall.lbearing,
|
||||
overall.width + cs->lbearing);
|
||||
overall.rbearing = max(overall.rbearing,
|
||||
overall.width + cs->rbearing);
|
||||
overall.width += cs->width;
|
||||
}
|
||||
|
||||
(*num_chars)++;
|
||||
}
|
||||
}
|
||||
|
||||
if (require_num) {
|
||||
*num_chars = require_num;
|
||||
return 0;
|
||||
} else {
|
||||
if (overall_ink) {
|
||||
overall_ink->x = overall.lbearing;
|
||||
overall_ink->y = -(overall.ascent);
|
||||
overall_ink->width = overall.rbearing - overall.lbearing;
|
||||
overall_ink->height = overall.ascent + overall.descent;
|
||||
}
|
||||
|
||||
if (overall_logical) {
|
||||
overall_logical->x = 0;
|
||||
overall_logical->y = -(logical_ascent);
|
||||
overall_logical->width = overall.width;
|
||||
overall_logical->height = logical_ascent + logical_descent;
|
||||
}
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
Status
|
||||
_XmbGenericTextPerCharExtents(XOC oc, _Xconst char *text, int length,
|
||||
XRectangle *ink_buf, XRectangle *logical_buf,
|
||||
int buf_size, int *num_chars,
|
||||
XRectangle *overall_ink,
|
||||
XRectangle *overall_logical)
|
||||
{
|
||||
return _XomGenericTextPerCharExtents(oc, XOMMultiByte, (XPointer) text,
|
||||
length, ink_buf, logical_buf, buf_size,
|
||||
num_chars, overall_ink,
|
||||
overall_logical);
|
||||
}
|
||||
|
||||
Status
|
||||
_XwcGenericTextPerCharExtents(XOC oc, _Xconst wchar_t *text, int length,
|
||||
XRectangle *ink_buf, XRectangle *logical_buf,
|
||||
int buf_size, int *num_chars,
|
||||
XRectangle *overall_ink,
|
||||
XRectangle *overall_logical)
|
||||
{
|
||||
return _XomGenericTextPerCharExtents(oc, XOMWideChar, (XPointer) text,
|
||||
length, ink_buf, logical_buf, buf_size,
|
||||
num_chars, overall_ink,
|
||||
overall_logical);
|
||||
}
|
||||
|
||||
Status
|
||||
_Xutf8GenericTextPerCharExtents(XOC oc, _Xconst char *text, int length,
|
||||
XRectangle *ink_buf, XRectangle *logical_buf,
|
||||
int buf_size, int *num_chars,
|
||||
XRectangle *overall_ink,
|
||||
XRectangle *overall_logical)
|
||||
{
|
||||
return _XomGenericTextPerCharExtents(oc, XOMUtf8String, (XPointer) text,
|
||||
length, ink_buf, logical_buf, buf_size,
|
||||
num_chars, overall_ink,
|
||||
overall_logical);
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue