//// Apply tone-mapping adjustment to a document// This script is executed by the Image > Adjustements > HDR Toning... menu item//$.localize = true;var g_StackScriptFolderPath = app.path + "/"+ localize("$$$/ScriptingSupport/InstalledScripts=Presets/Scripts") + "/"										+ localize("$$$/private/Exposuremerge/StackScriptOnly=Stack Scripts Only/");$.evalFile(g_StackScriptFolderPath + "StackSupport.jsx");// These should be added to Terminology.jsxconst eventRasterize               = app.charIDToTypeID('Rstr');const keyMerge                     = app.charIDToTypeID('Mrge');const classHistoryState            = app.charIDToTypeID('HstS');const enumLast                     = app.charIDToTypeID('Lst ');const keyCurrentHistoryState       = app.charIDToTypeID('CrnH');const kresetDocumentChanged        = app.stringIDToTypeID("resetDocumentChanged");// This should be in StackSupport.jsxfunction killLastHistoryState(){    // Select the last history state    var selDesc = new ActionDescriptor();    var selRef = new ActionReference();    selRef.putEnumerated( classHistoryState, typeOrdinal, enumLast );    selDesc.putReference( typeNULL, selRef );    executeAction( eventSelect, selDesc, DialogModes.NO );    // Nuke it    var delDesc = new ActionDescriptor();    var delRef = new ActionReference();    delRef.putProperty( classHistoryState, keyCurrentHistoryState );    delDesc.putReference( typeNULL, delRef );    executeAction( eventDelete, delDesc, DialogModes.NO );}// Create a base object to scope the rest of the functions in the filefunction ToneAdjuster(){	this.pluginName = "HDRToning";}toneAdjuster = new ToneAdjuster();// Version of flatten that'll ask first.  Returns true if it worked.toneAdjuster.askFlatten = function(){	if ((app.activeDocument.layers.length == 1)         && (app.activeDocument.activeLayer.isBackgroundLayer))		return true;	// Already flat	if (confirm( localize("$$$/HDRToning/ConfirmFlatten1=HDR Toning will flatten the document. Do you want to proceed?")))	{		app.activeDocument.flatten();		return true;	}	return false;}toneAdjuster.askRGB = function(){    if ((app.activeDocument.mode == DocumentMode.RGB)        || (app.activeDocument.mode == DocumentMode.GRAYSCALE))    return true;        if (confirm( localize("$$$/HDRToning/ConfirmRGB=HDR Toning only works in RGB color mode.  Do you want to convert the document to RGB?")))    {        app.activeDocument.changeMode( ChangeMode.RGB );        return true;    }    return false;}// This should be folded into convertNoDialog in StackSupport.jsxtoneAdjuster.convert32 = function(){	if (app.activeDocument.bitsPerChannel == BitsPerChannelType.THIRTYTWO)		return;    var desc3 = new ActionDescriptor();    desc3.putInteger( keyDepth, 32 );    desc3.putBoolean( keyMerge, true );    desc3.putBoolean( eventRasterize, false );	executeAction( eventConvertMode, desc3, DialogModes.NO );}toneAdjuster.doAdjustment = function(){    var removeHistory = false;        function doConversionNon32()    {        toneAdjuster.convert32();	// Make sure it's 32 bit        try {            convertFromHDR( resultDepth );        }        catch (err)        {            undoLastEvent();    // Leave it the depth we found it if canceled            removeHistory = true;   // Flag state containing this call must go too.        }    }    function doConversion32()    {        try {            convertFromHDR( resultDepth );        }        catch (err)        {            removeHistory = true;        }        toneAdjuster.convert32();   // This is a no-op if the conversion cancelled    }	if ((app.documents.length > 0) && this.askFlatten() && this.askRGB())	{        var depthMap = {'BitsPerChannelType.EIGHT': 8, 'BitsPerChannelType.SIXTEEN': 16, 'BitsPerChannelType.THIRTYTWO': 16};        var resultDepth = depthMap[app.activeDocument.bitsPerChannel];        var was32 = app.activeDocument.bitsPerChannel == BitsPerChannelType.THIRTYTWO;        var wasClean = app.activeDocument.saved;        // Group the convert to & from into a single operation        if (was32)            app.activeDocument.suspendHistory(localize("$$$/HDRToning/HDR_Tone_State_name=HDR Toning"),                                                 "doConversion32()");        else            // Group the convert up to 32 and convert down into a single operation            app.activeDocument.suspendHistory(localize("$$$/HDRToning/HDR_Tone_State_name=HDR Toning"),                                                 "doConversionNon32()");        // If the operation was canceled, remove the history state        if (removeHistory)        {            killLastHistoryState();            if (wasClean)				executeAction( kresetDocumentChanged, new ActionDescriptor(), DialogModes.NO );        }    }}// Set runtoneadjusterFromScript if you want to load this script w/o running it.if ((typeof(runtoneadjusterFromScript) == 'undefined')	|| (runtoneadjusterFromScript==false))	toneAdjuster.doAdjustment();