/* Method: Magick::fonts [ { |fontinfo| } ] Purpose: If called with the optional block, iterates over the fonts, otherwise returns an array of Magick::Font objects */ VALUE Magick_fonts(VALUE class) { #if defined(HAVE_GETTYPEINFOLIST) // ImageMagick 6.0.0 const TypeInfo **type_info; unsigned long number_types, x; volatile VALUE ary; #if defined(HAVE_OLD_GETTYPEINFOLIST) type_info = GetTypeInfoList("*", &number_types); #else // IM 6.1.3 added an exception argument to GetTypeInfoList ExceptionInfo exception; GetExceptionInfo(&exception); type_info = GetTypeInfoList("*", &number_types, &exception); HANDLE_ERROR #endif if (rb_block_given_p()) { for(x = 0; x < number_types; x++) { rb_yield(Font_from_TypeInfo((TypeInfo *)type_info[x])); } magick_free(type_info); return class; } else { ary = rb_ary_new2(number_types); for(x = 0; x < number_types; x++) { rb_ary_push(ary, Font_from_TypeInfo((TypeInfo *)type_info[x])); } magick_free(type_info); return ary; } #else const TypeInfo *type_list; TypeInfo *type, *next; ExceptionInfo exception; volatile VALUE ary; GetExceptionInfo(&exception); type_list = GetTypeInfo("*", &exception); HANDLE_ERROR // If block, iterate over fonts if (rb_block_given_p()) { for (type = (TypeInfo *)type_list; type; type = next) { next = type->next; // Protect against recursive calls to GetTypeInfo if (! type->stealth) { rb_yield(Font_from_TypeInfo(type)); } } return class; } else { ary = rb_ary_new(); for (type = (TypeInfo *)type_list; type; type = type->next) { rb_ary_push(ary, Font_from_TypeInfo(type)); } return ary; } #endif }