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