diff src/graph_engine_cairo.c @ 465:d8181696b689 Android_Skia

Move functions into graphic engine layers. Cairo and Skia have their own header files and C/C++ files. Some functions are refactoried and move into graphic engine layer to make reset of MadButterfly independently from graphic engines.
author Thinker K.F. Li <thinker@branda.to>
date Thu, 12 Nov 2009 21:22:30 +0800
parents
children 4dc0be6c044a
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/graph_engine_cairo.c	Thu Nov 12 21:22:30 2009 +0800
@@ -0,0 +1,110 @@
+#include <fontconfig/fontconfig.h>
+#include "mb_graph_engine_cairo.h"
+#include "mb_shapes.h"
+
+#ifndef ASSERT
+#define ASSERT(x)
+#endif
+
+/*! \brief Find out a font pattern.
+ *
+ * This function use fontconfig to decide a font file in pattern.  It can
+ * replaced by other mechanism if you think it is not what you want.
+ *
+ * \param slant make font prune if it it non-zero.
+ * \param weight make font normal if it is 100.
+ */
+static
+FcPattern *query_font_pattern(const char *family, int slant, int weight) {
+    FcPattern *ptn, *p, *fn_ptn;
+    FcValue val;
+    FcConfig *cfg;
+    FcBool r;
+    FcResult result;
+    static int slant_map[] = {	/* from MB_FONT_SLANT_* to FC_SLANT_* */
+	FC_SLANT_ROMAN,
+	FC_SLANT_ROMAN,
+	FC_SLANT_ITALIC,
+	FC_SLANT_OBLIQUE};
+
+    cfg = FcConfigGetCurrent();
+    ptn = FcPatternCreate();
+    p = FcPatternCreate();
+    if(ptn == NULL || p == NULL)
+	goto err;
+
+    val.type = FcTypeString;
+    val.u.s = family;
+    FcPatternAdd(ptn, "family", val, FcTrue);
+    
+    val.type = FcTypeInteger;
+    val.u.i = slant_map[slant];
+    FcPatternAdd(ptn, "slant", val, FcTrue);
+    
+    val.type = FcTypeInteger;
+    val.u.i = weight;
+    FcPatternAdd(ptn, "weight", val, FcTrue);
+
+    r = FcConfigSubstituteWithPat(cfg, ptn, NULL, FcMatchPattern);
+    if(!r)
+	goto err;
+    
+    r = FcConfigSubstituteWithPat(cfg, p, ptn, FcMatchFont);
+    if(!r)
+	goto err;
+
+    FcDefaultSubstitute(p);
+
+    fn_ptn = FcFontMatch(cfg, p, &result);
+
+    /* It is supposed to return FcResultMatch.  But, it is no, now.
+     * I don't know why.  Someone should figure out the issue.
+     */
+#if 0
+    if(result != FcResultMatch) {
+	printf("%d %d\n", result, FcResultMatch);
+	goto err;
+    }
+#endif
+    if(fn_ptn == NULL)
+	goto err;
+
+    FcPatternDestroy(ptn);
+    FcPatternDestroy(p);
+    
+    return fn_ptn;
+    
+err:
+    if(ptn)
+	FcPatternDestroy(ptn);
+    if(p)
+	FcPatternDestroy(p);
+    return NULL;
+
+}
+
+/*! \brief Find out a font face for a pattern specified.
+ *
+ * The pattern, here, is a vector of family, slant, and weight.
+ * This function base on fontconfig and cairo FreeType font supporting.
+ * You can replace this function with other font mechanisms.
+ */
+mbe_font_face_t *
+mbe_query_font_face(const char *family, int slant, int weight) {
+    mbe_font_face_t *cface;
+    FcPattern *ptn;
+    
+    ptn = query_font_pattern(family, slant, weight);
+    cface = mbe_ft_font_face_create_for_pattern(ptn);
+    FcPatternDestroy(ptn);
+    
+    return cface;
+}
+
+void
+mbe_free_font_face(mbe_font_face_t *face) {
+    ASSERT(face == NULL);
+
+    mbe_font_face_destroy(face);
+}
+