A patch to detect CTFont API availability (Re: [PATCH 2/3] Update README with new minimum MacOSX requirements)

suzuki toshiya <[email protected]>
Newsgroups gmane.comp.lib.cairo
Message-ID <[email protected]>
Hi,

Here I propose a patch to restore the support of Mac OS X 10.4
support, which detects the CTFont availability by configure,
following to the design by Ryan Schmidt
http://lists.cairographics.org/archives/cairo/2015-February/025959.html

I don't think the change is too complex to drop Mac OS X 10.4
support... How do you think of?

Regards,
mpsuzuki


Andrea Canciani wrote:
> From: Andrea Canciani <[email protected]>
> 
> Since 70cc8f250b5669e757b4f044571ba0f71e3dea9e the quartz backend is
> using some APIs that are not available on MacOSX 10.4 directly
> (i.e. without detecting their availability through dynamic linking).
> This means that the quartz backend does not work anymore on MacOSX
> 10.4 and that the 10.5 SDK (or newer) is needed to build.
> ---
>  README | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/README b/README
> index 5926430..0be9947 100644
> --- a/README
> +++ b/README
> @@ -121,7 +121,7 @@ Supported, "platform" surface backends
>  
>  	quartz backend
>  	--------------
> -	MacOS X >= 10.4 with Xcode >= 2.4
> +	MacOS X >= 10.5 with Xcode >= 3.0
>  
>  	win32 backend
>  	-------------

-- 
cairo mailing list
[email protected]
http://lists.cairographics.org/mailman/listinfo/cairo
cairo-1.14.1_mps20150212.diff (text/x-patch, 5.2 KB)
diff --git a/configure.ac b/configure.ac
index 2ce1959..23216c2 100644
--- a/configure.ac
+++ b/configure.ac
@@ -210,8 +210,43 @@ CAIRO_ENABLE_SURFACE_BACKEND(quartz, Quartz, auto, [
 
 CAIRO_ENABLE_FONT_BACKEND(quartz_font, Quartz, auto, [
   use_quartz_font=$use_quartz
+  if test "x$use_quartz_font" = "xyes" ; then
+    dnl include Quartz header to check CTFontRef declaration
+    header_for_CTFontRef=""
+    if test "x${ac_cv_header_ApplicationServices_ApplicationServices_h}" = "xyes" ; then
+      header_for_CTFontRef=ApplicationServices/ApplicationServices.h
+    else
+      AC_CHECK_HEADER(CoreText/CoreText.h,[
+        header_for_CTFontRef=CoreText/CoreText.h
+      ],[])
+    fi
+
+    if test "x${header_for_CTFontRef}" != "x" ; then
+      AC_CHECK_TYPE(CTFontRef,[
+          AC_DEFINE([QUARTZ_HAS_CTFONTREF_T], 1, [Define to 1 if CTFontRef type is defined in CTFont.h])
+        ],[],[#include "${header_for_CTFontRef}"]
+      )
+    fi
+  fi
 ])
 
+if test "x$use_quartz" = "xyes" ; then
+  dnl include Quartz header to check CGDataProviderReleaseDataCallback declaration
+  header_for_CGDataProviderReleaseDataCallback=""
+  if test "x${ac_cv_header_ApplicationServices_ApplicationServices_h}" = "xyes" ; then
+    header_for_CGDataProviderReleaseDataCallback=ApplicationServices/ApplicationServices.h
+  elif test "x${ac_cv_header_CoreGraphics_CoreGraphics_h}" = "xyes" ; then
+    header_for_CGDataProviderReleaseDataCallback=CoreGraphics/CoreGraphics.h
+  fi
+
+  if test "x${header_for_CGDataProviderReleaseDataCallback}" != "x" ; then
+    AC_CHECK_TYPE(CGDataProviderReleaseDataCallback,[
+        AC_DEFINE([QUARTZ_HAS_CGDATAPROVIDERRELEASEDATACALLBACK_T], 1, [Define to 1 if CGDataProviderReleaseDataCallback type is defined in CGDataProvider.h])
+      ],[],[#include "${header_for_CGDataProviderReleaseDataCallback}"]
+    )
+  fi
+fi
+
 CAIRO_ENABLE_SURFACE_BACKEND(quartz_image, Quartz Image, no, [
   use_quartz_image=$use_quartz
 ])
diff --git a/src/cairo-quartz-font.c b/src/cairo-quartz-font.c
index 02f3426..35fe24d 100644
--- a/src/cairo-quartz-font.c
+++ b/src/cairo-quartz-font.c
@@ -81,6 +81,18 @@ static void (*CGFontGetGlyphsForUnicharsPtr) (CGFontRef, const UniChar[], const
 static void (*CGContextSetAllowsFontSmoothingPtr) (CGContextRef, bool) = NULL;
 static bool (*CGContextGetAllowsFontSmoothingPtr) (CGContextRef) = NULL;
 
+/* Not public in the least bit */
+static CGPathRef (*CGFontGetGlyphPathPtr) (CGFontRef fontRef, CGAffineTransform *textTransform, int unknown, CGGlyph glyph) = NULL;
+
+/* CoreText Replacement of CGFontGetGlyphPathPtr */
+#ifdef QUARTZ_HAS_CTFONTREF_T
+static CTFontRef (*CTFontCreateWithGraphicsFontPtr) (CGFontRef , CGFloat size, const CGAffineTransform*, CTFontDescriptorRef) = NULL;
+static CGPathRef (*CTFontCreatePathForGlyphPtr) (CTFontRef, CGGlyph, CGAffineTransform *) = NULL;
+#else
+static void* CTFontCreateWithGraphicsFontPtr = NULL;
+static void* CTFontCreatePathForGlyphPtr = NULL;
+#endif
+
 /* CGFontGetHMetrics isn't public, but the other functions are public/present in 10.5 */
 typedef struct {
     int ascent;
@@ -125,6 +137,13 @@ quartz_font_ensure_symbols(void)
     CGFontGetUnitsPerEmPtr = dlsym(RTLD_DEFAULT, "CGFontGetUnitsPerEm");
     CGFontGetGlyphAdvancesPtr = dlsym(RTLD_DEFAULT, "CGFontGetGlyphAdvances");
 
+#ifdef QUARTZ_HAS_CTFONTREF_T
+    CTFontCreateWithGraphicsFontPtr = dlsym(RTLD_DEFAULT, "CTFontCreateWithGraphicsFont");
+    CTFontCreatePathForGlyphPtr = dlsym(RTLD_DEFAULT, "CTFontCreatePathForGlyphPtr");
+    if (!CTFontCreateWithGraphicsFontPtr || !CTFontCreatePathForGlyphPtr)
+#endif
+	CGFontGetGlyphPathPtr = dlsym(RTLD_DEFAULT, "CGFontGetGlyphPath");
+
     CGFontGetHMetricsPtr = dlsym(RTLD_DEFAULT, "CGFontGetHMetrics");
     CGFontGetAscentPtr = dlsym(RTLD_DEFAULT, "CGFontGetAscent");
     CGFontGetDescentPtr = dlsym(RTLD_DEFAULT, "CGFontGetDescent");
@@ -140,6 +159,7 @@ quartz_font_ensure_symbols(void)
 	CGFontGetGlyphsForUnicharsPtr &&
 	CGFontGetUnitsPerEmPtr &&
 	CGFontGetGlyphAdvancesPtr &&
+	((CTFontCreateWithGraphicsFontPtr && CTFontCreatePathForGlyphPtr) || CGFontGetGlyphPathPtr) &&
 	(CGFontGetHMetricsPtr || (CGFontGetAscentPtr && CGFontGetDescentPtr && CGFontGetLeadingPtr)))
 	_cairo_quartz_font_symbols_present = TRUE;
 
@@ -545,7 +565,6 @@ _cairo_quartz_init_glyph_path (cairo_quartz_scaled_font_t *font,
     CGGlyph glyph = _cairo_quartz_scaled_glyph_index (scaled_glyph);
     CGAffineTransform textMatrix;
     CGPathRef glyphPath;
-    CTFontRef ctFont;
     cairo_path_fixed_t *path;
 
     if (glyph == INVALID_GLYPH) {
@@ -560,9 +579,14 @@ _cairo_quartz_init_glyph_path (cairo_quartz_scaled_font_t *font,
 					-font->base.scale.yy,
 					0, 0);
 
-    ctFont = CTFontCreateWithGraphicsFont (font_face->cgFont, 0.0, NULL, NULL);
-    glyphPath = CTFontCreatePathForGlyph (ctFont, glyph, &textMatrix);
-    CFRelease (ctFont);
+#ifdef QUARTZ_HAS_CTFONTREF_T
+    if (CTFontCreateWithGraphicsFontPtr && CTFontCreatePathForGlyphPtr) {
+        CTFontRef ctFont = CTFontCreateWithGraphicsFontPtr (font_face->cgFont, 0.0, NULL, NULL);
+        glyphPath = CTFontCreatePathForGlyphPtr (ctFont, glyph, &textMatrix);
+        CFRelease (ctFont);
+    } else
+#endif
+	glyphPath = CGFontGetGlyphPathPtr (font_face->cgFont, &textMatrix, 0, glyph);
     if (!glyphPath)
 	return CAIRO_INT_STATUS_UNSUPPORTED;
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.