sync code with last improvements from OpenBSD
This commit is contained in:
commit
88965415ff
26235 changed files with 29195616 additions and 0 deletions
229
app/bdftopcf/bitmaputil.c
Normal file
229
app/bdftopcf/bitmaputil.c
Normal file
|
@ -0,0 +1,229 @@
|
|||
/*
|
||||
|
||||
Copyright 1990, 1994, 1998 The Open Group
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this software and its
|
||||
documentation for any purpose is hereby granted without fee, provided that
|
||||
the above copyright notice appear in all copies and that both that
|
||||
copyright notice and this permission notice appear in supporting
|
||||
documentation.
|
||||
|
||||
The above copyright notice and this permission notice shall be included
|
||||
in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
Except as contained in this notice, the name of The Open Group shall
|
||||
not be used in advertising or otherwise to promote the sale, use or
|
||||
other dealings in this Software without prior written authorization
|
||||
from The Open Group.
|
||||
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#include "fntfilst.h"
|
||||
#include "bitmap.h"
|
||||
#include "bdfint.h"
|
||||
|
||||
#ifndef MAXSHORT
|
||||
#define MAXSHORT 32767
|
||||
#endif
|
||||
|
||||
#ifndef MINSHORT
|
||||
#define MINSHORT -32768
|
||||
#endif
|
||||
|
||||
static xCharInfo initMinMetrics = {
|
||||
MAXSHORT, MAXSHORT, MAXSHORT, MAXSHORT, MAXSHORT, 0xFFFF
|
||||
};
|
||||
|
||||
static xCharInfo initMaxMetrics = {
|
||||
MINSHORT, MINSHORT, MINSHORT, MINSHORT, MINSHORT, 0x0000
|
||||
};
|
||||
|
||||
#define MINMAX(field,ci) \
|
||||
if (minbounds->field > (ci)->field) \
|
||||
minbounds->field = (ci)->field; \
|
||||
if (maxbounds->field < (ci)->field) \
|
||||
maxbounds->field = (ci)->field;
|
||||
|
||||
#define COMPUTE_MINMAX(ci) \
|
||||
if ((ci)->ascent || (ci)->descent || \
|
||||
(ci)->leftSideBearing || (ci)->rightSideBearing || \
|
||||
(ci)->characterWidth) \
|
||||
{ \
|
||||
MINMAX(ascent, (ci)); \
|
||||
MINMAX(descent, (ci)); \
|
||||
MINMAX(leftSideBearing, (ci)); \
|
||||
MINMAX(rightSideBearing, (ci)); \
|
||||
MINMAX(characterWidth, (ci)); \
|
||||
}
|
||||
|
||||
void
|
||||
bitmapComputeFontBounds(FontPtr pFont)
|
||||
{
|
||||
BitmapFontPtr bitmapFont = (BitmapFontPtr) pFont->fontPrivate;
|
||||
int nchars;
|
||||
CharInfoPtr ci;
|
||||
int maxOverlap;
|
||||
int overlap;
|
||||
xCharInfo *minbounds, *maxbounds;
|
||||
int i;
|
||||
int numneg = 0, numpos = 0;
|
||||
|
||||
if (bitmapFont->bitmapExtra) {
|
||||
minbounds = &bitmapFont->bitmapExtra->info.minbounds;
|
||||
maxbounds = &bitmapFont->bitmapExtra->info.maxbounds;
|
||||
}
|
||||
else {
|
||||
minbounds = &pFont->info.minbounds;
|
||||
maxbounds = &pFont->info.maxbounds;
|
||||
}
|
||||
*minbounds = initMinMetrics;
|
||||
*maxbounds = initMaxMetrics;
|
||||
maxOverlap = MINSHORT;
|
||||
nchars = bitmapFont->num_chars;
|
||||
for (i = 0, ci = bitmapFont->metrics; i < nchars; i++, ci++) {
|
||||
COMPUTE_MINMAX(&ci->metrics);
|
||||
if (ci->metrics.characterWidth < 0)
|
||||
numneg++;
|
||||
else
|
||||
numpos++;
|
||||
minbounds->attributes &= ci->metrics.attributes;
|
||||
maxbounds->attributes |= ci->metrics.attributes;
|
||||
overlap = ci->metrics.rightSideBearing - ci->metrics.characterWidth;
|
||||
if (maxOverlap < overlap)
|
||||
maxOverlap = overlap;
|
||||
}
|
||||
if (bitmapFont->bitmapExtra) {
|
||||
if (numneg > numpos)
|
||||
bitmapFont->bitmapExtra->info.drawDirection = RightToLeft;
|
||||
else
|
||||
bitmapFont->bitmapExtra->info.drawDirection = LeftToRight;
|
||||
bitmapFont->bitmapExtra->info.maxOverlap = maxOverlap;
|
||||
minbounds = &pFont->info.minbounds;
|
||||
maxbounds = &pFont->info.maxbounds;
|
||||
*minbounds = initMinMetrics;
|
||||
*maxbounds = initMaxMetrics;
|
||||
i = 0;
|
||||
maxOverlap = MINSHORT;
|
||||
for (int r = pFont->info.firstRow; r <= pFont->info.lastRow; r++) {
|
||||
for (int c = pFont->info.firstCol; c <= pFont->info.lastCol; c++) {
|
||||
ci = ACCESSENCODING(bitmapFont->encoding, i);
|
||||
if (ci) {
|
||||
COMPUTE_MINMAX(&ci->metrics);
|
||||
if (ci->metrics.characterWidth < 0)
|
||||
numneg++;
|
||||
else
|
||||
numpos++;
|
||||
minbounds->attributes &= ci->metrics.attributes;
|
||||
maxbounds->attributes |= ci->metrics.attributes;
|
||||
overlap = ci->metrics.rightSideBearing -
|
||||
ci->metrics.characterWidth;
|
||||
if (maxOverlap < overlap)
|
||||
maxOverlap = overlap;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (numneg > numpos)
|
||||
pFont->info.drawDirection = RightToLeft;
|
||||
else
|
||||
pFont->info.drawDirection = LeftToRight;
|
||||
pFont->info.maxOverlap = maxOverlap;
|
||||
}
|
||||
|
||||
void
|
||||
bitmapComputeFontInkBounds(FontPtr pFont)
|
||||
{
|
||||
BitmapFontPtr bitmapFont = (BitmapFontPtr) pFont->fontPrivate;
|
||||
|
||||
if (!bitmapFont->ink_metrics) {
|
||||
if (bitmapFont->bitmapExtra) {
|
||||
bitmapFont->bitmapExtra->info.ink_minbounds =
|
||||
bitmapFont->bitmapExtra->info.minbounds;
|
||||
bitmapFont->bitmapExtra->info.ink_maxbounds =
|
||||
bitmapFont->bitmapExtra->info.maxbounds;
|
||||
}
|
||||
pFont->info.ink_minbounds = pFont->info.minbounds;
|
||||
pFont->info.ink_maxbounds = pFont->info.maxbounds;
|
||||
}
|
||||
else {
|
||||
xCharInfo *minbounds, *maxbounds, *ci;
|
||||
int nchars, i;
|
||||
|
||||
if (bitmapFont->bitmapExtra) {
|
||||
minbounds = &bitmapFont->bitmapExtra->info.ink_minbounds;
|
||||
maxbounds = &bitmapFont->bitmapExtra->info.ink_maxbounds;
|
||||
}
|
||||
else {
|
||||
minbounds = &pFont->info.ink_minbounds;
|
||||
maxbounds = &pFont->info.ink_maxbounds;
|
||||
}
|
||||
*minbounds = initMinMetrics;
|
||||
*maxbounds = initMaxMetrics;
|
||||
nchars = bitmapFont->num_chars;
|
||||
for (i = 0, ci = bitmapFont->ink_metrics; i < nchars; i++, ci++) {
|
||||
COMPUTE_MINMAX(ci);
|
||||
minbounds->attributes &= ci->attributes;
|
||||
maxbounds->attributes |= ci->attributes;
|
||||
}
|
||||
if (bitmapFont->bitmapExtra) {
|
||||
minbounds = &pFont->info.ink_minbounds;
|
||||
maxbounds = &pFont->info.ink_maxbounds;
|
||||
*minbounds = initMinMetrics;
|
||||
*maxbounds = initMaxMetrics;
|
||||
i = 0;
|
||||
for (int r = pFont->info.firstRow; r <= pFont->info.lastRow; r++) {
|
||||
for (int c = pFont->info.firstCol; c <= pFont->info.lastCol; c++)
|
||||
{
|
||||
CharInfoPtr cit = ACCESSENCODING(bitmapFont->encoding, i);
|
||||
if (cit) {
|
||||
int offset = cit - bitmapFont->metrics;
|
||||
ci = &bitmapFont->ink_metrics[offset];
|
||||
COMPUTE_MINMAX(ci);
|
||||
minbounds->attributes &= ci->attributes;
|
||||
maxbounds->attributes |= ci->attributes;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Bool
|
||||
bitmapAddInkMetrics(FontPtr pFont)
|
||||
{
|
||||
BitmapFontPtr bitmapFont;
|
||||
|
||||
bitmapFont = (BitmapFontPtr) pFont->fontPrivate;
|
||||
bitmapFont->ink_metrics = malloc(bitmapFont->num_chars * sizeof(xCharInfo));
|
||||
if (!bitmapFont->ink_metrics) {
|
||||
fprintf(stderr, "Error: Couldn't allocate ink_metrics (%d*%ld)\n",
|
||||
bitmapFont->num_chars, (unsigned long) sizeof(xCharInfo));
|
||||
return FALSE;
|
||||
}
|
||||
for (int i = 0; i < bitmapFont->num_chars; i++)
|
||||
FontCharInkMetrics(pFont, &bitmapFont->metrics[i],
|
||||
&bitmapFont->ink_metrics[i]);
|
||||
pFont->info.inkMetrics = TRUE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/* ARGSUSED */
|
||||
int
|
||||
bitmapComputeWeight(FontPtr pFont)
|
||||
{
|
||||
return 10;
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue