diff --git a/rtdata/languages/Chinese (Simplified) b/rtdata/languages/Chinese (Simplified) index 675dec105..1eea9719a 100644 --- a/rtdata/languages/Chinese (Simplified) +++ b/rtdata/languages/Chinese (Simplified) @@ -1,17 +1,37 @@ -#01 2008-11-06 Yang Gao (grantyale) -#02 Updated by Forrest Sun +#00 Chinese (Simplified) +#01 2008-02-13 Forrest Sun +#02 2008-11-06 Yang Gao (grantyale) +#03 2013-10-20 Jiero +ABOUT_TAB_BUILD;版本 +ABOUT_TAB_CREDITS;感谢 +ABOUT_TAB_LICENSE;授权协议 +ABOUT_TAB_RELEASENOTES;发布说明 +ABOUT_TAB_SPLASH;Splash ADJUSTER_RESET_TO_DEFAULT;重置缺省参数 +BATCHQUEUE_AUTOSTART;自动开始 +BATCHQUEUE_DESTFILENAME;路径和文件名 +BATCH_PROCESSING;批量处理 +CURVEEDITOR_CURVES;曲线 +CURVEEDITOR_CURVE;曲线 +CURVEEDITOR_CUSTOM;自定义 +CURVEEDITOR_DARKS;暗 CURVEEDITOR_FILEDLGFILTERANY;任意文件 CURVEEDITOR_FILEDLGFILTERCURVE;曲线文件 +CURVEEDITOR_HIGHLIGHTS;高亮 +CURVEEDITOR_LIGHTS;光 CURVEEDITOR_LINEAR;线性 CURVEEDITOR_LOADDLGLABEL;正读取曲线... CURVEEDITOR_SAVEDLGLABEL;正保存曲线... +CURVEEDITOR_SHADOWS;阴影 CURVEEDITOR_TOOLTIPLINEAR;重置曲线 CURVEEDITOR_TOOLTIPLOAD;读取曲线 CURVEEDITOR_TOOLTIPSAVE;保存曲线 +CURVEEDITOR_TYPE;类型: +EDITWINDOW_TITLE;图片修改 EXIFFILTER_APERTURE;光圈 EXIFFILTER_CAMERA;相机 +EXIFFILTER_DIALOGLABEL;按Exif筛选 EXIFFILTER_FOCALLEN;焦距 EXIFFILTER_ISO;感光度 EXIFFILTER_LENS;镜头 @@ -30,29 +50,73 @@ EXIFPANEL_RESETALL;全部重置 EXIFPANEL_RESETHINT;重置所选标签内容 EXIFPANEL_RESET;重置 EXIFPANEL_SUBDIRECTORY;子文件夹 +EXPORT_BYPASS_ALL;(取消)选择全部 +EXPORT_FASTEXPORTOPTIONS;快速导出选项 +EXPORT_MAXHEIGHT;最大高度 +EXPORT_MAXWIDTH;最大宽度 +EXPORT_PUTTOQUEUEFAST; 放入快速导出序列 +EXPORT_RESIZEMETHOD;尺寸改变式 +EXTPROGTARGET_1;raw FILEBROWSER_APPLYPROFILE;应用配置 +FILEBROWSER_ARRANGEMENTHINT;切换缩略图对齐方式 +FILEBROWSER_CACHECLEARFROMFULL;清空缓存 +FILEBROWSER_CACHECLEARFROMPARTIAL;清理缓存 +FILEBROWSER_CACHE;缓存 FILEBROWSER_CLEARPROFILE;清空配置 FILEBROWSER_COPYPROFILE;复制配置 +FILEBROWSER_CURRENT_NAME;当前名称: FILEBROWSER_DELETEDLGLABEL;确认删除 FILEBROWSER_DELETEDLGMSG;确定删除所选的%1个文件? FILEBROWSER_EMPTYTRASHHINT;永久清空垃圾箱 FILEBROWSER_EMPTYTRASH;清空垃圾箱 +FILEBROWSER_EXEC_CPB;自定义档案制作工具 +FILEBROWSER_EXIFFILTERAPPLYHINT;文件浏览器Exif筛选开关 +FILEBROWSER_EXIFFILTERAPPLY;应用 +FILEBROWSER_EXIFFILTERLABEL;Exif筛选 +FILEBROWSER_EXIFFILTERSETTINGSHINT;更改Exif筛选设置 +FILEBROWSER_EXIFFILTERSETTINGS;设置 +FILEBROWSER_EXTPROGMENU;调用程序... +FILEBROWSER_NEW_NAME;新名称: +FILEBROWSER_OPENDEFAULTVIEWER;Windows 默认阅览工具 (序列) FILEBROWSER_PARTIALPASTEPROFILE;选择性粘贴 FILEBROWSER_PASTEPROFILE;粘贴配置 FILEBROWSER_POPUPCANCELJOB;取消任务 +FILEBROWSER_POPUPCOLORLABEL;彩色标帖 +FILEBROWSER_POPUPCOPYTO;复制至... +FILEBROWSER_POPUPFILEOPERATIONS;文件操作 FILEBROWSER_POPUPMOVEEND;移动到队列尾部 FILEBROWSER_POPUPMOVEHEAD;移动到队列头部 +FILEBROWSER_POPUPMOVETO;移动至... FILEBROWSER_POPUPOPEN;打开 +FILEBROWSER_POPUPPROCESSFAST;放入序列(快速导出) FILEBROWSER_POPUPPROCESS;放入队列 +FILEBROWSER_POPUPPROFILEOPERATIONS;处理色彩档案 +FILEBROWSER_POPUPRANK1;评 1 星 +FILEBROWSER_POPUPRANK2;评 2 星 +FILEBROWSER_POPUPRANK3;评 3 星 +FILEBROWSER_POPUPRANK4;评 4 星 +FILEBROWSER_POPUPRANK5;评 5 星 +FILEBROWSER_POPUPREMOVEINCLPROC;删除序列输出 +FILEBROWSER_POPUPREMOVESUBMENU;移除 FILEBROWSER_POPUPREMOVE;从文件系统中移除 FILEBROWSER_POPUPRENAME;重命名 FILEBROWSER_POPUPSELECTALL;全部选中 FILEBROWSER_POPUPTRASH;移动到垃圾箱 FILEBROWSER_POPUPUNRANK;取消星级 FILEBROWSER_POPUPUNTRASH;从垃圾箱中移除 +FILEBROWSER_PROCESSINGSETTINGSHINT;设置文件格式及输出文件夹 +FILEBROWSER_PROCESSINGSETTINGS;设置 +FILEBROWSER_QUERYBUTTONHINT;清除搜索序列 +FILEBROWSER_RANK1_TOOLTIP;Rank 1 *\nShortcut: Shift-1 +FILEBROWSER_RANK2_TOOLTIP;Rank 2 *\nShortcut: Shift-2 +FILEBROWSER_RANK3_TOOLTIP;Rank 3 *\nShortcut: Shift-3 +FILEBROWSER_RANK4_TOOLTIP;Rank 4 *\nShortcut: Shift-4 +FILEBROWSER_RANK5_TOOLTIP;Rank 5 *\nShortcut: Shift-5 FILEBROWSER_RENAMEDLGLABEL;文件重命名 FILEBROWSER_RENAMEDLGMSG;将"%1"更名为: +FILEBROWSER_SELECTDARKFRAME;选择暗幅... FILEBROWSER_SHOWDIRHINT;显示文件夹中所有图片 +FILEBROWSER_SHOWQUEUEHINT;显示队列内容 FILEBROWSER_SHOWRANK1HINT;显示1星图片 FILEBROWSER_SHOWRANK2HINT;显示2星图片 FILEBROWSER_SHOWRANK3HINT;显示3星图片 @@ -65,20 +129,39 @@ FILEBROWSER_STARTPROCESSING;开始处理 FILEBROWSER_STOPPROCESSINGHINT;停止处理图片 FILEBROWSER_STOPPROCESSING;停止处理 FILEBROWSER_THUMBSIZE;缩略图大小 +FILEBROWSER_USETEMPLATE;使用模版: FILEBROWSER_ZOOMINHINT;增大缩略图 FILEBROWSER_ZOOMOUTHINT;减小缩略图 GENERAL_ABOUT;关于 +GENERAL_AFTER;之后 +GENERAL_AUTO;自动 +GENERAL_BEFORE;之前 GENERAL_CANCEL;取消 +GENERAL_CLOSE;关闭 GENERAL_DISABLED;禁用 GENERAL_DISABLE;禁用 GENERAL_ENABLED;开启 GENERAL_ENABLE;启用 +GENERAL_FILE;文件 +GENERAL_HIGH_QUALITY;高质量 GENERAL_LANDSCAPE;横向 +GENERAL_LOAD;读取 GENERAL_NA;不适用 +GENERAL_NONE;无 GENERAL_NO;否 GENERAL_OK;确定 GENERAL_PORTRAIT;纵向 GENERAL_SAVE;保存 +GENERAL_UNCHANGED;(未改变) +GENERAL_WARNING;警告 +GENERAL_YES;是 +HISTOGRAM_BUTTON_BAR;RGB +HISTOGRAM_BUTTON_B;B +HISTOGRAM_BUTTON_G;G +HISTOGRAM_BUTTON_L;L +HISTOGRAM_BUTTON_RAW;Raw +HISTOGRAM_BUTTON_R;R +HISTOGRAM_LABEL;直方图 HISTOGRAM_TOOLTIP_B;显示/隐藏 蓝色直方图 HISTOGRAM_TOOLTIP_G;显示/隐藏 绿色直方图 HISTOGRAM_TOOLTIP_L;显示/隐藏 CIELAB 亮度直方图 @@ -166,12 +249,51 @@ HISTORY_MSG_75;调整大小方式 HISTORY_MSG_76;Exif元数据 HISTORY_MSG_77;IPTC元数据 HISTORY_MSG_78;Data specified for resize -HISTORY_MSG_79;Resize width -HISTORY_MSG_80;Resize height -HISTORY_MSG_81;Resize enabled +HISTORY_MSG_79;调整宽度 +HISTORY_MSG_80;调整高度 +HISTORY_MSG_81;调整尺寸开启 +HISTORY_MSG_89;降噪 +HISTORY_MSG_90;降噪 - 亮度 +HISTORY_MSG_92;降噪 - 伽马 +HISTORY_MSG_119;线性消噪 +HISTORY_MSG_122;自动暗幅 +HISTORY_MSG_123;暗幅文件 +HISTORY_MSG_124;线性曝光修正 +HISTORY_MSG_126;平场文件 +HISTORY_MSG_127;平场自动选择 +HISTORY_MSG_128;平场模糊半径 +HISTORY_MSG_129;平场模糊类型 +HISTORY_MSG_146;边缘锐化 +HISTORY_MSG_147;边缘锐化 - 单纯亮度 +HISTORY_MSG_158;力度 +HISTORY_MSG_159;边缘停止 +HISTORY_MSG_160;拉伸 +HISTORY_MSG_162;色阶映射 +HISTORY_MSG_173;降噪 - 亮度细节 +HISTORY_MSG_174;CIECAM02 +HISTORY_NEWSNAPSHOTAS;为... HISTORY_NEWSNAPSHOT;新建快照 +HISTORY_NEWSNAPSHOT_TOOLTIP;快捷键:Alt-s +HISTORY_NEWSSDIALOGLABEL;快照标签: +HISTORY_NEWSSDIALOGTITLE;添加新快照 +HISTORY_SETTO;设置为 HISTORY_SNAPSHOTS;系列快照 HISTORY_SNAPSHOT;快照 +ICMPANEL_FILEDLGFILTERANY;任意文件 +ICMPANEL_FILEDLGFILTERICM;ICC配置文件 +ICMPANEL_GAMMABEFOREINPUT;配置使用Gamma校正 +ICMPANEL_INPUTCAMERA;相机缺省 +ICMPANEL_INPUTCUSTOM;自定义 +ICMPANEL_INPUTDLGLABEL;选择输入ICC配置... +ICMPANEL_INPUTEMBEDDED;如可能,使用内置 +ICMPANEL_INPUTPROFILE;输入配置 +ICMPANEL_NOICM;No ICM: sRGB配置 +ICMPANEL_OUTPUTDLGLABEL;选择输出ICC配置... +ICMPANEL_OUTPUTPROFILE;输出配置 +ICMPANEL_SAVEREFERENCE;保存参考图片用于生成配置信息 +ICMPANEL_WORKINGPROFILE;当前配置 +IMAGEAREA_DETAILVIEW;细节视图 +IPTCPANEL_AUTHORHINT;作者姓名 IPTCPANEL_AUTHORSPOSITIONHINT;作者头衔 IPTCPANEL_AUTHORSPOSITION;作者职位 IPTCPANEL_AUTHOR;作者 @@ -213,51 +335,90 @@ IPTCPANEL_TITLEHINT;作品的名称 IPTCPANEL_TITLE;标题 IPTCPANEL_TRANSREFERENCEHINT;原始发送地点代码 IPTCPANEL_TRANSREFERENCE;传输基准 +MAIN_BUTTON_EXIT;退出 +MAIN_BUTTON_FULLSCREEN;全屏幕 MAIN_BUTTON_PREFERENCES;参数设置 +MAIN_BUTTON_QUEUE;放入序列 MAIN_BUTTON_SAVEAS;为... MAIN_BUTTON_SAVE;保存图片 +MAIN_BUTTON_SAVE_TOOLTIP;保存当前图像。\n快捷键:Ctrl+S MAIN_BUTTON_SENDTOEDITOR;发送到编辑器 +MAIN_BUTTON_SENDTOEDITOR_TOOLTIP;使用外部工具编辑当前图像。\n快捷键:Ctrl+E MAIN_FRAME_BATCHQUEUE;批量处理序列 MAIN_FRAME_FILEBROWSER;文件浏览 MAIN_FRAME_PLACES;位置 -MAIN_FRAME_PLACES_ADD;Add -MAIN_FRAME_PLACES_DEL;Del +MAIN_FRAME_PLACES_ADD;添加 +MAIN_FRAME_PLACES_DEL;删除 MAIN_FRAME_RECENT;最近使用的文件夹 MAIN_MSG_ALREADYEXISTS;该文件已存在 MAIN_MSG_CANNOTLOAD;无法加载图片 MAIN_MSG_CANNOTSAVE;文件保存中出错 MAIN_MSG_CANNOTSTARTEDITOR;无法启动编辑器 MAIN_MSG_CANNOTSTARTEDITOR_SECONDARY;请在“首选项“对话框设置正确的路径。 +MAIN_MSG_EXITJOBSINQUEUEINFO;退出时队列中未处理的图片将被丢弃。 +MAIN_MSG_EXITJOBSINQUEUEQUEST;队列中尚有图片未处理,确认退出? +MAIN_MSG_JOBSINQUEUE;任务列队中 MAIN_MSG_QOVERWRITE;是否覆盖? +MAIN_TAB_BASIC;基本 MAIN_TAB_COLOR;色彩 MAIN_TAB_DETAIL;详细 -MAIN_TAB_DEVELOP;Develop +MAIN_TAB_DEVELOP;图片开发 MAIN_TAB_EXIF;Exif MAIN_TAB_EXPOSURE;曝光 -MAIN_TAB_FILTER;Filter +MAIN_TAB_FILTER;滤镜 +MAIN_TAB_ICM;ICM MAIN_TAB_IPTC;IPTC MAIN_TAB_METADATA;元数据 +MAIN_TAB_RAW;Raw +MAIN_TAB_RAW_TOOLTIP;快捷键:Alt-R MAIN_TAB_TAGGING;标签 MAIN_TAB_TRANSFORM;转换 +MAIN_TOOLTIP_HIDEFP;显示/隐藏底部面板 (目录和文件浏览器,快捷键: F) MAIN_TOOLTIP_HIDEHP;显示/隐藏左面板 (包含历史, 快捷键: H) MAIN_TOOLTIP_INDCLIPPEDH;高光溢出提示 MAIN_TOOLTIP_INDCLIPPEDS;阴影不足提示 +MAIN_TOOLTIP_PREFERENCES;设置参数 MAIN_TOOLTIP_QINFO;图片快捷信息 +MAIN_TOOLTIP_SAVEAS;图片存于指定文件夹 +MAIN_TOOLTIP_SAVE;图片存于缺省文件夹 +MAIN_TOOLTIP_THRESHOLD;阀值 +NAVIGATOR_XY_FULL;宽 = %1, 高 = %2 +NAVIGATOR_XY_NA;x = n/a, y = n/a PARTIALPASTE_BASICGROUP;基本设置 PARTIALPASTE_CACORRECTION;色彩校正 +PARTIALPASTE_CHANNELMIXER;通道混合器 PARTIALPASTE_COARSETRANS;90度旋转/翻转 +PARTIALPASTE_COLORAPP;CIECAM02 国际照明协会色彩显示框架2002 +PARTIALPASTE_COLORBOOST;色彩增强 +PARTIALPASTE_COLORDENOISE;色彩降噪 PARTIALPASTE_COLORGROUP;色彩相关设定 +PARTIALPASTE_COLORMIXER;色彩混合器 +PARTIALPASTE_COLORSHIFT;色彩偏移 +PARTIALPASTE_COMMONTRANSFORMPARAMS;自动填充 PARTIALPASTE_COMPOSITIONGROUP;构图设置 PARTIALPASTE_CROP;剪裁 +PARTIALPASTE_DARKFRAMEAUTOSELECT;暗幅自动选择 +PARTIALPASTE_DARKFRAMEFILE;暗幅文件 PARTIALPASTE_DIALOGLABEL;选择性粘贴配置 PARTIALPASTE_DISTORTION;形变校正 PARTIALPASTE_EXIFCHANGES;对exif所做的修改 PARTIALPASTE_EXPOSURE;曝光 +PARTIALPASTE_HLRECOVERY;高感光修复 PARTIALPASTE_ICMSETTINGS;ICM 设置 PARTIALPASTE_IPTCINFO;IPTC 信息 +PARTIALPASTE_LABCURVE;Lab调整 PARTIALPASTE_LENSGROUP;镜头相关设置 +PARTIALPASTE_LENSPROFILE;镜片修正档案 PARTIALPASTE_LUMACURVE;亮度曲线 +PARTIALPASTE_LUMADENOISE;亮度降噪 +PARTIALPASTE_LUMINANCEGROUP;亮度相关设置 PARTIALPASTE_METAICMGROUP;元数据/ICM 设置 +PARTIALPASTE_PERSPECTIVE;视角 +PARTIALPASTE_PREPROCESS_GREENEQUIL;绿平衡 +PARTIALPASTE_PREPROCESS_LINEDENOISE;线性噪点滤镜 +PARTIALPASTE_RAWCACORR_AUTO;CA自动更正 +PARTIALPASTE_RAWCACORR_CABLUE;CA蓝 +PARTIALPASTE_RAWCACORR_CARED;CA红 PARTIALPASTE_RESIZE;缩放 PARTIALPASTE_ROTATION;旋转 PARTIALPASTE_SHADOWSHIGHLIGHTS;阴影/高光 @@ -273,6 +434,9 @@ PREFERENCES_CACHEFORMAT1;专有格式 (快速高质量) PREFERENCES_CACHEFORMAT2;JPEG (较小文件) PREFERENCES_CACHEMAXENTRIES;最大缓存数量 PREFERENCES_CACHEOPTS;缓存选项 +PREFERENCES_CACHESTRAT1;较高速度 +PREFERENCES_CACHESTRAT2;较低内存占用率 +PREFERENCES_CACHESTRAT;缓存方案 PREFERENCES_CACHETHUMBFORM;缩略图缓存格式 PREFERENCES_CACHETHUMBHEIGHT;最大缩略图高度 PREFERENCES_CLEARDLG_LINE1;正在清空缓存 @@ -280,10 +444,15 @@ PREFERENCES_CLEARDLG_LINE2;可能需要数秒钟时间。 PREFERENCES_CLEARDLG_TITLE;请稍等 PREFERENCES_CLIPPINGIND;高光溢出提示 PREFERENCES_CMETRICINTENT;色彩模式 +PREFERENCES_D50;5000K +PREFERENCES_D55;5500K +PREFERENCES_D60;6000K +PREFERENCES_D65;6500K PREFERENCES_DATEFORMATHINT;可以使用下列控制符:\n%y : 年\n%m : 月h\n%d : 日\n\n例如,中文日期格式:\n%y/%m/%d PREFERENCES_DATEFORMAT;日期格式 PREFERENCES_DEFAULTLANG;缺省语言 PREFERENCES_DEFAULTTHEME;默认主题 +PREFERENCES_DEMOSAICINGALGO;马赛克还原算法 PREFERENCES_DIRHOME;用户文件路径 PREFERENCES_DIRLAST;上次访问路径 PREFERENCES_DIROTHER;其他 @@ -295,10 +464,13 @@ PREFERENCES_EXTERNALEDITOR;外部编辑器 PREFERENCES_FALSECOLOR;虚假色彩压缩步骤 PREFERENCES_FBROWSEROPTS;文件浏览选项 PREFERENCES_FILEFORMAT;文件格式 +PREFERENCES_FLATFIELDFOUND;找到 +PREFERENCES_FLATFIELD;平场 PREFERENCES_FORIMAGE;用于图片文件 PREFERENCES_FORRAW;用于Raw文件 PREFERENCES_GIMPPATH;GIMP安装文件夹 PREFERENCES_GTKTHEME;GTK默认 +PREFERENCES_HINT;提示 PREFERENCES_HLTHRESHOLD;高光溢出阈值 PREFERENCES_ICCDIR;ICC配置路径 PREFERENCES_IMPROCPARAMS;缺省图片处理参数 @@ -306,9 +478,12 @@ PREFERENCES_INTENT_ABSOLUTE;绝对色彩模式 PREFERENCES_INTENT_PERCEPTUAL;感知模式 PREFERENCES_INTENT_RELATIVE;相对色彩模式 PREFERENCES_INTENT_SATURATION;饱和度 +PREFERENCES_LIVETHUMBNAILS;实时缩略图(较慢) +PREFERENCES_MENUGROUPRANK;组 "评价" PREFERENCES_MONITORICC;显示器配置 PREFERENCES_OUTDIRFOLDERHINT;将已寸图片放至所选文件夹 PREFERENCES_OUTDIRFOLDER;保存至文件夹 +PREFERENCES_OUTDIRHINT;可以使用下列控制符:\n%f, %d1, %d2, ..., %p1, %p2, ...\n\n这些控制符指向RAW文件所在文件夹及子文件夹。\n\n例如 假如 /home/tom/image/02-09-2006/dsc0012.nef已经打开,控制符的意义如下:\n%f=dsc0012, %d1=02-09-2006, %d2=image, ...\n%p1=/home/tom/image/02-09-2006, %p2=/home/tom/image, p3=/home/tom, ...\n\n如果想将输出文件保存到输入文件所在位置:\n%p1/%f\n\n如果想将输出文件保存至输入文件夹内的'converted'子文件夹:\n%p1/converted/%f\n\n如果想将输出文件保存至 '/home/tom/converted' 并保留按日期所分的子文件夹:\n%p2/converted/%d1/%f PREFERENCES_OUTDIRTEMPLATEHINT;可以使用下列控制符:\n%f, %d1, %d2, ..., %p1, %p2, ...\n\n这些控制符指向RAW文件所在文件夹及子文件夹。\n\n例如 假如 /home/tom/image/02-09-2006/dsc0012.nef已经打开,控制符的意义如下:\n%f=dsc0012, %d1=02-09-2006, %d2=image, ...\n%p1=/home/tom/image/02-09-2006, %p2=/home/tom/image, p3=/home/tom, ...\n\n如果想将输出文件保存到输入文件所在位置:\n%p1/%f\n\n如果想将输出文件保存至输入文件夹内的'converted'子文件夹:\n%p1/converted/%f\n\n如果想将输出文件保存至 '/home/tom/converted' 并保留按日期所分的子文件夹:\n%p2/converted/%d1/%f PREFERENCES_OUTDIRTEMPLATE;使用模板 PREFERENCES_OUTDIR;输出路径 @@ -323,28 +498,37 @@ PREFERENCES_PROFILEPRFILE;与图片并列存放的配置文件 PREFERENCES_PROFILESAVECACHE;将配置文件写至缓存 PREFERENCES_PROFILESAVEINPUT;将配置文件与图片并列存放 PREFERENCES_PSPATH;Adobe Photoshop安装路径 +PREFERENCES_SELECTICCDIRDLG;选择ICC路径... PREFERENCES_SELECTLANG;选择语言 +PREFERENCES_SELECTMONITORPROFDLG;选择显示器ICC路径... PREFERENCES_SELECTTHEME;选择主题 PREFERENCES_SHOWBASICEXIF;显示基本Exif信息 PREFERENCES_SHOWDATETIME;显示时间日期 +PREFERENCES_SHOWONLYRAW;仅显示Raw文件 PREFERENCES_SHTHRESHOLD;阴影过暗阈值 PREFERENCES_STARTUPIMDIR;启动时路径 PREFERENCES_TAB_BROWSER;文件浏览器 PREFERENCES_TAB_COLORMGR;色彩管理 PREFERENCES_TAB_GENERAL;一般 PREFERENCES_TAB_IMPROC;图片处理 +PREFERENCES_TAB_OUTPUT;输出选项 +PREFERENCES_THUMBSIZE;缩略图大小 PROFILEPANEL_FILEDLGFILTERANY;任意文件 PROFILEPANEL_FILEDLGFILTERPP;处理参数配置 PROFILEPANEL_LABEL;处理参数配置 PROFILEPANEL_LOADDLGLABEL;加载处理参数为... PROFILEPANEL_PCUSTOM;自定义 PROFILEPANEL_PFILE;由文件 +PROFILEPANEL_PLASTPHOTO;上次图片 PROFILEPANEL_PLASTSAVED;上次保存 +PROFILEPANEL_PROFILE;配置 PROFILEPANEL_SAVEDLGLABEL;保存处理参数为... PROFILEPANEL_TOOLTIPCOPY;将当前配置复制到剪贴板 PROFILEPANEL_TOOLTIPLOAD;由文件加载配置 PROFILEPANEL_TOOLTIPPASTE;从剪贴板粘贴配置 PROFILEPANEL_TOOLTIPSAVE;保存当前配置 +PROGRESSBAR_DECODING;Raw文件解码中... +PROGRESSBAR_DEMOSAICING;马赛克还原中... PROGRESSBAR_LOADING;图片加载中... PROGRESSBAR_LOADJPEG;JPEG文件加载中... PROGRESSBAR_LOADPNG;PNG文件加载中... @@ -357,17 +541,25 @@ PROGRESSBAR_SAVETIFF;TIFF文件保存中... PROGRESSDLG_LOADING;正在读取文件... PROGRESSDLG_PROCESSING;正在处理图像... PROGRESSDLG_SAVING;保存文件中... +QINFO_FOCALLENGTH;焦距 QINFO_ISO;感光度 +QINFO_LENS;Lens QINFO_NOEXIF;Exif数据不可用. SAVEDLG_FILEFORMAT;文件格式 +SAVEDLG_FORCEFORMATOPTS;强制保存选项 SAVEDLG_JPEGQUAL;JPEG质量 SAVEDLG_JPGFILTER;JPEG文件 SAVEDLG_PNGCOMPR;PNG压缩 -SAVEDLG_PUTTOQUEUEHEAD;Put to the head of the processing queue -SAVEDLG_PUTTOQUEUETAIL;Put to the end of the processing queue +SAVEDLG_PNGFILTER;PNG文件 +SAVEDLG_PUTTOQUEUEHEAD;放在处理序列首位 +SAVEDLG_PUTTOQUEUETAIL;放在处理序列末位 SAVEDLG_PUTTOQUEUE;放入队列 SAVEDLG_SAVEIMMEDIATELY;立即保存 SAVEDLG_SAVESPP;随图片保存处理参数 +SAVEDLG_SUBSAMP;二次抽样 +SAVEDLG_SUBSAMP_1;极限压缩 +SAVEDLG_SUBSAMP_2;平衡 +SAVEDLG_SUBSAMP_3;质量至优 SAVEDLG_TIFFFILTER;TIFF文件 TOOLBAR_TOOLTIP_CROP;剪裁选择 (快捷键: C) TOOLBAR_TOOLTIP_HAND;手形工具 (快捷键: N) @@ -385,6 +577,12 @@ TP_COARSETRAF_TOOLTIP_HFLIP;水平翻转 TP_COARSETRAF_TOOLTIP_ROTLEFT;左转 TP_COARSETRAF_TOOLTIP_ROTRIGHT;右转 TP_COARSETRAF_TOOLTIP_VFLIP;竖直翻转 +TP_COLORAPP_EQUAL;平均 +TP_COLORAPP_SURROUND_AVER;平均 +TP_COLORAPP_SURROUND_DARK;暗 +TP_COLORAPP_SURROUND_DIM;暗淡 +TP_COLORAPP_TCMODE_BRIGHTNESS;亮度 +TP_COLORAPP_TCMODE_LIGHTNESS;光度 TP_COLORBOOST_ACHANNEL;通道 "a" TP_COLORBOOST_AMOUNT;程度 TP_COLORBOOST_AVOIDCOLORCLIP;避免色彩溢出 @@ -419,6 +617,9 @@ TP_CROP_X;x TP_CROP_Y;y TP_DISTORTION_AMOUNT;程度 TP_DISTORTION_LABEL;失真 +TP_EPD_LABEL;色阶映射 +TP_EPD_SCALE;拉伸 +TP_EPD_STRENGTH;力度 TP_EXPOSURE_AUTOLEVELS;自动色阶 TP_EXPOSURE_BLACKLEVEL;黑 TP_EXPOSURE_BRIGHTNESS;亮度 @@ -429,6 +630,13 @@ TP_EXPOSURE_CONTRAST;对比度 TP_EXPOSURE_CURVEEDITOR;影调曲线 TP_EXPOSURE_EXPCOMP;曝光补偿 TP_EXPOSURE_LABEL;曝光 +TP_EXPOSURE_TCMODE_STANDARD;标准 +TP_FLATFIELD_AUTOSELECT;自动选择 +TP_FLATFIELD_BLURRADIUS;模糊半径 +TP_FLATFIELD_BLURTYPE;模糊种类 +TP_FLATFIELD_BT_AREA;区域 +TP_FLATFIELD_BT_HORIZONTAL;水平 +TP_FLATFIELD_BT_VERTHORIZ;垂直 + 水平 TP_HLREC_CIELAB;CIELab模式混合 TP_HLREC_COLOR;色彩延伸 TP_HLREC_LABEL;高光还原 @@ -444,9 +652,16 @@ TP_ICM_INPUTEMBEDDED;如可能,使用内置 TP_ICM_INPUTPROFILE;输入配置 TP_ICM_LABEL;ICM TP_ICM_NOICM;No ICM: sRGB配置 +TP_ICM_OUTPUTDLGLABEL;选择输出ICC配置... TP_ICM_OUTPUTPROFILE;输出配置 TP_ICM_SAVEREFERENCE;保存参考图片用于生成配置信息 TP_ICM_WORKINGPROFILE;当前配置 +TP_IMPULSEDENOISE_THRESH;阈值 +TP_LABCURVE_BWTONING;黑白色调 +TP_LABCURVE_CONTRAST;对比度 +TP_LABCURVE_LABEL;Lab调整 +TP_LENSGEOM_AUTOCROP;自动剪切 +TP_LENSGEOM_FILL;自动填充 TP_LUMACURVE_BLACKLEVEL;黑点 TP_LUMACURVE_BRIGHTNESS;亮度 TP_LUMACURVE_COMPRHIGHLIGHTS;高光压缩 @@ -454,15 +669,24 @@ TP_LUMACURVE_COMPRSHADOWS;阴影压缩 TP_LUMACURVE_CONTRAST;对比度 TP_LUMACURVE_CURVEEDITOR;亮度曲线 TP_LUMACURVE_LABEL;亮度曲线 +TP_LUMADENOISE_EDGETOLERANCE;边缘容差 +TP_LUMADENOISE_LABEL;亮度噪点抑制 +TP_LUMADENOISE_RADIUS;半径 +TP_RAWCACORR_AUTO;自动修正 TP_RESIZE_BICUBICSF;双三次 (柔化) TP_RESIZE_BICUBICSH;双三次 (锐化) TP_RESIZE_BICUBIC;双三次 TP_RESIZE_BILINEAR;双线性 +TP_RESIZE_FULLIMAGE;全图 +TP_RESIZE_FULLSIZE;全照片尺寸: +TP_RESIZE_HEIGHT;高度 TP_RESIZE_H;高: TP_RESIZE_LABEL;调整大小 TP_RESIZE_METHOD;方式: TP_RESIZE_NEAREST;最近点 TP_RESIZE_SCALE;比例 +TP_RESIZE_SPECIFY;指定: +TP_RESIZE_WIDTH;宽度 TP_RESIZE_W;宽: TP_ROTATE_AUTOCROP;自动剪裁 TP_ROTATE_DEGREE;角度 @@ -476,6 +700,7 @@ TP_SHADOWSHLIGHTS_LOCALCONTR;局部对比度 TP_SHADOWSHLIGHTS_RADIUS;半径 TP_SHADOWSHLIGHTS_SHADOWS;阴影 TP_SHADOWSHLIGHTS_SHTONALW;影调范围 +TP_SHARPENEDGE_AMOUNT;数量 TP_SHARPENING_AMOUNT;程度 TP_SHARPENING_EDRADIUS;半径 TP_SHARPENING_EDTOLERANCE;边缘容差 @@ -503,37 +728,26 @@ TP_WBALANCE_METHOD;方式 TP_WBALANCE_SIZE;大小: TP_WBALANCE_SPOTWB;白平衡采样 TP_WBALANCE_TEMPERATURE;色温 +ZOOMBAR_DETAIL;细节 +ZOOMBAR_HUGE;很大 +ZOOMBAR_LARGE;大 +ZOOMBAR_NORMAL;普通 +ZOOMBAR_PREVIEW;预览 +ZOOMBAR_SCALE;比例 +ZOOMBAR_SMALL;小 !!!!!!!!!!!!!!!!!!!!!!!!! ! Untranslated keys follow; remove the ! prefix after an entry is translated. !!!!!!!!!!!!!!!!!!!!!!!!! -!ABOUT_TAB_BUILD;Version -!ABOUT_TAB_CREDITS;Credits -!ABOUT_TAB_LICENSE;License -!ABOUT_TAB_RELEASENOTES;Release Notes -!ABOUT_TAB_SPLASH;Splash -!BATCHQUEUE_AUTOSTART;Auto start -!BATCHQUEUE_DESTFILENAME;Path and file name -!BATCH_PROCESSING;Batch Processing -!CURVEEDITOR_CURVES;Curves -!CURVEEDITOR_CURVE;Curve -!CURVEEDITOR_CUSTOM;Custom -!CURVEEDITOR_DARKS;Darks -!CURVEEDITOR_HIGHLIGHTS;Highlights -!CURVEEDITOR_LIGHTS;Lights !CURVEEDITOR_MINMAXCPOINTS;Minima/Maxima control points !CURVEEDITOR_NURBS;Control Cage !CURVEEDITOR_PARAMETRIC;Parametric -!CURVEEDITOR_SHADOWS;Shadows !CURVEEDITOR_TOOLTIPCOPY;Copy current curve to clipboard. !CURVEEDITOR_TOOLTIPPASTE;Paste curve from clipboard. -!CURVEEDITOR_TYPE;Type: -!EDITWINDOW_TITLE;Image Edit !EXIFFILTER_EXPOSURECOMPENSATION;Exposure Compensation (EV) !EXIFFILTER_FILETYPE;File Type !EXIFFILTER_METADATAFILTER;Enable Metadata Filters -!EXPORT_BYPASS_ALL;Select / Unselect All !EXPORT_BYPASS_COLORDENOISE;Bypass Color denoise !EXPORT_BYPASS_DEFRINGE;Bypass Defringe !EXPORT_BYPASS_DIRPYRDENOISE;Bypass Noise Reduction @@ -553,14 +767,8 @@ TP_WBALANCE_TEMPERATURE;色温 !EXPORT_BYPASS_SHARPENING;Bypass Sharpening !EXPORT_BYPASS_SHARPENMICRO;Bypass Microcontrast !EXPORT_BYPASS_SH_HQ;Bypass Sharp Mask Shadows/Highlights -!EXPORT_FASTEXPORTOPTIONS;Fast Export Options !EXPORT_INSTRUCTIONS;Fast Export options provide overrides to bypass time and resource consuming development settings and to run queue processing using the fast export settings instead. This method is recommended for quicker generation of lower resolution images when speed is a priority or when resized output is desired for one or many images without making modifications to their saved development parameters. -!EXPORT_MAXHEIGHT;Maximum Height: -!EXPORT_MAXWIDTH;Maximum Width: -!EXPORT_PUTTOQUEUEFAST; Put to Queue for Fast Export !EXPORT_RAW_DMETHOD;Demosaic Method -!EXPORT_RESIZEMETHOD;Resize Method -!EXTPROGTARGET_1;raw !EXTPROGTARGET_2;queue-processed !FILEBROWSER_ADDDELTEMPLATE;Add/Del templates... !FILEBROWSER_APPLYPROFILE_PARTIAL;Apply - partial @@ -568,37 +776,14 @@ TP_WBALANCE_TEMPERATURE;色温 !FILEBROWSER_AUTOFLATFIELD;Auto Flat Field !FILEBROWSER_BROWSEPATHBUTTONHINT;Click to browse to the chosen path. !FILEBROWSER_BROWSEPATHHINT;Type a path to navigate to.\n\nKeyboard shortcuts:\nCtrl-o to focus to the path text box.\nEnter / Ctrl-Enter to browse there;\nEsc to clear changes.\nShift-Esc to remove focus.\n\nPath shortcuts:\n~ - user's home directory.\n! - user's pictures directory -!FILEBROWSER_CACHECLEARFROMFULL;Clear from cache - full -!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear from cache - partial -!FILEBROWSER_CACHE;Cache !FILEBROWSER_COLORLABEL_TOOLTIP;Color label.\n\nUse dropdown menu or shortcuts:\nShift-Ctrl-0 No Color\nShift-Ctrl-1 Red\nShift-Ctrl-2 Yellow\nShift-Ctrl-3 Green\nShift-Ctrl-4 Blue\nShift-Ctrl-5 Purple -!FILEBROWSER_CURRENT_NAME;Current name: !FILEBROWSER_DARKFRAME;Dark frame !FILEBROWSER_DELETEDLGMSGINCLPROC;Are you sure you want to delete the selected %1 files including a queue-processed version? -!FILEBROWSER_EXEC_CPB;Custom Profile Builder -!FILEBROWSER_EXTPROGMENU;Open with !FILEBROWSER_FLATFIELD;Flat Field !FILEBROWSER_MOVETODARKFDIR;Move to dark frames directory !FILEBROWSER_MOVETOFLATFIELDDIR;Move to flat fields directory -!FILEBROWSER_NEW_NAME;New name: -!FILEBROWSER_OPENDEFAULTVIEWER;Windows default viewer (queue-processed) -!FILEBROWSER_POPUPCOLORLABEL;Color label -!FILEBROWSER_POPUPCOPYTO;Copy to... -!FILEBROWSER_POPUPFILEOPERATIONS;File Operations -!FILEBROWSER_POPUPMOVETO;Move to... -!FILEBROWSER_POPUPPROCESSFAST;Put to Queue (Fast export) -!FILEBROWSER_POPUPPROFILEOPERATIONS;Processing Profile Operations -!FILEBROWSER_POPUPRANK;Rank -!FILEBROWSER_POPUPREMOVEINCLPROC;Delete with output from queue -!FILEBROWSER_QUERYBUTTONHINT;Clear the Find query !FILEBROWSER_QUERYHINT;Type filenames to search for. Supports partial filenames. Separate search terms using commas, e.g.\n1001,1004,1199\n\nShortcuts:\nCtrl-f - focus the Find box,\nEnter - search,\nEsc - clear the Find box,\nShift-Esc - defocus the Find box. !FILEBROWSER_QUERYLABEL; Find: -!FILEBROWSER_RANK1_TOOLTIP;Rank 1 *\nShortcut: Shift-1 -!FILEBROWSER_RANK2_TOOLTIP;Rank 2 *\nShortcut: Shift-2 -!FILEBROWSER_RANK3_TOOLTIP;Rank 3 *\nShortcut: Shift-3 -!FILEBROWSER_RANK4_TOOLTIP;Rank 4 *\nShortcut: Shift-4 -!FILEBROWSER_RANK5_TOOLTIP;Rank 5 *\nShortcut: Shift-5 -!FILEBROWSER_SELECTDARKFRAME;Select dark frame... !FILEBROWSER_SELECTFLATFIELD;Select flat field... !FILEBROWSER_SHOWCOLORLABEL1HINT;Show images labeled Red.\nShortcut: Alt-1 !FILEBROWSER_SHOWCOLORLABEL2HINT;Show images labeled Yellow.\nShortcut: Alt-2 @@ -613,15 +798,6 @@ TP_WBALANCE_TEMPERATURE;色温 !FILEBROWSER_SHOWUNCOLORHINT;Show images without a color label.\nShortcut: Alt-0 !FILEBROWSER_TOOLTIP_STOPPROCESSING;Start processing automatically when a new job arrives. !FILEBROWSER_UNRANK_TOOLTIP;Unrank.\nShortcut: Shift-0 -!FILEBROWSER_USETEMPLATE;Use template: -!GENERAL_AFTER;After -!GENERAL_AUTO;Automatic -!GENERAL_BEFORE;Before -!GENERAL_CLOSE;Close -!GENERAL_FILE;File -!GENERAL_NONE;None -!GENERAL_UNCHANGED;(Unchanged) -!GENERAL_WARNING;Warning !HISTOGRAM_TOOLTIP_BAR;Show/Hide RGB indicator bar.\nRight-click on image preview to freeze/unfreeze. !HISTOGRAM_TOOLTIP_CHRO;Show/Hide chromaticity histogram. !HISTOGRAM_TOOLTIP_FULL;Toggle full (on) or scaled (off) histogram. @@ -633,10 +809,7 @@ TP_WBALANCE_TEMPERATURE;色温 !HISTORY_MSG_86;RGB Curves - Luminosity Mode !HISTORY_MSG_87;Impulse Noise Reduction !HISTORY_MSG_88;Impulse NR Threshold -!HISTORY_MSG_89;Noise Reduction -!HISTORY_MSG_90;NR - Luminance !HISTORY_MSG_91;NR - Chrominance Master -!HISTORY_MSG_92;NR - Gamma !HISTORY_MSG_93;CbDL - Value !HISTORY_MSG_94;Contrast by Detail Levels !HISTORY_MSG_95;Lab - Chromaticity @@ -663,17 +836,9 @@ TP_WBALANCE_TEMPERATURE;色温 !HISTORY_MSG_116;DCB Enhancement !HISTORY_MSG_117;Raw Red CA Correction !HISTORY_MSG_118;Raw Blue CA Correction -!HISTORY_MSG_119;Line Noise Filter !HISTORY_MSG_120;Green Equilibration !HISTORY_MSG_121;Raw Auto CA -!HISTORY_MSG_122;Dark Frame Auto Select -!HISTORY_MSG_123;Dark Frame File -!HISTORY_MSG_124;White Point Correction !HISTORY_MSG_125;Highlight Preservation -!HISTORY_MSG_126;Flat Field File -!HISTORY_MSG_127;Flat Field Auto Select -!HISTORY_MSG_128;Flat Field Blur Radius -!HISTORY_MSG_129;Flat Field Blur Type !HISTORY_MSG_130;Auto Distorion !HISTORY_MSG_131;Noise Reduction Luma !HISTORY_MSG_132;Noise Reduction Chroma @@ -690,8 +855,6 @@ TP_WBALANCE_TEMPERATURE;色温 !HISTORY_MSG_143;ES - Quantity !HISTORY_MSG_144;Microcontrast - Quantity !HISTORY_MSG_145;Microcontrast - Uniformity -!HISTORY_MSG_146;Edges Sharpening -!HISTORY_MSG_147;ES - Luminance Only !HISTORY_MSG_148;Microcontrast !HISTORY_MSG_149;Microcontrast - 3x3 matrix !HISTORY_MSG_150;Post Demosaic Artifact/Noise Reduction @@ -702,11 +865,7 @@ TP_WBALANCE_TEMPERATURE;色温 !HISTORY_MSG_155;Vib - Avoid color shift !HISTORY_MSG_156;Vib - Link pastel/saturated !HISTORY_MSG_157;Vib - P/S threshold -!HISTORY_MSG_158;TM - Strength -!HISTORY_MSG_159;TM - Edge Stopping -!HISTORY_MSG_160;TM - Scale !HISTORY_MSG_161;TM - Reweighting Iterates -!HISTORY_MSG_162;Tone Mapping !HISTORY_MSG_163;RGB Curves - Red !HISTORY_MSG_164;RGB Curves - Green !HISTORY_MSG_165;RGB Curves - Blue @@ -717,8 +876,6 @@ TP_WBALANCE_TEMPERATURE;色温 !HISTORY_MSG_170;Vib - Curve !HISTORY_MSG_171;'LC' curve !HISTORY_MSG_172;Lab - Restrict LC -!HISTORY_MSG_173;NR - Luminance Detail -!HISTORY_MSG_174;CIECAM02 !HISTORY_MSG_175;CAM02 - CAT02 Adaptation !HISTORY_MSG_176;CAM02 - Viewing surround !HISTORY_MSG_177;CAM02 - Scene luminosity @@ -795,14 +952,14 @@ TP_WBALANCE_TEMPERATURE;色温 !HISTORY_MSG_249;CbDL - Threshold !HISTORY_MSG_250;NR - Enhanced !HISTORY_MSG_251;B&W - Algorithm -!HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s -!MAIN_BUTTON_FULLSCREEN;Fullscreen +!HISTORY_MSG_252;CbDL Skin Tones +!HISTORY_MSG_253;CbDL Reduce artifacts +!HISTORY_MSG_254;CbDL - Hueskin +!HISTORY_MSG_255;CbDL - Algorithm !MAIN_BUTTON_NAVNEXT_TOOLTIP;Navigate to the next image relative to image opened in the Editor.\nShortcut: Shift-F4\n\nTo navigate to the next image relative to the currently selected thumbnail in the File Browser or Filmstrip:\nShortcut: F4 !MAIN_BUTTON_NAVPREV_TOOLTIP;Navigate to the previous image relative to image opened in the Editor.\nShortcut: Shift-F3\n\nTo navigate to the previous image relative to the currently selected thumbnail in the File Browser or Filmstrip:\nShortcut: F3 !MAIN_BUTTON_NAVSYNC_TOOLTIP;Synchronize the File Browser or Filmstrip with the Editor to reveal the thumbnail of the currently opened image, and clear any active filters.\nShortcut: x\n\nAs above, but without clearing active filters:\nShortcut: y\n(Note that the thumbnail of the opened image will not be shown if filtered out). !MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;Put current image to processing queue.\nShortcut: Ctrl+b -!MAIN_BUTTON_SAVE_TOOLTIP;Save current image.\nShortcut: Ctrl+s -!MAIN_BUTTON_SENDTOEDITOR_TOOLTIP;Edit current image in external editor.\nShortcut: Ctrl+e !MAIN_BUTTON_SHOWHIDESIDEPANELS_TOOLTIP;Show/hide all side panels.\nShortcut: m !MAIN_BUTTON_UNFULLSCREEN;Exit Fullscreen !MAIN_FRAME_BATCHQUEUE_TOOLTIP;Processing queue.\nShortcut: Ctrl-F3 @@ -821,8 +978,6 @@ TP_WBALANCE_TEMPERATURE;色温 !MAIN_TAB_EXPORT; Fast Export !MAIN_TAB_EXPOSURE_TOOLTIP;Shortcut: Alt-e !MAIN_TAB_METADATA_TOOLTIP;Shortcut: Alt-m -!MAIN_TAB_RAW;Raw -!MAIN_TAB_RAW_TOOLTIP;Shortcut: Alt-r !MAIN_TAB_TRANSFORM_TOOLTIP;Shortcut: Alt-t !MAIN_TOOLTIP_BACKCOLOR0;Background color of the preview: Theme-based\nShortcut: 9 !MAIN_TOOLTIP_BACKCOLOR1;Background color of the preview: Black\nShortcut: 9 @@ -836,7 +991,6 @@ TP_WBALANCE_TEMPERATURE;色温 !MAIN_TOOLTIP_SHOWHIDELP1;Show/Hide the left panel.\nShortcut: l !MAIN_TOOLTIP_SHOWHIDERP1;Show/Hide the right panel.\nShortcut: Alt-l !MAIN_TOOLTIP_SHOWHIDETP1;Show/Hide the top panel.\nShortcut: Shift-l -!MAIN_TOOLTIP_THRESHOLD;Threshold !MAIN_TOOLTIP_TOGGLE;Toggle the Before/After view.\nShortcut: Shift-b !NAVIGATOR_B_NA;B = n/a !NAVIGATOR_B_VALUE;B = %1 @@ -856,16 +1010,9 @@ TP_WBALANCE_TEMPERATURE;色温 !NAVIGATOR_S_VALUE;S = %1 !NAVIGATOR_V_NA;V = n/a !NAVIGATOR_V_VALUE;V = %1 -!NAVIGATOR_XY_FULL;Width = %1, Height = %2 -!NAVIGATOR_XY_NA;x = n/a, y = n/a !OPTIONS_DEFIMG_MISSING;The default profile for non-raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\nDefault internal values will be used. !OPTIONS_DEFRAW_MISSING;The default profile for raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\nDefault internal values will be used. !PARTIALPASTE_CHANNELMIXERBW;Black-and-White -!PARTIALPASTE_CHANNELMIXER;Channel mixer -!PARTIALPASTE_COLORAPP;CIE Color Appearance Model 2002 -!PARTIALPASTE_COMMONTRANSFORMPARAMS;Auto fill -!PARTIALPASTE_DARKFRAMEAUTOSELECT;Dark frame auto selection -!PARTIALPASTE_DARKFRAMEFILE;Dark frame file !PARTIALPASTE_DEFRINGE;Defringe !PARTIALPASTE_DETAILGROUP;Detail Settings !PARTIALPASTE_DIRPYRDENOISE;Noise reduction @@ -880,16 +1027,8 @@ TP_WBALANCE_TEMPERATURE;色温 !PARTIALPASTE_HSVEQUALIZER;HSV equalizer !PARTIALPASTE_ICMGAMMA;Output gamma !PARTIALPASTE_IMPULSEDENOISE;Impulse noise reduction -!PARTIALPASTE_LABCURVE;Lab adjustments -!PARTIALPASTE_LENSPROFILE;Lens correction profile !PARTIALPASTE_PCVIGNETTE;Vignette filter -!PARTIALPASTE_PERSPECTIVE;Perspective -!PARTIALPASTE_PREPROCESS_GREENEQUIL;Green equilibration !PARTIALPASTE_PREPROCESS_HOTDEADPIXFILT;Apply hot/dead pixel filter -!PARTIALPASTE_PREPROCESS_LINEDENOISE;Line noise filter -!PARTIALPASTE_RAWCACORR_AUTO;CA auto correction -!PARTIALPASTE_RAWCACORR_CABLUE;CA blue -!PARTIALPASTE_RAWCACORR_CARED;CA red !PARTIALPASTE_RAWEXPOS_BLACK;Black levels !PARTIALPASTE_RAWEXPOS_LINEAR;White point correction !PARTIALPASTE_RAWEXPOS_PRESER;Highlight preservation @@ -923,10 +1062,6 @@ TP_WBALANCE_TEMPERATURE;色温 !PREFERENCES_CUSTPROFBUILDPATH;Executable path !PREFERENCES_CUSTPROFBUILD;Custom Processing Profile Builder !PREFERENCES_CUTOVERLAYBRUSH;Crop mask color/transparency -!PREFERENCES_D50;5000K -!PREFERENCES_D55;5500K -!PREFERENCES_D60;6000K -!PREFERENCES_D65;6500K !PREFERENCES_DARKFRAMEFOUND;Found !PREFERENCES_DARKFRAMESHOTS;shots !PREFERENCES_DARKFRAMETEMPLATES;templates @@ -935,11 +1070,9 @@ TP_WBALANCE_TEMPERATURE;色温 !PREFERENCES_DIRDARKFRAMES;Dark frames directory !PREFERENCES_EDITORLAYOUT;Editor Layout !PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Single row file browser toolbar (de-select for low resolution display) -!PREFERENCES_FLATFIELDFOUND;Found !PREFERENCES_FLATFIELDSDIR;Flat fields directory !PREFERENCES_FLATFIELDSHOTS;shots !PREFERENCES_FLATFIELDTEMPLATES;templates -!PREFERENCES_FLATFIELD;Flat Field !PREFERENCES_FLUOF2;Fluorescent F2 !PREFERENCES_FLUOF7;Fluorescent F7 !PREFERENCES_FLUOF11;Fluorescent F11 @@ -958,7 +1091,6 @@ TP_WBALANCE_TEMPERATURE;色温 !PREFERENCES_MENUGROUPFILEOPERATIONS;Group "File Operations" !PREFERENCES_MENUGROUPLABEL;Group "Color Label" !PREFERENCES_MENUGROUPPROFILEOPERATIONS;Group "Processing Profile Operations" -!PREFERENCES_MENUGROUPRANK;Group "Rank" !PREFERENCES_MENUOPTIONS;Context Menu Options !PREFERENCES_METADATA;Metadata !PREFERENCES_MULTITABDUALMON;Multiple Editor Tabs Mode (if available on second monitor) @@ -1006,11 +1138,6 @@ TP_WBALANCE_TEMPERATURE;色温 !PROGRESSBAR_SNAPSHOT_ADDED;Snapshot added !PROGRESSDLG_PROFILECHANGEDINBROWSER;Processing profile changed in browser !SAVEDLG_AUTOSUFFIX;Automatically add a suffix if the file already exists -!SAVEDLG_FORCEFORMATOPTS;Force saving options -!SAVEDLG_SUBSAMP;Subsampling -!SAVEDLG_SUBSAMP_1;Best Compression -!SAVEDLG_SUBSAMP_2;Balanced -!SAVEDLG_SUBSAMP_3;Best Quality !SAVEDLG_SUBSAMP_TOOLTIP;Best Compression: 4:1:1\nBalanced: 4:2:2\nBest Quality: 4:4:4 !SAVEDLG_TIFFUNCOMPRESSED;Uncompressed TIFF !SAVEDLG_WARNFILENAME;File will be named @@ -1146,21 +1273,15 @@ TP_WBALANCE_TEMPERATURE;色温 !TP_COLORAPP_RSTPRO_TOOLTIP;Red and skin tones protection (sliders and curves). !TP_COLORAPP_SHARPCIE;--unused-- !TP_COLORAPP_SHARPCIE_TOOLTIP;--unused-- -!TP_COLORAPP_SURROUND;Surround -!TP_COLORAPP_SURROUND_AVER;Average -!TP_COLORAPP_SURROUND_DARK;Dark -!TP_COLORAPP_SURROUND_DIM;Dim !TP_COLORAPP_SURROUND_EXDARK;Extremly Dark (Cutsheet) !TP_COLORAPP_SURROUND_TOOLTIP;Changes tones and colors to take into account the viewing conditions of the output device.\n\nAverage: Average light environment (standard). The image will not change.\n\nDim: Dim environment (TV). The image will become slighty dark.\n\nDark: Dark environment (projector). The image will become more dark.\n\nExtremly Dark: Extremly dark environment (cutsheet). The image will become very dark. !TP_COLORAPP_SURSOURCE;Dark surround !TP_COLORAPP_SURSOURCE_TOOLTIP;Can be used if image has a dark border. -!TP_COLORAPP_TCMODE_BRIGHTNESS;Brightness !TP_COLORAPP_TCMODE_CHROMA;Chroma !TP_COLORAPP_TCMODE_COLORF;Colorfulness !TP_COLORAPP_TCMODE_LABEL1;Curve mode 1 !TP_COLORAPP_TCMODE_LABEL2;Curve mode 2 !TP_COLORAPP_TCMODE_LABEL3;Curve chroma mode -!TP_COLORAPP_TCMODE_LIGHTNESS;Lightness !TP_COLORAPP_TCMODE_SATUR;Saturation !TP_COLORAPP_TONECIE;Tone mapping using CIECAM02 !TP_COLORAPP_TONECIE_TOOLTIP;If this option is disabled, tone mapping is done in Lab space.\nIf this option is enabled, tone mapping is done using CIECAM02.\nThe Tone Mapping tool must be enabled for this setting to take effect. @@ -1191,20 +1312,27 @@ TP_WBALANCE_TEMPERATURE;色温 !TP_DIRPYRDENOISE_PERF;RGB mode (raw images) !TP_DIRPYRDENOISE_RED;Chrominance - Red-Green !TP_DIRPYRDENOISE_RGB;RGB +!TP_DIRPYREQUALIZER_ALGO;Algorithm Skin +!TP_DIRPYREQUALIZER_ALGO_FI;Fine +!TP_DIRPYREQUALIZER_ALGO_LA;Large +!TP_DIRPYREQUALIZER_ALGO_TOOLTIP;Fine: closer to the colors of the skin, minimizing the action on other colors\nLarge: avoid more artifacts +!TP_DIRPYREQUALIZER_GAMUT;Reduce artifacts +!TP_DIRPYREQUALIZER_HUESKIN;Skin hue +!TP_DIRPYREQUALIZER_HUESKIN_TOOLTIP;This pyramid is for the upper part, so far as the algorithm at its maximum efficiency.\nTo the lower part, the transition zones.\nIf you need to move the area significantly to the left or right - or if there are artifacts: the white balance is incorrect\nYou can slightly reduce the zone to prevent the rest of the image is affected !TP_DIRPYREQUALIZER_LABEL;Contrast by Detail Levels !TP_DIRPYREQUALIZER_LUMACOARSEST;Coarsest !TP_DIRPYREQUALIZER_LUMACONTRAST_MINUS;Contrast- !TP_DIRPYREQUALIZER_LUMACONTRAST_PLUS;Contrast+ !TP_DIRPYREQUALIZER_LUMAFINEST;Finest !TP_DIRPYREQUALIZER_LUMANEUTRAL;Neutral +!TP_DIRPYREQUALIZER_SKIN;Skin Tones Targetting/Protection +!TP_DIRPYREQUALIZER_SKIN_TOOLTIP;At -100 skin tones are targetted.\nAt 0 all tones are treated equally.\nAt +100 skin tones are protected while all other tones are affected. !TP_DIRPYREQUALIZER_THRESHOLD;Threshold +!TP_DIRPYREQUALIZER_TOOLTIP;Attempts to reduce artifacts due to the transitions between the color (hue, chroma, luma) of the skin and the rest of the image !TP_DISTORTION_AUTO;Auto Distortion Correction !TP_DISTORTION_AUTO_TIP;Correct lens distortion automatically for some cameras (Micro 4/3, some compact digital cameras, etc.). !TP_EPD_EDGESTOPPING;Edge Stopping -!TP_EPD_LABEL;Tone Mapping !TP_EPD_REWEIGHTINGITERATES;Reweighting Iterates -!TP_EPD_SCALE;Scale -!TP_EPD_STRENGTH;Strength !TP_EPD_TOOLTIP;Tone mapping is possible via Lab mode (standard) and CIECAM02 mode.\n\nTo engage CIECAM02 tone mapping mode enable the following settings:\n1. CIECAM02\n2. Algorithm="Brightness + Colorfulness (QM)"\n3. "Tone mapping using CIECAM02 brightness (Q)" !TP_EXPOSCORR_LABEL;Raw White & Black Points !TP_EXPOSURE_AUTOLEVELS_TIP;Toggles execution of Auto Levels to automatically set Exposure slider values based on an image analysis.\nEnables Highlight Reconstruction if necessary. @@ -1218,14 +1346,7 @@ TP_WBALANCE_TEMPERATURE;色温 !TP_EXPOSURE_TCMODE_LABEL1;Curve mode 1 !TP_EXPOSURE_TCMODE_LABEL2;Curve mode 2 !TP_EXPOSURE_TCMODE_SATANDVALBLENDING;Saturation and Value Blending -!TP_EXPOSURE_TCMODE_STANDARD;Standard !TP_EXPOSURE_TCMODE_WEIGHTEDSTD;Weighted Standard -!TP_FLATFIELD_AUTOSELECT;Auto selection -!TP_FLATFIELD_BLURRADIUS;Blur Radius -!TP_FLATFIELD_BLURTYPE;Blur Type -!TP_FLATFIELD_BT_AREA;Area -!TP_FLATFIELD_BT_HORIZONTAL;Horizontal -!TP_FLATFIELD_BT_VERTHORIZ;Vertical + Horizontal !TP_FLATFIELD_BT_VERTICAL;Vertical !TP_FLATFIELD_LABEL;Flat Field !TP_GAMMA_CURV;Gamma @@ -1268,13 +1389,11 @@ TP_WBALANCE_TEMPERATURE;色温 !TP_ICM_TONECURVE;Use DCP's tone curve !TP_ICM_TONECURVE_TOOLTIP;Employ the embedded DCP tone curve. The setting is only enabled if the selected DCP has a tone curve. !TP_IMPULSEDENOISE_LABEL;Impulse Noise Reduction -!TP_IMPULSEDENOISE_THRESH;Threshold !TP_LABCURVE_AVOIDCOLORSHIFT;Avoid color shift !TP_LABCURVE_AVOIDCOLORSHIFT_TOOLTIP;Fit colors into gamut of the working color space and apply Munsell correction. !TP_LABCURVE_BRIGHTNESS;Lightness !TP_LABCURVE_CHROMATICITY;Chromaticity !TP_LABCURVE_CHROMA_TOOLTIP;To apply B&W toning, set Chromaticity to -100. -!TP_LABCURVE_CONTRAST;Contrast !TP_LABCURVE_CURVEEDITOR;Luminance Curve !TP_LABCURVE_CURVEEDITOR_A_RANGE1;Green Saturated !TP_LABCURVE_CURVEEDITOR_A_RANGE2;Green Pastel @@ -1301,13 +1420,10 @@ TP_WBALANCE_TEMPERATURE;色温 !TP_LABCURVE_CURVEEDITOR_LH;LH !TP_LABCURVE_CURVEEDITOR_LH_TOOLTIP;Luminance according to hue L=f(H) !TP_LABCURVE_CURVEEDITOR_LL_TOOLTIP;Luminance according to luminance L=f(L) -!TP_LABCURVE_LABEL;Lab Adjustments !TP_LABCURVE_LCREDSK;Restrict LC to red and skin tones !TP_LABCURVE_LCREDSK_TIP;If enabled, the LC Curve affects only red and skin tones.\nIf disabled, it applies to all tones. !TP_LABCURVE_RSTPROTECTION;Red and Skin Tones Protection !TP_LABCURVE_RSTPRO_TOOLTIP;Can be used with the Chromaticity slider and the CC curve. -!TP_LENSGEOM_AUTOCROP;Auto Crop -!TP_LENSGEOM_FILL;Auto fill !TP_LENSGEOM_LABEL;Lens / Geometry !TP_LENSPROFILE_FILEDLGFILTERLCP;Lens correction files !TP_LENSPROFILE_LABEL;Lens Correction Profile @@ -1334,7 +1450,6 @@ TP_WBALANCE_TEMPERATURE;色温 !TP_PREPROCESS_LABEL;Preprocessing !TP_PREPROCESS_LINEDENOISE;Line Noise Filter !TP_PREPROCESS_NO_FOUND;None found -!TP_RAWCACORR_AUTO;Auto correction !TP_RAWCACORR_CABLUE;Blue !TP_RAWCACORR_CARED;Red !TP_RAWEXPOS_BLACKONE;Black Level: Red @@ -1359,11 +1474,7 @@ TP_WBALANCE_TEMPERATURE;色温 !TP_RESIZE_APPLIESTO;Applies to: !TP_RESIZE_CROPPEDAREA;Cropped Area !TP_RESIZE_FITBOX;Bounding Box -!TP_RESIZE_FULLIMAGE;Full Image -!TP_RESIZE_HEIGHT;Height !TP_RESIZE_LANCZOS;Lanczos -!TP_RESIZE_SPECIFY;Specify: -!TP_RESIZE_WIDTH;Width !TP_RGBCURVES_BLUE;B !TP_RGBCURVES_CHANNEL;Channel !TP_RGBCURVES_GREEN;G @@ -1373,7 +1484,6 @@ TP_WBALANCE_TEMPERATURE;色温 !TP_RGBCURVES_RED;R !TP_SAVEDIALOG_OK_TIP;Shortcut: Ctrl-Enter !TP_SHADOWSHLIGHTS_SHARPMASK;Sharp mask -!TP_SHARPENEDGE_AMOUNT;Quantity !TP_SHARPENEDGE_LABEL;Edges !TP_SHARPENEDGE_PASSES;Iterations !TP_SHARPENEDGE_THREE;Luminance only diff --git a/rtdata/languages/Chinese (Traditional) b/rtdata/languages/Chinese (Traditional) index 0cac75438..02e529cb3 100644 --- a/rtdata/languages/Chinese (Traditional) +++ b/rtdata/languages/Chinese (Traditional) @@ -1,3 +1,4 @@ +#00 Chinese (Traditional) #01 2008-07-29 Mingjui Liao ADJUSTER_RESET_TO_DEFAULT;重置預設參數 diff --git a/rtdata/languages/Espanol b/rtdata/languages/Espanol index fe80b1bb4..b9e7a59ed 100644 --- a/rtdata/languages/Espanol +++ b/rtdata/languages/Espanol @@ -6,7 +6,7 @@ #06 AC: Aberración cromática (fringe) #07 B&N: Blanco y Negro (Black & White) #08 CV: Corrección de Viñeteado (Vignette Filter: in Transform tab) -#09 FG: Filtro con Gradiente (Gradient Filter) +#09 FG: Filtro Graduado (Gradient Filter) #10 FV: Filtrar Viñeteado (Vignette Filter: in Exposure tab) #11 MC: Mezclador de canales (Channel Mixer) #12 RGB: Modelo de color Rojo Verde Azul (Red Green Blue) @@ -23,40 +23,42 @@ #23 Chromaticity: Cromaticidad (**) #24 Colorfulness: Colorido #25 Cyan: Cian (*) -#26 Dim: Luz tenue -#27 Feather: Difuminado -#28 Illuminant: Iluminante -#29 Lightness: Claridad -#30 Luminance: Luminancia (*) -#31 Luminosity: Luminosidad -#32 Mapping: Mapeo (*) -#33 Sharpening: Enfoque -#34 Slider: Control deslizante -#35 Tone Curve: Curva tonal -#36 Vibrance: Vibranza -#37 -#38 (*) Término incluido en diccionario RAE -#39 (**) Término no incluido en diccionario RAE -#40 -#41 Términos conservados en Inglés por no tener traducción breve -#42 al español en el sentido usado por RT/fotografía digital -#43 Dark Frame -#44 ICM (Image Color Management) -#45 Gamut -#46 Gamma -#47 Raw -#48 -#49 2008-01-15 keenonkites, first translation -#50 2008-03-03 Ioritz Ibarguren, corrections -#51 2008-04-05 keenonkites, completed for 2.4m1 -#52 2008-04-09 Ramon, partly corrected (part of 2.3) -#53 2008-04-29 Ramon, small correction -#54 2008-06-09 Ramon, Adaptions regarding 2.4m1 and others -#55 2008-09-20 keenonkites, first version for 2.4m2 -#56 2008-12-19 keenonkites, first version for 2.4beta4 -#57 2010-12-07 rickydh, some translations of untranslated keys for 3.0 alpha1 -#58 2011-12-25 plores, translation improvement, translation of untranslated strings -#59 2013-01-03 OdeLama, translation of untranslated strings +#26 Dark Frame: Toma Negra +#27 Dim: Luz tenue +#28 Feather: Difuminado +#29 Illuminant: Iluminante +#30 Lightness: Claridad +#31 Luminance: Luminancia (*) +#32 Luminosity: Luminosidad +#33 Mapping: Mapeo (*) +#34 Sharpening: Enfoque +#35 Slider: Control deslizante +#36 Tone Curve: Curva tonal +#37 Vibrance: Vibranza +#38 +#39 (*) Término incluido en diccionario RAE +#40 (**) Término no incluido en diccionario RAE +#41 +#42 Términos conservados en Inglés por no tener traducción breve +#43 al español en el sent ido usado por RT/fotografía digital +#44 ----------------------------------------------------- +#45 ICM (Image Color Management) +#46 Gamut +#47 Gamma +#48 Raw +#49 +#50 2008-01-15 keenonkites, first translation +#51 2008-03-03 Ioritz Ibarguren, corrections +#52 2008-04-05 keenonkites, completed for 2.4m1 +#53 2008-04-09 Ramon, partly corrected (part of 2.3) +#54 2008-04-29 Ramon, small correction +#55 2008-06-09 Ramon, Adaptions regarding 2.4m1 and others +#56 2008-09-20 keenonkites, first version for 2.4m2 +#57 2008-12-19 keenonkites, first version for 2.4beta4 +#58 2010-12-07 rickydh, some translations of untranslated keys for 3.0 alpha1 +#59 2011-12-25 plores, translation improvement, translation of untranslated strings +#60 2013-01-03 OdeLama, translation for v4.0.12 of untranslated/changed strings +#61 2014-01-14 mapelo, bug correction and small enhancements. ABOUT_TAB_BUILD;Versión ABOUT_TAB_CREDITS;Créditos @@ -123,9 +125,9 @@ EXPORT_BYPASS_RAW_CA;Saltar [raw] Corrección de aberración cromática EXPORT_BYPASS_RAW_CCSTEPS;Saltar [raw] Supresión de falso color EXPORT_BYPASS_RAW_DCB_ENHANCE;Saltar [raw] Aplicar pasos de mejora DCB EXPORT_BYPASS_RAW_DCB_ITERATIONS;Saltar [raw] Iteraciones DCB -EXPORT_BYPASS_RAW_DF;Saltar [raw] Dark Frame +EXPORT_BYPASS_RAW_DF;Saltar [raw] Toma Negra EXPORT_BYPASS_RAW_FF;Saltar [raw] Campo plano -EXPORT_BYPASS_RAW_GREENTHRESH;Saltar [raw] Equilibrado del verde +EXPORT_BYPASS_RAW_GREENTHRESH;Saltar [raw] Equilibrado de verdes EXPORT_BYPASS_RAW_LINENOISE;Saltar [raw] Filtro de ruido de línea EXPORT_BYPASS_RAW_LMMSE_ITERATIONS;Saltar [raw] Aplicar pasos de mejora LMMSE EXPORT_BYPASS_SHARPENEDGE;Saltar Enfoque de bordes @@ -144,7 +146,7 @@ EXTPROGTARGET_2;procesada en cola FILEBROWSER_ADDDELTEMPLATE;Añadir/Borrar plantillas... FILEBROWSER_APPLYPROFILE;Aplicar perfil FILEBROWSER_APPLYPROFILE_PARTIAL;Aplicar perfil (parcial) -FILEBROWSER_AUTODARKFRAME;Auto Dark Frame +FILEBROWSER_AUTODARKFRAME;Toma Negra automática FILEBROWSER_AUTOFLATFIELD;Auto Campo plano FILEBROWSER_BROWSEPATHBUTTONHINT;Pulsar para examinar la carpeta seleccionada FILEBROWSER_BROWSEPATHHINT;Ingrese la ruta a examinar \nCtrl-O poner el foco en campo con la ruta\nEnter / Ctrl-Enter para examinar allí;\nEscPara quitar los cambios.\nShift-Esc Para quitar el foco.\n\n\nAbreviaturas de ruta:\n ~ - Carpeta hogar del usuario\n ! - Carpeta de imágenes del usuario @@ -155,7 +157,7 @@ FILEBROWSER_CLEARPROFILE;Borrar perfil FILEBROWSER_COLORLABEL_TOOLTIP;Etiquetar con color\n\nUse menú desplegable o atajos de teclado:\nShift-Ctrl-0 No Color\nShift-Ctrl-1 Rojo\nShift-Ctrl-2 Amarillo\nShift-Ctrl-3 Verde\nShift-Ctrl-4 Azul\nShift-Ctrl-5 Púrpura FILEBROWSER_COPYPROFILE;Copiar perfil FILEBROWSER_CURRENT_NAME;Nombre actual: -FILEBROWSER_DARKFRAME;Dark Frame +FILEBROWSER_DARKFRAME;Toma Negra FILEBROWSER_DELETEDLGLABEL;Confirmación de borrar archivos FILEBROWSER_DELETEDLGMSGINCLPROC;¿Seguro que quiere borrar los %1 archivos seleccionados incluyendo la versión procesada en la cola? FILEBROWSER_DELETEDLGMSG;¿Seguro que quiere borrar los %1 archivos seleccionados? @@ -164,7 +166,7 @@ FILEBROWSER_EMPTYTRASH;Vaciar papelera FILEBROWSER_EXEC_CPB;Ejecutar generador de perfiles de imagen del usuario FILEBROWSER_EXTPROGMENU;Abrir con FILEBROWSER_FLATFIELD;Campo plano -FILEBROWSER_MOVETODARKFDIR;Mover a carpeta de Dark Frames +FILEBROWSER_MOVETODARKFDIR;Mover a carpeta de Tomas Negras FILEBROWSER_MOVETOFLATFIELDDIR;Mover a carpeta de campo plano FILEBROWSER_NEW_NAME;Nuevo nombre: FILEBROWSER_OPENDEFAULTVIEWER;Ventana predeterminada de visualización (procesada en cola) @@ -199,8 +201,8 @@ FILEBROWSER_RANK4_TOOLTIP;Rango 4 ****\nAtajoShift-4 FILEBROWSER_RANK5_TOOLTIP;Rango 5 *****\nAtajoShift-5 FILEBROWSER_RENAMEDLGLABEL;Renombrar archivo FILEBROWSER_RENAMEDLGMSG;Renombrar archivo "%1"a: -FILEBROWSER_SELECTDARKFRAME;Seleccionar Dark Frame... -FILEBROWSER_SELECTFLATFIELD;Seleccionar campo plano... +FILEBROWSER_SELECTDARKFRAME;Seleccionar Toma Negra… +FILEBROWSER_SELECTFLATFIELD;Seleccionar campo plano… FILEBROWSER_SHOWCOLORLABEL1HINT;Mostrar imágenes etiquetadas con Rojo Alt-1 FILEBROWSER_SHOWCOLORLABEL2HINT;Mostrar imágenes etiquetadas con Amarillo Alt-2 FILEBROWSER_SHOWCOLORLABEL3HINT;Mostrar imágenes etiquetadas con Verde Alt-3 @@ -220,12 +222,12 @@ FILEBROWSER_SHOWRECENTLYSAVEDNOTHINT;Mostrar imágenes no guardadas recientement FILEBROWSER_SHOWTRASHHINT;Mostrar el contenido de la papelera.\nAtajo: t FILEBROWSER_SHOWUNCOLORHINT;Mostrar imágenes sin etiqueta de color.\nAtajo: Alt-0 FILEBROWSER_SHOWUNRANKHINT;Mostrar imágenes sin rango.\nAtajo: 0 -FILEBROWSER_STARTPROCESSINGHINT;Iniciar procesamiento de imágenes en la cola +FILEBROWSER_STARTPROCESSINGHINT;Iniciar el procesamiento de imágenes en la cola FILEBROWSER_STARTPROCESSING;Iniciar procesamiento -FILEBROWSER_STOPPROCESSINGHINT;Parar procesamiento de imágenes en la cola +FILEBROWSER_STOPPROCESSINGHINT;Parar el procesamiento de imágenes en la cola FILEBROWSER_STOPPROCESSING;Parar procesamiento FILEBROWSER_THUMBSIZE;Tamaño miniatura -FILEBROWSER_TOOLTIP_STOPPROCESSING;Iniciar automáticamente el procesamiento cuando llega un nuevo trabajo +FILEBROWSER_TOOLTIP_STOPPROCESSING;Iniciar automáticamente el procesamiento en cuanto llega un nuevo trabajo FILEBROWSER_UNRANK_TOOLTIP;Sin Rango\nAtajoShift - 0 FILEBROWSER_USETEMPLATE;Utilizar plantilla: FILEBROWSER_ZOOMINHINT;Agrandar miniatura.\nAtajo: +\n\nAtajo en modo editor simple: Alt-+ @@ -251,13 +253,13 @@ GENERAL_SAVE;Guardar GENERAL_UNCHANGED;(Sin cambios) GENERAL_WARNING;Advertencia HISTOGRAM_TOOLTIP_BAR;Mostrar/Ocultar barra indicadora RGB\nHacer clic con el botón derecho del ratón en la previsualización para congelar/descongelar -HISTOGRAM_TOOLTIP_B;Mostrar/Ocultar histograma Azul -HISTOGRAM_TOOLTIP_CHRO;Mostrar/Ocultar histograma de cromaticidad -HISTOGRAM_TOOLTIP_FULL;Cambiar entre histograma completo o escalado -HISTOGRAM_TOOLTIP_G;Mostrar/Ocultar histograma Verde -HISTOGRAM_TOOLTIP_L;Mostrar/Ocultar histograma de Luminancia CIELAB -HISTOGRAM_TOOLTIP_RAW;Mostrar/ocultar histograma Raw -HISTOGRAM_TOOLTIP_R;Mostrar/Ocultar histograma Rojo +HISTOGRAM_TOOLTIP_B;Mostrar/Ocultar Histograma Azul +HISTOGRAM_TOOLTIP_CHRO;Mostrar/Ocultar Histograma de cromaticidad +HISTOGRAM_TOOLTIP_FULL;Cambiar entre Histograma completo o escalado +HISTOGRAM_TOOLTIP_G;Mostrar/Ocultar Histograma Verde +HISTOGRAM_TOOLTIP_L;Mostrar/Ocultar Histograma de Luminancia CIELAB +HISTOGRAM_TOOLTIP_RAW;Mostrar/ocultar Histograma Raw +HISTOGRAM_TOOLTIP_R;Mostrar/Ocultar Histograma Rojo HISTORY_CHANGED;Cambiado HISTORY_CUSTOMCURVE;Curva a medida HISTORY_DELSNAPSHOT;Quitar instantánea @@ -323,7 +325,7 @@ HISTORY_MSG_57;Rotación basta HISTORY_MSG_58;Volteo horizontal HISTORY_MSG_59;Volteo vertical HISTORY_MSG_60;Rotación -HISTORY_MSG_61;Auto relleno +HISTORY_MSG_61;Rellenado automático HISTORY_MSG_62;Corrección de distorsión HISTORY_MSG_63;Marcador seleccionado HISTORY_MSG_64;Recortar foto @@ -384,8 +386,8 @@ HISTORY_MSG_118;Corrección AC - Azul HISTORY_MSG_119;Filtro de ruido de línea HISTORY_MSG_120;Equilibrado de verde HISTORY_MSG_121;Corrección automática AC -HISTORY_MSG_122;Auto selección de arch. Dark Frame -HISTORY_MSG_123;Archivo Dark Frame +HISTORY_MSG_122;Auto selección de arch. de Toma Negra +HISTORY_MSG_123;Archivo de Toma Negra HISTORY_MSG_124;Corrección de punto blanco HISTORY_MSG_125;Preservar Luces Altas HISTORY_MSG_126;Archivo de campo plano @@ -431,7 +433,7 @@ HISTORY_MSG_165;Curvas RGB - Azul HISTORY_MSG_166;Niveles neutros HISTORY_MSG_167;-No se usa-- HISTORY_MSG_168;Curva 'CC' -HISTORY_MSG_169;Curva 'CH' +HISTORY_MSG_169;Curva 'CM' HISTORY_MSG_170;Vib - Curva HISTORY_MSG_171;Curva 'LC' HISTORY_MSG_172;Lab - Restringe 'LC' @@ -447,7 +449,7 @@ HISTORY_MSG_181;CAM02 - Crominancia (C) HISTORY_MSG_182;CAM02 - CAT02 Automático HISTORY_MSG_183;CAM02 - Contraste (J) HISTORY_MSG_184;CAM02 - Alrededor de escena -HISTORY_MSG_185;CAM02 - Control de gamut +HISTORY_MSG_185;CAM02 - Control de Gamut HISTORY_MSG_186;CAM02 - Algoritmo HISTORY_MSG_187;CAM02 - Proteje tonos rojos & piel HISTORY_MSG_188;CAM02 - Brillo(Q) @@ -472,7 +474,7 @@ HISTORY_MSG_206;CAT02 - Luz de escena auto. HISTORY_MSG_207;Elimina AC - Matices HISTORY_MSG_208;WB - Ecualizador Az-Ro HISTORY_MSG_210;FG - Ángulo -HISTORY_MSG_211;Filtro Gradiente (FG) +HISTORY_MSG_211;Filtro de Gradiente (FG) HISTORY_MSG_212;FV - Intensidad HISTORY_MSG_213;Filtro quitar Viñeteado HISTORY_MSG_214;Blanco y Negro @@ -662,8 +664,8 @@ PARTIALPASTE_COLORGROUP;Ajustes de color PARTIALPASTE_COMMONTRANSFORMPARAMS;Auto relleno PARTIALPASTE_COMPOSITIONGROUP;Ajustes de composición PARTIALPASTE_CROP;Recortar -PARTIALPASTE_DARKFRAMEAUTOSELECT;Auto Selección de Dark Frame -PARTIALPASTE_DARKFRAMEFILE;Archivo de Dark Frame +PARTIALPASTE_DARKFRAMEAUTOSELECT;Auto Selección de la Toma Negra +PARTIALPASTE_DARKFRAMEFILE;Archivo con Toma negra PARTIALPASTE_DEFRINGE;Eliminar borde púrpura PARTIALPASTE_DETAILGROUP;Ajustes de detalle PARTIALPASTE_DIALOGLABEL;Pegar parcialmente perfil de procesamiento @@ -720,7 +722,7 @@ PARTIALPASTE_VIGNETTING;Corrección de viñeteo PARTIALPASTE_WHITEBALANCE;Equilibrio de blancos POPUPBUTTON_SELECTOPTIONHINT;RMB para cambiar opción PREFERENCES_ADD;Añadir -PREFERENCES_APPLNEXTSTARTUP;aplicado al próximo arranque +PREFERENCES_APPLNEXTSTARTUP;requiere reinicio PREFERENCES_AUTOMONPROFILE;Usar perfil de color del monitor principal en el sistema operativo PREFERENCES_BATCH_PROCESSING;Procesamiento por lotes PREFERENCES_BEHADDALLHINT;Establezca todos los parámetros del modo Agregar.\nLos ajustes de parámetros en el panel de la herramienta de lotes serán deltas de los valores guardados @@ -764,7 +766,7 @@ PREFERENCES_D65;6500ºK PREFERENCES_DARKFRAMEFOUND;Encontrado PREFERENCES_DARKFRAMESHOTS;disparos PREFERENCES_DARKFRAMETEMPLATES;plantillas -PREFERENCES_DARKFRAME;Dark Frame +PREFERENCES_DARKFRAME;Toma Negra PREFERENCES_DATEFORMATFRAME;Formato de fecha PREFERENCES_DATEFORMATHINT;Puede usar las siguientes variables :\n%y : año\n%m : mes\n%d : dia\n\nPor ejemplo, la fecha en formato Húngaro es: \n%y/%m/%d PREFERENCES_DATEFORMAT;Formato de fecha @@ -772,7 +774,7 @@ PREFERENCES_DCBENHANCE;Aplicar paso mejora DCB PREFERENCES_DCBITERATIONS;Número iteraciones DCB PREFERENCES_DEFAULTLANG;Idioma predeterminado PREFERENCES_DEFAULTTHEME;Tema predeterminado -PREFERENCES_DIRDARKFRAMES;Carpeta de Dark Frames +PREFERENCES_DIRDARKFRAMES;Carpeta con las Tomas Negras PREFERENCES_DIRHOME;Carpeta de usuario PREFERENCES_DIRLAST;Última carpeta visitada PREFERENCES_DIROTHER;Otro @@ -802,7 +804,7 @@ PREFERENCES_FLUOF11;Fluorescente F11 PREFERENCES_FORIMAGE;Para fotos de tipo diferente a raw PREFERENCES_FORRAW;Para fotos Raw PREFERENCES_GIMPPATH;Carpeta de instalación de GIMP -PREFERENCES_GREENEQUIL;Equilibrado del verde +PREFERENCES_GREENEQUIL;Equilibrado de verdes PREFERENCES_GREY05;Yb=05 CIE L#30 PREFERENCES_GREY10;Yb=10 CIE L#40 PREFERENCES_GREY15;Yb=15 CIE L#45 @@ -888,7 +890,7 @@ PREFERENCES_TP_VSCROLLBAR;Ocultar barra de desplazamiento vertical del panel de PREFERENCES_TUNNELMETADATA;Copiar IPTC/XMP sin cambios al fichero de salida (cuando etiquete con otro programa) PREFERENCES_USEBUNDLEDPROFILES;Usar perfiles empaquetados PREFERENCES_USESYSTEMTHEME;Usar tema del sistema -PREFERENCES_VIEW;Balance de blancos establecido en el dispositivo de salida (monitor, TV, proyector, etc.) +PREFERENCES_VIEW;Balance de blancos en el dispositivo de salida (monitor, TV, proyector...) PREFERENCES_WORKFLOW;Disposición PROFILEPANEL_COPYPPASTE;Parámetros a copiar PROFILEPANEL_FILEDLGFILTERANY;Cualquier archivo @@ -897,7 +899,7 @@ PROFILEPANEL_GLOBALPROFILES;Perfiles empaquetados PROFILEPANEL_LABEL;Perfiles de procesamiento PROFILEPANEL_LOADDLGLABEL;Cargar parámetros de procesamiento... PROFILEPANEL_LOADPPASTE;Parámetros a cargar -PROFILEPANEL_MODE_TIP;Modo de procesamiento de perfiles.\n\nBotón presionado: los perfiles parciales son completados; Los valores faltantes son llenados usando valores predeterminados de fábrica.\n\nBotón liberado: Los perfiles son aplicados tal como están, alterando solo los valores que contienen; los parámetros sin valores en el perfil se dejan en la imagen tal como están. +PROFILEPANEL_MODE_TIP;Modo de procesamiento de perfiles.\n\nBotón Presionado: los perfiles parciales son completados; Los valores faltantes son llenados usando valores predeterminados de fábrica.\n\nBotón Liberado: Los perfiles son aplicados tal como están, alterando solo los valores que contienen; los parámetros sin valores en el perfil se dejan en la imagen tal como están. PROFILEPANEL_MYPROFILES;Mis perfiles PROFILEPANEL_PASTEPPASTE;Parámetros PROFILEPANEL_PCUSTOM;A medida @@ -983,7 +985,7 @@ TP_BWMIX_FILTER_REDYELLOW;Rojo-Amarillo TP_BWMIX_FILTER_RED;Rojo TP_BWMIX_FILTER_TOOLTIP;El filtro de color simula fotos tomadas con un filtro de color colocado frente a la lente de la cámara. Los filtros de colores reducen el paso de un rango específico de colores, afectando correspondientemente su claridad. Por ejemplo, un filtro rojo oscurece cielos azules. TP_BWMIX_FILTER_YELLOW;Amarillo -TP_BWMIX_GAMMA;Corrección de Gamma +TP_BWMIX_GAMMA;Corrección de Gamma TP_BWMIX_GAM_BLUE;Canal Azul TP_BWMIX_GAM_GREEN;Canal Verde TP_BWMIX_GAM_RED;Canal Rojo @@ -1021,8 +1023,8 @@ TP_BWMIX_SET_RGBABS;Mezclador de canales RGB Absoluto TP_BWMIX_SET_RGBREL;Mezclador de canales RGB Relativo TP_BWMIX_SET_ROYGCBPMABS;Mezclador de canales RNAmVCAzPM Absoluto TP_BWMIX_SET_ROYGCBPMREL;Mezclador de canales RNAmVCAzPM Relativo -TP_BWMIX_TCMODE_FILMLIKE;B&N emulando película -TP_BWMIX_TCMODE_SATANDVALBLENDING;Saturación y combinación de valores B&N +TP_BWMIX_TCMODE_FILMLIKE;B&N simulando película +TP_BWMIX_TCMODE_SATANDVALBLENDING;Saturación y combinación de Valores B&N TP_BWMIX_TCMODE_STANDARD;B&N Estándar TP_BWMIX_TCMODE_WEIGHTEDSTD;B&N Estándar Ponderado TP_BWMIX_VAL;L @@ -1043,13 +1045,13 @@ TP_CLARITY_SHARPEN;Nitidez por gradiente (bordes) TP_CLARITY_STRENGTH;Intensidad de gradiente TP_CLARITY_THREE;Sólo luminancia TP_COARSETRAF_DEGREE;Grados: -TP_COARSETRAF_TOOLTIP_HFLIP;Voltear horizontalmente.\nAtajo: [ -TP_COARSETRAF_TOOLTIP_ROTLEFT;Rotar a la izquierda.\nAtajo: ] +TP_COARSETRAF_TOOLTIP_HFLIP;Voltear horizontalmente.\nAtajo: '[' +TP_COARSETRAF_TOOLTIP_ROTLEFT;Rotar a la izquierda.\nAtajo: ']' TP_COARSETRAF_TOOLTIP_ROTRIGHT;Rotar a la derecha TP_COARSETRAF_TOOLTIP_VFLIP;Voltear verticalmente TP_COLORAPP_ADAPTSCENE;Adaptación a la luminosidad de la escena TP_COLORAPP_ADAPTSCENE_TOOLTIP;Luminancia absoluta del entorno de la escena (cd/m²).\n1) Calculado en base a datos Exif: \nTiempo de Exposición - Velocidad ISO - Número F de apertura - Corrección de exposición\n2) Calculado a partir del Punto Blanco raw y Compensación de Exposición RT. -TP_COLORAPP_ADAPTVIEWING;Adaptación a la luminosidad de visualización (cd/m²) +TP_COLORAPP_ADAPTVIEWING;Luminosidad de visualización (cd/m²) TP_COLORAPP_ADAPTVIEWING_TOOLTIP;Luminancia absoluta del entorno de visualización\n(usualmente 16cd/m²) TP_COLORAPP_ADAP_AUTO_TOOLTIP;Si la casilla está seleccionada (como se recomienda) RT calcula el valor óptimo a partir de los datos Exif.\nPara establecer el valor manualmente, primero desmarque la casilla TP_COLORAPP_ALGO;Algoritmo @@ -1059,7 +1061,7 @@ TP_COLORAPP_ALGO_JS;Claridad + Saturación (JS) TP_COLORAPP_ALGO_QM;Brillo + Colorido (QM) TP_COLORAPP_ALGO_TOOLTIP;Le permite elegir entre subconjuntos de parámetros o todos los parámetros TP_COLORAPP_BADPIXSL;Filtro de píxeles calientes/muertos -TP_COLORAPP_BADPIXSL_TOOLTIP;Supresión de píxeles calientes/muertos (con coloreado brillante).\n 0=No effect 1=Mediana 2=Gaussiano.\n\nEstos elementos extraños son causados por limitaciones de CIECAM02. Como alternativa, ajuste la imagen para evitar sombras muy oscuras. +TP_COLORAPP_BADPIXSL_TOOLTIP;Supresión de píxeles calientes/muertos (con coloreado brillante).\n 0 = Sin efecto \n 1 = Mediana \n 2 = Gaussiano.\n\nEstos elementos extraños son causados por limitaciones de CIECAM02. Como alternativa, ajuste la imagen para evitar sombras muy oscuras. TP_COLORAPP_BRIGHT;Brillo (Q) TP_COLORAPP_BRIGHT_TOOLTIP;En CIECAM02 el Brillo tiene en cuenta la luminosidad de los blancos y es diferente al de Lab y al de RGB TP_COLORAPP_CHROMA;Crominancia (C) @@ -1079,7 +1081,7 @@ TP_COLORAPP_CURVEEDITOR2;Curva tonal 2 TP_COLORAPP_CURVEEDITOR2_TOOLTIP;Por favor, consulte RawPedia para aprender cómo obtener mejores resultados usando dos curvas tonales TP_COLORAPP_CURVEEDITOR3;Curva de color TP_COLORAPP_CURVEEDITOR3_TOOLTIP;Ajusta Crominancia, Saturación o Colorido.\n\nMuestra el histograma de Cromaticidad (Lab) antes de los ajustes CIECAM02.\nSi la casilla "Muestra en las curvas histogramas de salida CIECAM02" está seleccionada, muestra el histograma de C, s o M después de CIECAM02.\n\nC, s y M no se muestran en el histograma del panel principal.\n\nVea el histograma de salida final en el panel principal -TP_COLORAPP_DATACIE;Muestra en las curvas histogramas de salida CIECAM02 +TP_COLORAPP_DATACIE;Curvas con histogramas de salida CIECAM02 TP_COLORAPP_DATACIE_TOOLTIP;Si está seleccionada, los histogramas en las curvas CIECAM02 muestran aproximadamente valores/rangos de J o Q, y C, s o M después de los ajustes CIECAM02.\nEsta selección no influye en el histograma del panel principal.\n\nCuando no está seleccionada, los histogramas en las curvas CIECAM02 muestran valores Lab antes de los ajustes CIECAM02 TP_COLORAPP_DEGREE_AUTO_TOOLTIP;Si la casilla está seleccionada (como se recomienda), RT calcula el valor óptimo, que es usado por CAT02, y también por todo CIECAM02.\nPara establecer manualmente el valor, primero desmarque la casilla (se recomienda usar valores mayores a 65) TP_COLORAPP_DEGREE_TOOLTIP;Cantidad de transformación de adaptación cromática CIE 2002 @@ -1096,7 +1098,7 @@ TP_COLORAPP_LIGHT_TOOLTIP;Claridad en CIECAM02 es diferente a la de Lab y a la d TP_COLORAPP_MODEL;Modelo de punto blanco TP_COLORAPP_MODEL_TOOLTIP;Modelo de Punto Blanco\n\nWB [RT] + [salida]:\nEl Balance de Blancos de RT es usado para la escena, CIECAM02 es establecido a D50, y el Balance de Blancos del dispositivo de salida es el establecido en Preferencias > Gestión de Color\n\nWB [RT+CAT02] + [salida]:\nEl Balance de Blancos de RT es usado por CAT02 y el del dispositivo de salida es el establecido en preferencias TP_COLORAPP_RSTPRO; Protección de tonos rojos y color piel -TP_COLORAPP_RSTPRO_TOOLTIP;Protección de tonos rojos y color piel (curvas y controles deslizantes) +TP_COLORAPP_RSTPRO_TOOLTIP;Intensidad de protección de tonos rojos y color piel (en curvas y en controles deslizantes) TP_COLORAPP_SHARPCIE;Enfoque, Contraste por niveles de detalle, Micro-contraste & Eliminación de AC con Q/C TP_COLORAPP_SHARPCIE_TOOLTIP;Si se selecciona, Enfoque, Contraste por niveles de detalle, Micro-contraste & Eliminación de AC usarán CIECAM02 TP_COLORAPP_SURROUND;Entorno @@ -1157,14 +1159,15 @@ TP_CROP_W;Ancho TP_CROP_X;x TP_CROP_Y;y TP_DARKFRAME_AUTOSELECT;Auto selección -TP_DARKFRAME_LABEL;Dark Frame +TP_DARKFRAME_LABEL;Toma Negra TP_DEFRINGE_LABEL;Quitar borde púrpura TP_DEFRINGE_RADIUS;Radio TP_DEFRINGE_THRESHOLD;Umbral TP_DETAIL_AMOUNT;Cantidad -TP_DIRPYRDENOISE_BLUE;Crominancia - Azul-Amarillo -TP_DIRPYRDENOISE_CHROMA;Crominancia - Maestra +TP_DIRPYRDENOISE_BLUE;Crominancia: Azul-Amarillo +TP_DIRPYRDENOISE_CHROMA;Crominancia: Maestra TP_DIRPYRDENOISE_ENABLED_TOOLTIP;Puede usarse en imágenes Raw y no Raw.\n\nPara imágenes no Raw la reducción del ruido en la luminancia depende de la gamma en el perfil de color de entrada. Se asume la gamma de sRGB, de manera que si la imagen tiene un perfil de color con otra gamma, la reducción del ruido en la luminancia va a variar. +TP_DIRPYRDENOISE_ENH;Modo mejorado TP_DIRPYRDENOISE_ENH_TOOLTIP;Incrementa la calidad de la Reducción de Ruido a costa de un incremento de 20% en el tiempo de procesamiento TP_DIRPYRDENOISE_GAMMA;Gamma TP_DIRPYRDENOISE_GAMMA_TOOLTIP;Gamma hace variar la fuerza de reducción del ruido a lo largo del rango tonal.\n\n Valores pequeños dirigen la reducción hacia las sombras, mientras que valores grandes extienden el efecto hasta los tonos brillantes @@ -1173,14 +1176,14 @@ TP_DIRPYRDENOISE_LABEL;Reducción de ruido TP_DIRPYRDENOISE_LDETAIL;Detalle en luminancia TP_DIRPYRDENOISE_LUMA;Luminancia TP_DIRPYRDENOISE_METHOD;Método -TP_DIRPYRDENOISE_METHOD_TOOLTIP;Para imágenes Raw puede usarse tanto el método RGB como el Lab.\n\nPara imágenes no Raw el método Lab será usado, ignorando el método seleccionado. +TP_DIRPYRDENOISE_METHOD_TOOLTIP;Para imágenes raw puede usar tanto el método RGB como el Lab.\n\nPara imágenes no raw el método Lab será usado de todas maneras, ignorando el método seleccionado. TP_DIRPYRDENOISE_PERF;Modo RGB (imagen raw) -TP_DIRPYRDENOISE_RED;Crominancia - Rojo-Verde +TP_DIRPYRDENOISE_RED;Crominancia: Rojo-Verde TP_DIRPYRDENOISE_RGB;RGB TP_DIRPYREQUALIZER_LABEL;Contraste por niveles de detalle TP_DIRPYREQUALIZER_LUMACOARSEST;Más grueso -TP_DIRPYREQUALIZER_LUMACONTRAST_MINUS;Contraste- -TP_DIRPYREQUALIZER_LUMACONTRAST_PLUS;Contraste+ +TP_DIRPYREQUALIZER_LUMACONTRAST_MINUS;-Contraste +TP_DIRPYREQUALIZER_LUMACONTRAST_PLUS;+Contraste TP_DIRPYREQUALIZER_LUMAFINEST;Más fino TP_DIRPYREQUALIZER_LUMANEUTRAL;Neutro TP_DIRPYREQUALIZER_THRESHOLD;Umbral @@ -1202,8 +1205,8 @@ TP_EQUALIZER_LARGEST;muy grueso TP_EQUALIZER_NEUTRAL;Neutro TP_EXPOSCORR_LABEL;Puntos Blanco y Negro (Raw) TP_EXPOSURE_AUTOLEVELS;Niveles automáticos -TP_EXPOSURE_AUTOLEVELS_TIP;Ejecuta Niveles Automáticos. Establece automáticamente los valores de los parámetros basándose en el análisis de la imagen\nHabilita la reconstrucción de luces altas si es necesario -TP_EXPOSURE_BLACKLEVEL;Negro +TP_EXPOSURE_AUTOLEVELS_TIP;Ejecuta Niveles Automáticos. Establece automáticamente los valores de los parámetros basándose en el análisis de la imagen.\nHabilita la reconstrucción de luces altas si es necesario +TP_EXPOSURE_BLACKLEVEL;Nivel de Negro TP_EXPOSURE_BRIGHTNESS;Brillo TP_EXPOSURE_CLIP;Recorte % TP_EXPOSURE_CLIP_TIP;Fracción de los píxeles que se recortará en una operación de Niveles Automáticos @@ -1214,10 +1217,10 @@ TP_EXPOSURE_CONTRAST;Contraste TP_EXPOSURE_CURVEEDITOR1;Curva tonal 1 TP_EXPOSURE_CURVEEDITOR2;Curva tonal 2 TP_EXPOSURE_CURVEEDITOR2_TOOLTIP;Por favor, consulte RawPedia para aprender cómo obtener mejores resultados usando dos curvas tonales -TP_EXPOSURE_EXPCOMP;Comp. de exposición +TP_EXPOSURE_EXPCOMP;Compensación de exposición TP_EXPOSURE_LABEL;Exposición TP_EXPOSURE_SATURATION;Saturación -TP_EXPOSURE_TCMODE_FILMLIKE;Similar a la película +TP_EXPOSURE_TCMODE_FILMLIKE;Similar a película TP_EXPOSURE_TCMODE_LABEL1;Curva modo 1 TP_EXPOSURE_TCMODE_LABEL2;Curva modo 2 TP_EXPOSURE_TCMODE_SATANDVALBLENDING;Mezcla de saturación y valor @@ -1240,14 +1243,14 @@ TP_GAMMA_SLOP;Pendiente (lineal) TP_GENERAL_11SCALE_TOOLTIP;El efecto de esta herramienta o el de alguno de sus componentes solo es apreciable en escala de vista previa 1:1 TP_GRADIENT_CENTER;Centro TP_GRADIENT_CENTER_X;Centro X -TP_GRADIENT_CENTER_X_TOOLTIP;Ancla X del punto de rotación:\n-100=borde izquierdo\n0=centro\n+100=borde derecho +TP_GRADIENT_CENTER_X_TOOLTIP;Ancla X del punto de rotación:\n-100 = borde izquierdo\n 0 = centro\n+100 = borde derecho TP_GRADIENT_CENTER_Y;Centro Y TP_GRADIENT_CENTER_Y_TOOLTIP;Ancla Y del punto de rotación:\n-100=borde superior\n0=centro\n+100=borde inferior TP_GRADIENT_DEGREE;Ángulo TP_GRADIENT_DEGREE_TOOLTIP;Ángulo de rotación en grados TP_GRADIENT_FEATHER;Difuminado TP_GRADIENT_FEATHER_TOOLTIP;Ancho del gradiente expresado como porcentaje de la diagonal de la imagen -TP_GRADIENT_LABEL;Filtro con gradiente +TP_GRADIENT_LABEL;Filtro gradiente TP_GRADIENT_STRENGTH;Intensidad TP_GRADIENT_STRENGTH_TOOLTIP;Fuerza del filtro en pasos de exposición TP_HLREC_BLEND;Mezcla @@ -1278,8 +1281,8 @@ TP_ICM_DCPILLUMINANT_TOOLTIP;Seleccione el Iluminante a emplear. El valor predet TP_ICM_FILEDLGFILTERANY;Cualquier archivo TP_ICM_FILEDLGFILTERICM;Perfiles de color TP_ICM_GAMMABEFOREINPUT;El perfil aplica gamma -TP_ICM_INPUTCAMERAICC;Perfil de la cámara (auto-matched) -TP_ICM_INPUTCAMERAICC_TOOLTIP;Usa perfil de color de entrada específico de la cámara de RawTherapee. Estos perfiles son más precisos que los de matriz de color simple. No están disponibles para todas las cámaras. Estos perfiles son guardados en las carpetas /iccprofiles/input y /dcpprofiles instaladas con RT. Son automáticamente elegidas buscando coincidencia entre el nombre del archivo con la marca y el modelo exacto de la cámara. +TP_ICM_INPUTCAMERAICC;Perfil de la cámara (auto elegida) +TP_ICM_INPUTCAMERAICC_TOOLTIP;Usa perfil de color de entrada específico de la cámara en RawTherapee. Estos perfiles son más precisos que los de matriz de color simple. No están disponibles para todas las cámaras. Estos perfiles son guardados en las carpetas /iccprofiles/input y /dcpprofiles instaladas con RT. Son automáticamente elegidas buscando coincidencia entre el nombre del archivo con la marca y el modelo exacto de la cámara. TP_ICM_INPUTCAMERA;Cámara estándar TP_ICM_INPUTCAMERA_TOOLTIP;Usa una versión de la matriz de color simple de dcraw mejorada por RT (cualquiera que esté disponible basándose en el modelo de la cámara) o incrustada en DNG TP_ICM_INPUTCUSTOM;A medida @@ -1298,10 +1301,10 @@ TP_ICM_PREFERREDPROFILE_1;Luz de día TP_ICM_PREFERREDPROFILE_2;Tungsteno TP_ICM_PREFERREDPROFILE_3;Fluorescente TP_ICM_PREFERREDPROFILE_4;Flash -TP_ICM_SAVEREFERENCEDLGLABEL;Guardar imagen de referencia para perfilado -TP_ICM_SAVEREFERENCE;Guardar imagen de referencia para el perfilado -TP_ICM_TONECURVE;Usar la curva de tonal DCP incrustada. Este ajuste es posible solo si el DCP seleccionado contiene una curva tonal. -TP_ICM_TONECURVE_TOOLTIP;Activa el uso de las curvas de tono que pueden contener los perfiles DCP. +TP_ICM_SAVEREFERENCEDLGLABEL;Guardar como referencia para perfilado +TP_ICM_SAVEREFERENCE;Guardar como referencia para el perfilado +TP_ICM_TONECURVE;Usar la curva tonal en DCP +TP_ICM_TONECURVE_TOOLTIP;Activa el uso de las curvas de tono que pueden contener los perfiles DCP. Este ajuste es posible solo si el DCP seleccionado contiene una curva tonal. TP_ICM_WORKINGPROFILE;Perfil de trabajo TP_IMPULSEDENOISE_LABEL;Impulsar Reducc. ruido TP_IMPULSEDENOISE_THRESH;Umbral @@ -1329,19 +1332,21 @@ TP_LABCURVE_CURVEEDITOR_CC_RANGE2;Mates TP_LABCURVE_CURVEEDITOR_CC_RANGE3;Pastel TP_LABCURVE_CURVEEDITOR_CC_RANGE4;Saturados TP_LABCURVE_CURVEEDITOR_CC_TOOLTIP;Cromaticidad en función de la Cromaticidad C=f(C) +TP_LABCURVE_CURVEEDITOR_CH;CM TP_LABCURVE_CURVEEDITOR_CH_TOOLTIP;Cromaticidad en función del Matiz C=f(M) TP_LABCURVE_CURVEEDITOR_CL;CL TP_LABCURVE_CURVEEDITOR_CL_TOOLTIP;Cromaticidad en función de la Luminancia C=f(L) TP_LABCURVE_CURVEEDITOR_HH;MM TP_LABCURVE_CURVEEDITOR_HH_TOOLTIP;Matiz en función del Matiz M=f(M) -TP_LABCURVE_CURVEEDITOR_LC_TOOLTIP;Luminancia en función de la Cromaticidad L=f(C) +TP_LABCURVE_CURVEEDITOR_LC;LC +TP_LABCURVE_CURVEEDITOR_LC_TOOLTIP;Luminancia en función de la Cromaticidad L=f(C) TP_LABCURVE_CURVEEDITOR_LH;LM TP_LABCURVE_CURVEEDITOR_LH_TOOLTIP;Luminancia en función del Matiz L=f(M) TP_LABCURVE_CURVEEDITOR_LL_TOOLTIP;Luminancia en función de la Luminancia L=f(L) TP_LABCURVE_ENABLESATLIMITER;Activar limitador de saturación TP_LABCURVE_LABEL;Ajustes Lab TP_LABCURVE_LCREDSK;Restringe LC a tonos rojos y piel -TP_LABCURVE_LCREDSK_TIP;Si se activa, 'Curva LC' afecta solo a los tonos rojos y piel\nSi se desactiva, se aplica a todos los colores +TP_LABCURVE_LCREDSK_TIP;Si se activa, la 'Curva LC' afecta solo a los tonos rojos y piel\nSi se desactiva, se aplica a todos los colores TP_LABCURVE_RSTPROTECTION;Protección de rojos y tonos piel TP_LABCURVE_RSTPRO_TOOLTIP;Puede usarse con el deslizador Cromaticidad y con la curva CC. TP_LABCURVE_SATLIMIT;Límite de saturación @@ -1376,14 +1381,14 @@ TP_PERSPECTIVE_HORIZONTAL;Horizontal TP_PERSPECTIVE_LABEL;Perspectiva TP_PERSPECTIVE_VERTICAL;Vertical TP_PFCURVE_CURVEEDITOR_CH;Matiz -TP_PFCURVE_CURVEEDITOR_CH_TOOLTIP;Controla la fuerza de reducción de bordes coloridos (AC):\n\n Alto = más\n\nbajo = menos. +TP_PFCURVE_CURVEEDITOR_CH_TOOLTIP;Controla la fuerza de reducción de bordes coloridos (AC):\n\n Alto = más\nbajo = menos. TP_PREPROCESS_DARKFRAME;Imagen en oscuridad TP_PREPROCESS_DFAUTOSELECT;Selección automática TP_PREPROCESS_FLATFIELDAUTOSELECT;Selección automática de campo plano TP_PREPROCESS_FLATFIELDBLURRADIUS;Radio de difuminado de campo plano TP_PREPROCESS_FLATFIELDBLURTYPE;Tipo de difuminado de campo plano TP_PREPROCESS_FLATFIELDFILE;Archivo de campo plano -TP_PREPROCESS_GREENEQUIL;Equilibrado del verde +TP_PREPROCESS_GREENEQUIL;Equilibrado de verdes TP_PREPROCESS_HOTDEADPIXFILT;Aplicar filtro de píxel dañado TP_PREPROCESS_HOTDEADPIXFILT_TOOLTIP;Intenta eliminar píxeles calientes o muertos TP_PREPROCESS_LABEL;Preprocesado @@ -1542,7 +1547,7 @@ TP_WBALANCE_SOLUX35;Solux 3500K TP_WBALANCE_SOLUX41;Solux 4100K TP_WBALANCE_SOLUX47;Solux 4700K (proveedor) TP_WBALANCE_SOLUX47_NG;Solux 4700K (Nat. Gallery) -TP_WBALANCE_SPOTWB;Muestra eq. bl. +TP_WBALANCE_SPOTWB;Muestra bal. blancos TP_WBALANCE_TEMPERATURE;Temperatura TP_WBALANCE_TUNGSTEN;Tungsteno TP_WBALANCE_WATER1;Subacuático 1 @@ -1560,8 +1565,22 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nAtajo: - !!!!!!!!!!!!!!!!!!!!!!!!! !HISTORY_MSG_251;B&W - Algorithm +!HISTORY_MSG_252;CbDL Skin Tones +!HISTORY_MSG_253;CbDL Reduce artifacts +!HISTORY_MSG_254;CbDL - Hueskin +!HISTORY_MSG_255;CbDL - Algorithm !TP_BWMIX_ALGO;Algorithm OYCPM !TP_BWMIX_ALGO_LI;Linear !TP_BWMIX_ALGO_SP;Special effects !TP_BWMIX_ALGO_TOOLTIP;Linear: will produce a normal linear response.\nSpecial effects: will produce special effects by mixing channels non-linearly. +!TP_DIRPYREQUALIZER_ALGO;Algorithm Skin +!TP_DIRPYREQUALIZER_ALGO_FI;Fine +!TP_DIRPYREQUALIZER_ALGO_LA;Large +!TP_DIRPYREQUALIZER_ALGO_TOOLTIP;Fine: closer to the colors of the skin, minimizing the action on other colors\nLarge: avoid more artifacts +!TP_DIRPYREQUALIZER_GAMUT;Reduce artifacts +!TP_DIRPYREQUALIZER_HUESKIN;Skin hue +!TP_DIRPYREQUALIZER_HUESKIN_TOOLTIP;This pyramid is for the upper part, so far as the algorithm at its maximum efficiency.\nTo the lower part, the transition zones.\nIf you need to move the area significantly to the left or right - or if there are artifacts: the white balance is incorrect\nYou can slightly reduce the zone to prevent the rest of the image is affected +!TP_DIRPYREQUALIZER_SKIN;Skin Tones Targetting/Protection +!TP_DIRPYREQUALIZER_SKIN_TOOLTIP;At -100 skin tones are targetted.\nAt 0 all tones are treated equally.\nAt +100 skin tones are protected while all other tones are affected. +!TP_DIRPYREQUALIZER_TOOLTIP;Attempts to reduce artifacts due to the transitions between the color (hue, chroma, luma) of the skin and the rest of the image !TP_ICM_SAVEREFERENCE_TOOLTIP;Save the linear TIFF image before the input profile is applied. The result can be used for calibration purposes and generation of a camera profile. diff --git a/rtdata/languages/Francais b/rtdata/languages/Francais index ad7e03c24..0cb4bf92d 100644 --- a/rtdata/languages/Francais +++ b/rtdata/languages/Francais @@ -116,6 +116,12 @@ FILEBROWSER_PARTIALPASTEPROFILE;Coller partiellement FILEBROWSER_PASTEPROFILE;Coller le profil FILEBROWSER_POPUPCANCELJOB;Retirer de la file de traitement FILEBROWSER_POPUPCOLORLABEL;Label couleur +FILEBROWSER_POPUPCOLORLABEL0;Label: Aucun +FILEBROWSER_POPUPCOLORLABEL1;Label: Rouge +FILEBROWSER_POPUPCOLORLABEL2;Label: Jaune +FILEBROWSER_POPUPCOLORLABEL3;Label: Vert +FILEBROWSER_POPUPCOLORLABEL4;Label: Bleu +FILEBROWSER_POPUPCOLORLABEL5;Label: Pourpre FILEBROWSER_POPUPCOPYTO;Copier vers... FILEBROWSER_POPUPFILEOPERATIONS;Opérations sur les fichiers FILEBROWSER_POPUPMOVEEND;Déplacer à la fin de la file @@ -125,7 +131,13 @@ FILEBROWSER_POPUPOPEN;Ouvrir FILEBROWSER_POPUPPROCESSFAST;Mettre dans la file de traitement (Export Rapide) FILEBROWSER_POPUPPROCESS;Mettre dans la file de traitement FILEBROWSER_POPUPPROFILEOPERATIONS;Opérations sur les profils -FILEBROWSER_POPUPRANK;Étoiles +FILEBROWSER_POPUPRANK;Rang +FILEBROWSER_POPUPRANK0;Aucun +FILEBROWSER_POPUPRANK1;Rang 1 * +FILEBROWSER_POPUPRANK2;Rang 2 ** +FILEBROWSER_POPUPRANK3;Rang 3 *** +FILEBROWSER_POPUPRANK4;Rang 4 **** +FILEBROWSER_POPUPRANK5;Rang 5 ***** FILEBROWSER_POPUPREMOVEINCLPROC;Supprimer (y compris les sorties de la file de traitement) FILEBROWSER_POPUPREMOVE;Retirer du système de fichier FILEBROWSER_POPUPRENAME;Renommer @@ -1115,7 +1127,7 @@ TP_GAMMA_CURV;Gamma TP_GAMMA_FREE;Manuel TP_GAMMA_OUTPUT;Gamma de sortie TP_GAMMA_SLOP;Pente (linéaire) -TP_GENERAL_11SCALE_TOOLTIP;L'effet de cet outil ou de l'un de ses sous-composant n'est visible qu'avec un aperçu à l'échelle 1:1. +TP_GENERAL_11SCALE_TOOLTIP;Les effets de cet outil ne sont visible ou fiable qu'avec un aperçu à l'échelle 1:1. TP_GRADIENT_CENTER;Centre TP_GRADIENT_CENTER_X;Centre X TP_GRADIENT_CENTER_X_TOOLTIP;Coord. X du point d'ancrage de la rotation: -100=bord gauche, 0=centre, +100=bord droit diff --git a/rtdata/languages/default b/rtdata/languages/default index 9e6309671..b222a9f0a 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -118,6 +118,12 @@ FILEBROWSER_PARTIALPASTEPROFILE;Paste - partial FILEBROWSER_PASTEPROFILE;Paste FILEBROWSER_POPUPCANCELJOB;Cancel job FILEBROWSER_POPUPCOLORLABEL;Color label +FILEBROWSER_POPUPCOLORLABEL0;Label: None +FILEBROWSER_POPUPCOLORLABEL1;Label: Red +FILEBROWSER_POPUPCOLORLABEL2;Label: Yellow +FILEBROWSER_POPUPCOLORLABEL3;Label: Green +FILEBROWSER_POPUPCOLORLABEL4;Label: Blue +FILEBROWSER_POPUPCOLORLABEL5;Label: Purple FILEBROWSER_POPUPCOPYTO;Copy to... FILEBROWSER_POPUPFILEOPERATIONS;File Operations FILEBROWSER_POPUPMOVEEND;Move to end of Queue @@ -128,6 +134,12 @@ FILEBROWSER_POPUPPROCESSFAST;Put to Queue (Fast export) FILEBROWSER_POPUPPROCESS;Put to Queue FILEBROWSER_POPUPPROFILEOPERATIONS;Processing Profile Operations FILEBROWSER_POPUPRANK;Rank +FILEBROWSER_POPUPRANK0;Unkank +FILEBROWSER_POPUPRANK1;Rank 1 * +FILEBROWSER_POPUPRANK2;Rank 2 ** +FILEBROWSER_POPUPRANK3;Rank 3 *** +FILEBROWSER_POPUPRANK4;Rank 4 **** +FILEBROWSER_POPUPRANK5;Rank 5 ***** FILEBROWSER_POPUPREMOVEINCLPROC;Delete with output from queue FILEBROWSER_POPUPREMOVE;Delete FILEBROWSER_POPUPRENAME;Rename @@ -1136,7 +1148,7 @@ TP_GAMMA_CURV;Gamma TP_GAMMA_FREE;Free gamma TP_GAMMA_OUTPUT;Output Gamma TP_GAMMA_SLOP;Slope (linear) -TP_GENERAL_11SCALE_TOOLTIP;The effect of this tool or some of its sub-components is only visible at 1:1 preview scale. +TP_GENERAL_11SCALE_TOOLTIP;The effects of this tool are only visible or only accurate at a preview scale of 1:1. TP_GRADIENT_CENTER;Center TP_GRADIENT_CENTER_X;Center X TP_GRADIENT_CENTER_X_TOOLTIP;Shift gradient to the left (negative values) or right (positive values). diff --git a/rtengine/FTblockDN.cc b/rtengine/FTblockDN.cc index 7eb267577..6b54a22e1 100644 --- a/rtengine/FTblockDN.cc +++ b/rtengine/FTblockDN.cc @@ -40,10 +40,8 @@ #include "boxblur.h" #include "rt_math.h" #include "mytime.h" -#include "sleef.c" -#ifdef __SSE2__ - #include "sleefsseavx.c" -#endif +#include "sleef.c" +#include "opthelper.h" #ifdef _OPENMP #include @@ -89,7 +87,7 @@ namespace rtengine { void ImProcFunctions::RGB_denoise(Imagefloat * src, Imagefloat * dst, bool isRAW, const procparams::DirPyrDenoiseParams & dnparams, const procparams::DefringeParams & defringe, const double expcomp) - { + { //#ifdef _DEBUG // MyTime t1e,t2e; // t1e.set(); @@ -98,6 +96,7 @@ namespace rtengine { static MyMutex FftwMutex; MyMutex::MyLock lock(FftwMutex); + //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*if (plistener) { @@ -109,8 +108,8 @@ namespace rtengine { //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - const short int imheight=src->height, imwidth=src->width; - + const short int imheight=src->height, imwidth=src->width; + if (dnparams.luma==0 && dnparams.chroma==0) { //nothing to do; copy src to dst memcpy(dst->data,src->data,dst->width*dst->height*3*sizeof(float)); @@ -174,7 +173,7 @@ namespace rtengine { array2D tilemask_out(TS,TS); const int border = MAX(2,TS/16); - + #ifdef _OPENMP #pragma omp parallel for #endif @@ -190,7 +189,6 @@ namespace rtengine { } } - //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% // begin tile processing of image @@ -296,7 +294,10 @@ namespace rtengine { { Lblox = (float*) fftwf_malloc(max_numblox_W*TS*TS*sizeof(float)); fLblox = (float*) fftwf_malloc(max_numblox_W*TS*TS*sizeof(float)); - } + } + + float * nbrwt = new float[TS*TS]; + float * blurbuffer = new float[TS*TS]; #ifdef _OPENMP #pragma omp for schedule(dynamic) collapse(2) #endif @@ -317,14 +318,10 @@ namespace rtengine { //pixel weight array2D totwt(width,height,ARRAY2D_CLEAR_DATA);//weight for combining DCT blocks - // - //#ifdef _OPENMP - //#pragma omp parallel for - //#endif //TODO: implement using AlignedBufferMP //fill tile from image; convert RGB to "luma/chroma" if (isRAW) {//image is raw; use channel differences for chroma channels - if(!perf){//lab mode + if(!perf){//lab mode //modification Jacques feb 2013 for (int i=tiletop/*, i1=0*/; i pBuf(width + TS + 2*blkrad*offset); for (int vblk=0; vblkdata, dsttmp->data, 3*dst->width*dst->height*sizeof(float)); @@ -804,16 +790,11 @@ namespace rtengine { //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -#if defined( __SSE2__ ) && defined( WIN32 ) -__attribute__((force_align_arg_pointer)) void ImProcFunctions::RGBtile_denoise (float * fLblox, int vblproc, int hblproc, int numblox_H, int numblox_W, float noisevar_Ldetail ) //for DCT -#else - void ImProcFunctions::RGBtile_denoise (float * fLblox, int vblproc, int hblproc, int numblox_H, int numblox_W, float noisevar_Ldetail ) //for DCT -#endif +SSEFUNCTION void ImProcFunctions::RGBtile_denoise (float * fLblox, int hblproc, float noisevar_Ldetail, float * nbrwt, float * blurbuffer ) //for DCT { - float * nbrwt = new float[TS*TS]; //for DCT int blkstart = hblproc*TS*TS; - boxabsblur(fLblox+blkstart, nbrwt, 3, 3, TS, TS);//blur neighbor weights for more robust estimation //for DCT + boxabsblur(fLblox+blkstart, nbrwt, 3, 3, TS, TS, blurbuffer);//blur neighbor weights for more robust estimation //for DCT #ifdef __SSE2__ __m128 tempv; @@ -830,7 +811,6 @@ __attribute__((force_align_arg_pointer)) void ImProcFunctions::RGBtile_denoise ( fLblox[blkstart+n] *= (1-xexpf(-SQR(nbrwt[n])/noisevar_Ldetail)); }//output neighbor averaged result #endif - delete[] nbrwt; //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //printf("vblk=%d hlk=%d wsqave=%f || ",vblproc,hblproc,wsqave); @@ -851,9 +831,6 @@ __attribute__((force_align_arg_pointer)) void ImProcFunctions::RGBtile_denoise ( int imax = bottom - top; //add row of tiles to output image -#ifdef _OPENMP -#pragma omp parallel for -#endif for (int hblk=0; hblk < numblox_W; hblk++) { int left = (hblk-blkrad)*offset; int right = MIN(left+TS, width); @@ -862,7 +839,7 @@ __attribute__((force_align_arg_pointer)) void ImProcFunctions::RGBtile_denoise ( int indx = hblk*TS; for (int i=imin; i=0; lvl--) {//for levels less than max, use level diff to make edge mask //for (int lvl=0; lvl edge(Wlvl_L,Hlvl_L); + float * sfave = new float[Wlvl_L*Hlvl_L]; + float * WavCoeffsLtemp = new float[Hlvl_ab*Wlvl_ab]; + +// array2D edge(Wlvl_L,Hlvl_L); //printf("\n level=%d \n",lvl); for (int dir=1; dir<4; dir++) { float mad_L = madL[lvl][dir-1]; float mad_a = noisevar_abr*mada[lvl][dir-1]; - float mad_b = noisevar_abb*madb[lvl][dir-1]; + float mad_b = noisevar_abb*madb[lvl][dir-1]; + + //float mad_Lpar = madL[lvl+1][dir-1]; //float mad_apar = mada[lvl+1][dir-1]; //float mad_bpar = mada[lvl+1][dir-1]; //float skip_ab_ratio = WaveletCoeffs_a.level_stride(lvl+1)/skip_ab; - float skip_L_ratio = WaveletCoeffs_L.level_stride(lvl+1)/skip_L; +// float skip_L_ratio = WaveletCoeffs_L.level_stride(lvl+1)/skip_L; if (noisevar_abr>0.01f || noisevar_abb>0.01f) { - + for(int i=0;i0.01f) { - mad_L *= noisevar_L*5/(lvl+1); -//OpenMP here + if (noisevar_L>0.01f) { + mad_L *= noisevar_L*5.f/(lvl+1); +#ifdef __SSE2__ + int j; + __m128 mad_Lv = _mm_set1_ps(mad_L); + __m128 mad_Lm9v = _mm_set1_ps(mad_L * 9.f); + __m128 epsv = _mm_set1_ps(eps); + __m128 mag_Lv; + for (int i=0; i (edge, edge, buffer, Wlvl_L, Hlvl_L, 1<<(lvl+1), false /*multiThread*/); //gaussVertical (edge, edge, buffer, Wlvl_L, Hlvl_L, 1<<(lvl+1), false); boxblur(sfave, sfave, lvl+2, lvl+2, Wlvl_L, Hlvl_L);//increase smoothness by locally averaging shrinkage -//OpenMP here + +#ifdef __SSE2__ + __m128 tempLv; + __m128 tempL2v; + __m128 sf_Lv; + + for (int i=0; i 582=max float mad_b = madb*noisevar_abb; - if (noisevar_abr>0.01f || noisevar_abb>0.01f) { -//OpenMP here + if (noisevar_abr>0.01f || noisevar_abb>0.01f) { + for(int i=0;i2*thresh_a ? 1 : (coeff_a2*thresh_b ? 1 : (coeff_b0.01f) { @@ -1225,9 +1364,6 @@ __attribute__((force_align_arg_pointer)) void ImProcFunctions::ShrinkAll(float * sfave[i] = mag/(mag+mad_L*xexpf(-mag/(9*mad_L))+eps); } #else -#ifdef _OPENMP -#pragma omp parallel for -#endif for (int i=0; iinUse) { buffers[i]->inUse=true; return buffers[i]; diff --git a/rtengine/boxblur.h b/rtengine/boxblur.h index 986f731d8..9c1b49a19 100644 --- a/rtengine/boxblur.h +++ b/rtengine/boxblur.h @@ -29,9 +29,7 @@ #endif #include "rt_math.h" -#ifdef __SSE2__ - #include "sleefsseavx.c" -#endif +#include "opthelper.h" //using namespace rtengine; @@ -120,11 +118,8 @@ template void boxblur (T** src, A** dst, int radx, int rady, i //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -#if defined( __SSE2__ ) && defined( WIN32 ) -template __attribute__((force_align_arg_pointer)) void boxblur (T* src, A* dst, int radx, int rady, int W, int H) { -#else -template void boxblur (T* src, A* dst, int radx, int rady, int W, int H) { -#endif +template SSEFUNCTION void boxblur (T* src, A* dst, int radx, int rady, int W, int H) { + //printf("boxblur\n"); //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //box blur image; box range = (radx,rady) i.e. box size is (2*radx+1)x(2*rady+1) @@ -138,9 +133,6 @@ template void boxblur (T* src, A* dst, int radx, int rady, int } } else { //horizontal blur -#ifdef _OPENMP -#pragma omp parallel for -#endif for (int row = 0; row < H; row++) { int len = radx + 1; temp[row*W+0] = (float)src[row*W+0]; @@ -163,9 +155,6 @@ template void boxblur (T* src, A* dst, int radx, int rady, int } if (rady==0) { -#ifdef _OPENMP -#pragma omp parallel for -#endif for (int row=0; row void boxblur (T* src, A* dst, int radx, int rady, int } } #else -#ifdef _OPENMP -#pragma omp parallel for -#endif for (int col = 0; col < W; col++) { int len = rady + 1; dst[0*W+col] = temp[0*W+col]/len; @@ -664,32 +650,18 @@ template void boxcorrelate (T* src, A* dst, int dx, int dy, in //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -#if defined( __SSE2__ ) && defined( WIN32 ) -template __attribute__((force_align_arg_pointer)) void boxabsblur (T* src, A* dst, int radx, int rady, int W, int H) { -#else -template void boxabsblur (T* src, A* dst, int radx, int rady, int W, int H) { -#endif +template SSEFUNCTION void boxabsblur (T* src, A* dst, int radx, int rady, int W, int H, float * temp) { //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //box blur image; box range = (radx,rady) i.e. box size is (2*radx+1)x(2*rady+1) - AlignedBuffer* buffer = new AlignedBuffer (W*H); - float* temp = buffer->data; - if (radx==0) { -#ifdef _OPENMP -#pragma omp parallel for -#endif for (int row=0; row void boxabsblur (T* src, A* dst, int radx, int rady, } if (rady==0) { -#ifdef _OPENMP -#pragma omp parallel for -#endif for (int row=0; row void boxabsblur (T* src, A* dst, int radx, int rady, } #else - -//OpenMP here -#ifdef _OPENMP -#pragma omp parallel for -#endif for (int col = 0; col < W; col++) { int len = rady + 1; dst[0*W+col] = temp[0*W+col]/len; @@ -792,8 +756,6 @@ template void boxabsblur (T* src, A* dst, int radx, int rady, #endif } - delete buffer; - } //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/rtengine/color.cc b/rtengine/color.cc index 4cc8dc63e..2c74c99e3 100644 --- a/rtengine/color.cc +++ b/rtengine/color.cc @@ -54,10 +54,10 @@ namespace rtengine { const double Color::sRGBGammaCurve = 2.4; const double Color::eps_max=580.40756; //(MAXVALF* 216.0f/24389.0); - const double Color::kappa=903.29630; //24389.0/27.0; + const double Color::kappa=24389.0/27.0;//903.29630; - const float Color::D50x=0.96422; - const float Color::D50z=0.82521; + const float Color::D50x=0.9642f; //0.96422; + const float Color::D50z=0.8249f; //0.82521; const double Color::u0=4.0*D50x/(D50x+15+3*D50z); const double Color::v0=9.0/(D50x+15+3*D50z); const double Color::epskap=8.0; @@ -703,7 +703,8 @@ namespace rtengine { const double epsilonExpInv3 = 6.0/29.0; const double kappaInv = 27.0/24389.0; // inverse of kappa - return (f > epsilonExpInv3) ? f*f*f : (116 * f - 16) * kappaInv; + return (f > epsilonExpInv3) ? f*f*f : (116. * f - 16.) * kappaInv; + } /* diff --git a/rtengine/curves.cc b/rtengine/curves.cc index 984960bde..8dbf4700d 100644 --- a/rtengine/curves.cc +++ b/rtengine/curves.cc @@ -168,7 +168,7 @@ void CurveFactory::updatechroma ( if (outBeforeCCurveHistogramC /*&& histogramCropped*/) histNeededC = true; } - for (int i=0; i<=48000; i++) {//32768*1.414 + ... + for (int i=0; i<48000; i++) {//32768*1.414 + ... float val; if (histNeededC) { float hval = dCcurve[i]; @@ -266,7 +266,7 @@ void CurveFactory::curveLightBrightColor ( tcurve = NULL; } } - for (int i=0; i<=32768; i++) { + for (int i=0; i<32768; i++) { float val; if (histNeeded) { @@ -275,7 +275,7 @@ void CurveFactory::curveLightBrightColor ( outBeforeCCurveHistogram[hi] += histogram[i] ; } } - for (int i=0; i<=48000; i++) {//32768*1.414 + ... + for (int i=0; i<48000; i++) {//32768*1.414 + ... float val; if (histNeededC) { float hval = dCcurve[i]; @@ -336,7 +336,7 @@ void CurveFactory::curveBW ( } // create first curve if needed - for (int i=0; i<=32768; i++) { + for (int i=0; i<32768; i++) { float val; if (histNeeded) { @@ -373,7 +373,7 @@ void CurveFactory::curveCL ( bool & clcutili,const std::vector& clcurveP if (dCurve && !dCurve->isIdentity()) {needed = true;clcutili=true;} } - for (int i=0; i<=50000; i++) {//32768*1.414 + ... + for (int i=0; i<50000; i++) {//32768*1.414 + ... float val; if (histNeededCL) { float hval = dCcurve[i]; @@ -459,7 +459,7 @@ void CurveFactory::curveCL ( bool & clcutili,const std::vector& clcurveP if (dCurve && !dCurve->isIdentity()) {needed = true;ccutili=true;} } - for (int i=0; i<=48000; i++) {//32768*1.414 + ... + for (int i=0; i<48000; i++) {//32768*1.414 + ... float val; if (histNeededC) { float hval = dCcurve[i]; @@ -483,7 +483,7 @@ void CurveFactory::curveCL ( bool & clcutili,const std::vector& clcurveP if (dCurve && !dCurve->isIdentity()) {needed = true;cclutili=true;} } - for (int i=0; i<=48000; i++) {//32768*1.414 + ... + for (int i=0; i<48000; i++) {//32768*1.414 + ... float val; if (histNeededLC) { float hval = dCcurve[i]; diff --git a/rtengine/dcraw.cc b/rtengine/dcraw.cc index bd37bba9e..dd7d45b71 100644 --- a/rtengine/dcraw.cc +++ b/rtengine/dcraw.cc @@ -8082,6 +8082,7 @@ konica_400z: filters = 0x16161616; } } else if (!strcmp(make,"Leica") || !strcmp(make,"Panasonic")) { + if(raw_width > 0) { // avoid divide by zero if ((flen - data_offset) / (raw_width*8/7) == raw_height) load_raw = &CLASS panasonic_load_raw; if (!load_raw) { @@ -8099,6 +8100,7 @@ konica_400z: } filters = 0x01010101 * (uchar) "\x94\x61\x49\x16" [((filters-1) ^ (left_margin & 1) ^ (top_margin << 1)) & 3]; + } } else if (!strcmp(model,"C770UZ")) { height = 1718; width = 2304; diff --git a/rtengine/dcraw.patch b/rtengine/dcraw.patch index 553342b3c..f43e1bdbe 100755 --- a/rtengine/dcraw.patch +++ b/rtengine/dcraw.patch @@ -1,5 +1,5 @@ ---- dcraw.c 2014-02-19 17:25:45.051457734 +0100 -+++ dcraw.cc 2014-02-25 15:08:30.852134339 +0100 +--- dcraw.c 2014-03-14 10:56:17 +0000 ++++ dcraw.cc 2014-03-14 10:57:48 +0000 @@ -1,3 +1,15 @@ +/*RT*/#include +/*RT*/#include @@ -936,7 +936,23 @@ width -= 46; } else if (!strcmp(model,"D4") || !strcmp(model,"Df")) { -@@ -8630,6 +8318,10 @@ +@@ -8394,6 +8082,7 @@ + filters = 0x16161616; + } + } else if (!strcmp(make,"Leica") || !strcmp(make,"Panasonic")) { ++ if(raw_width > 0) { // avoid divide by zero + if ((flen - data_offset) / (raw_width*8/7) == raw_height) + load_raw = &CLASS panasonic_load_raw; + if (!load_raw) { +@@ -8411,6 +8100,7 @@ + } + filters = 0x01010101 * (uchar) "\x94\x61\x49\x16" + [((filters-1) ^ (left_margin & 1) ^ (top_margin << 1)) & 3]; ++ } + } else if (!strcmp(model,"C770UZ")) { + height = 1718; + width = 2304; +@@ -8630,6 +8320,10 @@ memcpy (rgb_cam, cmatrix, sizeof cmatrix); raw_color = 0; } @@ -947,7 +963,7 @@ if (raw_color) adobe_coeff (make, model); if (load_raw == &CLASS kodak_radc_load_raw) if (raw_color) adobe_coeff ("Apple","Quicktake"); -@@ -8725,194 +8417,7 @@ +@@ -8725,194 +8419,7 @@ } #endif @@ -1143,7 +1159,7 @@ struct tiff_tag { ushort tag, type; -@@ -8935,585 +8440,12 @@ +@@ -8935,585 +8442,12 @@ unsigned gps[26]; char desc[512], make[64], model[64], soft[32], date[20], artist[64]; }; diff --git a/rtengine/demosaic_algos.cc b/rtengine/demosaic_algos.cc index 341f2905d..08922adb4 100644 --- a/rtengine/demosaic_algos.cc +++ b/rtengine/demosaic_algos.cc @@ -564,184 +564,243 @@ void RawImageSource::hphd_demosaic () { //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -#define FORCC for (c=0; c < colors; c++) -#define fc(row,col) \ - (ri->prefilters >> ((((row) << 1 & 14) + ((col) & 1)) << 1) & 3) +#define fc(row,col) (prefilters >> ((((row) << 1 & 14) + ((col) & 1)) << 1) & 3) typedef unsigned short ushort; void RawImageSource::vng4_demosaic () { - static const signed short int *cp, terms[] = { - -2,-2,+0,-1,0,0x01, -2,-2,+0,+0,1,0x01, -2,-1,-1,+0,0,0x01, - -2,-1,+0,-1,0,0x02, -2,-1,+0,+0,0,0x03, -2,-1,+0,+1,1,0x01, - -2,+0,+0,-1,0,0x06, -2,+0,+0,+0,1,0x02, -2,+0,+0,+1,0,0x03, - -2,+1,-1,+0,0,0x04, -2,+1,+0,-1,1,0x04, -2,+1,+0,+0,0,0x06, - -2,+1,+0,+1,0,0x02, -2,+2,+0,+0,1,0x04, -2,+2,+0,+1,0,0x04, - -1,-2,-1,+0,0,0x80, -1,-2,+0,-1,0,0x01, -1,-2,+1,-1,0,0x01, - -1,-2,+1,+0,1,0x01, -1,-1,-1,+1,0,0x88, -1,-1,+1,-2,0,0x40, - -1,-1,+1,-1,0,0x22, -1,-1,+1,+0,0,0x33, -1,-1,+1,+1,1,0x11, - -1,+0,-1,+2,0,0x08, -1,+0,+0,-1,0,0x44, -1,+0,+0,+1,0,0x11, - -1,+0,+1,-2,1,0x40, -1,+0,+1,-1,0,0x66, -1,+0,+1,+0,1,0x22, - -1,+0,+1,+1,0,0x33, -1,+0,+1,+2,1,0x10, -1,+1,+1,-1,1,0x44, - -1,+1,+1,+0,0,0x66, -1,+1,+1,+1,0,0x22, -1,+1,+1,+2,0,0x10, - -1,+2,+0,+1,0,0x04, -1,+2,+1,+0,1,0x04, -1,+2,+1,+1,0,0x04, - +0,-2,+0,+0,1,0x80, +0,-1,+0,+1,1,0x88, +0,-1,+1,-2,0,0x40, - +0,-1,+1,+0,0,0x11, +0,-1,+2,-2,0,0x40, +0,-1,+2,-1,0,0x20, - +0,-1,+2,+0,0,0x30, +0,-1,+2,+1,1,0x10, +0,+0,+0,+2,1,0x08, - +0,+0,+2,-2,1,0x40, +0,+0,+2,-1,0,0x60, +0,+0,+2,+0,1,0x20, - +0,+0,+2,+1,0,0x30, +0,+0,+2,+2,1,0x10, +0,+1,+1,+0,0,0x44, - +0,+1,+1,+2,0,0x10, +0,+1,+2,-1,1,0x40, +0,+1,+2,+0,0,0x60, - +0,+1,+2,+1,0,0x20, +0,+1,+2,+2,0,0x10, +1,-2,+1,+0,0,0x80, - +1,-1,+1,+1,0,0x88, +1,+0,+1,+2,0,0x08, +1,+0,+2,-1,0,0x40, - +1,+0,+2,+1,0,0x10 - }, chood[] = { -1,-1, -1,0, -1,+1, 0,+1, +1,+1, +1,0, +1,-1, 0,-1 }; + const signed short int *cp, terms[] = { + -2,-2,+0,-1,0,0x01, -2,-2,+0,+0,1,0x01, -2,-1,-1,+0,0,0x01, + -2,-1,+0,-1,0,0x02, -2,-1,+0,+0,0,0x03, -2,-1,+0,+1,1,0x01, + -2,+0,+0,-1,0,0x06, -2,+0,+0,+0,1,0x02, -2,+0,+0,+1,0,0x03, + -2,+1,-1,+0,0,0x04, -2,+1,+0,-1,1,0x04, -2,+1,+0,+0,0,0x06, + -2,+1,+0,+1,0,0x02, -2,+2,+0,+0,1,0x04, -2,+2,+0,+1,0,0x04, + -1,-2,-1,+0,0,0x80, -1,-2,+0,-1,0,0x01, -1,-2,+1,-1,0,0x01, + -1,-2,+1,+0,1,0x01, -1,-1,-1,+1,0,0x88, -1,-1,+1,-2,0,0x40, + -1,-1,+1,-1,0,0x22, -1,-1,+1,+0,0,0x33, -1,-1,+1,+1,1,0x11, + -1,+0,-1,+2,0,0x08, -1,+0,+0,-1,0,0x44, -1,+0,+0,+1,0,0x11, + -1,+0,+1,-2,1,0x40, -1,+0,+1,-1,0,0x66, -1,+0,+1,+0,1,0x22, + -1,+0,+1,+1,0,0x33, -1,+0,+1,+2,1,0x10, -1,+1,+1,-1,1,0x44, + -1,+1,+1,+0,0,0x66, -1,+1,+1,+1,0,0x22, -1,+1,+1,+2,0,0x10, + -1,+2,+0,+1,0,0x04, -1,+2,+1,+0,1,0x04, -1,+2,+1,+1,0,0x04, + +0,-2,+0,+0,1,0x80, +0,-1,+0,+1,1,0x88, +0,-1,+1,-2,0,0x40, + +0,-1,+1,+0,0,0x11, +0,-1,+2,-2,0,0x40, +0,-1,+2,-1,0,0x20, + +0,-1,+2,+0,0,0x30, +0,-1,+2,+1,1,0x10, +0,+0,+0,+2,1,0x08, + +0,+0,+2,-2,1,0x40, +0,+0,+2,-1,0,0x60, +0,+0,+2,+0,1,0x20, + +0,+0,+2,+1,0,0x30, +0,+0,+2,+2,1,0x10, +0,+1,+1,+0,0,0x44, + +0,+1,+1,+2,0,0x10, +0,+1,+2,-1,1,0x40, +0,+1,+2,+0,0,0x60, + +0,+1,+2,+1,0,0x20, +0,+1,+2,+2,0,0x10, +1,-2,+1,+0,0,0x80, + +1,-1,+1,+1,0,0x88, +1,+0,+1,+2,0,0x08, +1,+0,+2,-1,0,0x40, + +1,+0,+2,+1,0,0x10 + }, + chood[] = { -1,-1, -1,0, -1,+1, 0,+1, +1,+1, +1,0, +1,-1, 0,-1 }; - if (plistener) { - plistener->setProgressStr (Glib::ustring::compose(M("TP_RAW_DMETHOD_PROGRESSBAR"), RAWParams::methodstring[RAWParams::vng4])); - plistener->setProgress (0.0); - } + double progress = 0.0; + const bool plistenerActive = plistener; - float (*brow[5])[4], *pix; - int prow=7, pcol=1, *ip, *code[16][16], gval[8], gmin, gmax, sum[4]; - int row, col, x, y, x1, x2, y1, y2, t, weight, grads, color, diag; - int g, diff, thold, num, c, width=W, height=H, colors=4; - float (*image)[4]; - int lcode[16][16][32], shift, i; + if (plistenerActive) { + plistener->setProgressStr (Glib::ustring::compose(M("TP_RAW_DMETHOD_PROGRESSBAR"), RAWParams::methodstring[RAWParams::vng4])); + plistener->setProgress (progress); + } - image = (float (*)[4]) calloc (H*W, sizeof *image); - for (int ii=0; iiprefilters; + const int width=W, height=H; + const int colors=4; + float (*image)[4]; + + image = (float (*)[4]) calloc (height*width, sizeof *image); + +#ifdef _OPENMP +#pragma omp parallel for +#endif + for (int ii=0; ii gval[g]) gmin = gval[g]; - if (gmax < gval[g]) gmax = gval[g]; - } - if (gmax == 0) { - memcpy (brow[2][col], pix, sizeof *image); - continue; - } - thold = gmin + (gmax /2); - memset (sum, 0, sizeof sum); - for (num=g=0; g < 8; g++,ip+=2) { /* Average the neighbors */ - if (gval[g] <= thold) { - FORCC - if (c == color && ip[1]) - sum[c] += (pix[c] + pix[ip[1]]) /2; - else - sum[c] += pix[ip[0] + c]; - num++; +#ifdef _OPENMP +#pragma omp parallel for +#endif + for (int row=1; row < height-1; row++) { + for (int col=1; col < width-1; col++) { + float * pix = image[row*width+col]; + int * ip = lcode[row & 15][col & 15]; + float sum[4]; + memset (sum, 0, sizeof sum); + for (int i=0; i<8;i++, ip+=2) + sum[ip[1]] += pix[ip[0]] * mul[row & 15][col & 15][i]; + for (int i=0; i 3) /* Write buffer to image */ - memcpy (image[(row-2)*width+2], brow[0]+2, (width-4)*sizeof *image); - for (g=0; g < 4; g++) - brow[(g-1) & 3] = brow[g]; - if (!(row%20) && plistener) - plistener->setProgress ((double)row / (H-2)); } - memcpy (image[(row-2)*width+2], brow[0]+2, (width-4)*sizeof *image); - memcpy (image[(row-1)*width+2], brow[1]+2, (width-4)*sizeof *image); - free (brow[4]); + + const int prow=7, pcol=1; + int *code[8][2]; + int t, g; + int * ip = (int *) calloc ((prow+1)*(pcol+1), 1280); + for (int row=0; row <= prow; row++) /* Precalculate for VNG */ + for (int col=0; col <= pcol; col++) { + code[row][col] = ip; + for (cp=terms, t=0; t < 64; t++) { + int y1 = *cp++; + int x1 = *cp++; + int y2 = *cp++; + int x2 = *cp++; + int weight = *cp++; + int grads = *cp++; + int color = fc(row+y1,col+x1); + if (fc(row+y2,col+x2) != color) + continue; + int diag = (fc(row,col+1) == color && fc(row+1,col) == color) ? 2:1; + if (abs(y1-y2) == diag && abs(x1-x2) == diag) + continue; + *ip++ = (y1*width + x1)*4 + color; + *ip++ = (y2*width + x2)*4 + color; + *ip++ = weight; + for (g=0; g < 8; g++) + if (grads & (1<setProgress (progress); + } + + +#ifdef _OPENMP +#pragma omp parallel +#endif +{ + float gval[8], thold, sum[3]; + int g; + const int progressStep = 64; + const double progressInc = (0.98-progress)/((height-2)/progressStep); +#ifdef _OPENMP +#pragma omp for nowait +#endif + for (int row=2; row < height-2; row++) { /* Do VNG interpolation */ + for (int col=2; col < width-2; col++) { + float * pix = image[row*width+col]; + int * ip = code[row & prow][col & pcol]; + memset (gval, 0, sizeof gval); + while ((g = ip[0]) != INT_MAX) { /* Calculate gradients */ + float diff = fabsf(pix[g] - pix[ip[1]]) * (1<< ip[2]); + gval[ip[3]] += diff; + ip+=4; + while ((g = *ip++) != -1) + gval[g] += diff; + } + ip++; + { + float gmin, gmax; + gmin = gmax = gval[0]; /* Choose a threshold */ + for (g=1; g < 8; g++) { + if (gmin > gval[g]) + gmin = gval[g]; + if (gmax < gval[g]) + gmax = gval[g]; + } + thold = gmin + (gmax /2); + } + memset (sum, 0, sizeof sum); + float t1,t2; + int color = fc(row,col); + t1 = t2 = pix[color]; + if(color&1) { + int num = 0; + for (g=0; g < 8; g++,ip+=2) { /* Average the neighbors */ + if (gval[g] <= thold) { + if(ip[1]) + sum[0] += (t1 + pix[ip[1]])*0.5f; + sum[1] += pix[ip[0] + (color ^ 2)]; + num++; + } + } + t1 += (sum[1] - sum[0]) / num; + } else { + int num = 0; + for (g=0; g < 8; g++,ip+=2) { /* Average the neighbors */ + if (gval[g] <= thold) { + sum[1] += pix[ip[0] + 1]; + sum[2] += pix[ip[0] + 3]; + if(ip[1]) + sum[0] += (t1 + pix[ip[1]])*0.5f; + num++; + } + } + t1 += (sum[1] - sum[0]) / num; + t2 += (sum[2] - sum[0]) / num; + } + green[row][col] = 0.5f * (t1 + t2); + } + if(plistenerActive) { + if((row % progressStep) == 0) +#ifdef _OPENMP +#pragma omp critical (updateprogress) +#endif +{ + progress += progressInc; + plistener->setProgress (progress); +} + } + } + +} free (code[0][0]); + free (image); + if(plistenerActive) + plistener->setProgress (0.98); - for (int i=0; isetProgress (1.0); } //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -762,6 +822,8 @@ void RawImageSource::vng4_demosaic () { #define fc(row,col) \ (ri->get_filters() >> ((((row) << 1 & 14) + ((col) & 1)) << 1) & 3) +#define FORCC for (int c=0; c < colors; c++) + /* Patterned Pixel Grouping Interpolation by Alain Desbiolles */ @@ -836,17 +898,17 @@ void RawImageSource::ppg_demosaic() } red(W,H); - for (int i=0; isetProgressStr (Glib::ustring::compose(M("TP_RAW_DMETHOD_PROGRESSBAR"), RAWParams::methodstring[RAWParams::lmmse])); plistener->setProgress (0.0); @@ -1168,12 +1230,12 @@ void RawImageSource::lmmse_interpolate_omp(int winw, int winh, int iterations) float maxdata=0.f; image = (float (*)[3]) calloc (width*height, sizeof *image); unsigned int a=0; -#ifdef _OPENMP -#pragma omp parallel for +#ifdef _OPENMP +#pragma omp parallel for #endif for (int ii=0; ii= 0) & (row < height) & (col >= 0) & (col < width)) { if (applyGamma) - rix[0][4] = Color::gammatab_24_17a[image[row*width+col][FC(row,col)]]; + rix[0][4] = Color::gammatab_24_17a[image[row*width+col][FC(row,col)]]; else rix[0][4] = (float)image[row*width+col][FC(row,col)]/65535.0f; } @@ -1215,8 +1277,8 @@ void RawImageSource::lmmse_interpolate_omp(int winw, int winh, int iterations) // G-R(B) -#ifdef _OPENMP -#pragma omp for +#ifdef _OPENMP +#pragma omp for #endif for (int rr=2; rr < rr1-2; rr++) { // G-R(B) at R(B) location @@ -1258,8 +1320,8 @@ void RawImageSource::lmmse_interpolate_omp(int winw, int winh, int iterations) // apply low pass filter on differential colors -#ifdef _OPENMP -#pragma omp for +#ifdef _OPENMP +#pragma omp for #endif for (int rr=4; rr < rr1-4; rr++) for (int cc=4; cc < cc1-4; cc++) { @@ -1276,9 +1338,9 @@ void RawImageSource::lmmse_interpolate_omp(int winw, int winh, int iterations) // interpolate G-R(B) at R(B) -#ifdef _OPENMP -#pragma omp for -#endif +#ifdef _OPENMP +#pragma omp for +#endif for (int rr=4; rr < rr1-4; rr++) for (int cc=4+(FC(rr,4)&1); cc < cc1-4; cc+=2) { rix = qix + rr*cc1 + cc; @@ -1342,9 +1404,9 @@ void RawImageSource::lmmse_interpolate_omp(int winw, int winh, int iterations) // copy CFA values -#ifdef _OPENMP -#pragma omp for -#endif +#ifdef _OPENMP +#pragma omp for +#endif for (int rr=0; rr < rr1; rr++) for (int cc=0, row=rr-ba; cc < cc1; cc++) { int col=cc-ba; @@ -1352,7 +1414,7 @@ void RawImageSource::lmmse_interpolate_omp(int winw, int winh, int iterations) int c = FC(rr,cc); if ((row >= 0) & (row < height) & (col >= 0) & (col < width)) { if (applyGamma) - rix[0][c] = Color::gammatab_24_17a[image[row*width+col][c]]; + rix[0][c] = Color::gammatab_24_17a[image[row*width+col][c]]; else rix[0][c] = (float)image[row*width+col][c]/65535.0f; } @@ -1370,9 +1432,9 @@ void RawImageSource::lmmse_interpolate_omp(int winw, int winh, int iterations) // bilinear interpolation for R/B // interpolate R/B at G location -#ifdef _OPENMP -#pragma omp for -#endif +#ifdef _OPENMP +#pragma omp for +#endif for (int rr=1; rr < rr1-1; rr++) for (int cc=1+(FC(rr,2)&1), c=FC(rr,cc+1); cc < cc1-1; cc+=2) { rix = qix + rr*cc1 + cc; @@ -1390,9 +1452,9 @@ void RawImageSource::lmmse_interpolate_omp(int winw, int winh, int iterations) // interpolate R/B at B/R location -#ifdef _OPENMP +#ifdef _OPENMP #pragma omp for -#endif +#endif for (int rr=1; rr < rr1-1; rr++) for (int cc=1+(FC(rr,1)&1), c=2-FC(rr,cc); cc < cc1-1; cc+=2) { rix = qix + rr*cc1 + cc; @@ -1454,13 +1516,13 @@ void RawImageSource::lmmse_interpolate_omp(int winw, int winh, int iterations) } if (plistener) plistener->setProgress (0.8); -#ifdef _OPENMP +#ifdef _OPENMP #pragma omp parallel firstprivate (image,rix,qix) #endif { // copy result back to image matrix -#ifdef _OPENMP -#pragma omp for +#ifdef _OPENMP +#pragma omp for #endif for (int row=0; row < height; row++) for (int col=0, rr=row+ba; col < width; col++) { @@ -1500,7 +1562,7 @@ void RawImageSource::lmmse_interpolate_omp(int winw, int winh, int iterations) //if(iterations > 4) refinement_lassus(passref); if(iterations > 4 && iterations <=6) refinement(passref); else if(iterations > 6) refinement_lassus(passref); - + } /*** @@ -1524,7 +1586,7 @@ void RawImageSource::lmmse_interpolate_omp(int winw, int winh, int iterations) SSEFUNCTION void RawImageSource::igv_interpolate(int winw, int winh) { static const float eps=1e-5f, epssq=1e-5f;//mod epssq -10f =>-5f Jacques 3/2013 to prevent artifact (divide by zero) - + static const int h1=1, h2=2, h3=3, h5=5; const int width=winw, height=winh; const int v1=1*width, v2=2*width, v3=3*width, v5=5*width; @@ -1541,7 +1603,7 @@ SSEFUNCTION void RawImageSource::igv_interpolate(int winw, int winh) chrarray = (float (*)) calloc( width*height, sizeof( float ) ); chr[0] = chrarray; chr[1] = chrarray + (width*height)/2; - + // mapped chr[2] and chr[3] to hdif and hdif, because these are out of use, when chr[2] and chr[3] are used chr[2] = hdif; chr[3] = vdif; @@ -1620,7 +1682,7 @@ SSEFUNCTION void RawImageSource::igv_interpolate(int winw, int winh) egv=(epsv+(vabsf(LVFU(rgb[1][(indx+h1)>>1])-LVFU(rgb[1][(indx+h3)>>1]))+vabsf(LVFU(rgb[0][indx1])-LVFU(rgb[0][(indx1+h1)])))/c65535v); wgv=(epsv+(vabsf(LVFU(rgb[1][(indx-h1)>>1])-LVFU(rgb[1][(indx-h3)>>1]))+vabsf(LVFU(rgb[0][indx1])-LVFU(rgb[0][(indx1-h1)])))/c65535v); sgv=(epsv+(vabsf(LVFU(rgb[1][(indx+v1)>>1])-LVFU(rgb[1][(indx+v3)>>1]))+vabsf(LVFU(rgb[0][indx1])-LVFU(rgb[0][(indx1+v1)])))/c65535v); - //N,E,W,S High Order Interpolation (Li & Randhawa) + //N,E,W,S High Order Interpolation (Li & Randhawa) //N,E,W,S Hamilton Adams Interpolation // (48.f * 65535.f) = 3145680.f tempv = c40v*LVFU(rgb[0][indx1]); @@ -1640,7 +1702,7 @@ SSEFUNCTION void RawImageSource::igv_interpolate(int winw, int winh) eg=(eps+(fabsf(rgb[1][(indx+h1)>>1]-rgb[1][(indx+h3)>>1])+fabsf(rgb[0][indx1]-rgb[0][(indx1+h1)]))/65535.f); wg=(eps+(fabsf(rgb[1][(indx-h1)>>1]-rgb[1][(indx-h3)>>1])+fabsf(rgb[0][indx1]-rgb[0][(indx1-h1)]))/65535.f); sg=(eps+(fabsf(rgb[1][(indx+v1)>>1]-rgb[1][(indx+v3)>>1])+fabsf(rgb[0][indx1]-rgb[0][(indx1+v1)]))/65535.f); - //N,E,W,S High Order Interpolation (Li & Randhawa) + //N,E,W,S High Order Interpolation (Li & Randhawa) //N,E,W,S Hamilton Adams Interpolation // (48.f * 65535.f) = 3145680.f nv=LIM(((23.0f*rgb[1][(indx-v1)>>1]+23.0f*rgb[1][(indx-v3)>>1]+rgb[1][(indx-v5)>>1]+rgb[1][(indx+v1)>>1]+40.0f*rgb[0][indx1]-32.0f*rgb[0][(indx1-v1)]-8.0f*rgb[0][(indx1-v2)]))/3145680.f, 0.0f, 1.0f); @@ -1808,7 +1870,7 @@ SSEFUNCTION void RawImageSource::igv_interpolate(int winw, int winh) float *src1, *src2, *redsrc0, *redsrc1, *bluesrc0, *bluesrc1; #ifdef _OPENMP #pragma omp for -#endif +#endif for(int row=7; rowsetProgress (1.0); + if (plistener) plistener->setProgress (1.0); free(chrarray); free(rgbarray); free(vdif); free(hdif); @@ -1887,12 +1949,12 @@ void RawImageSource::igv_interpolate(int winw, int winh) chrarray = (float (*)) calloc(width*height*2, sizeof( float)); chr[0] = chrarray; chr[1] = chrarray + (width*height); - + vdif = (float (*)) calloc(width*height/2, sizeof *vdif); hdif = (float (*)) calloc(width*height/2, sizeof *hdif); border_interpolate2(winw,winh,7); - + if (plistener) { plistener->setProgressStr (Glib::ustring::compose(M("TP_RAW_DMETHOD_PROGRESSBAR"), RAWParams::methodstring[RAWParams::igv])); plistener->setProgress (0.0); @@ -1931,7 +1993,7 @@ void RawImageSource::igv_interpolate(int winw, int winh) eg=(eps+(fabsf(rgb[1][indx+h1]-rgb[1][indx+h3])+fabsf(rgb[c][indx]-rgb[c][indx+h2]))/65535.f); wg=(eps+(fabsf(rgb[1][indx-h1]-rgb[1][indx-h3])+fabsf(rgb[c][indx]-rgb[c][indx-h2]))/65535.f); sg=(eps+(fabsf(rgb[1][indx+v1]-rgb[1][indx+v3])+fabsf(rgb[c][indx]-rgb[c][indx+v2]))/65535.f); - //N,E,W,S High Order Interpolation (Li & Randhawa) + //N,E,W,S High Order Interpolation (Li & Randhawa) //N,E,W,S Hamilton Adams Interpolation // (48.f * 65535.f) = 3145680.f nv=LIM(((23.0f*rgb[1][indx-v1]+23.0f*rgb[1][indx-v3]+rgb[1][indx-v5]+rgb[1][indx+v1]+40.0f*rgb[c][indx]-32.0f*rgb[c][indx-v2]-8.0f*rgb[c][indx-v4]))/3145680.f, 0.0f, 1.0f); @@ -2071,7 +2133,7 @@ void RawImageSource::igv_interpolate(int winw, int winh) /* #ifdef _OPENMP #pragma omp for -#endif +#endif for (int row=0; row < height; row++) //borders for (int col=0; col < width; col++) { if (col==7 && row >= 7 && row < height-7) @@ -2085,7 +2147,7 @@ void RawImageSource::igv_interpolate(int winw, int winh) #ifdef _OPENMP #pragma omp for -#endif +#endif for(int row=7; rowverbose) printf("Refinement Lee %d usec\n", t2e.etime(t1e)); @@ -2423,8 +2485,8 @@ void RawImageSource::refinement(int PassCount) // // Should be DISABLED if it decreases image quality by increases some image noise and generates blocky edges void RawImageSource::refinement_lassus(int PassCount) -{ - // const int PassCount=1; +{ + // const int PassCount=1; // if (settings->verbose) printf("Refinement\n"); @@ -2445,7 +2507,7 @@ void RawImageSource::refinement_lassus(int PassCount) for (int j=0;j -#endif*/ +#include "opthelper.h" using namespace std; using namespace rtengine; +#define TS 224 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - +/* LUTf RawImageSource::initInvGrad() { LUTf invGrad (0x10000); @@ -47,46 +45,74 @@ LUTf RawImageSource::initInvGrad() return invGrad; } +*/ +#define INVGRAD(i) (16.0f/SQR(4.0f+i)) +#ifdef __SSE2__ +#define INVGRADV(i) (c16v*_mm_rcp_ps(SQRV(fourv+i))) +#endif +//LUTf RawImageSource::invGrad = RawImageSource::initInvGrad(); -LUTf RawImageSource::invGrad = RawImageSource::initInvGrad(); +SSEFUNCTION void RawImageSource::fast_demosaic(int winx, int winy, int winw, int winh) { + + double progress = 0.0; + const bool plistenerActive = plistener; -void RawImageSource::fast_demosaic(int winx, int winy, int winw, int winh) { //int winx=0, winy=0; //int winw=W, winh=H; if (plistener) { plistener->setProgressStr (Glib::ustring::compose(M("TP_RAW_DMETHOD_PROGRESSBAR"), RAWParams::methodstring[RAWParams::fast])); - plistener->setProgress (0.0); + plistener->setProgress (progress); } - float progress = 0.0; - const int bord=4; + const int bord=5; - int clip_pt = 4*65535*initialGain; + float clip_pt = 4*65535*initialGain; //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #ifdef _OPENMP #pragma omp parallel #endif { + + char (*buffer); + float (*greentile); + float (*redtile); + float (*bluetile); +#define CLF 1 + // assign working space + buffer = (char *) malloc(3*sizeof(float)*TS*TS + 3*CLF*64 + 63); + char *data; + data = (char*)( ( uintptr_t(buffer) + uintptr_t(63)) / 64 * 64); + + greentile = (float (*)) data; //pointers to array + redtile = (float (*)) ((char*)greentile + sizeof(float)*TS*TS + CLF*64); + bluetile = (float (*)) ((char*)redtile + sizeof(float)*TS*TS + CLF*64); + #ifdef _OPENMP -#pragma omp for +#pragma omp sections #endif +{ +#ifdef _OPENMP +#pragma omp section +#endif +{ + //first, interpolate borders using bilinear for (int i=0; i -1) && (i1 < H) && (j1 > -1)) { - int c = FC(i1,j1); - sum[c] += rawData[i1][j1]; - sum[c+3]++; - } + int jmin = max(0,j-1); + for (int i1=imin; i1 -1) && (i1 < H ) && (j1 < W)) { - int c = FC(i1,j1); - sum[c] += rawData[i1][j1]; - sum[c+3]++; - } + int jmax = min(j+2,W); + for (int i1=imin; i1 -1) && (j1 < W) && (i1 > -1)) { - int c = FC(i1,j1); - sum[c] += rawData[i1][j1]; - sum[c+3]++; - } + int c = FC(i1,j1); + sum[c] += rawData[i1][j1]; + sum[c+3]++; } int c=FC(i,j); if (c==1) { @@ -169,13 +195,11 @@ void RawImageSource::fast_demosaic(int winx, int winy, int winw, int winh) { for (int i=H-bord; i -1) && (j1 < W) && (i1 < H)) { - int c = FC(i1,j1); - sum[c] += rawData[i1][j1]; - sum[c+3]++; - } + int c = FC(i1,j1); + sum[c] += rawData[i1][j1]; + sum[c+3]++; } int c=FC(i,j); if (c==1) { @@ -194,91 +218,219 @@ void RawImageSource::fast_demosaic(int winx, int winy, int winw, int winh) { } }//i }//j - - if(plistener) plistener->setProgress(0.05); - + +} +} +#ifdef _OPENMP +#pragma omp single +#endif +{ + if(plistenerActive) { + progress += 0.1; + plistener->setProgress(progress); + } +} //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + int progressCounter = 0; + const double progressInc = 16.0*(1.0-progress)/((H*W)/((TS-4)*(TS-4))); #ifdef _OPENMP -#pragma omp for +#pragma omp for nowait +#endif + for (int top=bord-2; top < H-bord+2; top += TS-(4)) + for (int left=bord-2; left < W-bord+2; left += TS-(4)) { + int bottom = min(top+TS, H-bord+2); + int right = min(left+TS, W-bord+2); + +#ifdef __SSE2__ + int j,cc; + __m128 wtuv, wtdv, wtlv, wtrv; + __m128 greenv,tempv,absv,abs2v; + __m128 onev = _mm_set1_ps( 1.0f ); + __m128 c16v = _mm_set1_ps( 16.0f ); + __m128 fourv = _mm_set1_ps( 4.0f ); + vmask selmask; + vmask andmask = _mm_set_epi32( 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff ); + if(FC(top,left) == 1) + selmask = _mm_set_epi32( 0, 0xffffffff, 0, 0xffffffff ); + else + selmask = _mm_set_epi32( 0xffffffff, 0, 0xffffffff, 0 ); #endif // interpolate G using gradient weights - for (int i=bord; i< H-bord; i++) { + for (int i=top,rr=0; i< bottom; i++,rr++) { float wtu, wtd, wtl, wtr; - for (int j=bord; j < W-bord; j++) { +#ifdef __SSE2__ + selmask = (vmask)_mm_andnot_ps( (__m128)selmask, (__m128)andmask); + + for (j=left,cc=0; j < right-3; j+=4,cc+=4) { + tempv = LVFU(rawData[i][j]); + absv = vabsf(LVFU(rawData[i-1][j])-LVFU(rawData[i+1][j])); + wtuv = INVGRADV(absv+vabsf(tempv-LVFU(rawData[i-2][j]))+vabsf(LVFU(rawData[i-1][j])-LVFU(rawData[i-3][j]))); + wtdv = INVGRADV(absv+vabsf(tempv-LVFU(rawData[i+2][j]))+vabsf(LVFU(rawData[i+1][j])-LVFU(rawData[i+3][j]))); + abs2v = vabsf(LVFU(rawData[i][j-1])-LVFU(rawData[i][j+1])); + wtlv = INVGRADV(abs2v+vabsf(tempv-LVFU(rawData[i][j-2]))+vabsf(LVFU(rawData[i][j-1])-LVFU(rawData[i][j-3]))); + wtrv = INVGRADV(abs2v+vabsf(tempv-LVFU(rawData[i][j+2]))+vabsf(LVFU(rawData[i][j+1])-LVFU(rawData[i][j+3]))); + greenv = (wtuv*LVFU(rawData[i-1][j])+wtdv*LVFU(rawData[i+1][j])+wtlv*LVFU(rawData[i][j-1])+wtrv*LVFU(rawData[i][j+1])) / (wtuv+wtdv+wtlv+wtrv); + _mm_store_ps(&greentile[rr*TS+cc],vself(selmask, greenv, tempv)); + _mm_store_ps(&redtile[rr*TS+cc],tempv); + _mm_store_ps(&bluetile[rr*TS+cc],tempv); + } + for (; j < right; j++,cc++) { if (FC(i,j)==1) { - green[i][j] = rawData[i][j]; - //red[i][j] = green[i][j]; - //blue[i][j] = green[i][j]; + greentile[rr*TS+cc] = rawData[i][j]; - } else { + } else { //compute directional weights using image gradients - wtu=invGrad[(abs(rawData[i+1][j]-rawData[i-1][j])+abs(rawData[i][j]-rawData[i-2][j])+abs(rawData[i-1][j]-rawData[i-3][j])) /4]; - wtd=invGrad[(abs(rawData[i-1][j]-rawData[i+1][j])+abs(rawData[i][j]-rawData[i+2][j])+abs(rawData[i+1][j]-rawData[i+3][j])) /4]; - wtl=invGrad[(abs(rawData[i][j+1]-rawData[i][j-1])+abs(rawData[i][j]-rawData[i][j-2])+abs(rawData[i][j-1]-rawData[i][j-3])) /4]; - wtr=invGrad[(abs(rawData[i][j-1]-rawData[i][j+1])+abs(rawData[i][j]-rawData[i][j+2])+abs(rawData[i][j+1]-rawData[i][j+3])) /4]; + wtu=INVGRAD((abs(rawData[i+1][j]-rawData[i-1][j])+abs(rawData[i][j]-rawData[i-2][j])+abs(rawData[i-1][j]-rawData[i-3][j]))); + wtd=INVGRAD((abs(rawData[i-1][j]-rawData[i+1][j])+abs(rawData[i][j]-rawData[i+2][j])+abs(rawData[i+1][j]-rawData[i+3][j]))); + wtl=INVGRAD((abs(rawData[i][j+1]-rawData[i][j-1])+abs(rawData[i][j]-rawData[i][j-2])+abs(rawData[i][j-1]-rawData[i][j-3]))); + wtr=INVGRAD((abs(rawData[i][j-1]-rawData[i][j+1])+abs(rawData[i][j]-rawData[i][j+2])+abs(rawData[i][j+1]-rawData[i][j+3]))); //store in rgb array the interpolated G value at R/B grid points using directional weighted average - green[i][j]=(wtu*rawData[i-1][j]+wtd*rawData[i+1][j]+wtl*rawData[i][j-1]+wtr*rawData[i][j+1]) / (wtu+wtd+wtl+wtr); - //red[i][j] = green[i][j]; - //blue[i][j] = green[i][j]; - + greentile[rr*TS+cc]=(wtu*rawData[i-1][j]+wtd*rawData[i+1][j]+wtl*rawData[i][j-1]+wtr*rawData[i][j+1]) / (wtu+wtd+wtl+wtr); } + redtile[rr*TS+cc] = rawData[i][j]; + bluetile[rr*TS+cc] = rawData[i][j]; } - //progress+=(double)0.33/(H); - //if(plistener) plistener->setProgress(progress); - } - if(plistener) plistener->setProgress(0.4); + +#else + for (int j=left,cc=0; j < right; j++,cc++) { + if (FC(i,j)==1) { + greentile[rr*TS+cc] = rawData[i][j]; + } else { + //compute directional weights using image gradients + wtu=INVGRAD((abs(rawData[i+1][j]-rawData[i-1][j])+abs(rawData[i][j]-rawData[i-2][j])+abs(rawData[i-1][j]-rawData[i-3][j]))); + wtd=INVGRAD((abs(rawData[i-1][j]-rawData[i+1][j])+abs(rawData[i][j]-rawData[i+2][j])+abs(rawData[i+1][j]-rawData[i+3][j]))); + wtl=INVGRAD((abs(rawData[i][j+1]-rawData[i][j-1])+abs(rawData[i][j]-rawData[i][j-2])+abs(rawData[i][j-1]-rawData[i][j-3]))); + wtr=INVGRAD((abs(rawData[i][j-1]-rawData[i][j+1])+abs(rawData[i][j]-rawData[i][j+2])+abs(rawData[i][j+1]-rawData[i][j+3]))); -#ifdef _OPENMP -#pragma omp for -#endif - for (int i=bord; i< H-bord; i++) { - for (int j=bord+(FC(i,2)&1); j < W-bord; j+=2) { - - int c=FC(i,j); - //interpolate B/R colors at R/B sites - - if (c==0) {//R site - red[i][j] = rawData[i][j]; - blue[i][j] = green[i][j] - 0.25f*((green[i-1][j-1]+green[i-1][j+1]+green[i+1][j+1]+green[i+1][j-1]) - - min(static_cast(clip_pt),rawData[i-1][j-1]+rawData[i-1][j+1]+rawData[i+1][j+1]+rawData[i+1][j-1])); - } else {//B site - red[i][j] = green[i][j] - 0.25f*((green[i-1][j-1]+green[i-1][j+1]+green[i+1][j+1]+green[i+1][j-1]) - - min(static_cast(clip_pt),rawData[i-1][j-1]+rawData[i-1][j+1]+rawData[i+1][j+1]+rawData[i+1][j-1])); - blue[i][j] = rawData[i][j]; + //store in rgb array the interpolated G value at R/B grid points using directional weighted average + greentile[rr*TS+cc]=(wtu*rawData[i-1][j]+wtd*rawData[i+1][j]+wtl*rawData[i][j-1]+wtr*rawData[i][j+1]) / (wtu+wtd+wtl+wtr); } + redtile[rr*TS+cc] = rawData[i][j]; + bluetile[rr*TS+cc] = rawData[i][j]; } - //progress+=(double)0.33/(H); - //if(plistener) plistener->setProgress(progress); - } - if(plistener) plistener->setProgress(0.7); - -#ifdef _OPENMP -#pragma omp barrier #endif + } -#ifdef _OPENMP -#pragma omp for +#ifdef __SSE2__ + __m128 zd25v = _mm_set1_ps(0.25f); + __m128 clip_ptv = _mm_set1_ps( clip_pt ); +#endif + for (int i=top+1,rr=1; i< bottom-1; i++,rr++) { + if (FC(i,left+(FC(i,2)&1)+1)==0) +#ifdef __SSE2__ + for (int j=left+1,cc=1; j < right-1; j+=4,cc+=4) { + //interpolate B/R colors at R/B sites + _mm_storeu_ps(&bluetile[rr*TS+cc], LVFU(greentile[rr*TS+cc]) - zd25v*((LVFU(greentile[(rr-1)*TS+(cc-1)])+LVFU(greentile[(rr-1)*TS+(cc+1)])+LVFU(greentile[(rr+1)*TS+cc+1])+LVFU(greentile[(rr+1)*TS+cc-1])) - + _mm_min_ps(clip_ptv,LVFU(rawData[i-1][j-1])+LVFU(rawData[i-1][j+1])+LVFU(rawData[i+1][j+1])+LVFU(rawData[i+1][j-1])))); + } +#else + for (int cc=(FC(i,2)&1)+1, j=left+cc; j < right-1; j+=2, cc+=2) { + //interpolate B/R colors at R/B sites + bluetile[rr*TS+cc] = greentile[rr*TS+cc] - 0.25f*((greentile[(rr-1)*TS+(cc-1)]+greentile[(rr-1)*TS+(cc+1)]+greentile[(rr+1)*TS+cc+1]+greentile[(rr+1)*TS+cc-1]) - + min(clip_pt,rawData[i-1][j-1]+rawData[i-1][j+1]+rawData[i+1][j+1]+rawData[i+1][j-1])); + } +#endif + else +#ifdef __SSE2__ + for (int j=left+1,cc=1; j < right-1; j+=4,cc+=4) { + //interpolate B/R colors at R/B sites + _mm_storeu_ps(&redtile[rr*TS+cc], LVFU(greentile[rr*TS+cc]) - zd25v*((LVFU(greentile[(rr-1)*TS+cc-1])+LVFU(greentile[(rr-1)*TS+cc+1])+LVFU(greentile[(rr+1)*TS+cc+1])+LVFU(greentile[(rr+1)*TS+cc-1])) - + _mm_min_ps(clip_ptv,LVFU(rawData[i-1][j-1])+LVFU(rawData[i-1][j+1])+LVFU(rawData[i+1][j+1])+LVFU(rawData[i+1][j-1])))); + } +#else + for (int cc=(FC(i,2)&1)+1, j=left+cc; j < right-1; j+=2,cc+=2) { + //interpolate B/R colors at R/B sites + redtile[rr*TS+cc] = greentile[rr*TS+cc] - 0.25f*((greentile[(rr-1)*TS+cc-1]+greentile[(rr-1)*TS+cc+1]+greentile[(rr+1)*TS+cc+1]+greentile[(rr+1)*TS+cc-1]) - + min(clip_pt,rawData[i-1][j-1]+rawData[i-1][j+1]+rawData[i+1][j+1]+rawData[i+1][j-1])); + } +#endif + } + + +#ifdef __SSE2__ + __m128 temp1v,temp2v,greensumv; + selmask = _mm_set_epi32( 0xffffffff, 0, 0xffffffff, 0 ); #endif // interpolate R/B using color differences - for (int i=bord; i< H-bord; i++) { - for (int j=bord+1-(FC(i,2)&1); j < W-bord; j+=2) { - - //interpolate R and B colors at G sites - red[i][j] = green[i][j] - 0.25f*((green[i-1][j]-red[i-1][j])+(green[i+1][j]-red[i+1][j])+ - (green[i][j-1]-red[i][j-1])+(green[i][j+1]-red[i][j+1])); - blue[i][j] = green[i][j] - 0.25f*((green[i-1][j]-blue[i-1][j])+(green[i+1][j]-blue[i+1][j])+ - (green[i][j-1]-blue[i][j-1])+(green[i][j+1]-blue[i][j+1])); + for (int i=top+2, rr=2; i< bottom-2; i++,rr++) { +#ifdef __SSE2__ + for (int cc=2+(FC(i,2)&1), j=left+cc; j < right-2; j+=4,cc+=4) { + // no need to take care about the borders of the tile. There's enough free space. + //interpolate R and B colors at G sites + greenv = LVFU(greentile[rr*TS+cc]); + greensumv = LVFU(greentile[(rr-1)*TS+cc]) + LVFU(greentile[(rr+1)*TS+cc]) + LVFU(greentile[rr*TS+cc-1]) + LVFU(greentile[rr*TS+cc+1]); + + temp1v = LVFU(redtile[rr*TS+cc]); + temp2v = greenv - zd25v*(greensumv - LVFU(redtile[(rr-1)*TS+cc]) - LVFU(redtile[(rr+1)*TS+cc]) - LVFU(redtile[rr*TS+cc-1]) - LVFU(redtile[rr*TS+cc+1])); + +// temp2v = greenv - zd25v*((LVFU(greentile[(rr-1)*TS+cc])-LVFU(redtile[(rr-1)*TS+cc]))+(LVFU(greentile[(rr+1)*TS+cc])-LVFU(redtile[(rr+1)*TS+cc]))+ +// (LVFU(greentile[rr*TS+cc-1])-LVFU(redtile[rr*TS+cc-1]))+(LVFU(greentile[rr*TS+cc+1])-LVFU(redtile[rr*TS+cc+1]))); + _mm_storeu_ps( &redtile[rr*TS+cc], vself(selmask, temp1v, temp2v)); + + temp1v = LVFU(bluetile[rr*TS+cc]); + + temp2v = greenv - zd25v*(greensumv - LVFU(bluetile[(rr-1)*TS+cc]) - LVFU(bluetile[(rr+1)*TS+cc]) - LVFU(bluetile[rr*TS+cc-1]) - LVFU(bluetile[rr*TS+cc+1])); + +// temp2v = greenv - zd25v*((LVFU(greentile[(rr-1)*TS+cc])-LVFU(bluetile[(rr-1)*TS+cc]))+(LVFU(greentile[(rr+1)*TS+cc])-LVFU(bluetile[(rr+1)*TS+cc]))+ +// (LVFU(greentile[rr*TS+cc-1])-LVFU(bluetile[rr*TS+cc-1]))+(LVFU(greentile[rr*TS+cc+1])-LVFU(bluetile[rr*TS+cc+1]))); + _mm_storeu_ps( &bluetile[rr*TS+cc], vself(selmask, temp1v, temp2v)); + } +#else + for (int cc=2+(FC(i,2)&1), j=left+cc; j < right-2; j+=2,cc+=2) { + //interpolate R and B colors at G sites + redtile[rr*TS+cc] = greentile[rr*TS+cc] - 0.25f*((greentile[(rr-1)*TS+cc]-redtile[(rr-1)*TS+cc])+(greentile[(rr+1)*TS+cc]-redtile[(rr+1)*TS+cc])+ + (greentile[rr*TS+cc-1]-redtile[rr*TS+cc-1])+(greentile[rr*TS+cc+1]-redtile[rr*TS+cc+1])); + bluetile[rr*TS+cc] = greentile[rr*TS+cc] - 0.25f*((greentile[(rr-1)*TS+cc]-bluetile[(rr-1)*TS+cc])+(greentile[(rr+1)*TS+cc]-bluetile[(rr+1)*TS+cc])+ + (greentile[rr*TS+cc-1]-bluetile[rr*TS+cc-1])+(greentile[rr*TS+cc+1]-bluetile[rr*TS+cc+1])); + } +#endif } - progress+=(double)0.33/(H); - //if(plistener) plistener->setProgress(progress); - } - if(plistener) plistener->setProgress(0.99); - } // End of parallelization - -#undef bord - + + + for (int i=top+2, rr=2; i< bottom-2; i++,rr++) { +#ifdef __SSE2__ + for (j=left+2, cc=2; j< right-5; j+=4,cc+=4) { + _mm_storeu_ps(&red[i][j], LVFU(redtile[rr*TS+cc])); + _mm_storeu_ps(&green[i][j], LVFU(greentile[rr*TS+cc])); + _mm_storeu_ps(&blue[i][j], LVFU(bluetile[rr*TS+cc])); + } + for (; j< right-2; j++,cc++) { + red[i][j] = redtile[rr*TS+cc]; + green[i][j] = greentile[rr*TS+cc]; + blue[i][j] = bluetile[rr*TS+cc]; + } +#else + for (int j=left+2, cc=2; j< right-2; j++,cc++) { + red[i][j] = redtile[rr*TS+cc]; + green[i][j] = greentile[rr*TS+cc]; + blue[i][j] = bluetile[rr*TS+cc]; + } +#endif + + + } + if(plistenerActive && ((++progressCounter) % 16 == 0)) { +#ifdef _OPENMP +#pragma omp critical (updateprogress) +#endif +{ + progress += progressInc; + progress = min(1.0,progress); + plistener->setProgress (progress); } + } + + } + free(buffer); +} // End of parallelization + if(plistenerActive) plistener->setProgress(1.00); + + + +} +#undef TS +#undef CLF diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index 406e14d76..a1314df60 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -832,10 +832,10 @@ if(params->colorappearance.enabled) { if(ncie->Q_p[i][j]Q_p[i][j];//minima if(ncie->Q_p[i][j]>maxQ) maxQ=ncie->Q_p[i][j];//maxima } - if(!params->colorappearance.tonecie || !settings->autocielab || !params->edgePreservingDecompositionUI.enabled ){ + if(!params->colorappearance.tonecie || !settings->autocielab || !params->epd.enabled ){ -// if(!params->edgePreservingDecompositionUI.enabled || !params->colorappearance.tonecie || !settings->autocielab){ - // if(!params->edgePreservingDecompositionUI.enabled || !params->colorappearance.tonecie || !params->colorappearance.sharpcie){ +// if(!params->epd.enabled || !params->colorappearance.tonecie || !settings->autocielab){ + // if(!params->epd.enabled || !params->colorappearance.tonecie || !params->colorappearance.sharpcie){ int posl, posc; double brli=327.; double chsacol=327.; @@ -907,13 +907,13 @@ if(params->colorappearance.enabled) { } } // End of parallelization -if(!params->edgePreservingDecompositionUI.enabled || !params->colorappearance.tonecie || !settings->autocielab){//normal -//if(!params->edgePreservingDecompositionUI.enabled || !params->colorappearance.tonecie || !params->colorappearance.sharpcie){//normal +if(!params->epd.enabled || !params->colorappearance.tonecie || !settings->autocielab){//normal +//if(!params->epd.enabled || !params->colorappearance.tonecie || !params->colorappearance.sharpcie){//normal if(ciedata) { //update histogram J if(pW!=1){//only with improccoordinator - for (int i=0; i<=32768; i++) {// + for (int i=0; i<32768; i++) {// if (jp) { float hval = dLcurve[i]; int hi = (int)(255.0*CLIPD(hval)); // @@ -922,7 +922,7 @@ if(!params->edgePreservingDecompositionUI.enabled || !params->colorappearance.to } } if(pW!=1){//only with improccoordinator - for (int i=0; i<=48000; i++) {// + for (int i=0; i<48000; i++) {// if (chropC) { float hvalc = dCcurve[i]; int hic = (int)(255.0*CLIPD(hvalc)); // @@ -1004,11 +1004,11 @@ if(params->dirpyrequalizer.enabled /*&& (execsharp)*/) { } } -if((params->colorappearance.tonecie || (params->colorappearance.tonecie && params->edgePreservingDecompositionUI.enabled)) || (params->sharpening.enabled && settings->autocielab) +if((params->colorappearance.tonecie || (params->colorappearance.tonecie && params->epd.enabled)) || (params->sharpening.enabled && settings->autocielab) || (params->dirpyrequalizer.enabled && settings->autocielab) ||(params->defringe.enabled && settings->autocielab) || (params->sharpenMicro.enabled && settings->autocielab) || (params->colorappearance.badpixsl > 0 && settings->autocielab)) { - if(params->edgePreservingDecompositionUI.enabled && params->colorappearance.tonecie && algepd) ImProcFunctions::EPDToneMapCIE(ncie, a_w, c_, w_h, width, height, begh, endh, minQ, maxQ, Iterates, scale ); + if(params->epd.enabled && params->colorappearance.tonecie && algepd) ImProcFunctions::EPDToneMapCIE(ncie, a_w, c_, w_h, width, height, begh, endh, minQ, maxQ, Iterates, scale ); //EPDToneMapCIE adapted to CIECAM @@ -1034,8 +1034,8 @@ if((params->colorappearance.tonecie || (params->colorappearance.tonecie && param float x,y,z; const float eps=0.0001; float co_e=(pow(f_l,0.25f))+eps; - // if(params->edgePreservingDecompositionUI.enabled) ncie->J_p[i][j]=(100.0* ncie->Q_p[i][j]*ncie->Q_p[i][j])/(w_h*w_h); - if(params->edgePreservingDecompositionUI.enabled) ncie->J_p[i][j]=(100.0* ncie->Q_p[i][j]*ncie->Q_p[i][j])/SQR((4./c)*(aw+4.)); + // if(params->epd.enabled) ncie->J_p[i][j]=(100.0* ncie->Q_p[i][j]*ncie->Q_p[i][j])/(w_h*w_h); + if(params->epd.enabled) ncie->J_p[i][j]=(100.0* ncie->Q_p[i][j]*ncie->Q_p[i][j])/SQR((4./c)*(aw+4.)); ncie->C_p[i][j] =(ncie->M_p[i][j])/co_e; //show histogram in CIECAM mode (Q,J, M,s,C) @@ -1113,7 +1113,7 @@ if((params->colorappearance.tonecie || (params->colorappearance.tonecie && param if(ciedata) { //update histogram J and Q if(pW!=1){//only with improccoordinator - for (int i=0; i<=32768; i++) {// + for (int i=0; i<32768; i++) {// if (jp) { float hval = dLcurve[i]; int hi = (int)(255.0*CLIPD(hval)); // @@ -1123,7 +1123,7 @@ if((params->colorappearance.tonecie || (params->colorappearance.tonecie && param } //update color histogram M,s,C if(pW!=1){//only with improccoordinator - for (int i=0; i<=48000; i++) {// + for (int i=0; i<48000; i++) {// if (chropC) { float hvalc = dCcurve[i]; int hic = (int)(255.0*CLIPD(hvalc)); // @@ -1704,7 +1704,7 @@ if(params->colorappearance.enabled) { if(ncie->Q_p[i][j]Q_p[i][j];//minima if(ncie->Q_p[i][j]>maxQ) maxQ=ncie->Q_p[i][j];//maxima } - if(!params->colorappearance.tonecie || !settings->autocielab || !params->edgePreservingDecompositionUI.enabled){ + if(!params->colorappearance.tonecie || !settings->autocielab || !params->epd.enabled){ int posl, posc; float brli=327.f; float chsacol=327.f; @@ -1793,7 +1793,7 @@ if(!params->colorappearance.tonecie || !settings->autocielab){//normal if(ciedata) { //update histogram J if(pW!=1){//only with improccoordinator - for (int i=0; i<=32768; i++) {// + for (int i=0; i<32768; i++) {// if (jp) { float hval = dLcurve[i]; int hi = (int)(255.0f*CLIPD(hval)); // @@ -1802,7 +1802,7 @@ if(!params->colorappearance.tonecie || !settings->autocielab){//normal } } if(pW!=1){//only with improccoordinator - for (int i=0; i<=48000; i++) {// + for (int i=0; i<48000; i++) {// if (chropC) { float hvalc = dCcurve[i]; int hic = (int)(255.0f*CLIPD(hvalc)); // @@ -1895,11 +1895,11 @@ printf("BADPIX"); } } } -if((params->colorappearance.tonecie && (params->edgePreservingDecompositionUI.enabled)) || (params->sharpening.enabled && settings->autocielab) +if((params->colorappearance.tonecie && (params->epd.enabled)) || (params->sharpening.enabled && settings->autocielab) || (params->dirpyrequalizer.enabled && settings->autocielab) ||(params->defringe.enabled && settings->autocielab) || (params->sharpenMicro.enabled && settings->autocielab) || (params->impulseDenoise.enabled && settings->autocielab) || (params->colorappearance.badpixsl >0 && settings->autocielab)){ - if(params->edgePreservingDecompositionUI.enabled && params->colorappearance.tonecie && algepd) ImProcFunctions::EPDToneMapCIE(ncie, a_w, c_, w_h, width, height, begh, endh, minQ, maxQ, Iterates, scale ); + if(params->epd.enabled && params->colorappearance.tonecie && algepd) ImProcFunctions::EPDToneMapCIE(ncie, a_w, c_, w_h, width, height, begh, endh, minQ, maxQ, Iterates, scale ); //EPDToneMapCIE adated to CIECAM @@ -1924,8 +1924,8 @@ if((params->colorappearance.tonecie && (params->edgePreservingDecompositionUI.en float x,y,z; float eps=0.0001f; float co_e=(pow_F(f_l,0.25f))+eps; - // if(params->edgePreservingDecompositionUI.enabled) ncie->J_p[i][j]=(100.0f* ncie->Q_p[i][j]*ncie->Q_p[i][j])/(w_h*w_h); - if(params->edgePreservingDecompositionUI.enabled) ncie->J_p[i][j]=(100.0f* ncie->Q_p[i][j]*ncie->Q_p[i][j])/SQR((4.f/c)*(aw+4.f)); + // if(params->epd.enabled) ncie->J_p[i][j]=(100.0f* ncie->Q_p[i][j]*ncie->Q_p[i][j])/(w_h*w_h); + if(params->epd.enabled) ncie->J_p[i][j]=(100.0f* ncie->Q_p[i][j]*ncie->Q_p[i][j])/SQR((4.f/c)*(aw+4.f)); ncie->C_p[i][j] =(ncie->M_p[i][j])/co_e; //show histogram in CIECAM mode (Q,J, M,s,C) @@ -2004,7 +2004,7 @@ if((params->colorappearance.tonecie && (params->edgePreservingDecompositionUI.en if(ciedata) { //update histogram J and Q if(pW!=1){//only with improccoordinator - for (int i=0; i<=32768; i++) {// + for (int i=0; i<32768; i++) {// if (jp) { float hval = dLcurve[i]; int hi = (int)(255.0f*CLIPD(hval)); // @@ -2014,7 +2014,7 @@ if((params->colorappearance.tonecie && (params->edgePreservingDecompositionUI.en } //update color histogram M,s,C if(pW!=1){//only with improccoordinator - for (int i=0; i<=48000; i++) {// + for (int i=0; i<48000; i++) {// if (chropC) { float hvalc = dCcurve[i]; int hic = (int)(255.0f*CLIPD(hvalc)); // @@ -3690,7 +3690,7 @@ void ImProcFunctions::chromiLuminanceCurve (EditBuffer *editBuffer, int pW, LabI //update histogram C with data chromaticity and not with CC curve if(pW!=1){//only with improccoordinator - for (int i=0; i<=48000; i++) {//32768*1.414 + ... + for (int i=0; i<48000; i++) {//32768*1.414 + ... if (chrop) { float hval = dCcurve[i]; int hi = (int)(255.0*CLIPD(hval)); // @@ -3699,7 +3699,7 @@ void ImProcFunctions::chromiLuminanceCurve (EditBuffer *editBuffer, int pW, LabI } } //update histogram L with data luminance - for (int i=0; i<=65535; i++) { + for (int i=0; i<65535; i++) { if (chrop) { float hlval = dLcurve[i]; int hli = (int)(255.0*CLIPD(hlval)); @@ -3870,11 +3870,11 @@ void ImProcFunctions::colorCurve (LabImage* lold, LabImage* lnew) { } void ImProcFunctions::EPDToneMapCIE(CieImage *ncie, float a_w, float c_, float w_h, int Wid, int Hei, int begh, int endh, float minQ, float maxQ, unsigned int Iterates, int skip){ -if(!params->edgePreservingDecompositionUI.enabled) return; - float stren=params->edgePreservingDecompositionUI.Strength; - float edgest=params->edgePreservingDecompositionUI.EdgeStopping; - float sca=params->edgePreservingDecompositionUI.Scale; - float rew=params->edgePreservingDecompositionUI.ReweightingIterates; +if(!params->epd.enabled) return; + float stren=params->epd.strength; + float edgest=params->epd.edgeStopping; + float sca=params->epd.scale; + float rew=params->epd.reweightingIterates; unsigned int i, N = Wid*Hei; float Qpro= ( 4.0 / c_) * ( a_w + 4.0 ) ;//estimate Q max if J=100.0 float *Qpr=ncie->Q_p[0]; @@ -3952,15 +3952,15 @@ if(!params->edgePreservingDecompositionUI.enabled) return; //#include "EdgePreservingDecomposition.cc" void ImProcFunctions::EPDToneMap(LabImage *lab, unsigned int Iterates, int skip){ //Hasten access to the parameters. -// EPDParams *p = (EPDParams *)(¶ms->edgePreservingDecompositionUI); +// EPDParams *p = (EPDParams *)(¶ms->epd); //Enabled? Leave now if not. // if(!p->enabled) return; -if(!params->edgePreservingDecompositionUI.enabled) return; -float stren=params->edgePreservingDecompositionUI.Strength; -float edgest=params->edgePreservingDecompositionUI.EdgeStopping; -float sca=params->edgePreservingDecompositionUI.Scale; -float rew=params->edgePreservingDecompositionUI.ReweightingIterates; +if(!params->epd.enabled) return; +float stren=params->epd.strength; +float edgest=params->epd.edgeStopping; +float sca=params->epd.scale; +float rew=params->epd.reweightingIterates; //Pointers to whole data and size of it. float *L = lab->L[0]; float *a = lab->a[0]; diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index 73596c590..1aef3dfe5 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -250,7 +250,7 @@ class ImProcFunctions { //void RGB_OutputTransf(LabImage * src, Imagefloat * dst, const procparams::DirPyrDenoiseParams & dnparams); //void output_tile_row (float *Lbloxrow, float ** Lhipassdn, float ** tilemask, int height, int width, int top, int blkrad ); void RGB_denoise(Imagefloat * src, Imagefloat * dst, bool isRAW, const procparams::DirPyrDenoiseParams & dnparams, const procparams::DefringeParams & defringe, const double expcomp); - void RGBtile_denoise (float * fLblox, int vblproc, int hblproc, int numblox_H, int numblox_W, float noisevar_L ); //for DCT + void RGBtile_denoise (float * fLblox, int hblproc, float noisevar_L, float * nbrwt, float * blurbuffer ); //for DCT void RGBoutput_tile_row (float *Lbloxrow, float ** Ldetail, float ** tilemask_out, int height, int width, int top ); //void WaveletDenoise(cplx_wavelet_decomposition &DualTreeCoeffs, float noisevar ); //void WaveletDenoise(wavelet_decomposition &WaveletCoeffs, float noisevar ); @@ -268,9 +268,10 @@ class ImProcFunctions { // int W_L, int H_L, int W_ab, int H_ab, int W_h, int H_h, int skip_L, int skip_ab, int skip_h, float noisevar_L, float noisevar_ab, float **WavCoeffs_h, LabImage * noi); void ShrinkAll(float ** WavCoeffs_L, float ** WavCoeffs_a, float ** WavCoeffs_b, int level, - int W_L, int H_L, int W_ab, int H_ab, int skip_L, int skip_ab, float noisevar_L, float noisevar_abr, float noisevar_abb,LabImage * noi); + int W_L, int H_L, int W_ab, int H_ab, int skip_L, int skip_ab, float noisevar_L, float noisevar_abr, float noisevar_abb,LabImage * noi, float * madaa = NULL, float * madab = NULL, float * madaL = NULL, bool madCalculated = false); float MadMax(float * HH_Coeffs, int &max, int datalen); + float Mad(float * HH_Coeffs, int datalen, int * histo); // pyramid equalizer void dirpyr_equalizer (float ** src, float ** dst, int srcwidth, int srcheight, float ** l_a, float ** l_b, float ** dest_a, float ** dest_b, const double * mult, const double dirpyrThreshold, const double skinprot, const bool gamutlab, float b_l, float t_l, float t_r, float b_r, int choice, int scale);//Emil's directional pyramid equalizer @@ -289,8 +290,8 @@ class ImProcFunctions { void BadpixelsLab(LabImage * src, LabImage * dst, double radius, int thresh, int mode, float b_l, float t_l, float t_r, float b_r, float skinprot, float chrom); Image8* lab2rgb (LabImage* lab, int cx, int cy, int cw, int ch, Glib::ustring profile, bool standard_gamma); - Image16* lab2rgb16b (LabImage* lab, int cx, int cy, int cw, int ch, Glib::ustring profile, Glib::ustring profi, Glib::ustring gam, bool freegamma, double gampos, double slpos, double &ga0, double &ga1, double &ga2, double &ga3, double &ga4, double &ga5, double &ga6);// for gamma output - Image16* lab2rgb16 (LabImage* lab, int cx, int cy, int cw, int ch, Glib::ustring profile);//without gamma ==>default + Image16* lab2rgb16b (LabImage* lab, int cx, int cy, int cw, int ch, Glib::ustring profile, Glib::ustring profi, Glib::ustring gam, bool freegamma, double gampos, double slpos, double &ga0, double &ga1, double &ga2, double &ga3, double &ga4, double &ga5, double &ga6, bool bw);// for gamma output + Image16* lab2rgb16 (LabImage* lab, int cx, int cy, int cw, int ch, Glib::ustring profile, bool bw);//without gamma ==>default // CieImage *ciec; bool transCoord (int W, int H, int x, int y, int w, int h, int& xv, int& yv, int& wv, int& hv, double ascaleDef = -1, const LCPMapper *pLCPMap=NULL); diff --git a/rtengine/iplab2rgb.cc b/rtengine/iplab2rgb.cc index c6efa21de..bb0e7ecbb 100644 --- a/rtengine/iplab2rgb.cc +++ b/rtengine/iplab2rgb.cc @@ -263,7 +263,7 @@ Image8* ImProcFunctions::lab2rgb (LabImage* lab, int cx, int cy, int cw, int ch, return image; } // for default (not gamma) -Image16* ImProcFunctions::lab2rgb16 (LabImage* lab, int cx, int cy, int cw, int ch, Glib::ustring profile) { +Image16* ImProcFunctions::lab2rgb16 (LabImage* lab, int cx, int cy, int cw, int ch, Glib::ustring profile, bool bw) { //gamutmap(lab); @@ -288,19 +288,24 @@ Image16* ImProcFunctions::lab2rgb16 (LabImage* lab, int cx, int cy, int cw, int short* za = (short*)image->b(i-cy); for (int j=cx; jColor::epskap) ? 65535.0*fy*fy*fy : 65535.0*LL/Color::kappa; - - xa[j-cx] = CLIP((int)(x_+0.5)); - ya[j-cx] = CLIP((int)(y_+0.5)); - za[j-cx] = CLIP((int)(z_+0.5)); + float z_ = 65535.0f * (float) Color::f2xyz(fz)*Color::D50z; + float y_= (LL>Color::epskap) ? 65535.0f*fy*fy*fy : 65535.0f*LL/Color::kappa; + + xa[j-cx] = CLIP((int) round(x_)); + ya[j-cx] = CLIP((int) round(y_)); + za[j-cx] = CLIP((int) round(z_)); + if(bw && y_ < 65535.f ){//force Bw value and take highlight into account + xa[j-cx] =(int) round(y_* Color::D50x ); + za[j-cx] =(int) round(y_* Color::D50z); + } + } } @@ -321,15 +326,15 @@ Image16* ImProcFunctions::lab2rgb16 (LabImage* lab, int cx, int cy, int cw, int float* rb = lab->b[i]; for (int j=cx; jColor::epskap) ? 65535.0*fy*fy*fy : 65535.0*LL/Color::kappa; + float z_ = 65535.0f * (float) Color::f2xyz(fz)*Color::D50z; + float y_= (LL>Color::epskap) ? (float) 65535.0f*fy*fy*fy : 65535.0f*LL/Color::kappa; Color::xyz2srgb(x_,y_,z_,R,G,B); @@ -344,7 +349,7 @@ Image16* ImProcFunctions::lab2rgb16 (LabImage* lab, int cx, int cy, int cw, int // for gamma options (BT709...sRGB linear...) -Image16* ImProcFunctions::lab2rgb16b (LabImage* lab, int cx, int cy, int cw, int ch, Glib::ustring profile, Glib::ustring profi, Glib::ustring gam, bool freegamma, double gampos, double slpos, double &ga0, double &ga1, double &ga2, double &ga3, double &ga4, double &ga5, double &ga6) { +Image16* ImProcFunctions::lab2rgb16b (LabImage* lab, int cx, int cy, int cw, int ch, Glib::ustring profile, Glib::ustring profi, Glib::ustring gam, bool freegamma, double gampos, double slpos, double &ga0, double &ga1, double &ga2, double &ga3, double &ga4, double &ga5, double &ga6, bool bw) { //gamutmap(lab); @@ -432,19 +437,24 @@ Image16* ImProcFunctions::lab2rgb16b (LabImage* lab, int cx, int cy, int cw, int short* za = (short*)image->b(i-cy); for (int j=cx; jColor::epskap) ? 65535.0*fy*fy*fy : 65535.0*LL/Color::kappa; + float z_ = 65535.0f * (float)Color::f2xyz(fz)*Color::D50z; + float y_= (LL>Color::epskap) ? (float) 65535.0*fy*fy*fy : 65535.0f*LL/Color::kappa; - xa[j-cx] = CLIP((int)x_); - ya[j-cx] = CLIP((int)y_); - za[j-cx] = CLIP((int)z_); + xa[j-cx] = CLIP((int) round(x_)) ; + ya[j-cx] = CLIP((int) round(y_)); + za[j-cx] = CLIP((int) round(z_)); + if(bw && y_ < 65535.f){//force Bw value and take highlight into account + xa[j-cx] =(int) round(y_ * Color::D50x); + za[j-cx] =(int) round(y_ * Color::D50z); + } + } } @@ -465,15 +475,15 @@ Image16* ImProcFunctions::lab2rgb16b (LabImage* lab, int cx, int cy, int cw, int float* rb = lab->b[i]; for (int j=cx; jColor::epskap) ? 65535.0*fy*fy*fy : 65535.0*LL/Color::kappa; + float z_ = 65535.0f * (float) Color::f2xyz(fz)*Color::D50z; + float y_= (LL>Color::epskap) ? (float) 65535.0*fy*fy*fy : 65535.0f*LL/Color::kappa; Color::xyz2srgb(x_,y_,z_,R,G,B); diff --git a/rtengine/iptransform.cc b/rtengine/iptransform.cc index ef175a511..43284a257 100644 --- a/rtengine/iptransform.cc +++ b/rtengine/iptransform.cc @@ -525,10 +525,10 @@ void ImProcFunctions::transformLuminanceOnly (Imagefloat* original, Imagefloat* for (int y=0; yheight; y++) { double vig_y_d = (double) (y + cy) - vig_h2 ; for (int x=0; xwidth; x++) { - double vig_x_d = (double) (x + cx) - vig_w2 ; - double r = sqrt(vig_x_d*vig_x_d + vig_y_d*vig_y_d); double factor = 1.0; if (applyVignetting) { + double vig_x_d = (double) (x + cx) - vig_w2 ; + double r = sqrt(vig_x_d*vig_x_d + vig_y_d*vig_y_d); if(darkening) factor /= std::max(v + mul * tanh (b*(maxRadius-r) / maxRadius), 0.001); else diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index fff9b3985..4fb7942e9 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -309,11 +309,11 @@ void ProcParams::setDefaults () { dirpyrDenoise.gamma = 1.7; dirpyrDenoise.dmethod = "RGB"; - edgePreservingDecompositionUI.enabled = false; - edgePreservingDecompositionUI.Strength = 0.25; - edgePreservingDecompositionUI.EdgeStopping = 1.4; - edgePreservingDecompositionUI.Scale = 1.0; - edgePreservingDecompositionUI.ReweightingIterates = 0; + epd.enabled = false; + epd.strength = 0.25; + epd.edgeStopping = 1.4; + epd.scale = 1.0; + epd.reweightingIterates = 0; sh.enabled = false; sh.hq = false; @@ -897,12 +897,12 @@ int ProcParams::save (Glib::ustring fname, Glib::ustring fname2, bool fnameAbsol if (!pedited || pedited->dirpyrDenoise.bluechro)keyFile.set_double ("Directional Pyramid Denoising", "Bluechro", dirpyrDenoise.bluechro); if (!pedited || pedited->dirpyrDenoise.gamma) keyFile.set_double ("Directional Pyramid Denoising", "Gamma", dirpyrDenoise.gamma); - //Save edgePreservingDecompositionUI. - if (!pedited || pedited->edgePreservingDecompositionUI.enabled) keyFile.set_boolean ("EPD", "Enabled", edgePreservingDecompositionUI.enabled); - if (!pedited || pedited->edgePreservingDecompositionUI.Strength) keyFile.set_double ("EPD", "Strength", edgePreservingDecompositionUI.Strength); - if (!pedited || pedited->edgePreservingDecompositionUI.EdgeStopping) keyFile.set_double ("EPD", "EdgeStopping", edgePreservingDecompositionUI.EdgeStopping); - if (!pedited || pedited->edgePreservingDecompositionUI.Scale) keyFile.set_double ("EPD", "Scale", edgePreservingDecompositionUI.Scale); - if (!pedited || pedited->edgePreservingDecompositionUI.ReweightingIterates) keyFile.set_integer ("EPD", "ReweightingIterates", edgePreservingDecompositionUI.ReweightingIterates); + //Save epd. + if (!pedited || pedited->epd.enabled) keyFile.set_boolean ("EPD", "Enabled", epd.enabled); + if (!pedited || pedited->epd.strength) keyFile.set_double ("EPD", "Strength", epd.strength); + if (!pedited || pedited->epd.edgeStopping) keyFile.set_double ("EPD", "EdgeStopping", epd.edgeStopping); + if (!pedited || pedited->epd.scale) keyFile.set_double ("EPD", "Scale", epd.scale); + if (!pedited || pedited->epd.reweightingIterates) keyFile.set_integer ("EPD", "ReweightingIterates", epd.reweightingIterates); /* // save lumaDenoise @@ -1495,11 +1495,11 @@ if (keyFile.has_group ("Directional Pyramid Denoising")) {//TODO: No longer an a //Load EPD. if (keyFile.has_group ("EPD")) { - if(keyFile.has_key("EPD", "Enabled")) { edgePreservingDecompositionUI.enabled = keyFile.get_boolean ("EPD", "Enabled"); if (pedited) pedited->edgePreservingDecompositionUI.enabled = true; } - if(keyFile.has_key("EPD", "Strength")) { edgePreservingDecompositionUI.Strength = keyFile.get_double ("EPD", "Strength"); if (pedited) pedited->edgePreservingDecompositionUI.Strength = true; } - if(keyFile.has_key("EPD", "EdgeStopping")) { edgePreservingDecompositionUI.EdgeStopping = keyFile.get_double ("EPD", "EdgeStopping"); if (pedited) pedited->edgePreservingDecompositionUI.EdgeStopping = true; } - if(keyFile.has_key("EPD", "Scale")) { edgePreservingDecompositionUI.Scale = keyFile.get_double ("EPD", "Scale"); if (pedited) pedited->edgePreservingDecompositionUI.Scale = true; } - if(keyFile.has_key("EPD", "ReweightingIterates")) { edgePreservingDecompositionUI.ReweightingIterates = keyFile.get_integer ("EPD", "ReweightingIterates"); if (pedited) pedited->edgePreservingDecompositionUI.ReweightingIterates = true; } + if(keyFile.has_key("EPD", "Enabled")) { epd.enabled = keyFile.get_boolean ("EPD", "Enabled"); if (pedited) pedited->epd.enabled = true; } + if(keyFile.has_key("EPD", "Strength")) { epd.strength = keyFile.get_double ("EPD", "Strength"); if (pedited) pedited->epd.strength = true; } + if(keyFile.has_key("EPD", "EdgeStopping")) { epd.edgeStopping = keyFile.get_double ("EPD", "EdgeStopping"); if (pedited) pedited->epd.edgeStopping = true; } + if(keyFile.has_key("EPD", "Scale")) { epd.scale = keyFile.get_double ("EPD", "Scale"); if (pedited) pedited->epd.scale = true; } + if(keyFile.has_key("EPD", "ReweightingIterates")) { epd.reweightingIterates = keyFile.get_integer ("EPD", "ReweightingIterates"); if (pedited) pedited->epd.reweightingIterates = true; } } // load lumaDenoise @@ -1918,11 +1918,11 @@ bool ProcParams::operator== (const ProcParams& other) { && dirpyrDenoise.redchro == other.dirpyrDenoise.redchro && dirpyrDenoise.bluechro == other.dirpyrDenoise.bluechro && dirpyrDenoise.gamma == other.dirpyrDenoise.gamma - && edgePreservingDecompositionUI.enabled == other.edgePreservingDecompositionUI.enabled - && edgePreservingDecompositionUI.Strength == other.edgePreservingDecompositionUI.Strength - && edgePreservingDecompositionUI.EdgeStopping == other.edgePreservingDecompositionUI.EdgeStopping - && edgePreservingDecompositionUI.Scale == other.edgePreservingDecompositionUI.Scale - && edgePreservingDecompositionUI.ReweightingIterates == other.edgePreservingDecompositionUI.ReweightingIterates + && epd.enabled == other.epd.enabled + && epd.strength == other.epd.strength + && epd.edgeStopping == other.epd.edgeStopping + && epd.scale == other.epd.scale + && epd.reweightingIterates == other.epd.reweightingIterates && defringe.enabled == other.defringe.enabled && defringe.radius == other.defringe.radius && defringe.threshold == other.defringe.threshold diff --git a/rtengine/procparams.h b/rtengine/procparams.h index 1fa0d60b5..6ec20cc63 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -488,10 +488,10 @@ class DirPyrDenoiseParams { class EPDParams{ public: bool enabled; - double Strength; - double EdgeStopping; - double Scale; - int ReweightingIterates; + double strength; + double edgeStopping; + double scale; + int reweightingIterates; }; /** @@ -842,7 +842,7 @@ class ProcParams { DefringeParams defringe; ///< Defringing parameters ImpulseDenoiseParams impulseDenoise; ///< Impulse denoising parameters DirPyrDenoiseParams dirpyrDenoise; ///< Directional Pyramid denoising parameters - EPDParams edgePreservingDecompositionUI; + EPDParams epd; ///< Edge Preserving Decomposition parameters SHParams sh; ///< Shadow/highlight enhancement parameters CropParams crop; ///< Crop parameters CoarseTransformParams coarse; ///< Coarse transformation (90, 180, 270 deg rotation, h/v flipping) parameters diff --git a/rtengine/rawimagesource.h b/rtengine/rawimagesource.h index 54dd59985..6b60cae5d 100644 --- a/rtengine/rawimagesource.h +++ b/rtengine/rawimagesource.h @@ -212,7 +212,7 @@ class RawImageSource : public ImageSource { inline void convert_to_cielab_row (float* ar, float* ag, float* ab, float* oL, float* oa, float* ob); inline void interpolate_row_g (float* agh, float* agv, int i); inline void interpolate_row_rb (float* ar, float* ab, float* pg, float* cg, float* ng, int i); - inline void interpolate_row_rb_mul_pp (float* ar, float* ab, float* pg, float* cg, float* ng, int i, double r_mul, double g_mul, double b_mul, int x1, int width, int skip); + inline void interpolate_row_rb_mul_pp (float* ar, float* ab, float* pg, float* cg, float* ng, int i, float r_mul, float g_mul, float b_mul, int x1, int width, int skip); int LinEqSolve( int nDim, double* pfMatr, double* pfVect, double* pfSolution);//Emil's CA auto correction void CA_correct_RT (double cared, double cablue); diff --git a/rtengine/rawimagesource_i.h b/rtengine/rawimagesource_i.h index d24c3040c..5115a9ec1 100644 --- a/rtengine/rawimagesource_i.h +++ b/rtengine/rawimagesource_i.h @@ -219,7 +219,7 @@ inline void RawImageSource::interpolate_row_rb (float* ar, float* ab, float* pg, } } -inline void RawImageSource::interpolate_row_rb_mul_pp (float* ar, float* ab, float* pg, float* cg, float* ng, int i, double r_mul, double g_mul, double b_mul, int x1, int width, int skip) { +inline void RawImageSource::interpolate_row_rb_mul_pp (float* ar, float* ab, float* pg, float* cg, float* ng, int i, float r_mul, float g_mul, float b_mul, int x1, int width, int skip) { if (ri->ISRED(i,0) || ri->ISRED(i,1)) { // RGRGR or GRGRGR line @@ -228,7 +228,7 @@ inline void RawImageSource::interpolate_row_rb_mul_pp (float* ar, float* ab, flo // red is simple ar[jx] = r_mul * rawData[i][j]; // blue: cross interpolation - int b = 0; + float b = 0; int n = 0; if (i>0 && j>0) { b += b_mul*rawData[i-1][j-1] - g_mul*pg[j-1]; @@ -251,7 +251,7 @@ inline void RawImageSource::interpolate_row_rb_mul_pp (float* ar, float* ab, flo } else { // linear R-G interp. horizontally - int r; + float r; if (j==0) r = g_mul*cg[0] + r_mul*rawData[i][1] - g_mul*cg[1]; else if (j==W-1) @@ -260,7 +260,7 @@ inline void RawImageSource::interpolate_row_rb_mul_pp (float* ar, float* ab, flo r = g_mul*cg[j] + (r_mul*rawData[i][j-1] - g_mul*cg[j-1] + r_mul*rawData[i][j+1] - g_mul*cg[j+1]) / 2; ar[jx] = r; // linear B-G interp. vertically - int b; + float b; if (i==0) b = g_mul*ng[j] + b_mul*rawData[1][j] - g_mul*cg[j]; else if (i==H-1) @@ -278,7 +278,7 @@ inline void RawImageSource::interpolate_row_rb_mul_pp (float* ar, float* ab, flo // red is simple ab[jx] = b_mul*rawData[i][j]; // blue: cross interpolation - int r = 0; + float r = 0; int n = 0; if (i>0 && j>0) { r += r_mul*rawData[i-1][j-1] - g_mul*pg[j-1]; @@ -302,7 +302,7 @@ inline void RawImageSource::interpolate_row_rb_mul_pp (float* ar, float* ab, flo } else { // linear B-G interp. horizontally - int b; + float b; if (j==0) b = g_mul*cg[0] + b_mul*rawData[i][1] - g_mul*cg[1]; else if (j==W-1) @@ -311,7 +311,7 @@ inline void RawImageSource::interpolate_row_rb_mul_pp (float* ar, float* ab, flo b = g_mul*cg[j] + (b_mul*rawData[i][j-1] - g_mul*cg[j-1] + b_mul*rawData[i][j+1] - g_mul*cg[j+1]) / 2; ab[jx] = b; // linear R-G interp. vertically - int r; + float r; if (i==0) r = g_mul*ng[j] + r_mul*rawData[1][j] - g_mul*cg[j]; else if (i==H-1) diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index 73948c1e2..eafc8ee0a 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -199,6 +199,7 @@ IImage16* processImage (ProcessingJob* pjob, int& errorCode, ProgressListener* p ColorAppearance customColCurve1, customColCurve2,customColCurve3 ; ToneCurve customToneCurvebw1; ToneCurve customToneCurvebw2; + //if(params.blackwhite.enabled) params.toneCurve.hrenabled=false; ipf.g = imgsrc->getGamma(); ipf.iGamma = true; @@ -422,9 +423,8 @@ IImage16* processImage (ProcessingJob* pjob, int& errorCode, ProgressListener* p else if (params.icm.working=="Beta RGB") ns=4; else if (params.icm.working=="BestRGB") ns=5; else if (params.icm.working=="BruceRGB") ns=6; - - - readyImg = ipf.lab2rgb16b (labView, cx, cy, cw, ch, params.icm.output, params.icm.working, params.icm.gamma, params.icm.freegamma, params.icm.gampos, params.icm.slpos, ga0,ga1,ga2,ga3,ga4,ga5,ga6 ); + // if(params.blackwhite.enabled) params.toneCurve.hrenabled=false; + readyImg = ipf.lab2rgb16b (labView, cx, cy, cw, ch, params.icm.output, params.icm.working, params.icm.gamma, params.icm.freegamma, params.icm.gampos, params.icm.slpos, ga0,ga1,ga2,ga3,ga4,ga5,ga6, params.blackwhite.enabled ); customGamma = true; //or selected Free gamma @@ -569,13 +569,22 @@ IImage16* processImage (ProcessingJob* pjob, int& errorCode, ProgressListener* p else { // if Default gamma mode: we use the profile selected in the "Output profile" combobox; // gamma come from the selected profile, otherwise it comes from "Free gamma" tool - readyImg = ipf.lab2rgb16 (labView, cx, cy, cw, ch, params.icm.output); + + readyImg = ipf.lab2rgb16 (labView, cx, cy, cw, ch, params.icm.output, params.blackwhite.enabled); if (settings->verbose) printf("Output profile: \"%s\"\n", params.icm.output.c_str()); } delete labView; labView = NULL; - + + if(params.blackwhite.enabled) {//force BW r=g=b + for (int ccw=0;ccwr(cch,ccw)=readyImg->g(cch,ccw); + readyImg->b(cch,ccw)=readyImg->g(cch,ccw); + } + } + } if (pl) pl->setProgress (0.70); if (params.resize.enabled) { diff --git a/rtexif/pentaxattribs.cc b/rtexif/pentaxattribs.cc index 991a4c6ef..810d2634f 100644 --- a/rtexif/pentaxattribs.cc +++ b/rtexif/pentaxattribs.cc @@ -888,7 +888,10 @@ class PALensTypeInterpreter : public IntLensInterpreter< int > { focalLength = flt->toDouble(); } } - return guess( lensID, focalLength, maxApertureAtFocal, liArray); + std::string retval = guess( lensID, focalLength, maxApertureAtFocal, liArray); + if(liArray) + delete [] liArray; + return retval; } }; PALensTypeInterpreter paLensTypeInterpreter; diff --git a/rtexif/rtexif.cc b/rtexif/rtexif.cc index 73aab5816..707e83d99 100644 --- a/rtexif/rtexif.cc +++ b/rtexif/rtexif.cc @@ -629,6 +629,7 @@ Tag::Tag (TagDirectory* p, FILE* f, int base) tag = get2 (f, order); type = (TagType)get2 (f, order); count = get4 (f, order); + if (!count) count = 1; makerNoteKind = NOMK; keep = false; @@ -867,8 +868,9 @@ Tag::Tag (TagDirectory* p, FILE* f, int base) } else { // read value - value = new unsigned char [valuesize]; + value = new unsigned char [valuesize+1]; fread (value, 1, valuesize, f); + value[valuesize] = '\0'; } // seek back to the saved position fseek (f, save, SEEK_SET); diff --git a/rtexif/sonyminoltaattribs.cc b/rtexif/sonyminoltaattribs.cc index 04ebb05cf..bfcb7d35c 100644 --- a/rtexif/sonyminoltaattribs.cc +++ b/rtexif/sonyminoltaattribs.cc @@ -860,7 +860,10 @@ class SALensIDInterpreter : public IntLensInterpreter< int > { double *liArray = NULL; if (lensInfoTag) liArray = lensInfoTag->toDoubleArray(); - return guess( lensID, focalLength, maxApertureAtFocal, liArray); + std::string retval = guess( lensID, focalLength, maxApertureAtFocal, liArray); + if(liArray) + delete [] liArray; + return retval; } }; SALensIDInterpreter saLensIDInterpreter; @@ -908,7 +911,10 @@ class SALensID2Interpreter : public IntLensInterpreter< int > { double *liArray = NULL; if (lensInfoTag) liArray = lensInfoTag->toDoubleArray(); - return guess( lensID, focalLength, maxApertureAtFocal, liArray); + std::string retval = guess( lensID, focalLength, maxApertureAtFocal, liArray); + if(liArray) + delete [] liArray; + return retval; } }; SALensID2Interpreter saLensID2Interpreter; diff --git a/rtexif/stdattribs.cc b/rtexif/stdattribs.cc index ab3a20b22..a66a64cd9 100644 --- a/rtexif/stdattribs.cc +++ b/rtexif/stdattribs.cc @@ -371,8 +371,10 @@ class UserCommentInterpreter : public Interpreter { UserCommentInterpreter () {} virtual std::string toString (Tag* t) { char *buffer = new char[t->getCount()]; - if (!strncmp((char*)t->getValue(), "ASCII\0\0\0",8)) + if (!strncmp((char*)t->getValue(), "ASCII\0\0\0",8)) { strncpy (buffer, (char*)t->getValue()+8, t->getCount()-8); + buffer[t->getCount()-8] = '\0'; + } else buffer[0]=0; std::string retVal(buffer); diff --git a/rtgui/adjuster.cc b/rtgui/adjuster.cc index 6fec28b7d..452ac233c 100644 --- a/rtgui/adjuster.cc +++ b/rtgui/adjuster.cc @@ -32,7 +32,7 @@ static double one2one(double val) { return val; } Adjuster::Adjuster (Glib::ustring vlabel, double vmin, double vmax, double vstep, double vdefault, Gtk::Image *imgIcon1, Gtk::Image *imgIcon2, double2double_fun slider2value_, double2double_fun value2slider_) { Gtk::HBox *hbox2=NULL; - + label = NULL; adjusterListener = NULL; afterReset = false; blocked = false; @@ -450,6 +450,7 @@ void Adjuster::showEditedCB () { hbox->pack_start (*editedCheckBox, Gtk::PACK_SHRINK, 2); hbox->reorder_child (*editedCheckBox, 0); editedChange = editedCheckBox->signal_toggled().connect( sigc::mem_fun(*this, &Adjuster::editedToggled) ); + editedCheckBox->show(); } } diff --git a/rtgui/batchtoolpanelcoord.cc b/rtgui/batchtoolpanelcoord.cc index e818da969..a99fa4bd5 100644 --- a/rtgui/batchtoolpanelcoord.cc +++ b/rtgui/batchtoolpanelcoord.cc @@ -25,7 +25,7 @@ using namespace rtengine::procparams; -BatchToolPanelCoordinator::BatchToolPanelCoordinator (FilePanel* parent) : ToolPanelCoordinator(), parent(parent) { +BatchToolPanelCoordinator::BatchToolPanelCoordinator (FilePanel* parent) : ToolPanelCoordinator(), parent(parent), somethingChanged(false) { blockedUpdate = false; // remove exif panel and iptc panel diff --git a/rtgui/colorappearance.cc b/rtgui/colorappearance.cc index 1bb797c38..8031270d7 100644 --- a/rtgui/colorappearance.cc +++ b/rtgui/colorappearance.cc @@ -1099,7 +1099,7 @@ void ColorAppearance::algoChanged () { schroma->show(); qbright->hide(); colorh->hide(); - tonecie->hide(); + tonecie->hide(); // sharpcie->hide(); curveEditorG->show(); curveEditorG2->show(); @@ -1132,7 +1132,7 @@ void ColorAppearance::algoChanged () { schroma->show(); qbright->show(); colorh->show(); - tonecie->show(); + tonecie->show(); // sharpcie->show(); // sharpcie->hide(); curveEditorG->show(); @@ -1167,19 +1167,18 @@ void ColorAppearance::setBatchMode (bool batchMode) { wbmodel->append_text (M("GENERAL_UNCHANGED")); algo->append_text (M("GENERAL_UNCHANGED")); toneCurveMode->append_text (M("GENERAL_UNCHANGED")); -// toneCurveMode2->append_text (M("GENERAL_UNCHANGED")); -// toneCurveMode3->append_text (M("GENERAL_UNCHANGED")); + toneCurveMode2->append_text (M("GENERAL_UNCHANGED")); + toneCurveMode3->append_text (M("GENERAL_UNCHANGED")); curveEditorG->setBatchMode (batchMode); -// curveEditorG2->setBatchMode (batchMode); -// curveEditorG3->setBatchMode (batchMode); + curveEditorG2->setBatchMode (batchMode); + curveEditorG3->setBatchMode (batchMode); } void ColorAppearance::updateCurveBackgroundHistogram (LUTu & histToneCurve, LUTu & histLCurve, LUTu & histCCurve, LUTu & histCLurve, LUTu & histLLCurve, LUTu & histLCAM, LUTu & histCCAM, LUTu & histRed, LUTu & histGreen, LUTu & histBlue, LUTu & histLuma){ shape->updateBackgroundHistogram (histLCAM); shape3->updateBackgroundHistogram (histCCAM); - } diff --git a/rtgui/crop.cc b/rtgui/crop.cc index 27d60297e..97cac164e 100644 --- a/rtgui/crop.cc +++ b/rtgui/crop.cc @@ -7,7 +7,7 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - * + * * RawTherapee is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the @@ -74,12 +74,12 @@ Crop::Crop (): Gtk::VBox(), FoldableToolPanel(this) { h = Gtk::manage (new MySpinButton ()); h->set_size_request (60, -1); hb2->pack_start (*h); - + pack_start (*hb2, Gtk::PACK_SHRINK, 4); selectCrop = Gtk::manage (new Gtk::Button (M("TP_CROP_SELECTCROP"))); selectCrop->set_image (*Gtk::manage (new RTImage ("crop.png"))); - + pack_start (*selectCrop, Gtk::PACK_SHRINK, 2); Gtk::HBox* hb3 = Gtk::manage (new Gtk::HBox ()); @@ -104,7 +104,7 @@ Crop::Crop (): Gtk::VBox(), FoldableToolPanel(this) { hb31->pack_start (*guide); pack_start (*hb31, Gtk::PACK_SHRINK, 4); - + // ppibox START ppibox = Gtk::manage (new Gtk::VBox()); ppibox->pack_start (*Gtk::manage (new Gtk::HSeparator()), Gtk::PACK_SHRINK, 2); @@ -125,13 +125,13 @@ Crop::Crop (): Gtk::VBox(), FoldableToolPanel(this) { sizebox->pack_start (*sizein, Gtk::PACK_SHRINK, 4); sizebox->pack_start (*Gtk::manage (new Gtk::HSeparator()), Gtk::PACK_SHRINK, 6); sizebox->pack_start (*hb4, Gtk::PACK_SHRINK, 2); - + ppibox->pack_start (*sizebox, Gtk::PACK_SHRINK, 1); pack_start (*ppibox, Gtk::PACK_SHRINK, 0); ppi->set_value (300); // ppibox END - + /**************** * Crop Ratio *****************/ @@ -166,7 +166,7 @@ Crop::Crop (): Gtk::VBox(), FoldableToolPanel(this) { cropratio[25].label = "45:35 - ePassport"; cropratio[25].value = 45.0/35.0; - + // populate the combobox for (int i=0; iappend_text (cropratio[i].label); @@ -250,7 +250,7 @@ void Crop::readOptions () { void Crop::read (const ProcParams* pp, const ParamsEdited* pedited) { disableListener (); - + xconn.block (true); yconn.block (true); wconn.block (true); @@ -277,7 +277,7 @@ void Crop::read (const ProcParams* pp, const ParamsEdited* pedited) { orientation->set_active (0); else if (pp->crop.orientation == "Portrait") orientation->set_active (1); - + if (pp->crop.guide == "None") guide->set_active (0); else if (pp->crop.guide == "Rule of thirds") @@ -308,7 +308,7 @@ void Crop::read (const ProcParams* pp, const ParamsEdited* pedited) { ny = pp->crop.y; nw = pp->crop.w; nh = pp->crop.h; - + lastRotationDeg = pp->coarse.rotate; wDirty = false; @@ -322,11 +322,11 @@ void Crop::read (const ProcParams* pp, const ParamsEdited* pedited) { xDirty = pedited->crop.x; yDirty = pedited->crop.y; if (!pedited->crop.ratio) - ratio->set_active (8); - if (!pedited->crop.orientation) - orientation->set_active (2); - if (!pedited->crop.guide) - guide->set_active (7); + ratio->set_active_text (M("GENERAL_UNCHANGED")); + if (!pedited->crop.orientation) + orientation->set_active_text (M("GENERAL_UNCHANGED")); + if (!pedited->crop.guide) + guide->set_active_text (M("GENERAL_UNCHANGED")); enabled->set_inconsistent (!pedited->crop.enabled); fixr->set_inconsistent (!pedited->crop.fixratio); } @@ -385,9 +385,9 @@ void Crop::write (ProcParams* pp, ParamsEdited* pedited) { if (pedited) { pedited->crop.enabled = !enabled->get_inconsistent(); - pedited->crop.ratio = ratio->get_active_row_number() != 9; - pedited->crop.orientation = orientation->get_active_row_number() != 2; - pedited->crop.guide = guide->get_active_row_number() != 9; + pedited->crop.ratio = ratio->get_active_text() != M("GENERAL_UNCHANGED"); + pedited->crop.orientation = orientation->get_active_text() != M("GENERAL_UNCHANGED"); + pedited->crop.guide = guide->get_active_text() != M("GENERAL_UNCHANGED"); pedited->crop.fixratio = !fixr->get_inconsistent(); pedited->crop.w = wDirty; pedited->crop.h = hDirty; @@ -444,8 +444,19 @@ void Crop::selectPressed () { void Crop::notifyListener () { - if (listener && enabled->get_active ()) - listener->panelChanged (EvCrop, Glib::ustring::compose ("%1=%2, %3=%4\n%5=%6, %7=%8", M("TP_CROP_X"), nx, M("TP_CROP_Y"), ny, M("TP_CROP_W"), nw, M("TP_CROP_H"), nh)); + if (listener && enabled->get_active ()) + if (nw == 1 && nh == 1) { + econn.block (true); + enabled->set_active (false); + econn.block (false); + nx = (int)x->get_value (); + ny = (int)x->get_value (); + nw = (int)w->get_value (); + nh = (int)h->get_value (); + listener->panelChanged (EvCrop, M("GENERAL_DISABLED")); + } + else + listener->panelChanged (EvCrop, Glib::ustring::compose ("%1=%2, %3=%4\n%5=%6, %7=%8", M("TP_CROP_X"), nx, M("TP_CROP_Y"), ny, M("TP_CROP_W"), nw, M("TP_CROP_H"), nh)); } void Crop::enabledChanged () { @@ -595,7 +606,7 @@ void Crop::ratioChanged () { // Correct current crop if it doesn't fit void Crop::adjustCropToRatio() { if (fixr->get_active() && !fixr->get_inconsistent()) { - + // int W = w->get_value (); // int H = h->get_value (); int W = nw; @@ -944,12 +955,10 @@ void Crop::cropInit (int &x, int &y, int &w, int &h) { nh = 1; w = 1; h = 1; - + econn.block (true); enabled->set_active (1); econn.block (false); - g_idle_add (refreshSpinsUI, new RefreshSpinHelper (this, false)); -// Glib::signal_idle().connect (sigc::mem_fun(*this, &Crop::refreshSpins)); } void Crop::cropResized (int &x, int &y, int& x2, int& y2) { @@ -993,21 +1002,21 @@ void Crop::cropResized (int &x, int &y, int& x2, int& y2) { if (y<=y2) { int W2max = (int)round ((maxh-Y) * r); if (W>W2max) - W = W2max; + W = W2max; } else { int W2max = (int)round (y * r); if (W>W2max) - W = W2max; + W = W2max; } H = (int)round(W / r); if (xappend_text ("(Unchanged)"); - orientation->append_text ("(Unchanged)"); - guide->append_text ("(Unchanged)"); + ratio->append_text (M("GENERAL_UNCHANGED")); + orientation->append_text (M("GENERAL_UNCHANGED")); + guide->append_text (M("GENERAL_UNCHANGED")); removeIfThere (this, ppibox); } diff --git a/rtgui/crophandler.cc b/rtgui/crophandler.cc index 9832eddff..8e8bb391e 100644 --- a/rtgui/crophandler.cc +++ b/rtgui/crophandler.cc @@ -30,7 +30,7 @@ using namespace rtengine; CropHandler::CropHandler () : zoom(10), cx(0), cy(0), cw(0), ch(0), cropX(0), cropY(0), cropW(0), cropH(0), enabled(false), - cropimg(NULL), cropimgtrue(NULL), ipc(NULL), crop(NULL), listener(NULL) { + cropimg(NULL), cropimgtrue(NULL), ipc(NULL), crop(NULL), listener(NULL), isLowUpdatePriority(false) { chi = new CropHandlerIdleHelper; chi->destroyed = false; diff --git a/rtgui/dirpyrdenoise.cc b/rtgui/dirpyrdenoise.cc index 851549dc8..6d53fbd51 100644 --- a/rtgui/dirpyrdenoise.cc +++ b/rtgui/dirpyrdenoise.cc @@ -23,7 +23,7 @@ using namespace rtengine; using namespace rtengine::procparams; -DirPyrDenoise::DirPyrDenoise () : Gtk::VBox(), FoldableToolPanel(this) { +DirPyrDenoise::DirPyrDenoise () : Gtk::VBox(), FoldableToolPanel(this), lastenhance(false) { set_border_width(4); diff --git a/rtgui/editorpanel.cc b/rtgui/editorpanel.cc index 08f53aaf2..6a0e6ba82 100755 --- a/rtgui/editorpanel.cc +++ b/rtgui/editorpanel.cc @@ -32,7 +32,7 @@ using namespace rtengine::procparams; EditorPanel::EditorPanel (FilePanel* filePanel) - : beforePreviewHandler(NULL), beforeIarea(NULL), parent(NULL), ipc(NULL), beforeIpc(NULL), isProcessing(false), catalogPane(NULL) { + : beforePreviewHandler(NULL), beforeIarea(NULL), parent(NULL), ipc(NULL), beforeIpc(NULL), isProcessing(false), catalogPane(NULL), iHistoryShow(NULL), iHistoryHide(NULL), iBeforeLockON(NULL),iBeforeLockOFF(NULL), iRightPanel_1_Show(NULL), iRightPanel_1_Hide(NULL) { epih = new EditorPanelIdleHelper; epih->epanel = this; @@ -375,8 +375,19 @@ EditorPanel::~EditorPanel () { delete catalogPane; if (!iTopPanel_1_Show) delete iTopPanel_1_Show; - if (!iTopPanel_1_Hide) delete iTopPanel_1_Hide; - + if (!iTopPanel_1_Hide) delete iTopPanel_1_Hide; + if (iHistoryShow) + delete iHistoryShow; + if (iHistoryHide) + delete iHistoryHide; + if(iBeforeLockON) + delete iBeforeLockON; + if(iBeforeLockOFF) + delete iBeforeLockOFF; + if(iRightPanel_1_Show) + delete iRightPanel_1_Show; + if(iRightPanel_1_Hide) + delete iRightPanel_1_Hide; } void EditorPanel::leftPaneButtonReleased(GdkEventButton *event) { diff --git a/rtgui/epd.cc b/rtgui/epd.cc index 78c25952e..7b31502f1 100644 --- a/rtgui/epd.cc +++ b/rtgui/epd.cc @@ -39,129 +39,129 @@ EdgePreservingDecompositionUI::EdgePreservingDecompositionUI () : Gtk::VBox(), F enaConn = enabled->signal_toggled().connect( sigc::mem_fun(*this, &EdgePreservingDecompositionUI::enabledChanged) ); - Strength = Gtk::manage(new Adjuster (M("TP_EPD_STRENGTH"), -2.0, 2.0, 0.01, 0.25)); - EdgeStopping = Gtk::manage(new Adjuster (M("TP_EPD_EDGESTOPPING"), 0.1, 4.0, 0.01, 1.4)); - Scale = Gtk::manage(new Adjuster (M("TP_EPD_SCALE"), 0.1, 10.0, 0.01, 1.0)); - ReweightingIterates = Gtk::manage(new Adjuster (M("TP_EPD_REWEIGHTINGITERATES"), 0, 9, 1, 0)); + strength = Gtk::manage(new Adjuster (M("TP_EPD_STRENGTH"), -2.0, 2.0, 0.01, 0.25)); + edgeStopping = Gtk::manage(new Adjuster (M("TP_EPD_EDGESTOPPING"), 0.1, 4.0, 0.01, 1.4)); + scale = Gtk::manage(new Adjuster (M("TP_EPD_SCALE"), 0.1, 10.0, 0.01, 1.0)); + reweightingIterates = Gtk::manage(new Adjuster (M("TP_EPD_REWEIGHTINGITERATES"), 0, 9, 1, 0)); - Strength->setAdjusterListener(this); - EdgeStopping->setAdjusterListener(this); - Scale->setAdjusterListener(this); - ReweightingIterates->setAdjusterListener(this); + strength->setAdjusterListener(this); + edgeStopping->setAdjusterListener(this); + scale->setAdjusterListener(this); + reweightingIterates->setAdjusterListener(this); - Strength->show(); - EdgeStopping->show(); - Scale->show(); - ReweightingIterates->show(); + strength->show(); + edgeStopping->show(); + scale->show(); + reweightingIterates->show(); - pack_start(*Strength); - pack_start(*EdgeStopping); - pack_start(*Scale); - pack_start(*ReweightingIterates); + pack_start(*strength); + pack_start(*edgeStopping); + pack_start(*scale); + pack_start(*reweightingIterates); } void EdgePreservingDecompositionUI::read(const ProcParams *pp, const ParamsEdited *pedited){ disableListener(); if(pedited){ - Strength->setEditedState(pedited->edgePreservingDecompositionUI.Strength ? Edited : UnEdited); - EdgeStopping->setEditedState(pedited->edgePreservingDecompositionUI.EdgeStopping ? Edited : UnEdited); - Scale->setEditedState(pedited->edgePreservingDecompositionUI.Scale ? Edited : UnEdited); - ReweightingIterates->setEditedState(pedited->edgePreservingDecompositionUI.ReweightingIterates ? Edited : UnEdited); + strength->setEditedState(pedited->epd.strength ? Edited : UnEdited); + edgeStopping->setEditedState(pedited->epd.edgeStopping ? Edited : UnEdited); + scale->setEditedState(pedited->epd.scale ? Edited : UnEdited); + reweightingIterates->setEditedState(pedited->epd.reweightingIterates ? Edited : UnEdited); - enabled->set_inconsistent(!pedited->edgePreservingDecompositionUI.enabled); + enabled->set_inconsistent(!pedited->epd.enabled); } enaConn.block(true); - enabled->set_active(pp->edgePreservingDecompositionUI.enabled); + enabled->set_active(pp->epd.enabled); enaConn.block (false); - lastEnabled = pp->edgePreservingDecompositionUI.enabled; + lastEnabled = pp->epd.enabled; - Strength->setValue(pp->edgePreservingDecompositionUI.Strength); - EdgeStopping->setValue(pp->edgePreservingDecompositionUI.EdgeStopping); - Scale->setValue(pp->edgePreservingDecompositionUI.Scale); - ReweightingIterates->setValue(pp->edgePreservingDecompositionUI.ReweightingIterates); + strength->setValue(pp->epd.strength); + edgeStopping->setValue(pp->epd.edgeStopping); + scale->setValue(pp->epd.scale); + reweightingIterates->setValue(pp->epd.reweightingIterates); enableListener(); } void EdgePreservingDecompositionUI::write(ProcParams *pp, ParamsEdited *pedited){ - pp->edgePreservingDecompositionUI.Strength = Strength->getValue(); - pp->edgePreservingDecompositionUI.EdgeStopping = EdgeStopping->getValue(); - pp->edgePreservingDecompositionUI.Scale = Scale->getValue(); - pp->edgePreservingDecompositionUI.ReweightingIterates = ReweightingIterates->getValue(); - pp->edgePreservingDecompositionUI.enabled = enabled->get_active(); + pp->epd.strength = strength->getValue(); + pp->epd.edgeStopping = edgeStopping->getValue(); + pp->epd.scale = scale->getValue(); + pp->epd.reweightingIterates = reweightingIterates->getValue(); + pp->epd.enabled = enabled->get_active(); if(pedited){ - pedited->edgePreservingDecompositionUI.Strength = Strength->getEditedState(); - pedited->edgePreservingDecompositionUI.EdgeStopping = EdgeStopping->getEditedState(); - pedited->edgePreservingDecompositionUI.Scale = Scale->getEditedState(); - pedited->edgePreservingDecompositionUI.ReweightingIterates = ReweightingIterates->getEditedState(); - pedited->edgePreservingDecompositionUI.enabled = !enabled->get_inconsistent(); + pedited->epd.strength = strength->getEditedState(); + pedited->epd.edgeStopping = edgeStopping->getEditedState(); + pedited->epd.scale = scale->getEditedState(); + pedited->epd.reweightingIterates = reweightingIterates->getEditedState(); + pedited->epd.enabled = !enabled->get_inconsistent(); } } void EdgePreservingDecompositionUI::setDefaults(const ProcParams *defParams, const ParamsEdited *pedited){ - Strength->setDefault(defParams->edgePreservingDecompositionUI.Strength); - EdgeStopping->setDefault(defParams->edgePreservingDecompositionUI.EdgeStopping); - Scale->setDefault(defParams->edgePreservingDecompositionUI.Scale); - ReweightingIterates->setDefault(defParams->edgePreservingDecompositionUI.ReweightingIterates); + strength->setDefault(defParams->epd.strength); + edgeStopping->setDefault(defParams->epd.edgeStopping); + scale->setDefault(defParams->epd.scale); + reweightingIterates->setDefault(defParams->epd.reweightingIterates); if(pedited){ - Strength->setDefaultEditedState(pedited->edgePreservingDecompositionUI.Strength ? Edited : UnEdited); - EdgeStopping->setDefaultEditedState(pedited->edgePreservingDecompositionUI.EdgeStopping ? Edited : UnEdited); - Scale->setDefaultEditedState(pedited->edgePreservingDecompositionUI.Scale ? Edited : UnEdited); - ReweightingIterates->setDefaultEditedState(pedited->edgePreservingDecompositionUI.ReweightingIterates ? Edited : UnEdited); + strength->setDefaultEditedState(pedited->epd.strength ? Edited : UnEdited); + edgeStopping->setDefaultEditedState(pedited->epd.edgeStopping ? Edited : UnEdited); + scale->setDefaultEditedState(pedited->epd.scale ? Edited : UnEdited); + reweightingIterates->setDefaultEditedState(pedited->epd.reweightingIterates ? Edited : UnEdited); }else{ - Strength->setDefaultEditedState(Irrelevant); - EdgeStopping->setDefaultEditedState(Irrelevant); - Scale->setDefaultEditedState(Irrelevant); - ReweightingIterates->setDefaultEditedState(Irrelevant); + strength->setDefaultEditedState(Irrelevant); + edgeStopping->setDefaultEditedState(Irrelevant); + scale->setDefaultEditedState(Irrelevant); + reweightingIterates->setDefaultEditedState(Irrelevant); } } void EdgePreservingDecompositionUI::adjusterChanged(Adjuster* a, double newval){ if(listener && enabled->get_active()){ - if(a == Strength) + if(a == strength) listener->panelChanged(EvEPDStrength, Glib::ustring::format(std::setw(2), std::fixed, std::setprecision(2), a->getValue())); - else if(a == EdgeStopping) + else if(a == edgeStopping) listener->panelChanged(EvEPDEdgeStopping, Glib::ustring::format(std::setw(2), std::fixed, std::setprecision(2), a->getValue())); - else if(a == Scale) + else if(a == scale) listener->panelChanged(EvEPDScale, Glib::ustring::format(std::setw(2), std::fixed, std::setprecision(2), a->getValue())); - else if(a == ReweightingIterates) + else if(a == reweightingIterates) listener->panelChanged(EvEPDReweightingIterates, Glib::ustring::format((int)a->getValue())); } } void EdgePreservingDecompositionUI::enabledChanged(){ - if(batchMode){ - if(enabled->get_inconsistent()){ - enabled->set_inconsistent (false); - enaConn.block (true); - enabled->set_active (false); - enaConn.block (false); - } - else if(lastEnabled) - enabled->set_inconsistent (true); - - lastEnabled = enabled->get_active (); - } + if(batchMode){ + if(enabled->get_inconsistent()){ + enabled->set_inconsistent (false); + enaConn.block (true); + enabled->set_active (false); + enaConn.block (false); + } + else if(lastEnabled) + enabled->set_inconsistent (true); + + lastEnabled = enabled->get_active (); + } - if(listener){ - if(enabled->get_active ()) - listener->panelChanged (EvEPDEnabled, M("GENERAL_ENABLED")); - else - listener->panelChanged (EvEPDEnabled, M("GENERAL_DISABLED")); - } + if(listener){ + if(enabled->get_active ()) + listener->panelChanged (EvEPDEnabled, M("GENERAL_ENABLED")); + else + listener->panelChanged (EvEPDEnabled, M("GENERAL_DISABLED")); + } } void EdgePreservingDecompositionUI::setBatchMode(bool batchMode){ ToolPanel::setBatchMode(batchMode); - Strength->showEditedCB(); - EdgeStopping->showEditedCB(); - Scale->showEditedCB(); - ReweightingIterates->showEditedCB(); + strength->showEditedCB(); + edgeStopping->showEditedCB(); + scale->showEditedCB(); + reweightingIterates->showEditedCB(); } diff --git a/rtgui/epd.h b/rtgui/epd.h index 6ae32f4bf..0a7273ef4 100644 --- a/rtgui/epd.h +++ b/rtgui/epd.h @@ -25,10 +25,10 @@ class EdgePreservingDecompositionUI : public Gtk::VBox, public AdjusterListener, public FoldableToolPanel { protected: - Adjuster *Strength; - Adjuster *EdgeStopping; - Adjuster *Scale; - Adjuster *ReweightingIterates; + Adjuster *strength; + Adjuster *edgeStopping; + Adjuster *scale; + Adjuster *reweightingIterates; Gtk::CheckButton* enabled; bool lastEnabled; diff --git a/rtgui/gradient.cc b/rtgui/gradient.cc index 30e4d8495..5eb163d0b 100644 --- a/rtgui/gradient.cc +++ b/rtgui/gradient.cc @@ -121,7 +121,7 @@ void Gradient::read (const ProcParams* pp, const ParamsEdited* pedited) strength->setEditedState (pedited->gradient.strength ? Edited : UnEdited); centerX->setEditedState (pedited->gradient.centerX ? Edited : UnEdited); centerY->setEditedState (pedited->gradient.centerY ? Edited : UnEdited); - enabled->set_inconsistent (!pedited->gradient.enabled); + enabled->set_inconsistent (multiImage && !pedited->gradient.enabled); } enaConn.block (true); diff --git a/rtgui/histogrampanel.cc b/rtgui/histogrampanel.cc index 54e568328..f1cd465a8 100644 --- a/rtgui/histogrampanel.cc +++ b/rtgui/histogrampanel.cc @@ -547,7 +547,7 @@ void HistogramRGBArea::styleChanged (const Glib::RefPtr& style) { // // HistogramArea HistogramArea::HistogramArea (FullModeListener *fml) : //needChroma unactive by default - valid(false), fullMode(options.histogramFullMode), myFullModeListener(fml), oldwidth(-1), needLuma(true), needRed(true), needGreen(true), needBlue(true), rawMode(false), needChroma(false) { + valid(false), fullMode(options.histogramFullMode), myFullModeListener(fml), oldwidth(-1), oldheight(-1), needLuma(true), needRed(true), needGreen(true), needBlue(true), rawMode(false), needChroma(false) { lhist(256); rhist(256); diff --git a/rtgui/options.h b/rtgui/options.h index 53b5e7e5f..842d4fc9c 100644 --- a/rtgui/options.h +++ b/rtgui/options.h @@ -38,18 +38,19 @@ // Profile name to use for internal values' profile #define DEFPROFILE_INTERNAL "Neutral" -class SaveFormat { - - public: - Glib::ustring format; - int pngBits; - int pngCompression; - int jpegQuality; - int jpegSubSamp; // 1=best compression, 3=best quality - int tiffBits; - bool tiffUncompressed; - bool saveParams; -}; +class SaveFormat { + + public: + Glib::ustring format; + int pngBits; + int pngCompression; + int jpegQuality; + int jpegSubSamp; // 1=best compression, 3=best quality + int tiffBits; + bool tiffUncompressed; + bool saveParams; + SaveFormat () : format("jpg"), jpegQuality(90), jpegSubSamp(2), pngCompression(6), pngBits(8), tiffBits(8), tiffUncompressed(true), saveParams(true) {}; +}; enum ThFileType {FT_Invalid=-1, FT_None=0, FT_Raw=1, FT_Jpeg=2, FT_Tiff=3, FT_Png=4, FT_Custom=5, FT_Tiff16=6, FT_Png16=7, FT_Custom16=8}; enum PPLoadLocation {PLL_Cache=0, PLL_Input=1}; diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index 72e26921a..ed068e1f6 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -158,14 +158,14 @@ void ParamsEdited::set (bool v) { dirpyrDenoise.Ldetail = v; dirpyrDenoise.chroma = v; dirpyrDenoise.redchro = v; - dirpyrDenoise.bluechro = v; + dirpyrDenoise.bluechro = v; dirpyrDenoise.gamma = v; dirpyrDenoise.dmethod = v; - edgePreservingDecompositionUI.enabled = v; - edgePreservingDecompositionUI.Strength = v; - edgePreservingDecompositionUI.EdgeStopping = v; - edgePreservingDecompositionUI.Scale = v; - edgePreservingDecompositionUI.ReweightingIterates = v; + epd.enabled = v; + epd.strength = v; + epd.edgeStopping = v; + epd.scale = v; + epd.reweightingIterates = v; sh.enabled = v; sh.hq = v; sh.highlights = v; @@ -450,11 +450,11 @@ void ParamsEdited::initFrom (const std::vector dirpyrDenoise.gamma = dirpyrDenoise.gamma && p.dirpyrDenoise.gamma == other.dirpyrDenoise.gamma; dirpyrDenoise.dmethod = dirpyrDenoise.dmethod && p.dirpyrDenoise.dmethod == other.dirpyrDenoise.dmethod; - edgePreservingDecompositionUI.enabled = edgePreservingDecompositionUI.enabled && p.edgePreservingDecompositionUI.enabled == other.edgePreservingDecompositionUI.enabled; - edgePreservingDecompositionUI.Strength = edgePreservingDecompositionUI.Strength && p.edgePreservingDecompositionUI.Strength == other.edgePreservingDecompositionUI.Strength; - edgePreservingDecompositionUI.EdgeStopping = edgePreservingDecompositionUI.EdgeStopping && p.edgePreservingDecompositionUI.EdgeStopping == other.edgePreservingDecompositionUI.EdgeStopping; - edgePreservingDecompositionUI.Scale = edgePreservingDecompositionUI.Scale && p.edgePreservingDecompositionUI.Scale == other.edgePreservingDecompositionUI.Scale; - edgePreservingDecompositionUI.ReweightingIterates = edgePreservingDecompositionUI.ReweightingIterates && p.edgePreservingDecompositionUI.ReweightingIterates == other.edgePreservingDecompositionUI.ReweightingIterates; + epd.enabled = epd.enabled && p.epd.enabled == other.epd.enabled; + epd.strength = epd.strength && p.epd.strength == other.epd.strength; + epd.edgeStopping = epd.edgeStopping && p.epd.edgeStopping == other.epd.edgeStopping; + epd.scale = epd.scale && p.epd.scale == other.epd.scale; + epd.reweightingIterates = epd.reweightingIterates && p.epd.reweightingIterates == other.epd.reweightingIterates; sh.enabled = sh.enabled && p.sh.enabled == other.sh.enabled; sh.hq = sh.hq && p.sh.hq == other.sh.hq; @@ -737,11 +737,11 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten // if (dirpyrDenoise.perform) toEdit.dirpyrDenoise.perform = mods.dirpyrDenoise.perform; if (dirpyrDenoise.dmethod) toEdit.dirpyrDenoise.dmethod = mods.dirpyrDenoise.dmethod; - if (edgePreservingDecompositionUI.enabled) toEdit.edgePreservingDecompositionUI.enabled = mods.edgePreservingDecompositionUI.enabled; - if (edgePreservingDecompositionUI.Strength) toEdit.edgePreservingDecompositionUI.Strength = mods.edgePreservingDecompositionUI.Strength; - if (edgePreservingDecompositionUI.EdgeStopping) toEdit.edgePreservingDecompositionUI.EdgeStopping = mods.edgePreservingDecompositionUI.EdgeStopping; - if (edgePreservingDecompositionUI.Scale) toEdit.edgePreservingDecompositionUI.Scale = mods.edgePreservingDecompositionUI.Scale; - if (edgePreservingDecompositionUI.ReweightingIterates) toEdit.edgePreservingDecompositionUI.ReweightingIterates = mods.edgePreservingDecompositionUI.ReweightingIterates; + if (epd.enabled) toEdit.epd.enabled = mods.epd.enabled; + if (epd.strength) toEdit.epd.strength = mods.epd.strength; + if (epd.edgeStopping) toEdit.epd.edgeStopping = mods.epd.edgeStopping; + if (epd.scale) toEdit.epd.scale = mods.epd.scale; + if (epd.reweightingIterates) toEdit.epd.reweightingIterates = mods.epd.reweightingIterates; if (sh.enabled) toEdit.sh.enabled = mods.sh.enabled; if (sh.hq) toEdit.sh.hq = mods.sh.hq; diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index 5836846fa..7b436fce4 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -247,10 +247,10 @@ public: class EPDParamsEdited{ public: bool enabled; - bool Strength; - bool EdgeStopping; - bool Scale; - bool ReweightingIterates; + bool strength; + bool edgeStopping; + bool scale; + bool reweightingIterates; }; @@ -502,7 +502,7 @@ class ParamsEdited { //ColorDenoiseParamsEdited colorDenoise; DefringeParamsEdited defringe; DirPyrDenoiseParamsEdited dirpyrDenoise; - EPDParamsEdited edgePreservingDecompositionUI; + EPDParamsEdited epd; ImpulseDenoiseParamsEdited impulseDenoise; SHParamsEdited sh; CropParamsEdited crop; diff --git a/rtgui/partialpastedlg.cc b/rtgui/partialpastedlg.cc index 16531a029..25e0bcf76 100644 --- a/rtgui/partialpastedlg.cc +++ b/rtgui/partialpastedlg.cc @@ -608,7 +608,7 @@ void PartialPasteDlg::applyPaste (rtengine::procparams::ProcParams* dstPP, Param if (!wb->get_active ()) filterPE.wb = falsePE.wb; if (!exposure->get_active ()) filterPE.toneCurve = falsePE.toneCurve; if (!sh->get_active ()) filterPE.sh = falsePE.sh; - if (!epd->get_active ()) filterPE.edgePreservingDecompositionUI = falsePE.edgePreservingDecompositionUI; + if (!epd->get_active ()) filterPE.epd = falsePE.epd; if (!pcvignette->get_active ()) filterPE.pcvignette = falsePE.pcvignette; if (!gradient->get_active ()) filterPE.gradient = falsePE.gradient; if (!labcurve->get_active ()) filterPE.labCurve = falsePE.labCurve; diff --git a/rtgui/previewwindow.cc b/rtgui/previewwindow.cc index fafd6a563..ba4a5fe08 100644 --- a/rtgui/previewwindow.cc +++ b/rtgui/previewwindow.cc @@ -21,7 +21,7 @@ #include "imagearea.h" #include "cursormanager.h" -PreviewWindow::PreviewWindow () : previewHandler(NULL), mainCropWin(NULL), imageArea(NULL), isMoving(false) { +PreviewWindow::PreviewWindow () : previewHandler(NULL), mainCropWin(NULL), imageArea(NULL), isMoving(false), zoom(0.0) { rconn = signal_size_allocate().connect( sigc::mem_fun(*this, &PreviewWindow::on_resized) ); } @@ -36,7 +36,7 @@ void PreviewWindow::getObservedFrameArea (int& x, int& y, int& w, int& h) { if (mainCropWin) { int cropX, cropY, cropW, cropH; - mainCropWin->getCropRectangle (cropX, cropY, cropW, cropH); + mainCropWin->getCropRectangle (cropX, cropY, cropW, cropH); // translate it to screen coordinates x = imgX + cropX*zoom; y = imgY + cropY*zoom; @@ -100,12 +100,12 @@ bool PreviewWindow::on_expose_event (GdkEventExpose* event) { window->draw_drawable (get_style()->get_base_gc(Gtk::STATE_NORMAL), backBuffer, 0, 0, 0, 0, -1, -1); - if (mainCropWin) { + if (mainCropWin && zoom > 0.0) { Cairo::RefPtr cr = get_window()->create_cairo_context(); int x, y, w, h; getObservedFrameArea (x, y, w, h); cr->set_source_rgb (1.0, 1.0, 1.0); - cr->set_line_width (3); + cr->set_line_width (3); cr->rectangle (x-1.5, y-1.5, w+2, h+2); cr->stroke (); cr->set_source_rgb (1.0, 0.0, 0.0); diff --git a/rtgui/tonecurve.cc b/rtgui/tonecurve.cc index 3f25affd5..40fb77346 100644 --- a/rtgui/tonecurve.cc +++ b/rtgui/tonecurve.cc @@ -607,6 +607,8 @@ void ToneCurve::waitForAutoExp () { saturation->setEnabled (false); curveEditorG->set_sensitive (false); toneCurveMode->set_sensitive (false); + curveEditorG2->set_sensitive (false); + toneCurveMode2->set_sensitive (false); hrenabled->set_sensitive(false); method->set_sensitive(false); } @@ -641,6 +643,8 @@ void ToneCurve::enableAll () { saturation->setEnabled (true); curveEditorG->set_sensitive (true); toneCurveMode->set_sensitive (true); + curveEditorG2->set_sensitive (true); + toneCurveMode2->set_sensitive (true); hrenabled->set_sensitive(true); method->set_sensitive(true); } @@ -690,8 +694,10 @@ void ToneCurve::setBatchMode (bool batchMode) { saturation->showEditedCB (); toneCurveMode->append_text (M("GENERAL_UNCHANGED")); + toneCurveMode2->append_text (M("GENERAL_UNCHANGED")); curveEditorG->setBatchMode (batchMode); + curveEditorG2->setBatchMode (batchMode); } void ToneCurve::setAdjusterBehavior (bool expadd, bool hlcompadd, bool hlcompthreshadd, bool bradd, bool blackadd, bool shcompadd, bool contradd, bool satadd) { diff --git a/rtgui/toolpanelcoord.cc b/rtgui/toolpanelcoord.cc index 9f3d6667e..acdf6e9e7 100644 --- a/rtgui/toolpanelcoord.cc +++ b/rtgui/toolpanelcoord.cc @@ -45,7 +45,7 @@ ToolPanelCoordinator::ToolPanelCoordinator () : ipc(NULL) { impulsedenoise = Gtk::manage (new ImpulseDenoise ()); defringe = Gtk::manage (new Defringe ()); dirpyrdenoise = Gtk::manage (new DirPyrDenoise ()); - edgePreservingDecompositionUI = Gtk::manage (new EdgePreservingDecompositionUI ()); + epd = Gtk::manage (new EdgePreservingDecompositionUI ()); sharpening = Gtk::manage (new Sharpening ()); sharpenEdge = Gtk::manage (new SharpenEdge ()); sharpenMicro = Gtk::manage (new SharpenMicro ()); @@ -90,11 +90,10 @@ ToolPanelCoordinator::ToolPanelCoordinator () : ipc(NULL) { addPanel (detailsPanel, sharpenMicro, M("TP_SHARPENMICRO_LABEL"), true); toolPanels.push_back (sharpenMicro); addPanel (colorPanel, hsvequalizer, M("TP_HSVEQUALIZER_LABEL")); toolPanels.push_back (hsvequalizer); addPanel (colorPanel, rgbcurves, M("TP_RGBCURVES_LABEL")); toolPanels.push_back (rgbcurves); - addPanel (exposurePanel, edgePreservingDecompositionUI, M("TP_EPD_LABEL")); toolPanels.push_back (edgePreservingDecompositionUI); + addPanel (exposurePanel, epd, M("TP_EPD_LABEL"), true); toolPanels.push_back (epd); addPanel (exposurePanel, pcvignette, M("TP_PCVIGNETTE_LABEL")); toolPanels.push_back (pcvignette); addPanel (exposurePanel, gradient, M("TP_GRADIENT_LABEL")); toolPanels.push_back (gradient); addPanel (exposurePanel, lcurve, M("TP_LABCURVE_LABEL")); toolPanels.push_back (lcurve); -// addPanel (exposurePanel, edgePreservingDecompositionUI, M("TP_EPD_LABEL")); toolPanels.push_back (edgePreservingDecompositionUI); addPanel (exposurePanel, colorappearance, M("TP_COLORAPP_LABEL")); toolPanels.push_back (colorappearance); addPanel (detailsPanel, impulsedenoise, M("TP_IMPULSEDENOISE_LABEL"), true); toolPanels.push_back (impulsedenoise); addPanel (detailsPanel, dirpyrdenoise, M("TP_DIRPYRDENOISE_LABEL"), true); toolPanels.push_back (dirpyrdenoise); diff --git a/rtgui/toolpanelcoord.h b/rtgui/toolpanelcoord.h index f5a73739c..5d76254d6 100644 --- a/rtgui/toolpanelcoord.h +++ b/rtgui/toolpanelcoord.h @@ -108,7 +108,7 @@ class ToolPanelCoordinator : public ToolPanelListener, Defringe* defringe; ImpulseDenoise* impulsedenoise; DirPyrDenoise* dirpyrdenoise; - EdgePreservingDecompositionUI *edgePreservingDecompositionUI; + EdgePreservingDecompositionUI *epd; Sharpening* sharpening; SharpenEdge* sharpenEdge; SharpenMicro* sharpenMicro; diff --git a/tools/buildRT b/tools/buildRT index d1fc4f25b..bd2186a9e 100755 --- a/tools/buildRT +++ b/tools/buildRT @@ -1,6 +1,6 @@ #!/usr/bin/env bash # Written by DrSlony -# buildRT version 3.8, 2014-01-23 +# buildRT version 4.0, 2014-03-06 # Please report bugs or enhancements to http://code.google.com/p/rawtherapee/issues/list # www.rawtherapee.com # www.londonlight.org @@ -25,56 +25,63 @@ esac #--- Set some variables unset choiceNumber choiceNumbers buildType buildTypes list branch branches repo -version="3.8" +version="4.0" movetoPatched="" repo="${HOME}/rawtherapee" procTarget=2 -while getopts "bc:np:uvh?-" opt; do - case "${opt}" in - b) patched="yes" - movetoPatched="_patched" - printf "%s\n" "Buildonly flag detected, will not hg pull or update" ;; - c) dCacheNameSuffix="$OPTARG" - #sanitize - dCacheNameSuffix=${dCacheNameSuffix//[^\.\-_a-zA-Z0-9]/}; - printf "%s\n" "Cache and config name suffix: $dCacheNameSuffix" ;; - n) noomp="-DOPTION_OMP=OFF" - printf "%s\n" "OpenMP disabled" ;; - p) procTarget="$OPTARG" - if [[ $procTarget -lt 1 || $procTarget -gt 9 ]]; then - printf "%s\n" "Invalid processor target value." "Use a value from 1 to 9, e.g." "./buildRT -p 1" "See ProcessorTargets.cmake" "Aborting" - exit 1 - fi ;; - u) gcVer="$(curl "http://rawtherapee.googlecode.com/hg/tools/buildRT" 2>/dev/null | grep "^#.*[vV]ersion.*")" || { echo "\"curl\" program not found, please install it first."; exit 1; } - gcVer="${gcVer##*[[:alpha:]] }" - gcVer="${gcVer%%,*}" - latestVer="$(printf "%s\n" "$version" "$gcVer" | sort -rV | head -n 1)" - if [[ $version = $latestVer ]]; then - printf "%s\n" "You are using the latest version of buildRT, $version" - exit 0 - else - printf "%s\n" "You are using version $version but version $gcVer is available on Google Code." "You can download the Google Code version from this URL:" " https://rawtherapee.googlecode.com/hg/tools/buildRT" "Replace it with this script, and remember to run \"chmod +x buildRT\"" - exit 0 - fi ;; - v) verbose=yes - printf "%s\n" "Verbose mode, I will spam your screen with warnings" ;; - h|\?|-) printf "%s\n" "Usage:" "" \ - " $0 [-b] [-c ] [-n] [-p <1-9>] [-v]" "" \ - " -b" \ - "Build-only mode. buildRT uses \"hg update -C default\" to update your source code repository to the newest revision, however doing so might destroy any uncommitted or unpushed changes you made or any patches you applied. With the -b flag the script will not update the source code, so that you can easily compile RawTherapee with whatever patches you manually applied. buildRT should automatically detect if you modified the source code, but you can use this flag to force build-only mode." "Generally when compiling patched RT versions you want to keep the cache and config folders separate, so consider using \"-b -c _testing\"" "" \ - " -c " \ - "Specify a suffix to the cache and config directory names. Only alphanumerics, periods, dashes and underscores are valid. The default value is \"4\", which will result in your build of RawTherapee storing the cache in \"${HOME}/.cache/RawTherapee4\" and config in \"${HOME}/.config/RawTherapee4\". For example, use \"-c _testing\" if you want to test older or patched versions of RawTherapee without potentially damaging your \"real\" cache and config files." "" \ - " -n" \ - "Disable OpenMP." "" \ - " -p <1-9>" \ - "Set which processor target to use. Takes a single digit from 1 to 9. The default is 2. See ProcessorTargets.cmake" "" \ - " -u" \ - "Check for an update of buildRT on Google Code." "" \ - " -v" \ - "Make compilation verbose, so you see all compiler warnings." | fold -s - exit 0 ;; - esac +while getopts "bc:np:s:t:uvh?-" opt; do + case "${opt}" in + b) patched="yes" + movetoPatched="_patched" + printf "%s\n" "Buildonly flag detected, will not hg pull or update" ;; + c) dCacheNameSuffix="$OPTARG" + dCacheNameSuffix=${dCacheNameSuffix//[^\.\-_a-zA-Z0-9]/}; + printf "%s\n" "Cache and config name suffix: $dCacheNameSuffix" ;; + n) noomp="-DOPTION_OMP=OFF" + printf "%s\n" "OpenMP disabled" ;; + p) procTarget="$OPTARG" + if [[ $procTarget -lt 1 || $procTarget -gt 9 ]]; then + printf "%s\n" "Invalid processor target value." "Use a value from 1 to 9, e.g." "./buildRT -p 1" "See ProcessorTargets.cmake" "Aborting" + exit 1 + fi ;; + s) movetoPatched="_${OPTARG//[^\.\-_a-zA-Z0-9]/}" + printf "%s\n" "Suffix of destination build dir: ${movetoPatched}" ;; + t) titleSuffix="${OPTARG//[^\.\-\:\ \+_a-zA-Z0-9]/}" + printf "%s\n" "Titlebar version suffix: ${titleSuffix}" ;; + u) gcVer="$(curl "http://rawtherapee.googlecode.com/hg/tools/buildRT" 2>/dev/null | grep "^#.*[vV]ersion.*")" || { echo "\"curl\" program not found, please install it first."; exit 1; } + gcVer="${gcVer##*[[:alpha:]] }" + gcVer="${gcVer%%,*}" + latestVer="$(printf "%s\n" "$version" "$gcVer" | sort -rV | head -n 1)" + if [[ $version = $latestVer ]]; then + printf "%s\n" "You are using the latest version of buildRT, $version" + exit 0 + else + printf "%s\n" "You are using version $version but version $gcVer is available on Google Code." "You can download the Google Code version from this URL:" " https://rawtherapee.googlecode.com/hg/tools/buildRT" "Replace it with this script, and remember to run \"chmod +x buildRT\"" + exit 0 + fi ;; + v) verbose=yes + printf "%s\n" "Verbose mode, I will spam your screen with warnings" ;; + h|\?|-) printf "%s\n" "Usage:" "" \ + " $0 [-b] [-c ] [-n] [-p <1-9>] [-s ] [-v]" "" \ + " -b" \ + "Build-only mode. buildRT uses \"hg update -C default\" to update your source code repository to the newest revision, however doing so might destroy any uncommitted or unpushed changes you made or any patches you applied. With the -b flag the script will not update the source code, so that you can easily compile RawTherapee with whatever patches you manually applied. buildRT should automatically detect if you modified the source code, but you can use this flag to force build-only mode." "Generally when compiling patched RT versions you want to keep the cache and config folders separate, so consider using \"-b -c _testing\"" "" \ + " -c " \ + "Specify a suffix to the cache and config directory names. Only alphanumerics, periods, dashes and underscores are valid. The default value is \"4\", which will result in your build of RawTherapee storing the cache in \"${HOME}/.cache/RawTherapee4\" and config in \"${HOME}/.config/RawTherapee4\". For example, use \"-c _testing\" if you want to test older or patched versions of RawTherapee without potentially damaging your \"real\" cache and config files." "" \ + " -n" \ + "Disable OpenMP." "" \ + " -p <1-9>" \ + "Set which processor target to use. Takes a single digit from 1 to 9. The default is 2. See ProcessorTargets.cmake" "" \ + " -s " \ + "Suffix of destination build directory, so that if you have applied a patch, say \"dustremoval-1.patch\", and want to have RawTherapee compiled to a folder whose name ends with \"_dustremoval1\", you would set \"-s dustremoval1\" (the underscore is automated)." "" \ + " -t " \ + "Suffix displayed next to the RawTherapee version in the window titlebar. It is recommended that you include the changeset of the newest public commit (the one you would see if you cloned the repository anew) so it is clear which commit you applied the patches to. E.g.:" "-t \": ee72ddbcfd4e + dustremoval-1.patch + mustafa ibrahim\"" "" \ + " -u" \ + "Check for an update of buildRT on Google Code." "" \ + " -v" \ + "Make compilation verbose, so you see all compiler warnings." | fold -s + exit 0 ;; +esac done shift $((OPTIND-1)) [ "$1" = "--" ] && shift @@ -201,13 +208,17 @@ elif [[ -z $patched ]]; then echo ;; c|C) printf "%s\n" "Retaining edited source code and compiling RT as-is." "" patched="yes" - movetoPatched="_patched" ;; + if [[ -z $movetoPatched ]]; then + movetoPatched="_patched" + fi ;; *) printf "%s\n" "User aborted" "" exit 0 ;; esac else printf "%s\n" "Retaining edited source code and compiling RT as-is." "" - movetoPatched="_patched" + if [[ -z $movetoPatched ]]; then + movetoPatched="_patched" + fi fi hg parents --template 'Repository state:\n Branch: {branch}\n RawTherapee-{latesttag}.{latesttagdistance}\n Changeset: {rev}:{node|short}\n Latest tag: {latesttag}\n\n' @@ -272,9 +283,9 @@ for choiceNumber in "${choiceNumbers[@]}"; do echo case $REPLY in d|D) rm -rf "${HOME}/rt_${branch}_${buildType}${movetoPatched}" || exit 1 ;; - r|R) printf "%s\n" "The build will be saved to \"${HOME}/rt_${branch}_${buildType}${movetoPatched}X\" where \"X\" will be replaced with whatever suffix you choose next. Only alphanumerics, dashes and underscores are valid." | fold -s + r|R) printf "%s\n" "The build will be saved to \"${HOME}/rt_${branch}_${buildType}_X\" where \"X\" will be replaced with whatever suffix you choose next. Only alphanumerics, dashes, underscores and periods are valid." | fold -s read -r -p "Suffix: " - movetoPatched="${REPLY//[^\.\-_a-zA-Z0-9]/}" + movetoPatched="_${REPLY//[^\.\-_a-zA-Z0-9]/}" printf "%s\n" "Build will be compiled to \"${HOME}/rt_${branch}_${buildType}${movetoPatched}\"" ;; a|A) printf "%s\n" "Cannot proceed if old build directory exists." "Remove it or rename it, then re-run this script." "Aborting" exit 0 ;; @@ -320,7 +331,9 @@ for choiceNumber in "${choiceNumbers[@]}"; do -DBUILD_BUNDLE="ON" \ -DBINDIR="." \ -DDATADIR="." \ - -DCACHE_NAME_SUFFIX="$dCacheNameSuffix" ../ \ + -DCACHE_NAME_SUFFIX="$dCacheNameSuffix" \ + -DVERSION_SUFFIX="$titleSuffix" \ + ../ \ || { echo "Error during cmake, exiting."; exit 1; } fi echo