### cairo.m4 -- extra macros for configuring R for cairo    -*- Autoconf -*-
###
### Copyright (C) 2008-2021 R Core Team
###
### This file is part of R.
###
### R is free software; you can redistribute it and/or modify it under
### the terms of the GNU General Public License as published by the Free
### Software Foundation; either version 2 of the License, or (at your
### option) any later version.
###
### R is distributed in the hope that it will be useful, but WITHOUT ANY
### WARRANTY; without even the implied warranty of MERCHANTABILITY or
### FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
### License for more details.
###
### You should have received a copy of the GNU General Public License
### along with R; if not, a copy is available at
### https://www.r-project.org/Licenses/


AC_DEFUN([R_PANGO_CAIRO], [
if test "x${PKG_CONFIG}" = "x"; then
  AC_MSG_NOTICE([not checking for cairo as pkg-config is not present])
else
  save_CPPFLAGS=${CPPFLAGS}
  save_LIBS=${LIBS}
  AC_CACHE_CHECK([whether pkg-config knows about cairo and pango], 
      [r_cv_has_pangocairo],
      [if "${PKG_CONFIG}" --exists pangocairo; then
         r_cv_has_pangocairo="yes"
       else
         r_cv_has_pangocairo="no"
       fi
  ])
  if test "x${r_cv_has_pangocairo}" = "xyes"; then
    modlist="pangocairo"
    ## These tests are useful for existence of features but
    ## because cairo is built as a single library they
    ## currently make no difference to CPPFLAGS nor LIBS
    for module in cairo-png; do
      if "${PKG_CONFIG}" --exists ${module}; then
	modlist="${modlist} ${module}"
      fi
    done
    if "${PKG_CONFIG}" --exists cairo-pdf; then
       modlist="${modlist} cairo-pdf"
       r_cairo_pdf=yes
    fi
    if "${PKG_CONFIG}" --exists cairo-ps; then
       modlist="${modlist} cairo-ps"
       r_cairo_ps=yes
    fi
    if "${PKG_CONFIG}" --exists cairo-svg; then
       modlist="${modlist} cairo-svg"
       r_cairo_svg=yes
    fi
    if "${PKG_CONFIG}" --exists cairo-xlib; then
       xmodlist="${modlist} cairo-xlib"
       r_cairo_xlib=yes
    else
       xmodlist="${modlist}"
    fi
    CAIRO_CPPFLAGS=`"${PKG_CONFIG}" --cflags ${modlist}`
    CAIROX11_CPPFLAGS=`"${PKG_CONFIG}" --cflags ${xmodlist}`
    ## Static builds may currently be impossible as harfbuzz
    ## requires graphite2 and that does not support static building.
    if test "x$use_static_cairo" = xyes; then
       AC_MSG_NOTICE([using static pangocairo])
       CAIRO_LIBS=`"${PKG_CONFIG}" --static --libs ${modlist}`
       CAIROX11_LIBS=`"${PKG_CONFIG}" --static --libs ${xmodlist}`
    else
       CAIRO_LIBS=`"${PKG_CONFIG}" --libs ${modlist}`
       CAIROX11_LIBS=`"${PKG_CONFIG}" --libs ${xmodlist}`
    fi

    CPPFLAGS="${CPPFLAGS} ${CAIRO_CPPFLAGS}"
    LIBS="${LIBS} ${CAIRO_LIBS}"

     AC_CACHE_CHECK([whether cairo including pango is >= 1.2 and works], 
		    [r_cv_cairo_works],
                    [AC_LINK_IFELSE([AC_LANG_SOURCE([[
#include <pango/pango.h>
#include <pango/pangocairo.h>
//#include <cairo-xlib.h>
#include <stddef.h>
#if CAIRO_VERSION  < 10200
#error cairo version >= 1.2 required
#endif
int main(void) {
    cairo_t  *CC = NULL; // silence picky compilers
    cairo_arc(CC, 0.0, 0.0, 1.0, 0.0, 6.28);
    pango_cairo_create_layout(CC);
    pango_font_description_new();
    return 0;
 }
	]])],[r_cv_cairo_works=yes],[r_cv_cairo_works=no
          CAIRO_LIBS=
          CAIRO_CFLAGS=
        ])])
    CPPFLAGS=${save_CPPFLAGS}
    LIBS=${save_LIBS}
  else  ## no pangocairo, check for just cairo
    AC_CACHE_CHECK([whether pkg-config knows about cairo], [r_cv_has_cairo],
	[if "${PKG_CONFIG}" --exists cairo; then
	   r_cv_has_cairo="yes"
	 else
	   r_cv_has_cairo="no"
	 fi
    ])
    if test "x${r_cv_has_cairo}" = "xyes"; then
      modlist="cairo"
      ## on Linux, cairo-ft brings in header paths <cairo-ft.h>:
      ## the code which needs this is currently conditionalized
      for module in cairo-png cairo-ft; do
	if "${PKG_CONFIG}" --exists ${module}; then
	  modlist="${modlist} ${module}"
	fi
      done
      if "${PKG_CONFIG}" --exists cairo-pdf; then
         modlist="${modlist} cairo-pdf"
         r_cairo_pdf=yes
      fi
      if "${PKG_CONFIG}" --exists cairo-ps; then
         modlist="${modlist} cairo-ps"
         r_cairo_ps=yes
      fi
      if "${PKG_CONFIG}" --exists cairo-svg; then
         modlist="${modlist} cairo-svg"
         r_cairo_svg=yes
      fi
      if "${PKG_CONFIG}" --exists cairo-xlib; then
         xmodlist="${modlist} cairo-xlib"
         r_cairo_xlib=yes
      else
         xmodlist="${modlist}"
      fi
      CAIRO_CPPFLAGS=`"${PKG_CONFIG}" --cflags ${modlist}`
      CAIROX11_CPPFLAGS=`"${PKG_CONFIG}" --cflags ${xmodlist}`
      if test "x$use_static_cairo" = xyes; then
      	  AC_MSG_NOTICE([using static cairo])
          CAIRO_LIBS=`"${PKG_CONFIG}" --static --libs ${modlist}`
          CAIROX11_LIBS=`"${PKG_CONFIG}" --static --libs ${xmodlist}`
      else
          CAIRO_LIBS=`"${PKG_CONFIG}" --libs ${modlist}`
          CAIROX11_LIBS=`"${PKG_CONFIG}" --libs ${xmodlist}`
      fi

      CPPFLAGS="${CPPFLAGS} ${CAIRO_CPPFLAGS} ${CAIROX11_CPPFLAGS}"
      LIBS="${LIBS} ${CAIRO_LIBS}"

      AC_CACHE_CHECK([whether cairo is >= 1.2 and works], 
		     [r_cv_cairo_works], 
                     [AC_LINK_IFELSE([AC_LANG_SOURCE([[
#include <cairo.h>
//#include <cairo-xlib.h>
#include <stddef.h>
#if CAIRO_VERSION  < 10200
#error cairo version >= 1.2 required
#endif
int main(void) {
    cairo_t  *CC = NULL; // silence picky compilers    
    cairo_arc(CC, 0.0, 0.0, 1.0, 0.0, 6.28);
    cairo_select_font_face (CC, "Helvetica", CAIRO_FONT_SLANT_NORMAL, 
                            CAIRO_FONT_WEIGHT_BOLD);
    return 0;
 }
	]])],[r_cv_cairo_works=yes],[r_cv_cairo_works=no
          CAIRO_LIBS=
          CAIRO_CFLAGS=
          CAIROX11_LIBS=
          CAIROX11_CFLAGS=
        ])])
      CPPFLAGS=${save_CPPFLAGS}
      LIBS=${save_LIBS}
    fi
  fi
fi

if test "x${r_cv_has_pangocairo}" = xyes; then
   AC_DEFINE(HAVE_PANGOCAIRO, 1, [Define to 1 if you have pangocairo.]) 
fi
if test "x${r_cv_cairo_works}" = xyes; then
   AC_DEFINE(HAVE_WORKING_CAIRO, 1, [Define to 1 if you have cairo.])
   if test "x${r_cairo_xlib}" = xyes; then
      AC_DEFINE(HAVE_WORKING_X11_CAIRO, 1,
               [Define to 1 if you have cairo including Xlib.])
   fi
fi
if test "x${r_cairo_pdf}" = xyes; then
   AC_DEFINE(HAVE_CAIRO_PDF, 1, [Define to 1 if you have cairo-ps.]) 
fi
if test "x${r_cairo_ps}" = xyes; then
   AC_DEFINE(HAVE_CAIRO_PS, 1, [Define to 1 if you have cairo-pdf.]) 
fi
if test "x${r_cairo_svg}" = xyes; then
   AC_DEFINE(HAVE_CAIRO_SVG, 1, [Define to 1 if you have cairo-svg.]) 
fi
AC_SUBST(CAIRO_CPPFLAGS)
AC_SUBST(CAIROX11_CPPFLAGS)
AC_SUBST(CAIRO_LIBS)
AC_SUBST(CAIROX11_LIBS)
])
