# Copyright 1999-2018 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2

EAPI=6

# CrOS change.
# eapi-ver7.eclass is not present. Drop it as well as check for the
# 3rd component of version number >= 90, '[[ $(ver_cut 3) -ge 90 ]]'
# before the KEYWORDS line.
# The 3rd component of fontconfig version >= 90 indicates that it's a release
# candidate.
inherit autotools multilib-minimal readme.gentoo-r1

DESCRIPTION="A library for configuring and customizing font access"
HOMEPAGE="https://fontconfig.org/"
SRC_URI="https://fontconfig.org/release/${P}.tar.bz2"

LICENSE="MIT"
SLOT="1.0"
KEYWORDS="*"
IUSE="cros_host doc static-libs +subpixel_rendering touchview"

# Purposefully dropped the xml USE flag and libxml2 support.  Expat is the
# default and used by every distro.  See bug #283191.
RDEPEND=">=dev-libs/expat-2.1.0-r3[${MULTILIB_USEDEP}]
	>=media-libs/freetype-2.9[${MULTILIB_USEDEP}]
	!elibc_Darwin? ( sys-apps/util-linux[${MULTILIB_USEDEP}] )
	elibc_Darwin? ( sys-libs/native-uuid )
	virtual/libintl[${MULTILIB_USEDEP}]"
DEPEND="${RDEPEND}
	virtual/pkgconfig
	>=sys-devel/gettext-0.19.8
	doc? ( =app-text/docbook-sgml-dtd-3.1*
		app-text/docbook-sgml-utils[jadetex] )"
# CrOS change: we don't need fontconfig eselect.
PDEPEND="virtual/ttf-fonts"

PATCHES=(
	"${FILESDIR}"/${PN}-2.10.2-docbook.patch # 310157
	"${FILESDIR}"/${P}-fonts-config.patch
	"${FILESDIR}"/${P}-locale.patch #650332
	"${FILESDIR}"/${P}-mtime.patch
	"${FILESDIR}"/${P}-names.patch #650370
	"${FILESDIR}"/${P}-fccache-sysroot.patch
	"${FILESDIR}"/${P}-fc-cache-doesn-t-use-y-option.patch # crbug.com/907781
)

# Checks that a passed-in fontconfig default symlink (e.g. "10-autohint.conf")
# is present and dies if it isn't.
check_fontconfig_default() {
	local path="${D}"/etc/fonts/conf.d/"$1"
	if [[ ! -L ${path} ]]; then
		die "Didn't find $1 among default fontconfig settings (at ${path})."
	fi
}

MULTILIB_CHOST_TOOLS=( /usr/bin/fc-cache$(get_exeext) )

pkg_setup() {
	DOC_CONTENTS="Please make fontconfig configuration changes using
	\`eselect fontconfig\`. Any changes made to /etc/fonts/fonts.conf will be
	overwritten. If you need to reset your configuration to upstream defaults,
	delete the directory ${EROOT%/}/etc/fonts/conf.d/ and re-emerge fontconfig."
}

src_prepare() {
	default
	export GPERF=$(type -P true)  # avoid dependency on gperf, #631980
	sed -i -e 's/FC_GPERF_SIZE_T="unsigned int"/FC_GPERF_SIZE_T=size_t/' \
		configure.ac || die # rest of gperf dependency fix, #631920
	eautoreconf
	rm test/out.expected || die #662048
}

multilib_src_configure() {
	cros_optimize_package_for_speed

	local addfonts
	# harvest some font locations, such that users can benefit from the
	# host OS's installed fonts
	case ${CHOST} in
		*-darwin*)
			addfonts=",/Library/Fonts,/System/Library/Fonts"
		;;
		*-solaris*)
			[[ -d /usr/X/lib/X11/fonts/TrueType ]] && \
				addfonts=",/usr/X/lib/X11/fonts/TrueType"
			[[ -d /usr/X/lib/X11/fonts/Type1 ]] && \
				addfonts="${addfonts},/usr/X/lib/X11/fonts/Type1"
		;;
		*-linux-gnu)
			use prefix && [[ -d /usr/share/fonts ]] && \
				addfonts=",/usr/share/fonts"
		;;
	esac

	local myeconfargs=(
		$(use_enable doc docbook)
		$(use_enable static-libs static)
		--enable-docs
		# Font cache should be in /usr/share/cache instead of /var/cache
		# because the latter is not in the read-only partition.
		--localstatedir="${EPREFIX}"/usr/share
		--with-default-fonts="${EPREFIX}"/usr/share/fonts
		--with-add-fonts="${EPREFIX}/usr/local/share/fonts${addfonts}"
		--with-templatedir="${EPREFIX}"/etc/fonts/conf.avail
	)

	ECONF_SOURCE="${S}" \
	econf "${myeconfargs[@]}"
}

multilib_src_install() {
	default

	# avoid calling this multiple times, bug #459210
	if multilib_is_native_abi; then
		# stuff installed from build-dir
		emake -C doc DESTDIR="${D}" install-man

		insinto /etc/fonts
		doins fonts.conf
	fi
}

multilib_src_install_all() {
	einstalldocs
	find "${ED}" -name "*.la" -delete || die

	insinto /etc/fonts
	doins "${FILESDIR}"/local.conf
	# Enable autohint by default
	# match what we want to use.
	dosym ../conf.avail/10-autohint.conf /etc/fonts/conf.d/10-autohint.conf
	check_fontconfig_default 10-autohint.conf

	# Make sure that hinting-slight is on.
	check_fontconfig_default 10-hinting-slight.conf

	# Set sub-pixel mode to RGB
	dosym ../conf.avail/10-sub-pixel-rgb.conf \
		/etc/fonts/conf.d/10-sub-pixel-rgb.conf
	check_fontconfig_default 10-sub-pixel-rgb.conf

	# Use the default LCD filter
	dosym ../conf.avail/11-lcdfilter-default.conf \
		/etc/fonts/conf.d/11-lcdfilter-default.conf
	check_fontconfig_default 11-lcdfilter-default.conf

	# CrOS: Delete unnecessary configurtaion files
	local confs_to_delete=(
		"20-unhint-small-vera"
		"40-nonlatin"
		"45-latin"
		"50-user"
		"60-latin"
		"65-fonts-persian"
		"65-nonlatin"
		"69-unifont"
		"80-delicious"
	)

	local conf
	for conf in "${confs_to_delete[@]}"; do
		rm -f "${D}"/etc/fonts/conf.d/"${conf}".conf
	done

	# There's a lot of variability across different displays with subpixel
	# rendering. Until we have a better solution, turn it off and use grayscale
	# instead on boards that don't have internal displays.
	#
	# Additionally, disable it for convertible devices with rotatable displays
	# (http://crbug.com/222208) and when installing to the host sysroot so the
	# images in the initramfs package won't use subpixel rendering
	# (http://crosbug.com/27872).
	if ! use subpixel_rendering || use touchview || use cros_host; then
		rm "${D}"/etc/fonts/conf.d/10-sub-pixel-rgb.conf
		rm "${D}"/etc/fonts/conf.d/11-lcdfilter-default.conf
		dosym ../conf.avail/10-no-sub-pixel.conf \
			/etc/fonts/conf.d/10-no-sub-pixel.conf
		check_fontconfig_default 10-no-sub-pixel.conf
	fi

	dodoc doc/fontconfig-user.{txt,pdf}

	if [[ -e ${ED}usr/share/doc/fontconfig/ ]];  then
		mv "${ED}"usr/share/doc/fontconfig/* "${ED}"/usr/share/doc/${P} || die
		rm -rf "${ED}"usr/share/doc/fontconfig
	fi

	# Changes should be made to /etc/fonts/local.conf, and as we had
	# too much problems with broken fonts.conf we force update it ...
	echo 'CONFIG_PROTECT_MASK="/etc/fonts/fonts.conf"' > "${T}"/37fontconfig
	doenvd "${T}"/37fontconfig

	# As of fontconfig 2.7, everything sticks their noses in here.
	# Replace /var/cache with /usr/share/cache for CrOS.
	dodir /etc/sandbox.d
	echo 'SANDBOX_PREDICT="/usr/share/cache/fontconfig"' > "${ED}"/etc/sandbox.d/37fontconfig

	readme.gentoo_create_doc
}

pkg_postinst() {
	einfo "Cleaning broken symlinks in ${EROOT%/}/etc/fonts/conf.d/"
	find -L "${EROOT}"etc/fonts/conf.d/ -type l -delete

	readme.gentoo_print_elog

	if [[ ${ROOT} = / ]]; then
		multilib_pkg_postinst() {
			ebegin "Creating global font cache for ${ABI}"
			"${EPREFIX}"/usr/bin/${CHOST}-fc-cache -srf
			eend $?
		}

		multilib_parallel_foreach_abi multilib_pkg_postinst
	fi
}
