Licensestateerror=This is trial version of Coolorus. Either your settings do not allow plugins to access internet or our servers are temporarily unavailable errorinvalidProductForThisLicense=This license is not valid for this application. Mar 30, 2018 - Coolorus is a color wheel plugin for Adobe® Photoshop®, inspired. Each license key can be used to activate Coolorus on up to two.
Coolorus-2.5.jsx
/* |
* Globals |
* @type {Object} |
*/ |
varG, PSInstaller, PSU, e, errorMessage, psInstaller; |
varisWindows=$.os.match(/windows/i); |
varisMac=!isWindows; |
G= { |
/* INFO */ |
COMPANY:'MoonGorilla', |
CONTACT_INFO:'[email protected]', |
PRODUCT_NAME:'Coolorus 2.5', |
PRODUCT_ID:'com.moongorilla.coolorus2', |
PRODUCT_VERSION:'2.5.7', |
/* PRODUCTS */ |
/* Photoshop versions range */ |
/* Leave undefined for no limit */ |
MIN_VERSION:void15.2, |
MAX_VERSION:void16.9, |
/* Product Source Folders */ |
/* Leave undefined for no product to install */ |
/* Make sure tha paths (relative to the installer.jsx) do NOT start or end with '/' */ |
HTML_PANEL:'HTML', |
FLASH_PANEL:'', |
SCRIPT:isMac?'SCRIPTS' : '', |
MAC_PLUGIN:'', |
WIN_PLUGIN:'', |
EXTRA:void0, |
/* If you have a readme file to display, put it here (path and filename) */ |
README:'', |
/* System vs. User installation */ |
SYSTEM_INSTALL:isMac, |
/* DEBUG */ |
INSTALLER_VERSION:'0.1.1', |
ENABLE_LOG:false, |
LOG_FILE_PATH:File($.fileName).path, |
/* will be created as LOG_FILE_PATH / PRODUCT_NAME.log */ |
LOG_FILE:'', |
/* Array of RegExp for Files to be ignored (escape ' -> ') |
Possibly a very bad idea, because the HTML Panel Signing and Timestamping |
may easily get corrupted if something is missing in the folder. |
Examples: |
IGNORE : [ |
'^.w+', // starting with . |
'^_w+', // starting with _ |
] |
Leaving undefined means: don't ignore |
*/ |
IGNORE:void0, |
/* UTILS */ |
CURRENT_PATH:File($.fileName).path, |
CURRENT_PS_VERSION:app.version.split('.')[0] |
}; |
/* |
* Utility functions |
* Mostly borrowed from xbytor's xtools installer |
* http://sourceforge.net/projects/ps-scripts/files/xtools/ |
* License: http://www.opensource.org/licenses/bsd-license.php |
*/ |
PSU= (function(GLOBAL) { |
varcreateFolder, exceptionMessage, init, isMac, isWindows, log, that, throwFileError; |
that=this; |
this.enableLog=void0; |
this.logFile=void0; |
this.logFilePointer=void0; |
isWindows=function() { |
return$.os.match(/windows/i); |
}; |
isMac=function() { |
return!isWindows(); |
}; |
throwFileError=function(f, msg) { |
if (msgnull) { |
msg=''; |
} |
returnError.runtimeError(9002, ''+msg+'''+f+'': '+f.error+'.'); |
}; |
exceptionMessage=function(e) { |
varfname, str; |
fname=!e.fileName?'???' : decodeURI(e.fileName); |
str='tMessage: '+e.message+'ntFile: '+fname+'ntLine: '+ (e.line||'???') +'ntError Name: '+e.name+'ntError Number: '+e.number; |
if ($.stack) { |
str+='t'+$.stack; |
} |
returnstr; |
}; |
log=function(msg) { |
varfile; |
if (!that.enableLog) { |
return; |
} |
file=that.logFilePointer; |
if (!file.open('e')) { |
throwFileError(file, 'Unable to open Log file'); |
} |
file.seek(0, 2); |
if (!file.writeln(''+msg)) { |
returnthrowFileError(file, 'Unable to write to log file'); |
} |
}; |
createFolder=function(fptr) { |
varrc; |
if (fptrnull) { |
Error.runtimeError(19, 'No Folder name specified'); |
} |
if (fptr.constructorString) { |
fptr=newFolder(fptr); |
} |
/* Recursion if the arg is a File */ |
if (fptrinstanceofFile) { |
returncreateFolder(fptr.parent); |
} |
/* Are we done? */ |
if (fptr.exists) { |
returntrue; |
} |
if (!(fptrinstanceofFolder)) { |
log(fptr.constructor); |
Error.runtimeError(21, 'Folder is not a Folder?'); |
} |
if ((fptr.parent!=null) &&!fptr.parent.exists) { |
if (!createFolder(fptr.parent)) { |
returnfalse; |
} |
} |
/* eventually...! */ |
rc=fptr.create(); |
if (!rc) { |
Error.runtimeError(9002, 'Unable to create folder '+fptr+' ('+fptr.error+')nPlease create it manually and run this script again.'); |
} |
returnrc; |
}; |
deleteFolder=function(folder) { |
if(folderinstanceofFolder&&folder.exists) { |
varfiles=folder.getFiles(); |
for(vari=0; i<files.length; ++i) { |
varfile=files[i]; |
if(fileinstanceofFolder) { |
deleteFolder(file); |
} else { |
file.remove(); |
} |
} |
folder.remove(); |
} |
}; |
/* |
* Sets up the logging |
* @param {string} logFile Log file name |
* @param {Boolean} isLogEnabled To log or not to log... |
* @return {void} |
*/ |
init=function(logFile, isLogEnabled) { |
varfile; |
if (!isLogEnabled) { |
return; |
} |
/* LOG Stuff */ |
that.enableLog=isLogEnabled; |
that.logFile=logFile; |
/* Create Log File Pointer */ |
file=newFile(that.logFile); |
if (file.exists) { |
file.remove(); |
} |
if (!file.open('w')) { |
throwFileError(file, 'Unable to open Log file'); |
} |
if (isMac()) { |
file.lineFeed='unix'; |
} |
that.logFilePointer=file; |
}; |
return { |
'isMac': isMac, |
'exceptionMessage': exceptionMessage, |
'log': log, |
'createFolder': createFolder, |
'init': init, |
'deleteFolder': deleteFolder, |
}; |
})(this); |
PSInstaller= (function() { |
/* |
* Set globals and start the logging |
* @return {void} |
*/ |
functionPSInstaller() { |
/* set the log file name */ |
G.LOG_FILE=''+G.LOG_FILE_PATH+'/'+G.PRODUCT_NAME+'.log'; |
/* init the logging */ |
PSU.init(G.LOG_FILE, G.ENABLE_LOG); |
/* SCRIPT, FLASH_PANEL, etc. */ |
this.productsToInstall= []; |
/* All the folders to be copied (relative to the ASSETS path) */ |
this.foldersList= []; |
/* List of Deployed Files and Folder - to be used by the uninstaller */ |
this.installedFiles= []; |
this.installedFolders= []; |
PSU.log('n'+ (newDate()) +'ntCompany: '+G.COMPANY+'ntProduct: '+G.PRODUCT_NAME+'ntProduct version: '+G.PRODUCT_VERSION+'ntApp: '+BridgeTalk.appName+'ntApp Version: '+app.version+'ntOS: '+$.os+'ntLocale: '+$.locale+'n ---------------------------------------ntInstaller Version: '+G.INSTALLER_VERSION+'n'); |
return; |
} |
/* |
* App compatibility check |
* @return {} |
*/ |
PSInstaller.prototype.preflight=function() { |
var_ref; |
G.MIN_VERSION=G.MIN_VERSION||0; |
G.MAX_VERSION=G.MAX_VERSION||99; |
PSU.log('nPreflight n----------------------------'); |
if ((G.MIN_VERSION<= (_ref=G.CURRENT_PS_VERSION) &&_ref<=G.MAX_VERSION)) { |
PSU.log('OK: PS version '+G.CURRENT_PS_VERSION+' in the range ['+G.MIN_VERSION+', '+G.MAX_VERSION+']'); |
alert(''+G.COMPANY+' - '+G.PRODUCT_NAME+'nPress OK to start the installation.nThe process is going to be completed in a short while.'); |
returntrue; |
} else { |
PSU.log('nFAIL: PS version '+G.CURRENT_PS_VERSION+' not in the range ['+G.MIN_VERSION+', '+G.MAX_VERSION+']'); |
returnError.runtimeError(9002, 'Bad Photoshop version.n'+G.CURRENT_PS_VERSION+' not in the range ['+G.MIN_VERSION+', '+G.MAX_VERSION+']'); |
} |
}; |
/* |
* Depending on the PS version, sets the available products options |
* to install (@productsToInstall) and log them |
* @return {void} |
*/ |
PSInstaller.prototype.init=function() { |
vardependencyObj, product, that, _i, _len, _ref; |
that=this; |
/* Depending on the PS version, what to install |
(not the classiest way I know but it works) |
*/ |
dependencyObj= { |
'10': ['SCRIPT', 'MAC_PLUGIN', 'WIN_PLUGIN', 'EXTRA'], |
'11': ['FLASH_PANEL', 'SCRIPT', 'MAC_PLUGIN', 'WIN_PLUGIN', 'EXTRA'], |
'12': ['FLASH_PANEL', 'SCRIPT', 'MAC_PLUGIN', 'WIN_PLUGIN', 'EXTRA'], |
'13': ['FLASH_PANEL', 'SCRIPT', 'MAC_PLUGIN', 'WIN_PLUGIN', 'EXTRA'], |
'14': ['HTML_PANEL', 'SCRIPT', 'MAC_PLUGIN', 'WIN_PLUGIN', 'EXTRA'], |
'15': ['HTML_PANEL', 'SCRIPT', 'MAC_PLUGIN', 'WIN_PLUGIN', 'EXTRA'], |
'16': ['HTML_PANEL', 'SCRIPT', 'MAC_PLUGIN', 'WIN_PLUGIN', 'EXTRA'] |
}; |
/* Array */ |
this.productsToInstall=dependencyObj[G.CURRENT_PS_VERSION]; |
PSU.log('nItems to be installed n----------------------------'); |
_ref=this.productsToInstall; |
for (_i=0, _len=_ref.length; _i<_len; _i++) { |
product=_ref[_i]; |
PSU.log('- '+product); |
} |
}; |
PSInstaller.prototype.copy=function() { |
varallFiles, copyFiles, createRelativeFolder, destinationFolder, destinationPath, eachFolder, getFoldersList, ignoreRegExp, panelsPath, pluginsPath, product, saveFolder, scriptsPath, sourceFolder, that, _i, _j, _len, _len1, _ref, _ref1, _results; |
that=this; |
/* |
* [createRelativeFolder description] |
* @param {folder} destination the destination Folder |
* @param {folder} origin the original, existing Folder |
* @param {folder} base the Folder used as a base |
* @return {folder} a new created folder in the destination |
*/ |
createRelativeFolder=function(destination, origin, base) { |
vardestinationArray, destinationToWriteArray, destinationToWriteFolder, destinationToWriteString, originArray, originBaseArray; |
destinationArray=decodeURI(destination).toString().split('/'); |
originArray=decodeURI(origin).toString().split('/'); |
originBaseArray=decodeURI(base).toString().split('/'); |
originArray.splice(0, originBaseArray.length); |
destinationToWriteArray=destinationArray.concat(originArray); |
destinationToWriteString=destinationToWriteArray.join('/'); |
destinationToWriteFolder=Folder(destinationToWriteString); |
if (!destinationToWriteFolder.exists) { |
destinationToWriteFolder.create(); |
} |
PSU.log('Created Folder:t'+destinationToWriteFolder.fsName); |
that.installedFolders.push(''+destinationToWriteFolder.fsName); |
returndestinationToWriteFolder; |
}; |
/* |
* process the folder and fills the external |
* array of folders foldersList |
* @param {folder} folder |
* @return {void} |
*/ |
getFoldersList=function(folder) { |
vari, item, list, _i, _len; |
if (folder.constructorString) { |
folder=newFolder(folder); |
} |
list=folder.getFiles(); |
i=0; |
for (_i=0, _len=list.length; _i<_len; _i++) { |
item=list[_i]; |
if (iteminstanceofFolder) { |
that.foldersList.push(item); |
PSU.log('Folder: '+item.fsName); |
getFoldersList(item); |
} |
} |
}; |
/* |
* Copy Files to a Folder |
* @param {array} files Array of strings (File paths) |
* @param {string} folder Folder path to copy to |
* @return {void} |
*/ |
copyFiles=function(files, folder) { |
vareachFile, file, filesList, _i, _j, _len, _len1, _results; |
filesList= []; |
for (_i=0, _len=files.length; _i<_len; _i++) { |
file=files[_i]; |
filesList.push(decodeURI(file)); |
} |
_results= []; |
for (_j=0, _len1=filesList.length; _j<_len1; _j++) { |
eachFile=filesList[_j]; |
if (File(eachFile).exists) { |
File(eachFile).copy(''+folder+'/'+ (File(eachFile).name)); |
/* For the uninstaller */ |
that.installedFiles.push(''+folder+'/'+ (File(eachFile).name)); |
_results.push(PSU.log('Copied:tt'+ (File(eachFile).name))); |
} else { |
_results.push(void0); |
} |
} |
return_results; |
}; |
/* Routine */ |
_ref=this.productsToInstall; |
_results= []; |
for (_i=0, _len=_ref.length; _i<_len; _i++) { |
product=_ref[_i]; |
if (!G[product]) { |
PSU.log('n'+product+' - Nothing to installn'); |
continue; |
} |
switch (product) { |
case'SCRIPT': |
scriptsPath=''+app.path+'/'+ (localize('$$$/ScriptingSupport/InstalledScripts=Presets/Scripts')); |
destinationPath=''+scriptsPath+'/'+G.PRODUCT_NAME; |
break; |
case'FLASH_PANEL': |
panelsPath=''+ (G.SYSTEM_INSTALL?Folder.commonFiles:Folder.userData) +'/Adobe/CS'+ (G.CURRENT_PS_VERSION-7) +'ServiceManager/extensions'; |
destinationPath=''+panelsPath+'/'+G.PRODUCT_ID; |
break; |
case'HTML_PANEL': |
panelsPath=''+ (G.SYSTEM_INSTALL?Folder.commonFiles:Folder.userData) +'/Adobe/'+ (G.CURRENT_PS_VERSION'14'?'CEPServiceManager4':'CEP') +'/extensions'; |
destinationPath=''+panelsPath+'/'+G.PRODUCT_ID; |
break; |
case'MAC_PLUGIN': |
if ($.os.match(/windows/i)) { |
destinationPath=''; |
break; |
} |
pluginsPath=''+app.path+'/'+ (localize('$$$/private/Plugins/DefaultPluginFolder=Plug-Ins')); |
destinationPath=''+pluginsPath+'/'+G.COMPANY; |
break; |
case'WIN_PLUGIN': |
if (!$.os.match(/windows/i)) { |
destinationPath=''; |
break; |
} |
pluginsPath=''+app.path+'/'+ (localize('$$$/private/Plugins/DefaultPluginFolder=Plug-Ins')); |
destinationPath=''+pluginsPath+'/'+G.COMPANY; |
break; |
case'EXTRA': |
/* TODO */ |
destinationPath=G.EXTRA; |
} |
if (destinationPath'') { |
continue; |
} |
PSU.log('nnAdding '+product+'n----------------------------nDestination folder: '+ (Folder(destinationPath).fsName)); |
vardestFolderFile=newFolder(''+panelsPath+'/com.moongorilla.coolorus'); |
if(destFolderFile.exists) { |
try { |
PSU.deleteFolder(destFolderFile); |
} catch(e) {} |
} |
destFolderFile=newFolder(destinationPath); |
if(destFolderFile.exists) { |
PSU.log('Destination Folder exists. Removing...n'); |
try { |
PSU.deleteFolder(destFolderFile); |
} catch(e) {} |
} |
/* Create destination Folder */ |
if (PSU.createFolder(destinationPath)) { |
PSU.log('Destination Folder successfully created.n'); |
} else { |
PSU.log('ERROR! Can't create destination folder.'); |
} |
/* Create the Folder for the source from the string path */ |
sourceFolder=Folder(''+G.CURRENT_PATH+'/'+G[product]); |
if(G[product] !=''&&!sourceFolder.exists) { |
PSU.log('nFAIL: Installation files not found ['+G[product]+']. Have you extracted ZIP file first?'); |
throwError('Installation files could not be found. Have you extracted ZIP file?'); |
} |
/* Create the Folder for the destination from the string path */ |
destinationFolder=Folder(destinationPath); |
/* Reset the array containing all the folders to be created in the destination */ |
this.foldersList= []; |
/* Fill the foldersList */ |
PSU.log('List of Folders to be copied for the '+product+':'); |
/* Log is in the getFolderl */ |
getFoldersList(sourceFolder); |
/* Add the root folder to the list */ |
this.foldersList.unshift(sourceFolder); |
PSU.log('Folder: '+sourceFolder); |
/* Create Folders tree in destination */ |
PSU.log('nCreating Folders in destination and copying files:n'); |
/* RegExp for ignoring files to be copied */ |
ignoreRegExp=G.IGNORE?newRegExp(G.IGNORE.join('|'), 'i') : newRegExp('$.'); |
_ref1=this.foldersList; |
for (_j=0, _len1=_ref1.length; _j<_len1; _j++) { |
eachFolder=_ref1[_j]; |
saveFolder=createRelativeFolder(destinationFolder, eachFolder, sourceFolder); |
allFiles=eachFolder.getFiles(function(f) { |
if (finstanceofFolder) { |
returnfalse; |
} else { |
if ((f.name.match(ignoreRegExp)) !=null) { |
returnfalse; |
} |
returntrue; |
} |
}); |
if (allFiles.length) { |
copyFiles(allFiles, saveFolder); |
} |
} |
_results.push(PSU.log('nEnded copying files for '+product+'.')); |
} |
return_results; |
}; |
PSInstaller.prototype.wrapUp=function() { |
//alert('Complete!nAn installation LOG file has been created in:n' + G.LOG_FILE); |
alert('Complete! You must restart the application in order to use '+G.PRODUCT_NAME+', thank you!'); |
if (G.README) { |
return (File(''+G.CURRENT_PATH+'/'+G.README)).execute(); |
} |
}; |
PSInstaller.prototype.createUninstaller=function() { |
varuninstall, uninstaller; |
uninstall=function(files, folders) { |
vare, eachFile, eachFolder, file, folder, performInstallation, uninstallErrors, _i, _j, _len; |
if (!(performInstallation=confirm(''+G.PRODUCT_NAME+' Version '+G.PRODUCT_VERSION+' UninstallernAre you sure to remove '+G.PRODUCT_NAME+'?'))) { |
return; |
} |
uninstallErrors=false; |
G.LOG_FILE=''+G.LOG_FILE_PATH+'/'+G.PRODUCT_NAME+' Uninstaller.log'; |
/* init the logging */ |
PSU.init(G.LOG_FILE, G.ENABLE_LOG); |
PSU.log('n'+ (newDate()) +'ntCompany: '+G.COMPANY+'ntProduct: '+G.PRODUCT_NAME+'ntProduct version: '+G.PRODUCT_VERSION+'ntApp: '+BridgeTalk.appName+'ntApp Version: '+app.version+'ntOS: '+$.os+'ntLocale: '+$.locale+'n ---------------------------------------ntInstaller Version: '+G.INSTALLER_VERSION+'n'); |
PSU.log('nRemoving FILES...'); |
for (_i=0, _len=files.length; _i<_len; _i++) { |
eachFile=files[_i]; |
try { |
file=File(eachFile); |
PSU.log('Removing:t'+file.fsName+'...'); |
file.remove(); |
PSU.log('Done!'); |
} catch (_error) { |
e=_error; |
PSU.log('ERROR!'); |
uninstallErrors=true; |
} |
} |
PSU.log('---------------------------------------n Removing FOLDERS...'); |
for (_j=folders.length-1; _j>=0; _j+=-1) { |
eachFolder=folders[_j]; |
try { |
folder=Folder(eachFolder); |
PSU.log('Removing:t'+folder.fsName+'...'); |
folder.remove(); |
PSU.log('Done!'); |
} catch (_error) { |
e=_error; |
PSU.log('ERROR!'); |
uninstallErrors=true; |
} |
if (uninstallErrors) { |
alert('Something went wrong!nA uninstallation LOG file has been created in:n'+G.LOG_FILE+', please send it to '+G.CONTACT_INFO); |
throwError('Restart Photoshop and see if the product has been uninstalled anyway.'); |
} |
} |
returnalert(''+G.PRODUCT_NAME+' successfully RemovednPlease Restart Photoshop for the changes to take effect.'); |
}; |
uninstaller=newFile(''+G.CURRENT_PATH+'/Uninstall '+G.PRODUCT_NAME+'.jsx'); |
if (!uninstaller.open('w')) { |
throwFileError(uninstaller, 'Unable to Write the Uninstaller file'); |
} |
if (PSU.isMac()) { |
uninstaller.lineFeed='unix'; |
} |
uninstaller.writeln('var G = '+ (G.toSource())); |
/* This won't work :-/ |
uninstaller.writeln 'var PSU = #{PSU.toSource()}' |
*/ |
uninstaller.writeln('var PSU=(function(GLOBAL){var createFolder,exceptionMessage,init,isMac,isWindows,log,that,throwFileError;that=this;this.enableLog=void 0;this.logFile=void 0;this.logFilePointer=void 0;isWindows=function(){return $.os.match(/windows/i);};isMac=function(){return!isWindows();};throwFileError=function(f,msg){if(msgnull){msg=';}return Error.runtimeError(9002,'+msg+'+f+': '+f.error+'.');};exceptionMessage=function(e){var fname,str;fname=!e.fileName?'???':decodeURI(e.fileName);str=' Message: '+e.message+' File: '+fname+'tLine: '+(e.line||'???')+'ntError Name: '+e.name+'ntError Number: '+e.number;if($.stack){str+=' '+$.stack;}return str;};log=function(msg){var file;if(!that.enableLog){return;}file=that.logFilePointer;if(!file.open('e')){throwFileError(file,'Unable to open Log file');}file.seek(0,2);if(!file.writeln('+msg)){return throwFileError(file,'Unable to write to log file');}};createFolder=function(fptr){var rc;if(fptrnull){Error.runtimeError(19,'No Folder name specified');}if(fptr.constructorString){fptr=new Folder(fptr);}if(fptr instanceof File){return createFolder(fptr.parent);}if(fptr.exists){return true;}if(!(fptr instanceof Folder)){log(fptr.constructor);Error.runtimeError(21,'Folder is not a Folder?');}if((fptr.parent!=null)&&!fptr.parent.exists){if(!createFolder(fptr.parent)){return false;}}rc=fptr.create();if(!rc){Error.runtimeError(9002,'Unable to create folder '+fptr+' ('+fptr.error+') Please create it manually and run this script again.');}return rc;};init=function(logFile,isLogEnabled){var file;if(!isLogEnabled){return;}that.enableLog=isLogEnabled;that.logFile=logFile;file=new File(that.logFile);if(file.exists){file.remove();}if(!file.open('w')){throwFileError(file,'Unable to open Log file');}if(isMac()){file.lineFeed='unix';}that.logFilePointer=file;};return{'isMac':isMac,'exceptionMessage':exceptionMessage,'log':log,'createFolder':createFolder,'init':init};})(this);'); |
uninstaller.writeln('var filesToRemove = '+ (this.installedFiles.toSource()) +';'); |
uninstaller.writeln('var foldersToRemove = '+ (this.installedFolders.toSource()) +';'); |
uninstaller.writeln('var uninstall = '+ (uninstall.toSource()) +';'); |
uninstaller.writeln('uninstall(filesToRemove, foldersToRemove);'); |
returnuninstaller.close(); |
}; |
returnPSInstaller; |
})(); |
try { |
psInstaller=newPSInstaller(); |
psInstaller.preflight(); |
psInstaller.init(); |
psInstaller.copy(); |
psInstaller.createUninstaller(); |
psInstaller.wrapUp(); |
} catch (_error) { |
e=_error; |
errorMessage=e.message; |
PSU.log(errorMessage); |
alert('Something went wrong!n'+errorMessage+'nnIf you need further assistance please contact '+G.CONTACT_INFO+', thank you.'); |
} |
/* EOF */ |
'psInstaller'; |
commented Jun 4, 2017
JavaScript source fils for Coolorus 2.5 full version. Photoshop extension. officiel link: https://coolorus.com/ |
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment
Posted by5 years ago
Archived
How to install Coolorus into photoshop CC when I had it originally on photoshop CS5?
I bought Coolorus for photoshop cs5 originally In Janurary, then in March I bought photoshop CC. I can't seem to use Coolorus in CC but it still works in photoshop cs5! Is there a way to transfer it? also, I had Coolorus 1.0 then today, I bought 2.0 hoping it would install in CC automatically somehow. I got a file in .zpx format And it opens up in adobe extension manager cs6, but I don't have cs6 only CC, how do I install Coolorus for photoshop CC!?!?! Thanks!
67% Upvoted