-int getCharID(SWFFONT *font, int charnr, char *charname, int u)
-{
- int t;
- if(charname && font->glyphnames) {
- for(t=0;t<font->numchars;t++) {
- if(font->glyphnames[t] && !strcmp(font->glyphnames[t],charname)) {
- msg("<debug> Char [%d,>%s<,%d] maps to %d\n", charnr, charname, u, t);
- return t;
- }
- }
- /* if we didn't find the character, maybe
- we can find the capitalized version */
- for(t=0;t<font->numchars;t++) {
- if(font->glyphnames[t] && !strcasecmp(font->glyphnames[t],charname)) {
- msg("<debug> Char [%d,>>%s<<,%d] maps to %d\n", charnr, charname, u, t);
- return t;
- }
- }
- }
-
- if(u>0 && font->encoding != 255) {
- /* try to use the unicode id */
- if(u>=0 && u<font->maxascii && font->ascii2glyph[u]>=0) {
- msg("<debug> Char [%d,%s,>%d<] maps to %d\n", charnr, charname, u, font->ascii2glyph[u]);
- return font->ascii2glyph[u];
- }
- }
-
- if(font->encoding != FONT_ENCODING_UNICODE) {
- /* the following only works if the font encoding
- is US-ASCII based. It's needed for fonts which return broken unicode
- indices */
- if(charnr>=0 && charnr<font->maxascii && font->ascii2glyph[charnr]>=0) {
- msg("<debug> Char [>%d<,%s,%d] maps to %d\n", charnr, charname, u, font->ascii2glyph[charnr]);
- return font->ascii2glyph[charnr];
- }
- }
-
- if(charnr>=0 && charnr<font->numchars) {
- msg("<debug> Char [>%d<,%s,%d] maps to %d\n", charnr, charname, u, charnr);
- return charnr;
- }
-
- return -1;
-}
-
-
-/* set's the t1 font index of the font to use for swfoutput_drawchar(). */
-void swfoutput_setfont(struct swfoutput*obj, char*fontid, char*filename)
-{
- swfoutput_internal*i = (swfoutput_internal*)obj->internal;
- fontlist_t*last=0,*iterator;
- if(!fontid) {
- msg("<error> No fontid");
- return;
- }
-
- if(obj->swffont && obj->swffont->name && !strcmp((char*)obj->swffont->name,fontid))
- return;
-
- /* TODO: remove the need for this (enhance getcharacterbbox so that it can cope
- with multiple fonts */
- endtext(obj);
-
- iterator = i->fontlist;
- while(iterator) {
- if(!strcmp((char*)iterator->swffont->name,fontid)) {
- obj->swffont = iterator->swffont;
- return;
- }
- last = iterator;
- iterator = iterator->next;
- }
-
- if(!filename) {
- msg("<error> No filename given for font- internal error?");
- return;
- }
-
- swf_SetLoadFontParameters(64,/*skip unused*/0,/*full unicode*/1);
- SWFFONT*swffont = swf_LoadFont(filename);
-
- if(swffont == 0) {
- msg("<warning> Couldn't load font %s (%s)", fontid, filename);
- swffont = swf_LoadFont(0);
- }
-
- if(swffont->glyph2ascii) {
- int t;
- int bad = 0;
- /* check whether the Unicode indices look o.k.
- If they don't, disable the unicode lookup by setting
- the encoding to 255 */
- for(t=0;t<swffont->numchars;t++) {
- int c = swffont->glyph2ascii[t];
- if(c && c < 32 && swffont->glyph[t].shape->bitlen > 16) {
- // the character maps into the unicode control character range
- // between 0001-001f. Yet it is not empty. Treat the one
- // mapping as broken, and look how many of those we find.
- bad ++;
- }
- }
- if(bad>5) {
- msg("<warning> Font %s has bad unicode mapping", fontid);
- swffont->encoding = 255;
- }
- }
-
- swf_FontSetID(swffont, getNewID(obj));
-
- if(getScreenLogLevel() >= LOGLEVEL_DEBUG) {
- // print font information
- msg("<debug> Font %s (%s)",swffont->name, filename);
- msg("<debug> | ID: %d", swffont->id);
- msg("<debug> | Version: %d", swffont->version);
- msg("<debug> | Name: %s", fontid);
- msg("<debug> | Numchars: %d", swffont->numchars);
- msg("<debug> | Maxascii: %d", swffont->maxascii);
- msg("<debug> | Style: %d", swffont->style);
- msg("<debug> | Encoding: %d", swffont->encoding);
- for(int iii=0; iii<swffont->numchars;iii++) {
- msg("<debug> | Glyph %d) name=%s, unicode=%d size=%d bbox=(%.2f,%.2f,%.2f,%.2f)\n", iii, swffont->glyphnames?swffont->glyphnames[iii]:"<nonames>", swffont->glyph2ascii[iii], swffont->glyph[iii].shape->bitlen,
- swffont->layout->bounds[iii].xmin/20.0,
- swffont->layout->bounds[iii].ymin/20.0,
- swffont->layout->bounds[iii].xmax/20.0,
- swffont->layout->bounds[iii].ymax/20.0
- );
- int t;
- for(t=0;t<swffont->maxascii;t++) {
- if(swffont->ascii2glyph[t] == iii)
- msg("<debug> | - maps to %d",t);
- }
- }
- }
-
- /* set the font name to the ID we use here */
- if(swffont->name) free(swffont->name);
- swffont->name = (U8*)strdup(fontid);
-
- iterator = new fontlist_t;
- iterator->swffont = swffont;
- iterator->next = 0;
-
- if(last)
- last->next = iterator;
- else
- i->fontlist = iterator;
-
- obj->swffont = swffont;
-}
-
-int swfoutput_queryfont(struct swfoutput*obj, char*fontid)