<?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="imageGeneratorInit">

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

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

	<property name="imageGen.list.internal.extension" value=".images.list"/>
	<property name="imageGen.list.external.extension" value=".imagesext.list"/>

	<!-- Make a property available to the Image Generator and its plugins with System.getProperty -->
	<macrodef name="addImageGeneratorProperty">
		<attribute name="name" />
		<attribute name="value" />
		<sequential>
			<script language="javascript">
			    java.lang.System.setProperty('@{name}', '@{value}');
			</script>
		</sequential>
	</macrodef>

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

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

	<target name="definitions/imageGen/generator" depends="definitions/imageGen/outputdir" if="image.generator.gen.needed">
		<augment id="init.application.classpath">
			<!-- add the images binary output dir (directory where resources are generated (images resources) -->
			<pathelement location="${imageGen.bin.output.dir}"/>
		</augment>
		<loadproperties srcfile="${imageGeneratorInit.dir}/imagegen.properties" prefix="image.gen."/>
		<loadproperties srcfile="${imageGeneratorInit.dir}/../init-display/display.properties" prefix="imagen.display."/>

		<!-- check if there is no display on the platform. In this case, no need to launch the image generator! -->
		<condition property="image.generator.gen.needed.2" value="true">
			<not><equals arg1="${imagen.display.bpp}" arg2="-1"/></not>
		</condition>

		<!--
			_______________________________________________________
			|      Graphics Engine     | Image Encoding (any bpp) |
			|__________________________|__________________________|
			|   bpp    | memory layout |     sim    |     emb     |
			|__________|_______________|____________|_____________|
			| < 8 (Cx) | line          | line       | line        |
			| < 8 (Cx) | column (1)    | column (1) | column (1)  |
			| >= 8     | line          | line       | line        |
			| >= 8     | column (2)    | line       | column (2)  |
			|__________|_______________|____________|_____________|

			- column (1): 
				- follow the Cx specification: xx, xy, yx, yy
				- first encoded pixel: (0,0) == top-left
				- second encoded pixel: (1,0) or (0,1) 
				- RGB images (bpp >= 8) follows the memory layout "column"
			- column (2):
				- means "rotation" 90° anticlockwise
				- advanced option (not documented, not officially supported)
				- use "line" layouts (memory and byte) but on emb:
					- first encoded pixel: (0,h-1) == bottom-left
					- second encoded pixel: (0,h-2)
				- only useful on emb; on sim, keeps "line" encoding 
		-->
		<condition property="image.gen.memoryLayout" value="${imagen.display.memoryLayout}" else="line">
			<and>
				<isset property="image.generator.gen.needed.2"/>
				<or>
					<isset property="onBoard"/>
					<equals arg1="${imagen.display.bpp}" arg2="1"/>
					<equals arg1="${imagen.display.bpp}" arg2="2"/>
					<equals arg1="${imagen.display.bpp}" arg2="4"/>
				</or>
			</and>
		</condition>

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

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

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

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

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

		<!-- Define ImageGenerator classpath -->
		<!-- Please update ImageGenerator.isMeaningfulClasspathEntry(File) if this classpath is changed. -->
		<path id="imageGenerator.classpath.ref">
			<path location="${ej.imagegenerator.extension.project}/bin" description="no error when ${ej.imagegenerator.extension.project} not set or invalid"/>
			<fileset dir="${platform.dir}/tools" includes="imageGenerator*.jar" />
			<fileset dir="${platform.dir}/tools" includes="imagegenerator*.jar" />
			<fileset dir="${platform.dir}/tools" includes="imageio-*.jar"/>
		</path>

		<!-- image generator tool definition -->
		<taskdef name="ImageGenerator" classname="com.microej.graphicalengine.generator.ImageGeneratorTask"  classpathref="imageGenerator.classpath.ref"/>

		<!-- load the architecture properties files to get the architecture version -->
		<property file="${jpf.dir}/architecture.properties" prefix="imageGen.arch" description="no error if not exist"/>
	</target>

	<target name="definitions/imageGen" depends="definitions/imageGen/generator" />

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

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

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

	<target name="init/imageGen/internal/vm" extensionOf="init/execution" depends="init/imageGen/internal" if="internal.image.generator.lscf">
		<!-- add linker file -->
		<augment id="partialLink.lscf.path">
			<path location="${imageGen.bin.output.dir}"/>
		</augment>
	</target>

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

	<!--
		On VM, delete resource list and linker files: the generated images must not been included in microejapp.o.
		On S3, keep these files (linker file is useless) to simulate an external memory. 
	-->
	<target name="init/imageGen/external/vm" extensionOf="init/execution" depends="init/imageGen/external" if="onBoard">
		<delete failonerror="false">
			<fileset dir="${externalResources.output.dir}" erroronmissingdir="false" includes="*.resources.list"/>
			<fileset dir="${externalResources.output.dir}" erroronmissingdir="false" includes="*.lscf"/>
		</delete>
	</target>

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

	<target name="dyninit/imageGen/internal" extensionOf="dyninit/execution" depends="activity/imageGen" if="internal.image.generator.gen.needed">
		<dynImageGen prefix="internal" extension="${imageGen.list.internal.extension}" output.dir="${imageGen.bin.output.dir}"/>
	</target>

	<target name="dyninit/imageGen/internal/vm" extensionOf="dyninit/execution" depends="dyninit/imageGen/internal" if="internal.image.generator.lscf">
		<!-- add linker file -->
		<augment id="dynamicLink.lscf.path">
			<path location="${imageGen.bin.output.dir}"/>
		</augment>
	</target>

	<target name="dyninit/imageGen/external" extensionOf="dyninit/execution" depends="activity/imageGen">
		<property name="dyninit.images.external.dir" location="${externalResources.output.dir}"/>
		<dynImageGen prefix="external" extension="${imageGen.list.external.extension}" output.dir="${dyninit.images.external.dir}"/>
	</target>

	<!--
		On VM, delete resource list and linker files: the generated images must not been included in feature.
		On S3, keep these files (linker file is useless) to simulate an external memory. 
	-->
	<target name="dyninit/imageGen/external/vm" extensionOf="dyninit/execution" depends="dyninit/imageGen/external" if="onBoard">
		<delete failonerror="false">
			<fileset dir="${dyninit.images.external.dir}" erroronmissingdir="false" includes="*.resources.list"/>
			<fileset dir="${dyninit.images.external.dir}" erroronmissingdir="false" includes="*.lscf"/>
		</delete>
	</target>

	<macrodef name="imageGen">
		<attribute name="list.file" default=""/>
		<attribute name="list.patternset" default=""/>
		<attribute name="list.extension" default=""/>
		<attribute name="prefix"/>
		<attribute name="output.dir"/>
		<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="disableCache" default="false" />
		<sequential>
			<!-- convert -->
			<ImageGenerator
				classpath="@{classpath}"
				extraClasspaths="@{extra.classpaths}"
				list="@{list.file}" 
				pathSeparator="${path.separator}" 
				verboseLevel="${imagen.verbose}"
				endianness="${arch.endianness}"
				arch="${imageGen.arch.version}"
				bpp="${imagen.display.bpp}"
				pixel="${imagen.display.pixel}"
				alignment="${imagen.display.imageBuffer.memoryAlignment}"
				memoryLayout="${image.gen.memoryLayout}"
				byteLayout="${imagen.display.byteLayout}"
				outputDirectory="@{output.dir}"
				listExtension="@{list.extension}"
				disableCache="@{disableCache}"
			/>
		</sequential>
	</macrodef>

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