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

Andrea Canciani ranma42 at gmail.com
Tue Mar 10 07:01:55 PDT 2015


On Tue, Mar 10, 2015 at 12:17 PM, suzuki toshiya <mpsuzuki at hiroshima-u.ac.jp
> wrote:

> 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?
>

The change itself is not very complex, but maintaining 10.4 is becoming
unfeasible, given that testing is very hard.
This is confirmed by the bug you have in your patch :P (see comment inline).

Instead of adding #ifdef's and configure-time detection (which is usually
the wrong thing to do for mac, as you might be compiling with a newer SDK
and targeting an old OSX version), the commit you're looking for should be
something like
http://cgit.freedesktop.org/~ranma42/cairo/commit/?h=wip/restore-10.4&id=c2d111ecbf729fe1ecdfcc260f2c51cd3e96fe37

Another option, which at least to me sounds very appealing, is to let 10.4
die (from Apple's point of view, it's unsupported since September 2009) and
cleanup cairo-quartz as in
http://cgit.freedesktop.org/~ranma42/cairo/commit/?h=wip/remove-10.4&id=66b5419704aa1971c77de764fd94b2f7d2a05b76
This would remove most of the weirdness in the quartz backend (the two
bigger culprits are currently blend modes and font metrics).

Of course, if the remove-10.4 branch was merged, the patch to restore 10.4
would be much more complex, so we could say that supporting 10.4 requires a
significant complexity in cairo-quartz.

Andrea


> Regards,
> mpsuzuki
>
>
> Andrea Canciani wrote:
> > From: Andrea Canciani <ranma42 at tartaros.local>
> >
> > 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
> >       -------------

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");
>

Hidden bug!
CTFontCreatePathForGlyphPtr = dlsym(RTLD_DEFAULT,
"CTFontCreatePathForGlyphPtr");
should be
CTFontCreatePathForGlyphPtr = dlsym(RTLD_DEFAULT,
"CTFontCreatePathForGlyph");


> +    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;
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.cairographics.org/archives/cairo/attachments/20150310/c3fecf13/attachment-0001.html>


More information about the cairo mailing list