# Set output image preferences
OutputWidth=720
OutputHeight=540
BorderWidth=20
ThumbnailWidth=150
SeparatorWidth=10

from JascApp import *

def ScriptProperties():
	return {
		'Author': u'Andrew John Hardwick, 2004/4/3-5',
		'Copyright': u'GPL',
		'Description': u'Show corners against black to check cropping',
		'Host': u'Paint Shop Pro',
		'Host Version': u'8.10'
		}
def Do(Environment):
	# EnableOptimizedScriptUndo
	App.Do(Environment,'EnableOptimizedScriptUndo',{})

	# Get image size
	ImageInformation=App.Do(Environment,'ReturnImageInfo')
	Width=ImageInformation['Width']
	Height=ImageInformation['Height']

	# Rotate portrait to landscape to fit screen better
	if Width<Height:
		# Rotate image
		App.Do( Environment, 'Rotate90', {
			'GeneralSettings': {
				'ExecutionMode': App.Constants.ExecutionMode.Default, 
				'AutoActionMode': App.Constants.AutoActionMode.Match}})
		# Switch dimensions to match
		Temp=Width
		Width=Height
		Height=Temp

	# Add the black border
	App.Do( Environment, 'AddBorders', {
			'Bottom': BorderWidth, 
			'Left': BorderWidth, 
			'Right': BorderWidth, 
			'Symmetric': App.Constants.Boolean.true, 
			'Top': BorderWidth, 
			'Color': (0,0,0), 
			'DimUnits': App.Constants.UnitsOfMeasure.Pixels, 
			'GeneralSettings': {
				'ExecutionMode': App.Constants.ExecutionMode.Default, 
				'AutoActionMode': App.Constants.AutoActionMode.Match}})

	# Create thumbnail (duplicate layer, shrink, move to place safe for crop)
	App.Do( Environment, 'LayerDuplicate', {
			'GeneralSettings': {
				'ExecutionMode': App.Constants.ExecutionMode.Default, 
				'AutoActionMode': App.Constants.AutoActionMode.Match}})
	App.Do(Environment,'LayerProperties', {
			'General': {
				'Name': u'Thumbnail'}})
	App.Do( Environment, 'Resize', {
			'CurrentDimensionUnits': App.Constants.UnitsOfMeasure.Pixels, 
			'MaintainAspectRatio': App.Constants.Boolean.true, 
			'Resample': App.Constants.Boolean.true, 
			'ResampleType': App.Constants.ResampleType.SmartSize, 
			'ResizeAllLayers': App.Constants.Boolean.false, 
			'Width': ThumbnailWidth,
			# I don't know why it needs height if asp' ratio fixed but it does
			'Height': float(ThumbnailWidth)/float(Width)*float(Height),
			'GeneralSettings': {
				'ExecutionMode': App.Constants.ExecutionMode.Default, 
				'AutoActionMode': App.Constants.AutoActionMode.Match}})
	App.Do( Environment, 'Mover', {
			'Offset': (ThumbnailWidth/2-Width/2-BorderWidth,
				ThumbnailWidth/2-Height/2-BorderWidth), 
			'Object': App.Constants.LayerOrSelection.Layer, 
			'SelectPoint': None, 
			'GeneralSettings': {
				'ExecutionMode': App.Constants.ExecutionMode.Default, 
				'AutoActionMode': App.Constants.AutoActionMode.Match}})
	# Create fold (by mirror & flip) all corners to top left (as layers)
	App.Do( Environment, 'SelectLayer', {
			'Path': (0,-1,[],App.Constants.Boolean.false), 
			'GeneralSettings': {
				'ExecutionMode': App.Constants.ExecutionMode.Silent, 
				'AutoActionMode': App.Constants.AutoActionMode.Default
				}
			})
	App.Do( Environment, 'LayerDuplicate', {
			'GeneralSettings': {
				'ExecutionMode': App.Constants.ExecutionMode.Default, 
				'AutoActionMode': App.Constants.AutoActionMode.Match
				}
			})
	App.Do(Environment,'LayerProperties', {
			'General': {
				'Name': u'Mirrored'}})
	App.Do( Environment, 'Mirror', {
			'Mirror All Layers': App.Constants.Boolean.false, 
			'GeneralSettings': {
				'ExecutionMode': App.Constants.ExecutionMode.Default, 
				'AutoActionMode': App.Constants.AutoActionMode.Match
				}
			})
	App.Do( Environment, 'LayerDuplicate', {
			'GeneralSettings': {
				'ExecutionMode': App.Constants.ExecutionMode.Default, 
				'AutoActionMode': App.Constants.AutoActionMode.Match
				}
			})
	App.Do(Environment,'LayerProperties', {
			'General': {
				'Name': u'Mirrored & Flipped'}})
	App.Do( Environment, 'Flip', {
			'Flip All Layers': App.Constants.Boolean.false, 
			'GeneralSettings': {
				'ExecutionMode': App.Constants.ExecutionMode.Default, 
				'AutoActionMode': App.Constants.AutoActionMode.Match
				}
			})
	App.Do( Environment, 'SelectLayer', {
			'Path': (0,-2,[],App.Constants.Boolean.false), 
			'GeneralSettings': {
				'ExecutionMode': App.Constants.ExecutionMode.Silent, 
				'AutoActionMode': App.Constants.AutoActionMode.Default
				}
			})
	App.Do( Environment, 'LayerDuplicate', {
			'GeneralSettings': {
				'ExecutionMode': App.Constants.ExecutionMode.Default, 
				'AutoActionMode': App.Constants.AutoActionMode.Match
				}
			})
	App.Do(Environment,'LayerProperties', {
			'General': {
				'Name': u'Flipped'}})
	App.Do( Environment, 'Flip', {
			'Flip All Layers': App.Constants.Boolean.false, 
			'GeneralSettings': {
				'ExecutionMode': App.Constants.ExecutionMode.Default, 
				'AutoActionMode': App.Constants.AutoActionMode.Match
				}
			})

	# Crop all layers down to one corner
	App.Do( Environment, 'Crop', {
			'CropRect': ((0,0),(OutputWidth-SeparatorWidth)/2,
				(OutputHeight-SeparatorWidth)/2), 
			'Mode': App.Constants.CropMode.Custom, 
			'Units': App.Constants.CropUnits.Pixels, 
			'SelectedArea': App.Constants.Boolean.false, 
			'PrintWidth': (OutputWidth-SeparatorWidth)/2, 
			'PrintHeight': (OutputHeight-SeparatorWidth)/2, 
			'GeneralSettings': {
				'ExecutionMode': App.Constants.ExecutionMode.Default, 
				'AutoActionMode': App.Constants.AutoActionMode.Match
				}
			})

	# Expand canvas up to  size
	App.Do( Environment, 'ResizeCanvas', {
			'AspectRatio': 2, 
			'FillColor': (0,0,0), 
			'HoriPlace': App.Constants.HorizontalType.Left, 
			'MaintainAspect': App.Constants.Boolean.false, 
			'NewDimUnits': App.Constants.UnitsOfMeasure.Pixels, 
			'NewHeight': OutputHeight, 
			'NewWidth': OutputWidth, 
			'PlaceBottom': OutputHeight/2, 
			'PlaceLeft': 0, 
			'PlaceRight': OutputWidth/2, 
			'PlaceTop': 0, 
			'VertPlace': App.Constants.VerticalType.Top, 
			'GeneralSettings': {
				'ExecutionMode': App.Constants.ExecutionMode.Default, 
				'AutoActionMode': App.Constants.AutoActionMode.Match
				}
			})

	# Unfold the corners (unmirror & unflip the layers)
	App.Do( Environment, 'Flip', {
			'Flip All Layers': App.Constants.Boolean.false, 
			'GeneralSettings': {
				'ExecutionMode': App.Constants.ExecutionMode.Default, 
				'AutoActionMode': App.Constants.AutoActionMode.Match
				}
			})
	App.Do( Environment, 'SelectLayer', {
			'Path': (0,1,[],App.Constants.Boolean.false), 
			'GeneralSettings': {
				'ExecutionMode': App.Constants.ExecutionMode.Silent, 
				'AutoActionMode': App.Constants.AutoActionMode.Default
				}
			})
	App.Do( Environment, 'Mirror', {
			'Mirror All Layers': App.Constants.Boolean.false, 
			'GeneralSettings': {
				'ExecutionMode': App.Constants.ExecutionMode.Default, 
				'AutoActionMode': App.Constants.AutoActionMode.Match
				}
			})
	App.Do( Environment, 'SelectLayer', {
			'Path': (0,1,[],App.Constants.Boolean.false), 
			'GeneralSettings': {
				'ExecutionMode': App.Constants.ExecutionMode.Silent, 
				'AutoActionMode': App.Constants.AutoActionMode.Default
				}
			})
	App.Do( Environment, 'Flip', {
			'Flip All Layers': App.Constants.Boolean.false, 
			'GeneralSettings': {
				'ExecutionMode': App.Constants.ExecutionMode.Default, 
				'AutoActionMode': App.Constants.AutoActionMode.Match
				}
			})
	App.Do( Environment, 'Mirror', {
			'Mirror All Layers': App.Constants.Boolean.false, 
			'GeneralSettings': {
				'ExecutionMode': App.Constants.ExecutionMode.Default, 
				'AutoActionMode': App.Constants.AutoActionMode.Match
				}
			})

	# Put the thumbnail back in the middle
	App.Do( Environment, 'Mover', {
			'Offset': (OutputWidth/2-ThumbnailWidth/2,
				OutputHeight/2-ThumbnailWidth/2), 
			'Object': App.Constants.LayerOrSelection.Layer, 
			'SelectPoint': (ThumbnailWidth/2,ThumbnailWidth/2), 
			'GeneralSettings': {
				'ExecutionMode': App.Constants.ExecutionMode.Default, 
				'AutoActionMode': App.Constants.AutoActionMode.Match
				}
			})

	# Combine all the bits
	App.Do( Environment, 'LayerMergeAll', {
			'GeneralSettings': {
				'ExecutionMode': App.Constants.ExecutionMode.Default, 
				'AutoActionMode': App.Constants.AutoActionMode.Match
				}
			})

	# Fit the image to the window
	App.Do( Environment, 'FitToWindow', {
			'GeneralSettings': {
				'ExecutionMode': App.Constants.ExecutionMode.Default, 
				'AutoActionMode': App.Constants.AutoActionMode.Match
				}
			})