from JascApp import *

# Set contants
ResizeTo = 2048

def ScriptProperties():
    return {
        'Author': u'Andrew J. Hardwick, 2004/4/21',
        'Copyright': u'GPL',
        'Description': u'Shrink image to 2048 pixels in maximum extent preserving aspect ratio & adapting resolution correctly.',
        'Host': u'Paint Shop Pro 8',
        'Host Version': u'8.10'
        }

def Do(Environment):
	# EnableOptimizedScriptUndo
	App.Do(Environment,'EnableOptimizedScriptUndo',{})

	# Get image parameters
	ImageInformation=App.Do(Environment,'ReturnImageInfo')
	WidthFrom=ImageInformation['Width']
	HeightFrom=ImageInformation['Height']
	ResolutionFrom=ImageInformation['PixelsPerUnit']
	UnitFrom=ImageInformation['Unit']

	# Abort if already small enough
	if WidthFrom<=ResizeTo and HeightFrom<=ResizeTo:
	        return

	# Convert unit from read to write format
	if UnitFrom=='Centimeters': # NB USA spelling
		UnitTo=App.Constants.ResolutionUnits.PixelsPerCM
	else:
		UnitTo=App.Constants.ResolutionUnits.PixelsPerIn

	# Work out what to resize it to
	if WidthFrom>HeightFrom:
		WidthTo=ResizeTo
		HeightTo=float(ResizeTo)*float(HeightFrom)/float(WidthFrom)
	else:
		HeightTo=ResizeTo
		WidthTo=float(ResizeTo)*float(WidthFrom)/float(HeightFrom)

	# Work out new resolution
	ResolutionTo=ResolutionFrom*float(WidthTo)/float(WidthFrom)

	# Rescale
	App.Do( Environment, 'Resize', {
		'CurrentDimensionUnits': App.Constants.UnitsOfMeasure.Pixels, 
		'CurrentResolutionUnits': UnitTo, 
		'MaintainAspectRatio': App.Constants.Boolean.true, 
		'FromDimensionUnits': App.Constants.UnitsOfMeasure.Pixels,
		'FromResolutionUnits': UnitTo, 
		'Resample': App.Constants.Boolean.true, 
		'ResampleType': App.Constants.ResampleType.SmartSize, 
		'ResizeAllLayers': App.Constants.Boolean.true, 
		'Resolution': ResolutionTo, 
		'Width':WidthTo, 
		'Height':HeightTo, 
		'GeneralSettings': {
			'ExecutionMode': App.Constants.ExecutionMode.Silent, 
			'AutoActionMode': App.Constants.AutoActionMode.Match
}
            })

