Mini Kabibi Habibi
//
// 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();