summaryrefslogtreecommitdiff
path: root/src/select/font_face.c
diff options
context:
space:
mode:
authorJohn Mark Bell <jmb@netsurf-browser.org>2011-12-04 21:06:24 +0000
committerJohn Mark Bell <jmb@netsurf-browser.org>2011-12-04 21:06:24 +0000
commitd5a183e14d42560632a6aa270aede226215bb3d3 (patch)
tree31d7c6692a8267237ff3caa34fa5958e280ead24 /src/select/font_face.c
parentd153cb125a6a69e08a49c93f9774f86705aa9898 (diff)
downloadlibcss-d5a183e14d42560632a6aa270aede226215bb3d3.tar.gz
libcss-d5a183e14d42560632a6aa270aede226215bb3d3.tar.bz2
@font-face support. Credit: James Montgomerie
Things missing: parser tests; the following descriptors: font-feature-settings, font-stretch, font-variant, unicode-range. svn path=/trunk/libcss/; revision=13244
Diffstat (limited to 'src/select/font_face.c')
-rw-r--r--src/select/font_face.c251
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;
+}
+
+