Blame src/TextExt.c

Packit Service dc579d
/*
Packit Service dc579d
Packit Service dc579d
Copyright 1989, 1998  The Open Group
Packit Service dc579d
Packit Service dc579d
Permission to use, copy, modify, distribute, and sell this software and its
Packit Service dc579d
documentation for any purpose is hereby granted without fee, provided that
Packit Service dc579d
the above copyright notice appear in all copies and that both that
Packit Service dc579d
copyright notice and this permission notice appear in supporting
Packit Service dc579d
documentation.
Packit Service dc579d
Packit Service dc579d
The above copyright notice and this permission notice shall be included
Packit Service dc579d
in all copies or substantial portions of the Software.
Packit Service dc579d
Packit Service dc579d
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
Packit Service dc579d
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
Packit Service dc579d
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
Packit Service dc579d
IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
Packit Service dc579d
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
Packit Service dc579d
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
Packit Service dc579d
OTHER DEALINGS IN THE SOFTWARE.
Packit Service dc579d
Packit Service dc579d
Except as contained in this notice, the name of The Open Group shall
Packit Service dc579d
not be used in advertising or otherwise to promote the sale, use or
Packit Service dc579d
other dealings in this Software without prior written authorization
Packit Service dc579d
from The Open Group.
Packit Service dc579d
Packit Service dc579d
*/
Packit Service dc579d
/*
Packit Service dc579d
 * Copyright 1995 by FUJITSU LIMITED
Packit Service dc579d
 * This is source code modified by FUJITSU LIMITED under the Joint
Packit Service dc579d
 * Development Agreement for the CDE/Motif PST.
Packit Service dc579d
 */
Packit Service dc579d
Packit Service dc579d
Packit Service dc579d
#ifdef HAVE_CONFIG_H
Packit Service dc579d
#include <config.h>
Packit Service dc579d
#endif
Packit Service dc579d
#include "Xlibint.h"
Packit Service dc579d
Packit Service dc579d
#define min_byte2 min_char_or_byte2
Packit Service dc579d
#define max_byte2 max_char_or_byte2
Packit Service dc579d
Packit Service dc579d
Packit Service dc579d
/*
Packit Service dc579d
 * CI_GET_ROWZERO_CHAR_INFO_2D - do the same thing as CI_GET_CHAR_INFO_1D,
Packit Service dc579d
 * except that the font has more than one row.  This is special case of more
Packit Service dc579d
 * general version used in XTextExt16.c since row == 0.  This is used when
Packit Service dc579d
 * max_byte2 is not zero.  A further optimization would do the check for
Packit Service dc579d
 * min_byte1 being zero ahead of time.
Packit Service dc579d
 */
Packit Service dc579d
Packit Service dc579d
#define CI_GET_ROWZERO_CHAR_INFO_2D(fs,col,def,cs) \
Packit Service dc579d
{ \
Packit Service dc579d
    cs = def; \
Packit Service dc579d
    if (fs->min_byte1 == 0 && \
Packit Service dc579d
	col >= fs->min_byte2 && col <= fs->max_byte2) { \
Packit Service dc579d
	if (fs->per_char == NULL) { \
Packit Service dc579d
	    cs = &fs->min_bounds; \
Packit Service dc579d
	} else { \
Packit Service dc579d
	    cs = &fs->per_char[(col - fs->min_byte2)]; \
Packit Service dc579d
	    if (CI_NONEXISTCHAR(cs)) cs = def; \
Packit Service dc579d
	} \
Packit Service dc579d
    } \
Packit Service dc579d
}
Packit Service dc579d
Packit Service dc579d
Packit Service dc579d
/*
Packit Service dc579d
 * XTextExtents - compute the extents of string given as a sequences of eight
Packit Service dc579d
 * bit bytes.  Since we know that the input characters will always be from the
Packit Service dc579d
 * first row of the font (i.e. byte1 == 0), we can do some optimizations beyond
Packit Service dc579d
 * what is done in XTextExtents16.
Packit Service dc579d
 */
Packit Service dc579d
int
Packit Service dc579d
XTextExtents (
Packit Service dc579d
    XFontStruct *fs,
Packit Service dc579d
    _Xconst char *string,
Packit Service dc579d
    int nchars,
Packit Service dc579d
    int *dir,           /* RETURN font information */
Packit Service dc579d
    int *font_ascent,   /* RETURN font information */
Packit Service dc579d
    int *font_descent,  /* RETURN font information */
Packit Service dc579d
    register XCharStruct *overall)	/* RETURN character information */
Packit Service dc579d
{
Packit Service dc579d
    int i;				/* iterator */
Packit Service dc579d
    Bool singlerow = (fs->max_byte1 == 0);  /* optimization */
Packit Service dc579d
    int nfound = 0;			/* number of characters found */
Packit Service dc579d
    XCharStruct *def;			/* info about default char */
Packit Service dc579d
    unsigned char *us;  		/* be 8bit clean */
Packit Service dc579d
Packit Service dc579d
    if (singlerow) {			/* optimization */
Packit Service dc579d
	CI_GET_DEFAULT_INFO_1D (fs, def);
Packit Service dc579d
    } else {
Packit Service dc579d
	CI_GET_DEFAULT_INFO_2D (fs, def);
Packit Service dc579d
    }
Packit Service dc579d
Packit Service dc579d
    *dir = fs->direction;
Packit Service dc579d
    *font_ascent = fs->ascent;
Packit Service dc579d
    *font_descent = fs->descent;
Packit Service dc579d
Packit Service dc579d
    /*
Packit Service dc579d
     * Iterate over the input string getting the appropriate * char struct.
Packit Service dc579d
     * The default (which may be null if there is no def_char) will be returned
Packit Service dc579d
     * if the character doesn't exist.  On the first time * through the loop,
Packit Service dc579d
     * assign the values to overall; otherwise, compute * the new values.
Packit Service dc579d
     */
Packit Service dc579d
Packit Service dc579d
    for (i = 0, us = (unsigned char *) string; i < nchars; i++, us++) {
Packit Service dc579d
	register unsigned uc = (unsigned) *us;	/* since about to do macro */
Packit Service dc579d
	register XCharStruct *cs;
Packit Service dc579d
Packit Service dc579d
	if (singlerow) {		/* optimization */
Packit Service dc579d
	    CI_GET_CHAR_INFO_1D (fs, uc, def, cs);
Packit Service dc579d
	} else {
Packit Service dc579d
	    CI_GET_ROWZERO_CHAR_INFO_2D (fs, uc, def, cs);
Packit Service dc579d
	}
Packit Service dc579d
Packit Service dc579d
	if (cs) {
Packit Service dc579d
	    if (nfound++ == 0) {
Packit Service dc579d
		*overall = *cs;
Packit Service dc579d
	    } else {
Packit Service dc579d
		overall->ascent = max (overall->ascent, cs->ascent);
Packit Service dc579d
		overall->descent = max (overall->descent, cs->descent);
Packit Service dc579d
		overall->lbearing = min (overall->lbearing,
Packit Service dc579d
					 overall->width + cs->lbearing);
Packit Service dc579d
		overall->rbearing = max (overall->rbearing,
Packit Service dc579d
					 overall->width + cs->rbearing);
Packit Service dc579d
		overall->width += cs->width;
Packit Service dc579d
	    }
Packit Service dc579d
	}
Packit Service dc579d
    }
Packit Service dc579d
Packit Service dc579d
    /*
Packit Service dc579d
     * if there were no characters, then set everything to 0
Packit Service dc579d
     */
Packit Service dc579d
    if (nfound == 0) {
Packit Service dc579d
	overall->width = overall->ascent = overall->descent =
Packit Service dc579d
	  overall->lbearing = overall->rbearing = 0;
Packit Service dc579d
    }
Packit Service dc579d
Packit Service dc579d
    return 0;
Packit Service dc579d
}
Packit Service dc579d
Packit Service dc579d
Packit Service dc579d
/*
Packit Service dc579d
 * XTextWidth - compute the width of a string of eightbit bytes.  This is a
Packit Service dc579d
 * subset of XTextExtents.
Packit Service dc579d
 */
Packit Service dc579d
int
Packit Service dc579d
XTextWidth (
Packit Service dc579d
    XFontStruct *fs,
Packit Service dc579d
    _Xconst char *string,
Packit Service dc579d
    int count)
Packit Service dc579d
{
Packit Service dc579d
    int i;				/* iterator */
Packit Service dc579d
    Bool singlerow = (fs->max_byte1 == 0);  /* optimization */
Packit Service dc579d
    XCharStruct *def;			/* info about default char */
Packit Service dc579d
    unsigned char *us;  		/* be 8bit clean */
Packit Service dc579d
    int width = 0;			/* RETURN value */
Packit Service dc579d
Packit Service dc579d
    if (singlerow) {			/* optimization */
Packit Service dc579d
	CI_GET_DEFAULT_INFO_1D (fs, def);
Packit Service dc579d
    } else {
Packit Service dc579d
	CI_GET_DEFAULT_INFO_2D (fs, def);
Packit Service dc579d
    }
Packit Service dc579d
Packit Service dc579d
    if (def && fs->min_bounds.width == fs->max_bounds.width)
Packit Service dc579d
	return (fs->min_bounds.width * count);
Packit Service dc579d
Packit Service dc579d
    /*
Packit Service dc579d
     * Iterate over all character in the input string; only consider characters
Packit Service dc579d
     * that exist.
Packit Service dc579d
     */
Packit Service dc579d
    for (i = 0, us = (unsigned char *) string; i < count; i++, us++) {
Packit Service dc579d
	register unsigned uc = (unsigned) *us;	/* since about to do macro */
Packit Service dc579d
	register XCharStruct *cs;
Packit Service dc579d
Packit Service dc579d
	if (singlerow) {		/* optimization */
Packit Service dc579d
	    CI_GET_CHAR_INFO_1D (fs, uc, def, cs);
Packit Service dc579d
	} else {
Packit Service dc579d
	    CI_GET_ROWZERO_CHAR_INFO_2D (fs, uc, def, cs);
Packit Service dc579d
	}
Packit Service dc579d
Packit Service dc579d
	if (cs) width += cs->width;
Packit Service dc579d
    }
Packit Service dc579d
Packit Service dc579d
    return width;
Packit Service dc579d
}
Packit Service dc579d
Packit Service dc579d
Packit Service dc579d
Packit Service dc579d
/*
Packit Service dc579d
 * _XTextHeight - compute the height of a string of eightbit bytes.
Packit Service dc579d
 */
Packit Service dc579d
int
Packit Service dc579d
_XTextHeight (
Packit Service dc579d
    XFontStruct *fs,
Packit Service dc579d
    _Xconst char *string,
Packit Service dc579d
    int count)
Packit Service dc579d
{
Packit Service dc579d
    int i;				/* iterator */
Packit Service dc579d
    Bool singlerow = (fs->max_byte1 == 0);  /* optimization */
Packit Service dc579d
    XCharStruct *def;			/* info about default char */
Packit Service dc579d
    unsigned char *us;  		/* be 8bit clean */
Packit Service dc579d
    int height = 0;			/* RETURN value */
Packit Service dc579d
Packit Service dc579d
    if (singlerow) {			/* optimization */
Packit Service dc579d
	CI_GET_DEFAULT_INFO_1D (fs, def);
Packit Service dc579d
    } else {
Packit Service dc579d
	CI_GET_DEFAULT_INFO_2D (fs, def);
Packit Service dc579d
    }
Packit Service dc579d
Packit Service dc579d
    if (def && (fs->min_bounds.ascent == fs->max_bounds.ascent)
Packit Service dc579d
	    && (fs->min_bounds.descent == fs->max_bounds.descent))
Packit Service dc579d
	return ((fs->min_bounds.ascent + fs->min_bounds.descent) * count);
Packit Service dc579d
Packit Service dc579d
    /*
Packit Service dc579d
     * Iterate over all character in the input string; only consider characters
Packit Service dc579d
     * that exist.
Packit Service dc579d
     */
Packit Service dc579d
    for (i = 0, us = (unsigned char *) string; i < count; i++, us++) {
Packit Service dc579d
	register unsigned uc = (unsigned) *us;	/* since about to do macro */
Packit Service dc579d
	register XCharStruct *cs;
Packit Service dc579d
Packit Service dc579d
	if (singlerow) {		/* optimization */
Packit Service dc579d
	    CI_GET_CHAR_INFO_1D (fs, uc, def, cs);
Packit Service dc579d
	} else {
Packit Service dc579d
	    CI_GET_ROWZERO_CHAR_INFO_2D (fs, uc, def, cs);
Packit Service dc579d
	}
Packit Service dc579d
Packit Service dc579d
	if (cs) height += (cs->ascent + cs->descent);
Packit Service dc579d
    }
Packit Service dc579d
Packit Service dc579d
    return height;
Packit Service dc579d
}
Packit Service dc579d