diff src/shape_stext.c @ 396:7fe0b1ee92b6

Add extents supporting into Fontconfig and FreeType Layer
author Thinker K.F. Li <thinker@branda.to>
date Wed, 10 Jun 2009 22:46:13 +0800
parents d30b575a4ad4
children 55f38c2cdb8f
line wrap: on
line diff
--- a/src/shape_stext.c	Wed Jun 10 21:45:39 2009 +0800
+++ b/src/shape_stext.c	Wed Jun 10 22:46:13 2009 +0800
@@ -1,4 +1,4 @@
-#if 0
+#ifdef SHAPE_STEXT
 
 #include <stdio.h>
 #include <cairo.h>
@@ -12,6 +12,33 @@
 #define OK 0
 #define ERR -1
 
+/*! \defgroup fontconfig_freetype Fontconfig and FreeType Layer.
+ *
+ * This layer implements a font provider to reset of the system.
+ * It bases on fontconfig and FreeType supporting of Cairo.
+ *
+ * @{
+ */
+/*! \brief Stakeholder of scaled font.
+ *
+ * It is actually a cairo_scaled_font_t, now.  But, it should not be
+ * noticed by out-siders.  Only \ref fontconfig_freetype
+ * should known it.
+ */
+typedef struct _mb_scaled_font mb_scaled_font_t;
+
+/*! \brief Stakeholder of scaled font.
+ *
+ * Although, mb_text_extents_t is defined as a cairo_scaled_font_t, but
+ * programmers should assume it is opague.
+ */
+typedef cairo_text_extents_t mb_text_extents_t;
+
+#define MBE_GET_X_ADV(ext) ((ext)->x_advance)
+#define MBE_GET_Y_ADV(ext) ((ext)->y_advance)
+#define MBE_GET_WIDTH(ext) ((ext)->width)
+#define MBE_GET_HEIGHT(ext) ((ext)->height)
+
 /*! \brief Find out a font pattern.
  *
  * This function use fontconfig to decide a font file in pattern.  It can
@@ -77,9 +104,7 @@
  * You can replace this function with other font mechanisms.
  */
 static
-cairo_font_face_t *query_font_face(const char *family,
-				   int slant,
-				   int weight) {
+mb_font_face_t *query_font_face(const char *family, int slant, int weight) {
     cairo_font_face_t *cface;
     FcPattern *ptn;
     
@@ -87,14 +112,14 @@
     cface = cairo_ft_font_face_create_for_pattern(ptn);
     FcPatternDestroy(ptn);
     
-    return cface;
+    return (mb_font_face_t *)cface;
 }
 
 static
-void free_font_face(cairo_font_face_t *cface) {
-    ASSERT(cface == NULL);
+void free_font_face(mb_font_face_t *face) {
+    ASSERT(face == NULL);
 
-    cairo_font_face_destroy(cface);
+    cairo_font_face_destroy((cairo_font_face_t *)face);
 }
 
 /*! \brief This is scaled font for specified size and extent.
@@ -106,8 +131,8 @@
  * user space of cairo surface.
  */
 static
-cairo_scaled_font_t *get_ciaro_scaled_font(cairo_font_face_t *cface,
-					   co_aix *matrix) {
+mb_scaled_font_t *get_cairo_scaled_font(mb_font_face_t *face,
+					co_aix *matrix) {
     cairo_font_face_t *scaled_font;
     cairo_matrix_t font_matrix;
     static cairo_matir_t id = {
@@ -131,18 +156,40 @@
     font_matrix.yx = *matrix++;
     font_matrix.yy = *matrix++;
     font_matrix.y0 = *matrix;
-    scaled_font = cairo_scaled_font_create(cface, &font_matrix,
+    scaled_font = cairo_scaled_font_create((cairo_font_face_t *)face,
+					   &font_matrix,
 					   &id, opt);
 
-    return scaled_font;
+    return (mb_scaled_font_t *)scaled_font;
+}
+
+static
+void free_scaled_font(mb_scaled_font_t *scaled_font) {
+    cairo_scaled_font_destroy((cairo_scaled_font_t *)scaled_font);
 }
 
 static
-void free_scaled_font(cairo_scaled_font_t *scaled_font) {
-    cairo_scaled_font_destroy(scaled_font);
+void text_extents(mb_scaled_font_t *scaled_font, const char *txt,
+		  mb_text_extents_t *extents) {
+    cairo_scaled_font_text_extents((cairo_scaled_font_t *)scaled_font,
+				   txt,
+				   (cairo_text_extents_t *)extents);
 }
 
-/* ============================================================ */
+static
+mb_text_extents_t *mb_text_extents_new(void) {
+    cairo_text_extents_t *extents;
+
+    extents = (cairo_text_extents_t *)malloc(sizeof(cairo_text_extents_t));
+    return extents;
+}
+
+static
+void mb_text_extents_free(mb_text_extents_t *extents) {
+    free(extents);
+}
+
+/* @} */
 
 /*! \brief Query and return a font face for a specified attribute vector.
  *
@@ -159,13 +206,12 @@
 				   const char *family,
 				   int slant,
 				   int weight) {
-    return (mb_font_face_t *)query_font_face(family, slant, weight);
+    return query_font_face(family, slant, weight);
 }
 
 void mb_font_face_free(mb_font_face_t *face) {
-    cairo_font_face_t *cface = (cairo_font_face_t *)face;
     ASSERT(face != NULL);
-    cairo_font_face_destroy(face);
+    free_font_face(face);
 }
 
 /*! \brief A simple implementation of text shape.
@@ -178,7 +224,7 @@
     int nblks;			      /*!< \brief Number of style blocks */
     int max_nblks;
     co_aix x, y;
-    cairo_scaled_font_t **scaled_fonts;
+    mb_scaled_font_t **scaled_fonts;
 } sh_stext_t;
 
 shape_t *rdman_shape_stext_new(redraw_man_t *rdman, co_aix x, co_aix y,
@@ -375,4 +421,4 @@
     return OK;
 }
 
-#endif /* 0 */
+#endif /* SHAPE_STEXT */