packages feed

FreeTypeGL-0.0.1: src/font-desc.c

#include "font-desc.h"

#include <stdio.h>
#include <string.h>

#ifdef USE_FONT_CONFIG
#  if !defined(_WIN32) && !defined(_WIN64)
#    include <fontconfig/fontconfig.h>
#  endif
#endif

char *
font_desc_find_filename( const font_desc_t *desc )
{
// Use of fontconfig is disabled by default.
#ifndef USE_FONT_CONFIG
    return NULL;
#else
#  if defined _WIN32 || defined _WIN64
    fprintf( stderr, "\"font_manager_match_description\" not implemented for windows.\n" );
    return 0;
#  endif
    char *filename = 0;
    int weight = FC_WEIGHT_REGULAR;
    int slant = FC_SLANT_ROMAN;
    if ( desc->bold )
    {
        weight = FC_WEIGHT_BOLD;
    }
    if( desc->italic )
    {
        slant = FC_SLANT_ITALIC;
    }
    FcInit();
    FcPattern *pattern = FcPatternCreate();
    FcPatternAddDouble( pattern, FC_SIZE, desc->size );
    FcPatternAddInteger( pattern, FC_WEIGHT, weight );
    FcPatternAddInteger( pattern, FC_SLANT, slant );
    FcPatternAddString( pattern, FC_FAMILY, (FcChar8*) desc->family );
    FcConfigSubstitute( 0, pattern, FcMatchPattern );
    FcDefaultSubstitute( pattern );
    FcResult dummy;
    FcPattern *match = FcFontMatch( 0, pattern, &dummy );
    FcPatternDestroy( pattern );

    if ( !match ) {
        fprintf( stderr, "fontconfig error: could not match family '%s'", desc->family );
        return 0;
    }
    FcValue value;
    FcResult result = FcPatternGet( match, FC_FILE, 0, &value );
    FcPatternDestroy( match );
    if ( result ) {
        fprintf( stderr, "fontconfig error: could not match family '%s'", desc->family );
        return 0;
    }
    return strdup( (char *)(value.u.s) );
#endif
}