[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