[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [ft-devel] controlling FreeType modules
From: |
Behdad Esfahbod |
Subject: |
Re: [ft-devel] controlling FreeType modules |
Date: |
Thu, 23 Aug 2012 11:33:53 -0400 |
User-agent: |
Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.9.2.28) Gecko/20120306 Thunderbird/3.1.20 |
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
> address@hidden
> https://lists.nongnu.org/mailman/listinfo/freetype-devel
>
- Re: [ft-devel] controlling FreeType modules, (continued)
- Re: [ft-devel] controlling FreeType modules, Werner LEMBERG, 2012/08/28
- Re: [ft-devel] controlling FreeType modules, Alexei Podtelezhnikov, 2012/08/29
- Re: [ft-devel] controlling FreeType modules, Behdad Esfahbod, 2012/08/29
- Re: [ft-devel] controlling FreeType modules, Werner LEMBERG, 2012/08/29
- Re: [ft-devel] controlling FreeType modules, Alexei Podtelezhnikov, 2012/08/30
- Re: [ft-devel] controlling FreeType modules, Akira TAGOH, 2012/08/30
- Re: [ft-devel] controlling FreeType modules, suzuki toshiya, 2012/08/30
- Re: [ft-devel] controlling FreeType modules, Werner LEMBERG, 2012/08/30
- Message not available
- Re: [ft-devel] controlling FreeType modules, Ken Sharp, 2012/08/30
Re: [ft-devel] controlling FreeType modules,
Behdad Esfahbod <=