diff options
Diffstat (limited to 'Build/source/texk/web2c/luatexdir/luafontloader/fontforge/fontforge/splinechar.c')
-rw-r--r-- | Build/source/texk/web2c/luatexdir/luafontloader/fontforge/fontforge/splinechar.c | 266 |
1 files changed, 266 insertions, 0 deletions
diff --git a/Build/source/texk/web2c/luatexdir/luafontloader/fontforge/fontforge/splinechar.c b/Build/source/texk/web2c/luatexdir/luafontloader/fontforge/fontforge/splinechar.c new file mode 100644 index 00000000000..7245bb926bb --- /dev/null +++ b/Build/source/texk/web2c/luatexdir/luafontloader/fontforge/fontforge/splinechar.c @@ -0,0 +1,266 @@ +/* Copyright (C) 2000-2008 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "fontforgevw.h" +#include <math.h> +#include <locale.h> +# include <ustring.h> +# include <utype.h> +# include <gresource.h> +#ifdef HAVE_IEEEFP_H +# include <ieeefp.h> /* Solaris defines isnan in ieeefp rather than math.h */ +#endif +#include "ttf.h" + +int adjustwidth = true; +int adjustlbearing = true; +int allow_utf8_glyphnames = false; +int clear_tt_instructions_when_needed = true; + +void SCClearRounds(SplineChar *sc,int layer) { + SplineSet *ss; + SplinePoint *sp; + + for ( ss=sc->layers[layer].splines; ss!=NULL; ss=ss->next ) { + for ( sp=ss->first; ; ) { + sp->roundx = sp->roundy = false; + if ( sp->next==NULL ) + break; + sp = sp->next->to; + if ( sp==ss->first ) + break; + } + } +} + + +void SCClearLayer(SplineChar *sc,int layer) { + RefChar *refs, *next; + + SplinePointListsFree(sc->layers[layer].splines); + sc->layers[layer].splines = NULL; + for ( refs=sc->layers[layer].refs; refs!=NULL; refs = next ) { + next = refs->next; + SCRemoveDependent(sc,refs,layer); + } + sc->layers[layer].refs = NULL; + ImageListsFree(sc->layers[layer].images); + sc->layers[layer].images = NULL; +} + +void SCClearContents(SplineChar *sc,int layer) { + int ly_first, ly_last; + + if ( sc==NULL ) +return; + if ( sc->parent!=NULL && sc->parent->multilayer ) { + ly_first = ly_fore; + ly_last = sc->layer_cnt-1; + } else + ly_first = ly_last = layer; + for ( layer = ly_first; layer<=ly_last; ++layer ) + SCClearLayer(sc,layer); + --layer; + + if ( sc->parent!=NULL && + (sc->parent->multilayer || + (!sc->parent->layers[layer].background && SCWasEmpty(sc,layer)))) { + sc->widthset = false; + if ( sc->parent!=NULL && sc->width!=0 ) + sc->width = sc->parent->ascent+sc->parent->descent; + AnchorPointsFree(sc->anchor); + sc->anchor = NULL; + StemInfosFree(sc->hstem); sc->hstem = NULL; + StemInfosFree(sc->vstem); sc->vstem = NULL; + DStemInfosFree(sc->dstem); sc->dstem = NULL; + MinimumDistancesFree(sc->md); sc->md = NULL; + free(sc->ttf_instrs); + sc->ttf_instrs = NULL; + sc->ttf_instrs_len = 0; + SCOutOfDateBackground(sc); + } +} + + +void SplinePointRound(SplinePoint *sp,real factor) { + + sp->nextcp.x = rint(sp->nextcp.x*factor)/factor; + sp->nextcp.y = rint(sp->nextcp.y*factor)/factor; + if ( sp->next!=NULL && sp->next->order2 ) + sp->next->to->prevcp = sp->nextcp; + sp->prevcp.x = rint(sp->prevcp.x*factor)/factor; + sp->prevcp.y = rint(sp->prevcp.y*factor)/factor; + if ( sp->prev!=NULL && sp->prev->order2 ) + sp->prev->from->nextcp = sp->prevcp; + if ( sp->prev!=NULL && sp->next!=NULL && sp->next->order2 && + sp->ttfindex == 0xffff ) { + sp->me.x = (sp->nextcp.x + sp->prevcp.x)/2; + sp->me.y = (sp->nextcp.y + sp->prevcp.y)/2; + } else { + sp->me.x = rint(sp->me.x*factor)/factor; + sp->me.y = rint(sp->me.y*factor)/factor; + } +} + +void SplineSetsRound2Int(SplineSet *spl,real factor, int inspiro, int onlysel) { + SplinePoint *sp; + + for ( ; spl!=NULL; spl=spl->next ) { + if ( inspiro ) { + } else { + for ( sp=spl->first; ; ) { + if ( sp->selected || !onlysel ) + SplinePointRound(sp,factor); + if ( sp->prev!=NULL ) + SplineRefigure(sp->prev); + if ( sp->next==NULL ) + break; + sp = sp->next->to; + if ( sp==spl->first ) + break; + } + if ( spl->first->prev!=NULL ) + SplineRefigure(spl->first->prev); + } + } +} + + +void AltUniAdd(SplineChar *sc,int uni) { + struct altuni *altuni; + + if ( sc!=NULL && uni!=-1 && uni!=sc->unicodeenc ) { + for ( altuni = sc->altuni; altuni!=NULL && (altuni->unienc!=uni || + altuni->vs!=-1 || + altuni->fid); altuni=altuni->next ); + if ( altuni==NULL ) { + altuni = chunkalloc(sizeof(struct altuni)); + altuni->next = sc->altuni; + sc->altuni = altuni; + altuni->unienc = uni; + altuni->vs = -1; + altuni->fid = 0; + } + } +} + +void SCOrderAP(SplineChar *sc) { + int lc=0, cnt=0, out=false, i,j; + AnchorPoint *ap, **array; + /* Order so that first ligature index comes first */ + + for ( ap=sc->anchor; ap!=NULL; ap=ap->next ) { + if ( ap->lig_index<lc ) out = true; + if ( ap->lig_index>lc ) lc = ap->lig_index; + ++cnt; + } + if ( !out ) +return; + + array = galloc(cnt*sizeof(AnchorPoint *)); + for ( i=0, ap=sc->anchor; ap!=NULL; ++i, ap=ap->next ) + array[i] = ap; + for ( i=0; i<cnt-1; ++i ) { + for ( j=i+1; j<cnt; ++j ) { + if ( array[i]->lig_index>array[j]->lig_index ) { + ap = array[i]; + array[i] = array[j]; + array[j] = ap; + } + } + } + sc->anchor = array[0]; + for ( i=0; i<cnt-1; ++i ) + array[i]->next = array[i+1]; + array[cnt-1]->next = NULL; + free( array ); +} + + +static void SCUpdateNothing(SplineChar *sc) { +} + +static void SCHintsChng(SplineChar *sc) { + sc->changedsincelasthinted = false; + if ( !sc->changed ) { + sc->changed = true; + sc->parent->changed = true; + } +} + +static void _SCChngNoUpdate(SplineChar *sc,int layer,int changed) { +} + +static void SCChngNoUpdate(SplineChar *sc,int layer) { + _SCChngNoUpdate(sc,layer,true); +} + +static void SCB_MoreLayers(SplineChar *sc,Layer *old) { +} + +static struct sc_interface noui_sc = { + SCUpdateNothing, + SCUpdateNothing, + SCUpdateNothing, + SCHintsChng, + SCChngNoUpdate, + _SCChngNoUpdate, + SCUpdateNothing, + SCUpdateNothing, + SCB_MoreLayers +}; + +struct sc_interface *sc_interface = &noui_sc; + +void FF_SetSCInterface(struct sc_interface *sci) { + sc_interface = sci; +} + +static void CVChngNoUpdate(CharViewBase *cv) { +} + +static void _CVChngNoUpdate(CharViewBase *cv,int changed) { +} + +static void CVGlphRenameFixup(SplineFont *sf,char *oldname, char *newname) { +} + +static void CV__LayerPaletteCheck(SplineFont *sf) { +} + +static struct cv_interface noui_cv = { + CVChngNoUpdate, + _CVChngNoUpdate, + CVGlphRenameFixup, + CV__LayerPaletteCheck +}; + +struct cv_interface *cv_interface = &noui_cv; + +void FF_SetCVInterface(struct cv_interface *cvi) { + cv_interface = cvi; +} |