<?xml version="1.0" encoding="UTF-8"?>
<!--
	ANT
 
	Copyright 2011-2024 MicroEJ Corp. All rights reserved.
	This library is provided in source code for use, modification and test, subject to license terms.
	Any modification of the source code will break MicroEJ Corp. warranties on the whole library.
-->
<project name="fontGeneratorInit">

	<dirname file="${ant.file.fontGeneratorInit}" property="fontGeneratorInit.dir"/>

	<import file="${fontGeneratorInit.dir}/../extension-init.xml" />
	<import file="${fontGeneratorInit.dir}/../kfAntToolsDefinition.xml" optional="true"/>
	<import file="${fontGeneratorInit.dir}/../init-microui/microuiinit.xml" />

	<property name="fontGen.list.internal.extension" value=".fonts.list"/>
	<property name="fontGen.list.external.extension" value=".fontsext.list"/>

	<target name="init/fontGen/check" extensionOf="init/context" depends="init/microui/check">
		<property name="ej.microui.fontConverter.useIt" value="true" description="default value (same than microej launch)"/>
		<condition property="font.generator.gen.needed" value="true">
			<and>
				<istrue value="${usesMICROUI}"/>
				<istrue value="${ej.microui.fontConverter.useIt}"/>
			</and>
		</condition>
	</target>

	<target name="definitions/fontGen/outputdir">
		<property name="ej.microui.cache.dir" location="${output.dir}/.cache"/>
		<property name="fontGen.output.dir" location="${ej.microui.cache.dir}/fonts"/>
		<mkdir dir="${fontGen.output.dir}"/>
		<property name="fontGen.bin.output.dir" location="${fontGen.output.dir}/bin"/>
		<mkdir dir="${fontGen.bin.output.dir}"/>
	</target>

	<target name="definitions/fontGen/generator" depends="definitions/fontGen/outputdir" if="font.generator.gen.needed">
		<augment id="init.application.classpath">
			<!-- add the fonts binary output dir (directory where resources are generated (font resources and optional immutable property) -->
			<pathelement location="${fontGen.bin.output.dir}"/>
		</augment>
		<loadproperties srcfile="${fontGeneratorInit.dir}/fontgen.properties" prefix="font.gen."/>

		<!-- check for internal resources -->
		<condition property="internal.font.generator.gen.needed" value="true">
			<and>
				<isset property="font.generator.gen.needed"/>
			</and>
		</condition>

		<!-- check for external resources -->
		<condition property="external.font.generator.gen.needed" value="true">
			<and>
				<isset property="font.generator.gen.needed"/>
				<!-- property set by external-resource-loader-init.xml -->
				<isset property="external-resource-loader.input.dir"/>
			</and>
		</condition>

		<condition property="ej.microui.fontConverter.file.intern" value="${ej.microui.fontConverter.file}" else="">
			<istrue value="${ej.microui.fontConverter.file.enabled}"/>
		</condition>
		<condition property="ej.microui.fontConverter.file.external.intern" value="${ej.microui.fontConverter.file.external}" else="">
			<istrue value="${ej.microui.fontConverter.file.external.enabled}"/>
		</condition>
		<condition property="ej.microui.fontConverter.list.extension.intern" value="${fontGen.list.internal.extension}" else="">
			<isfalse value="${ej.microui.fontConverter.file.enabled}"/>
		</condition>
		<condition property="ej.microui.fontConverter.list.external.extension.intern" value="${fontGen.list.external.extension}" else="">
			<isfalse value="${ej.microui.fontConverter.file.external.enabled}"/>
		</condition>
	</target>

	<target name="definitions/fontGen/cache" depends="definitions/fontGen/outputdir" unless="font.generator.gen.needed">
		<fileset id="fonts.list" dir="${fontGen.bin.output.dir}" includes="fonts/**" />
		<pathconvert pathsep="${line.separator}" dirsep="/" property="fonts.list.lines" refid="fonts.list">
			<map from="${fontGen.bin.output.dir}/" to="" />
		</pathconvert>
		<echo file="${fontGen.bin.output.dir}/generated_fonts.resources.list">
${fonts.list.lines}
		</echo>
		<pathconvert property="fonts.list.slash" refid="fonts.list" pathsep=":" dirsep="/">
			<map from="${fontGen.bin.output.dir}" to="" />
		</pathconvert>
		<property name="ej.microui.fonts.list" value="${fonts.list.slash}"/>
	</target>

	<target name="definitions/fontGen" depends="definitions/fontGen/generator, definitions/fontGen/cache" />

	<target name="activity/fontGen" depends="definitions/fontGen" if="font.generator.gen.needed">
		<start.subactivity
			activity.id="${font.gen.activity.id}"
			message="${font.gen.activity.msg}"
			parent.activity.id="${activity.root.id}"
		/>

		<!-- verbose -->
		<echo message="MicroUI FontGen init" level="verbose" />

		<!-- define FontGenerator task -->
		<!-- Please update ImageGenerator.isMeaningfulClasspathEntry(File) if this classpath is changed. -->
		<path id="fontGenerator.classpath.ref">
			<fileset dir="${jpf.dir}/tools" includes="fontGenerator.jar" />
		</path>
		<taskdef name="FontGenerator" classname="${font.gen.classname}" classpathref="fontGenerator.classpath.ref"/>

		<!-- define verbose -->
		<condition property="fontgen.verbose" value="1" else="0">
			<isset property="execution.verbose"/>
		</condition>
	</target>

	<target name="init/fontGen/internal" depends="activity/fontGen" if="internal.font.generator.gen.needed">
		<!-- convert -->
		<fontGen
			list.file="${ej.microui.fontConverter.file.intern}"
			list.extension="${ej.microui.fontConverter.list.extension.intern}"
			prefix="internal"
			output.dir="${fontGen.bin.output.dir}"
			classpath="${application.classpath}"
			extra.classpaths="s3.features.classpath"
			disableCache="${ej.microui.fontConverter.disableCache}"
		/>

		<!-- append the ant property to the global list -->
		<augment id="init.resources">
			<string value="${internal.fonts.resources}"/>
		</augment>
	</target>

	<target name="init/fontGen/external" depends="activity/fontGen" if="external.font.generator.gen.needed">
		<fontGen
			list.file="${ej.microui.fontConverter.file.external.intern}"
			list.extension="${ej.microui.fontConverter.list.external.extension.intern}"
			prefix="external"
			output.dir="${externalResources.output.dir}"	
			classpath="${application.classpath}"
			extra.classpaths="s3.features.classpath"
			disableCache="true"
		/>

		<!-- default external heap size (can be overrided by launcher) -->
		<property name="ej.microui.memory.externalfontsheap.size" value="${external.fonts.heap.usage}"/>
	</target>

	<!--
		Compare launcher value with font generator value. 
		Set ${ej.microui.memory.externalfontsheap.toosmall} = true when launcher value is too small
	-->
	<target name="init/fontGen/external/heap/compare" depends="init/fontGen/external" if="external.font.generator.gen.needed">
		<script language="javascript"><![CDATA[
			var launcher = parseInt(project.getProperty('ej.microui.memory.externalfontsheap.size'));
			var minExpected = parseInt(project.getProperty('external.fonts.heap.usage'));
			project.setProperty('ej.microui.memory.externalfontsheap.toosmall', launcher < minExpected);
		]]></script>
	</target>

	<!--
		Prints a warning when launcher value is smaller than font generator required value.
		It is not an error: at runtime, some characters will be not rendered.
	-->
	<target name="init/fontGen/external/heap/warning" extensionOf="init/microui/thirdparty" depends="init/fontGen/external/heap/compare" if="${ej.microui.memory.externalfontsheap.toosmall}" unless="onS3">
		<echo level="warning" message="[WARNING] External heap for external fonts issue:"/>
		<echo level="warning" message="		Launcher specifies a size for the fonts external heap smaller than required size."/>
		<echo level="warning" message="		Some characters will be not rendered."/>
		<echo level="warning" message="		Enable verbose to consult the heap usage for each external font."/>
		<echo level="warning" message="		Required size = ${external.fonts.heap.usage} bytes."/>
		<echo level="warning" message="		Launcher size = ${ej.microui.memory.externalfontsheap.size} bytes (see launcher property: -Dej.microui.memory.externalfontsheap.size)."/>
	</target>

	<target name="init/fontGen/external/s3" extensionOf="init/microui/thirdparty" depends="init/fontGen/external" if="onS3">
		<property name="external.fonts.resources" value="" description="useful when there is no external resource"/>
		<augment id="init.resources">
			<string value="${external.fonts.resources}"/>
		</augment>
	</target>

	<target name="init/fontGen" extensionOf="init/microui/thirdparty" depends="init/fontGen/internal, init/fontGen/external">
		<!-- load system font -->
		<property file="${jpf.dir}/javaLibs/systemmicroui.properties"/>

		<!-- default properties -->
		<property name="ej.microui.system.fonts" value=""/>
		<property name="internal.ej.microui.user.fonts" value=""/>
		<property name="internal.ej.microui.features.fonts" value=""/>
		<property name="external.ej.microui.user.fonts" value=""/>

		<!-- microui system font is default font (index 0 of fonts list) -->
		<property name="ej.microui.fonts.list" value="${ej.microui.system.fonts}:${internal.ej.microui.user.fonts}:${external.ej.microui.user.fonts}"/>

		<!-- Front panel properties (global S3 properties) -->
		<property file="${jpf.dir}/javaLibs/systemmicroui.properties"/>
		<property name="microui.resources" value="" description="default value: no specific resource"/>
	</target>

	<target name="dyninit/fontGen/check" extensionOf="dyninit/context">
		<property name="font.generator.gen.needed" value="true"/>
	</target>

	<target name="dyninit/fontGen/internal" depends="activity/fontGen">
		<dynFontGen prefix="internal" extension="${fontGen.list.internal.extension}" output.dir="${fontGen.bin.output.dir}"/>
		<augment id="init.resources">
			<string value="${internal.fonts.resources}"/>
		</augment>
	</target>

	<target name="dyninit/fontGen/external" depends="activity/fontGen">
		<dynFontGen prefix="external" extension="${fontGen.list.external.extension}" output.dir="${externalResources.output.dir}"/>
	</target>

	<!--
		Check if font generator's external fonts heap usage is higher than 0 (not null). 
	-->
	<target name="dyninit/fontGen/external/compare" depends="dyninit/fontGen/external">
		<script language="javascript"><![CDATA[
			var minExpected = parseInt(project.getProperty('external.fonts.heap.usage'));
			project.setProperty('ej.microui.memory.externalfontsheap.warning', minExpected > 0);
		]]></script>
	</target>

	<!--
		Prints a warning when firmware external fonts heap must not be null.
		It is not an error: at runtime, some characters will be not rendered.
	-->
	<target name="dyninit/fontGen/external/warning" extensionOf="dyninit/execution" depends="dyninit/fontGen/external/compare" if="${ej.microui.memory.externalfontsheap.warning}">
		<echo level="warning" message="[WARNING] Firmware's heap for external fonts must be higher or equals to ${external.fonts.heap.usage} bytes (see firmware option -Dej.microui.memory.externalfontsheap.size)"/>
	</target>

	<target name="dyninit/fontGen" extensionOf="dyninit/execution" depends="dyninit/fontGen/internal, dyninit/fontGen/external">
		<!-- Convert to an immutable -->
		<property name="fonts.immutables.name" value="com.is2t.microui.fonts.data"/>
		<property name="fonts.immutables.file" value="${fontGen.bin.output.dir}/${fonts.immutables.name}"/>

		<PropertyToImmutable outputfile="${fonts.immutables.file}">
			<property name="ej.microui.fonts.list" value="${internal.ej.microui.user.fonts}:${external.ej.microui.user.fonts}"/>
		</PropertyToImmutable>
		<augment id="init.immutables">
			<string value="${fonts.immutables.name}"/>
		</augment>
	</target>

	<macrodef name="fontGen">
		<attribute name="list.file" default=""/>
		<attribute name="list.extension" default=""/>
		<attribute name="list.patternset" default=""/>
		<attribute name="classpath" /> <!-- Do not use a default value, the classpath must be set later when this macrodef is invoked -->
		<attribute name="extra.classpaths" default="" />
		<attribute name="prefix"/>
		<attribute name="output.dir"/>
		<attribute name="disableCache" default="false" />
		<sequential>
			<!-- create a temp file -->
			<property name="fonts.file" value="${microej.io.tmpdir}/fontgen.prop"/>
			<delete file="${fonts.file}" failonerror="false" verbose="no"/>

			<!-- generate -->
			<FontGenerator
				list="@{list.file}" 
				listExtension="@{list.extension}"
				classpath="@{classpath}"
				extraClasspaths="@{extra.classpaths}"
				outputFile="${fonts.file}" 
				pathSeparator="${path.separator}"
				endianness="${arch.endianness}"
				verboseLevel="${fontgen.verbose}"
				outputDirectory="@{output.dir}"
				disableCache="@{disableCache}"
			/>

			<!-- load a property from a file, nothing is loaded if the file does not exists -->
			<property file="${fonts.file}" prefix="@{prefix}"/>

			<!-- set empty values in case of no font has been generated -->
			<property name="@{prefix}.fonts.resources" value=""/>
			<property name="@{prefix}.ej.microui.user.fonts" value=""/>
			<property name="@{prefix}.fonts.heap.usage" value="0"/>

			<!-- delete temp files if exist -->
			<delete file="${fonts.file}" failonerror="false" verbose="no"/>
		</sequential>
	</macrodef>

	<macrodef name="dynFontGen">
		<attribute name="prefix"/>
		<attribute name="extension"/>
		<attribute name="output.dir"/>
		<sequential>
			<!-- Apply font generator -->
			<fontGen
				list.extension="@{extension}"
				prefix="@{prefix}"
				output.dir="@{output.dir}"
				classpath="${application.notapi.classpath}"
				disableCache="true"
			/>
		</sequential>
	</macrodef>
</project>