freetype-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Devel] Re-encoding interface requested?


From: Tom Kacvinsky
Subject: Re: [Devel] Re-encoding interface requested?
Date: Mon, 12 Mar 2001 17:55:16 -0500 (EST)

But this is a glyph index to glyph name mapping.  What you are after is a glyph
name to glyph index mapping (if I read your original post correctly).

Oh, wait a second, you are going to build a list of glyph names with their
corresponding glyph indices, and from that you can reencode.  Now you just get
the char code you want to set, get the name from the encoding vector you have
(which I presume is the encoding vector from the PDF file), and from the name,
get a GID (because now you have a name to GID mapping).

Did I miss something?

Tom

On Mon, 12 Mar 2001, Sander van der Wal wrote:

>
> I stumbled on an even easier way: FT_Get_Glyph_Name()
>
> I needed to implement this for the CFF driver but that wasn't hard:
> cffdrivr.c
>
>   static
>   FT_Error  get_cff_glyph_name( CFF_Face    face,
>                                 FT_UInt     glyph_index,
>                                 FT_Pointer  buffer,
>                                 FT_UInt     buffer_max )
>   {
>     CFF_Font*           font = (CFF_Font*)face->extra.data;
>     FT_Memory           memory = FT_FACE_MEMORY(face);
>     FT_String*          gname;
>     FT_UShort           sid;
>     PSNames_Interface*  psnames;
>
>     psnames = (PSNames_Interface*)FT_Get_Module_Interface(
>               face->root.driver->root.library, "psnames" );
>
>     /* first, locate the sid in the charset table */
>     sid = font->charset.sids[glyph_index];
>
>     /* now, lookup the name itself */
>     gname = CFF_Get_String( &font->string_index,
>                             sid,
>                             psnames );
>     if ( buffer_max > 0 )
>     {
>       FT_UInt  len = strlen( gname );
>
>
>       if (len >= buffer_max)
>         len = buffer_max - 1;
>
>       MEM_Copy( buffer, gname, len );
>       ((FT_Byte*)buffer)[len] = 0;
>     }
>
>     FREE ( gname );
>     return CFF_Err_Ok;
>   }
>
> further down, cff_get_interface becomes:
>
>   static
>   FT_Module_Interface  cff_get_interface( CFF_Driver   driver,
>                                           const char*  interface )
>   {
>     FT_Module  sfnt;
>
> #ifndef FT_CONFIG_OPTION_NO_GLYPH_NAMES
>     if ( strcmp( (const char*)interface, "glyph_name" ) == 0 )
>       return (FT_Module_Interface)get_cff_glyph_name;
> #endif
>
>     /* we simply pass our request to the `sfnt' module */
>     sfnt = FT_Get_Module( driver->root.root.library, "sfnt" );
>
>     return sfnt ? sfnt->clazz->get_interface( sfnt, interface ) : 0;
>   }
>
>
> And in cffobjs.c, in function CFF_Init_Face():
>
>   /* XXX: WE DO NOT SUPPORT KERNING METRICS IN THE GPOS TABLE FOR NOW
> */
> #if 0
>         /* kerning available? */
>         if ( face->kern_pairs )
>           flags |= FT_FACE_FLAG_KERNING;
> #endif
>
> #ifndef FT_CONFIG_OPTION_NO_GLYPH_NAMES
>         flags |= FT_FACE_FLAG_GLYPH_NAMES;
> #endif
>
>         root->face_flags = flags;
>
> There might be some more changes needed, that this works satisfactory
> for me.
>
> Sander van der Wal
>
>
> > See the TODO list in a CVS snapshot.  I plan on working on a cmap
> synthesizer.
> > I also want to add a a unction like below (though I didn't add it to
> the list).
> > What you propose sounds reasonable.  The hooks are there.  YYou pass
> the glyph
> > name, find its SID (string ID) and use the SID to find the GID
> (glyph index)
> > from the charset table.  The most difficult part of this is the
> glyph name to
> > SID mapping, just becuase of how CFF fonts are set up.  In
> particular, you might
> > have to iterate over the entire string table in the CFF font to find
> the SID for
> > a particular string.  Or you might have to consult the standard
> strings table
>
> > >
> > > A couple of weeks ago (8 jan 2001) Leonard Rosenthol had a problem
> > > with custom encodings for Type 1 fonts and CFF fonts having no
> cmap.
> > >
> > > I have the same problems (because I am also doing a PDF viewer)
> and I
> > > think that the solution is to add a function to the public
> interface
> > > of freetype2. Right now there's FT_Get_Char_Index, to translate a
> > > character code to a glyph index. If there would be a function
> > >
> > > FT_UInt   FT_Get_Glyphname_Index(FT_Face* face, const FT_String*
> > > glyph_name)
> > >
> > > that returned the glyph index based on the glyph name, client
> > > applications could do the re-encoding themselves.
> > >
> > > Is this a reasonable way? I can work on the implementations.
> > >
> >
> >
> > _______________________________________________
> > Devel mailing list
> > address@hidden
> > http://www.freetype.org/mailman/listinfo/devel
> >
>
>
> _______________________________________________
> Devel mailing list
> address@hidden
> http://www.freetype.org/mailman/listinfo/devel
>




reply via email to

[Prev in Thread] Current Thread [Next in Thread]