diff options
Diffstat (limited to 'src/select/font_face.c')
-rw-r--r-- | src/select/font_face.c | 251 |
1 files changed, 251 insertions, 0 deletions
diff --git a/src/select/font_face.c b/src/select/font_face.c new file mode 100644 index 0000000..ae24827 --- /dev/null +++ b/src/select/font_face.c @@ -0,0 +1,251 @@ +/* + * This file is part of LibCSS. + * Licensed under the MIT License, + * http://www.opensource.org/licenses/mit-license.php + * Copyright 2011 Things Made Out Of Other Things Ltd. + * Written by James Montgomerie <jamie@th.ingsmadeoutofotherthin.gs> + */ + +#include <string.h> + +#include "select/font_face.h" + +static void font_faces_srcs_destroy(css_font_face *font_face) +{ + uint32_t i; + css_font_face_src *srcs = font_face->srcs; + + for (i = 0; i < font_face->n_srcs; ++i) { + if (srcs[i].location != NULL) { + lwc_string_unref(srcs[i].location); + } + } + + font_face->alloc(srcs, 0, font_face->pw); + font_face->srcs = NULL; +} + +/** + * Create a font-face + * + * \param alloc Memory (de)allocation function + * \param pw Pointer to client-specific data + * \param result Pointer to location to receive result + * \return CSS_OK on success, + * CSS_NOMEM on memory exhaustion, + * CSS_BADPARM on bad parameters. + */ +css_error css__font_face_create(css_allocator_fn alloc, void *pw, + css_font_face **result) +{ + css_font_face *f; + + if (alloc == NULL || result == NULL) + return CSS_BADPARM; + + f = alloc(NULL, sizeof(css_font_face), pw); + if (f == NULL) + return CSS_NOMEM; + + memset(f, 0, sizeof(css_font_face)); + + f->alloc = alloc; + f->pw = pw; + + *result = f; + + return CSS_OK; +} + +/** + * Destroy a font-face + * + * \param font_face Font-face to destroy + * \return CSS_OK on success, appropriate error otherwise + */ +css_error css__font_face_destroy(css_font_face *font_face) +{ + if (font_face == NULL) + return CSS_BADPARM; + + if (font_face->font_family != NULL) + lwc_string_unref(font_face->font_family); + + if (font_face->srcs != NULL) + font_faces_srcs_destroy(font_face); + + font_face->alloc(font_face, 0, font_face->pw); + + return CSS_OK; +} + + +/** + * Set a font-face's font-family name + * + * \param font_face The font-face + * \param font_family Font-family name + * \param result Pointer to location to receive result + * \return CSS_OK on success, + * CSS_BADPARM on bad parameters. + */ +css_error css__font_face_set_font_family(css_font_face *font_face, + lwc_string *font_family) +{ + if (font_face == NULL || font_family == NULL) + return CSS_BADPARM; + + if (font_face->font_family != NULL) + lwc_string_unref(font_face->font_family); + + font_face->font_family = lwc_string_ref(font_family); + + return CSS_OK; +} + +/** + * Get a font-face's font-family name + * + * \param font_face The font-face + * \param result Pointer to location to receive result + * \return CSS_OK on success, + * CSS_BADPARM on bad parameters. + */ +css_error css_font_face_get_font_family(const css_font_face *font_face, + lwc_string **font_family) +{ + if (font_face == NULL || font_family == NULL) + return CSS_BADPARM; + + *font_family = font_face->font_family; + + return CSS_OK; +} + +/** + * Get the style of font for a font-face. + * + * \param src The font-face + * \return The style, as a css_font_style_e + */ +uint8_t css_font_face_font_style(const css_font_face *font_face) +{ + return font_face->bits[0] & 0x3; +} + +/** + * Get the weight of font for a font-face. + * + * \param src The font-face + * \return The style, as a css_font_weight_e + */ +uint8_t css_font_face_font_weight(const css_font_face *font_face) +{ + return (font_face->bits[0] >> 2) & 0xf; +} + +/** + * Get the number of potential src locations for a font-face + * + * \param font_face The font-face + * \param count Pointer to location to receive result + * \return CSS_OK on success, + * CSS_BADPARM on bad parameters. + */ +css_error css_font_face_count_srcs(const css_font_face *font_face, + uint32_t *count) +{ + if (font_face == NULL || count == NULL) + return CSS_BADPARM; + + *count = font_face->n_srcs; + return CSS_OK; +} + +/** + * Get a specific src location from a font-face + * + * \param font_face The font-face + * \param index The index for the wanted src. + * \param count Pointer to location to receive result + * \return CSS_OK on success, + * CSS_BADPARM on bad parameters. + */ +css_error css_font_face_get_src(const css_font_face *font_face, + uint32_t index, const css_font_face_src **src) +{ + if (font_face == NULL || src == NULL || index >= font_face->n_srcs) + return CSS_BADPARM; + + *src = &(font_face->srcs[index]); + + return CSS_OK; +} + +/** + * Get the location for a font-face src. + * + * \param font_face The font-face + * \param count Pointer to location to receive result + * \return CSS_OK on success, + * CSS_BADPARM on bad parameters. + * + * \note The type of location (local or URL) can be gathered from + * css_font_face_src_location_type, and the format of font (if specified) + * from css_font_face_src_format. + */ +css_error css_font_face_src_get_location(const css_font_face_src *src, + lwc_string **location) +{ + if (src == NULL || location == NULL) + return CSS_BADPARM; + + *location = src->location; + + return CSS_OK; +} + +/** + * Get the location type for a font-face src. + * + * \param src The font-face src + * \return The location type + */ +css_font_face_location_type css_font_face_src_location_type( + const css_font_face_src *src) +{ + return src->bits[0] & 0x3; +} + +/** + * Get the format of font for a font-face src. + * + * \param src The font-face src + * \return The format, if specified + */ +css_font_face_format css_font_face_src_format(const css_font_face_src *src) +{ + return (src->bits[0] >> 2) & 0x1f; +} + +/** + * Set a font-faces array of srcs. + * + * \param font_face The font-face + * \param srcs The array of css_font_face_srcs + * \param n_srcs The count of css_font_face_srcs in the array + * \return The format, if specified + */ +css_error css__font_face_set_srcs(css_font_face *font_face, + css_font_face_src *srcs, uint32_t n_srcs) +{ + if (font_face->srcs != NULL) + font_faces_srcs_destroy(font_face); + + font_face->srcs = srcs; + font_face->n_srcs = n_srcs; + + return CSS_OK; +} + + |