# Helper function that can't be used as a theme.
BEGIN: Resize3x3
	INPUT: FixedPoint, targetWidth
	INPUT: FixedPoint, targetHeight
	INPUT: FixedPoint, sourceBorder
	INPUT: ImageRgbaU8, sourceImage
	INPUT: FixedPoint, sourceLeft
	INPUT: FixedPoint, sourceTop
	INPUT: FixedPoint, sourceWidth
	INPUT: FixedPoint, sourceHeight
	OUTPUT: ImageRgbaU8, targetImage
	CREATE: targetImage, targetWidth, targetHeight
	# Limit targetBorder
	MIN: targetBorder<FixedPoint>, targetWidth, targetHeight
	MUL: targetBorder, targetBorder, 0.3
	MIN: targetBorder, targetBorder, sourceBorder
	# Calculat dimensions
	ADD: sourceRight<FixedPoint>, sourceLeft, sourceWidth
	ADD: sourceBottom<FixedPoint>, sourceTop, sourceHeight
	ADD: sb2<FixedPoint>, sourceBorder, sourceBorder
	SUB: sbiw<FixedPoint>, sourceWidth, sb2
	SUB: sbih<FixedPoint>, sourceHeight, sb2
	#ADD: sbl<FixedPoint>, sourceLeft, sourceBorder
	#ADD: sbt<FixedPoint>, sourceTop, sourceBorder
	SUB: sbow<FixedPoint>, sourceRight, sourceBorder
	SUB: sboh<FixedPoint>, sourceBottom, sourceBorder
	ADD: pl<FixedPoint>, sourceLeft, sourceBorder
	ADD: pt<FixedPoint>, sourceTop, sourceBorder
	ADD: tb2<FixedPoint>, targetBorder, targetBorder
	SUB: tbiw<FixedPoint>, targetWidth, tb2
	SUB: tbih<FixedPoint>, targetHeight, tb2
	SUB: tbow<FixedPoint>, targetWidth, targetBorder
	SUB: tboh<FixedPoint>, targetHeight, targetBorder
	# Upper
	RESIZE_BILINEAR: scaled<ImageRgbaU8>, targetBorder, targetBorder, sourceImage, sourceLeft, sourceTop, sourceBorder, sourceBorder
	COPY: targetImage, 0, 0, scaled
	RESIZE_BILINEAR: scaled, tbiw, targetBorder, sourceImage, pl, sourceTop, sbiw, sourceBorder
	COPY: targetImage, targetBorder, 0, scaled
	RESIZE_BILINEAR: scaled, targetBorder, targetBorder, sourceImage, sbow, sourceTop, sourceBorder, sourceBorder
	COPY: targetImage, tbow, 0, scaled
	# Middle
	RESIZE_BILINEAR: scaled, targetBorder, tbih, sourceImage, sourceLeft, pt, sourceBorder, sbih
	COPY: targetImage, 0, targetBorder, scaled
	RESIZE_BILINEAR: scaled, tbiw, tbih, sourceImage, pl, pt, sbiw, sbih
	COPY: targetImage, targetBorder, targetBorder, scaled
	RESIZE_BILINEAR: scaled, targetBorder, tbih, sourceImage, sbow, pt, sourceBorder, sbih
	COPY: targetImage, tbow, targetBorder, scaled
	# Lower
	RESIZE_BILINEAR: scaled, targetBorder, targetBorder, sourceImage, sourceLeft, sboh, sourceBorder, sourceBorder
	COPY: targetImage, 0, tboh, scaled
	RESIZE_BILINEAR: scaled, tbiw, targetBorder, sourceImage, pl, sboh, sbiw, sourceBorder
	COPY: targetImage, targetBorder, tboh, scaled
	RESIZE_BILINEAR: scaled, targetBorder, targetBorder, sourceImage, sbow, sboh, sourceBorder, sourceBorder
	COPY: targetImage, tbow, tboh, scaled
END:

BEGIN: Diffuse3x3
	INPUT: FixedPoint, width
	INPUT: FixedPoint, height
	INPUT: FixedPoint, red
	INPUT: FixedPoint, green
	INPUT: FixedPoint, blue
	INPUT: FixedPoint, sourceLeft
	INPUT: FixedPoint, sourceTop
	INPUT: FixedPoint, sourceWidth
	INPUT: FixedPoint, sourceHeight
	INPUT: FixedPoint, preserved
	INPUT: ImageRgbaU8, atlas
	OUTPUT: ImageRgbaU8, colorImage
	# Scale by 1 / 255 so that 255 represents full intensity in atlas.
	MUL: normRed<FixedPoint>, red, 0.00392156862745
	MUL: normGreen<FixedPoint>, green, 0.00392156862745
	MUL: normBlue<FixedPoint>, blue, 0.00392156862745
	# Resize source region from the atlas.
	CALL: Resize3x3, rescaledImage<ImageRgbaU8>, width, height, preserved, atlas, sourceLeft, sourceTop, sourceWidth, sourceHeight
	GET_RED: diffuseMap<ImageU8>, rescaledImage
	GET_ALPHA: visibilityMap<ImageU8>, rescaledImage
	MUL: redImage<ImageU8>, diffuseMap, normRed
	MUL: greenImage<ImageU8>, diffuseMap, normGreen
	MUL: blueImage<ImageU8>, diffuseMap, normBlue
	PACK_RGBA: colorImage, redImage, greenImage, blueImage, visibilityMap
END:

BEGIN: FocusableDiffuse3x3
	INPUT: FixedPoint, width
	INPUT: FixedPoint, height
	INPUT: FixedPoint, red
	INPUT: FixedPoint, green
	INPUT: FixedPoint, blue
	INPUT: FixedPoint, sourceLeft
	INPUT: FixedPoint, sourceTop
	INPUT: FixedPoint, sourceWidth
	INPUT: FixedPoint, sourceHeight
	INPUT: FixedPoint, focusOffsetX
	INPUT: FixedPoint, focusOffsetY
	INPUT: FixedPoint, focused
	INPUT: FixedPoint, preserved
	INPUT: ImageRgbaU8, atlas
	OUTPUT: ImageRgbaU8, colorImage
	# Select image using the focused state.
	MUL: sourceOffsetX<FixedPoint>, focused, focusOffsetX
	MUL: sourceOffsetY<FixedPoint>, focused, focusOffsetY
	ADD: adjustedSourceLeft<FixedPoint>, sourceLeft, sourceOffsetX
	ADD: adjustedSourceTop<FixedPoint>, sourceTop, sourceOffsetY
	# Scale by 1 / 255 so that 255 represents full intensity in atlas.
	MUL: normRed<FixedPoint>, red, 0.00392156862745
	MUL: normGreen<FixedPoint>, green, 0.00392156862745
	MUL: normBlue<FixedPoint>, blue, 0.00392156862745
	# Resize source region from the atlas.
	CALL: Resize3x3, rescaledImage<ImageRgbaU8>, width, height, preserved, atlas, adjustedSourceLeft, adjustedSourceTop, sourceWidth, sourceHeight
	GET_RED: diffuseMap<ImageU8>, rescaledImage
	GET_ALPHA: visibilityMap<ImageU8>, rescaledImage
	MUL: redImage<ImageU8>, diffuseMap, normRed
	MUL: greenImage<ImageU8>, diffuseMap, normGreen
	MUL: blueImage<ImageU8>, diffuseMap, normBlue
	PACK_RGBA: colorImage, redImage, greenImage, blueImage, visibilityMap
END:

BEGIN: DiffuseSpecular3x3
	INPUT: FixedPoint, width
	INPUT: FixedPoint, height
	INPUT: FixedPoint, red
	INPUT: FixedPoint, green
	INPUT: FixedPoint, blue
	INPUT: FixedPoint, sourceLeft
	INPUT: FixedPoint, sourceTop
	INPUT: FixedPoint, sourceWidth
	INPUT: FixedPoint, sourceHeight
	INPUT: FixedPoint, preserved
	INPUT: ImageRgbaU8, atlas
	OUTPUT: ImageRgbaU8, colorImage
	# Scale by 1 / 255 so that 255 represents full intensity in atlas.
	MUL: normRed<FixedPoint>, red, 0.00392156862745
	MUL: normGreen<FixedPoint>, green, 0.00392156862745
	MUL: normBlue<FixedPoint>, blue, 0.00392156862745
	# Resize source region from the atlas.
	CALL: Resize3x3, rescaledImage<ImageRgbaU8>, width, height, preserved, atlas, sourceLeft, sourceTop, sourceWidth, sourceHeight
	GET_RED: diffuseMap<ImageU8>, rescaledImage
	GET_GREEN: specularMap<ImageU8>, rescaledImage
	GET_ALPHA: visibilityMap<ImageU8>, rescaledImage
	MUL: redImage<ImageU8>, diffuseMap, normRed
	MUL: greenImage<ImageU8>, diffuseMap, normGreen
	MUL: blueImage<ImageU8>, diffuseMap, normBlue
	ADD: redImage, redImage, specularMap
	ADD: greenImage, greenImage, specularMap
	ADD: blueImage, blueImage, specularMap
	PACK_RGBA: colorImage, redImage, greenImage, blueImage, visibilityMap
END:

BEGIN: PressableDiffuseSpecular3x3
	INPUT: FixedPoint, width
	INPUT: FixedPoint, height
	INPUT: FixedPoint, red
	INPUT: FixedPoint, green
	INPUT: FixedPoint, blue
	INPUT: FixedPoint, pressed
	INPUT: FixedPoint, sourceLeft
	INPUT: FixedPoint, sourceTop
	INPUT: FixedPoint, sourceWidth
	INPUT: FixedPoint, sourceHeight
	INPUT: FixedPoint, pressOffsetX
	INPUT: FixedPoint, pressOffsetY
	INPUT: FixedPoint, preserved
	INPUT: ImageRgbaU8, atlas
	OUTPUT: ImageRgbaU8, colorImage
	# Select image using the pressed state.
	MUL: sourceOffsetX<FixedPoint>, pressed, pressOffsetX
	MUL: sourceOffsetY<FixedPoint>, pressed, pressOffsetY
	ADD: adjustedSourceLeft<FixedPoint>, sourceLeft, sourceOffsetX
	ADD: adjustedSourceTop<FixedPoint>, sourceTop, sourceOffsetY
	# Rescale the source region to fit width and height, while applying the diffuse color and adding white shine.
	CALL: DiffuseSpecular3x3, colorImage, width, height, red, green, blue, adjustedSourceLeft, adjustedSourceTop, sourceWidth, sourceHeight, preserved, atlas
END:

BEGIN: DiffuseSpecular1x1
	INPUT: FixedPoint, width
	INPUT: FixedPoint, height
	INPUT: FixedPoint, red
	INPUT: FixedPoint, green
	INPUT: FixedPoint, blue
	INPUT: FixedPoint, sourceLeft
	INPUT: FixedPoint, sourceTop
	INPUT: FixedPoint, sourceWidth
	INPUT: FixedPoint, sourceHeight
	INPUT: FixedPoint, preserved
	INPUT: ImageRgbaU8, atlas
	OUTPUT: ImageRgbaU8, colorImage
	# Scale by 1 / 255 so that 255 represents full intensity in atlas.
	MUL: normRed<FixedPoint>, red, 0.00392156862745
	MUL: normGreen<FixedPoint>, green, 0.00392156862745
	MUL: normBlue<FixedPoint>, blue, 0.00392156862745
	# Resize source region from the atlas.
	RESIZE_BILINEAR: rescaledImage<ImageRgbaU8>, width, height, atlas, sourceLeft, sourceTop, sourceWidth, sourceHeight
	GET_RED: diffuseMap<ImageU8>, rescaledImage
	GET_GREEN: specularMap<ImageU8>, rescaledImage
	GET_ALPHA: visibilityMap<ImageU8>, rescaledImage
	MUL: redImage<ImageU8>, diffuseMap, normRed
	MUL: greenImage<ImageU8>, diffuseMap, normGreen
	MUL: blueImage<ImageU8>, diffuseMap, normBlue
	ADD: redImage, redImage, specularMap
	ADD: greenImage, greenImage, specularMap
	ADD: blueImage, blueImage, specularMap
	PACK_RGBA: colorImage, redImage, greenImage, blueImage, visibilityMap
END:

BEGIN: PressableDiffuseSpecular1x1
	INPUT: FixedPoint, width
	INPUT: FixedPoint, height
	INPUT: FixedPoint, red
	INPUT: FixedPoint, green
	INPUT: FixedPoint, blue
	INPUT: FixedPoint, pressed
	INPUT: FixedPoint, sourceLeft
	INPUT: FixedPoint, sourceTop
	INPUT: FixedPoint, sourceWidth
	INPUT: FixedPoint, sourceHeight
	INPUT: FixedPoint, pressOffsetX
	INPUT: FixedPoint, pressOffsetY
	INPUT: FixedPoint, preserved
	INPUT: ImageRgbaU8, atlas
	OUTPUT: ImageRgbaU8, colorImage
	# Select image using the pressed state.
	MUL: sourceOffsetX<FixedPoint>, pressed, pressOffsetX
	MUL: sourceOffsetY<FixedPoint>, pressed, pressOffsetY
	ADD: adjustedSourceLeft<FixedPoint>, sourceLeft, sourceOffsetX
	ADD: adjustedSourceTop<FixedPoint>, sourceTop, sourceOffsetY
	# Rescale the source region to fit width and height, while applying the diffuse color and adding white shine.
	CALL: DiffuseSpecular1x1, colorImage, width, height, red, green, blue, adjustedSourceLeft, adjustedSourceTop, sourceWidth, sourceHeight, preserved, atlas
END:

BEGIN: ListBox
	INPUT: FixedPoint, width
	INPUT: FixedPoint, height
	INPUT: FixedPoint, red
	INPUT: FixedPoint, green
	INPUT: FixedPoint, blue
	INPUT: FixedPoint, sourceLeft
	INPUT: FixedPoint, sourceTop
	INPUT: FixedPoint, sourceWidth
	INPUT: FixedPoint, sourceHeight
	INPUT: FixedPoint, preserved
	INPUT: ImageRgbaU8, atlas
	OUTPUT: ImageRgbaU8, colorImage
	# Rescale the source region to fit width and height, while applying the diffuse color.
	CALL: Diffuse3x3, colorImage, width, height, red, green, blue, sourceLeft, sourceTop, sourceWidth, sourceHeight, preserved, atlas
END:

BEGIN: VerticalScrollList
	INPUT: FixedPoint, width
	INPUT: FixedPoint, height
	INPUT: FixedPoint, red
	INPUT: FixedPoint, green
	INPUT: FixedPoint, blue
	OUTPUT: ImageRgbaU8, colorImage
	CREATE: visImage<ImageU8>, width, height
	CREATE: lumaImage<ImageU8>, width, height
	FADE_LINEAR: visImage, 0, 0, 128, width, 0, 0
	PACK_RGBA: colorImage, 0, 0, 0, visImage
END:

BEGIN: HorizontalScrollList
	INPUT: FixedPoint, width
	INPUT: FixedPoint, height
	INPUT: FixedPoint, red
	INPUT: FixedPoint, green
	INPUT: FixedPoint, blue
	OUTPUT: ImageRgbaU8, colorImage
	CREATE: visImage<ImageU8>, width, height
	CREATE: lumaImage<ImageU8>, width, height
	FADE_LINEAR: visImage, 0, 0, 128, 0, height, 0
	PACK_RGBA: colorImage, 0, 0, 0, visImage
END:
