Werner,

I know I'm fairly opinionated when it comes to library design, but thought
share my thoughts anyway.  Personally I think FreeType's public API is largely
over-engineered, and the proposed property service is a big step in that
direction.  As a user of the library, I don't care about "modules",
"services", or generic properties infrastructures.  Just give me an enum for
the parameters that make sense, and a setter/getter.  No need to reinvent a
property system in C.

My 0.02CAD,
behdad

On 07/28/2012 01:51 AM, Werner LEMBERG wrote:
> 
> Toshiya-san and I have met in Osaka, and we have enjoyed a great time
> visiting the private museums of Motoya and Morizawa, two big font
> companies in Japan.
> 
> While having a nice lunch, we've discussed how to control modules in
> FreeType.  In FreeType's `autohinter-properties' branch, I've posted a
> first draft of how an interface might look like.  However, this is far
> from sufficient, and it is special to the auto-hinter only, while we
> need a more generic solution to control any module.
> 
> So here is another proposal for an interface.
> 
> 
>   Property service
>   ----------------
> 
>   Properties get accessed with FreeType services.  For example, to
>   make the module `foo' listen to property changes, add a
>   `foo-properties' service to the module, with two functions to get
>   and set values.
> 
> 
>   Default properties
>   ------------------
> 
>   Internally, we use an `FT_Property' structure to collect all
>   properties in a linked list:
> 
>     typedef FT_Property_
>     {
>       FT_String*    module_name;
>       FT_String*    property_name;
>       void*         value;
> 
>       FT_Property*  next;
> 
>     } FT_Property;
> 
>   The list is located in the `FT_Library' object:
> 
>     FT_Property*  properties;
> 
>   Allocation and deallocation of `properties' is handled by FreeType.
> 
>   As soon as a new `FT_Face' object gets created, the corresponding
>   modules check the `properties' list and use it for initialization.
>   There might be properties which are not suitable for global
>   initialization; such cases are to be ignored (with a debugging
>   warning probably).
> 
>   Already existing `FT_Face' objects are not affected.
> 
>     FT_Error
>     FT_Library_SetProperty( FT_Library        library,
>                             const FT_String*  module_name,
>                             const FT_String*  property_name,
>                             void*             value );
> 
>     FT_Error
>     FT_Library_RemoveProperty( FT_Library        library,
>                                const FT_String*  module_name,
>                                const FT_String*  property_name );
> 
>     FT_Error
>     FT_Library_GetProperty( FT_Library        library,
>                             const FT_String*  module_name,
>                             const FT_String*  property_name,
>                             void*             avalue );
> 
>   The generic pointer `value' gets typecast to a pointer of the real
>   value variable or structure.  Maybe not the most convenient, it
>   guarantees flexibility and extensibility, however.
> 
> 
>   Local properties
>   ----------------
> 
>   These are located in an FT_Face object.  Existing values for
>   properties get overwritten.
> 
>     FT_Error
>     FT_Face_SetProperty( FT_Face           face,
>                          const FT_String*  module_name,
>                          const FT_String*  property_name,
>                          void*             value );
> 
>     FT_Error
>     FT_Face_RemoveProperty( FT_Face           face,
>                             const FT_String*  module_name,
>                             const FT_String*  property_name );
> 
>     FT_Error
>     FT_Face_GetProperty( FT_Face           face,
>                          const FT_String*  module_name,
>                          const FT_String*  property_name,
>                          void*             avalue );
> 
> 
>   Examples
>   --------
> 
>     /***************************************************************/
>     /* Set property `bar' in module `foo' to value 1.              */
> 
>     FT_UInt  bar;
> 
> 
>     bar = 1;
>     FT_Face_SetProperty( face, "foo", "bar", &bar );
> 
> 
>     /***************************************************************/
>     /* Get property `baz', which consists of a minimum and maximum */
>     /* value.                                                      */
> 
>     typedef range_
>     {
>       FT_Int32  min;
>       FT_Int32  max;
> 
>     } range;
> 
>     range baz;
> 
> 
>     FT_Face_GetProperty( face, "foo", "baz", &baz );
> 
> 
> 
>       Werner
> 
> _______________________________________________
> Freetype-devel mailing list
> Freetype-devel@nongnu.org
> https://lists.nongnu.org/mailman/listinfo/freetype-devel
> 

_______________________________________________
Freetype-devel mailing list
Freetype-devel@nongnu.org
https://lists.nongnu.org/mailman/listinfo/freetype-devel

Reply via email to