Remove the soft proof button and internal flag as it was decided not to mix this with the output profile handling.
This commit is contained in:
parent
bcbb45454a
commit
5fd5d5bece
@ -33,7 +33,7 @@ extern const Settings* settings;
|
|||||||
Crop::Crop (ImProcCoordinator* parent, EditDataProvider *editDataProvider, bool isDetailWindow)
|
Crop::Crop (ImProcCoordinator* parent, EditDataProvider *editDataProvider, bool isDetailWindow)
|
||||||
: EditBuffer(editDataProvider), origCrop(NULL), laboCrop(NULL), labnCrop(NULL),
|
: EditBuffer(editDataProvider), origCrop(NULL), laboCrop(NULL), labnCrop(NULL),
|
||||||
cropImg(NULL), cbuf_real(NULL), cshmap(NULL), transCrop(NULL), cieCrop(NULL), cbuffer(NULL),
|
cropImg(NULL), cbuf_real(NULL), cshmap(NULL), transCrop(NULL), cieCrop(NULL), cbuffer(NULL),
|
||||||
softProofing(false), updating(false), newUpdatePending(false), skip(10),
|
updating(false), newUpdatePending(false), skip(10),
|
||||||
cropx(0), cropy(0), cropw(-1), croph(-1),
|
cropx(0), cropy(0), cropw(-1), croph(-1),
|
||||||
trafx(0), trafy(0), trafw(-1), trafh(-1),
|
trafx(0), trafy(0), trafw(-1), trafh(-1),
|
||||||
rqcropx(0), rqcropy(0), rqcropw(-1), rqcroph(-1),
|
rqcropx(0), rqcropy(0), rqcropw(-1), rqcroph(-1),
|
||||||
@ -987,42 +987,8 @@ void Crop::update (int todo)
|
|||||||
EditBuffer::setReady();
|
EditBuffer::setReady();
|
||||||
|
|
||||||
// switch back to rgb
|
// switch back to rgb
|
||||||
parent->ipf.lab2monitorRgb (labnCrop, cropImg, softProofing);
|
parent->ipf.lab2monitorRgb (labnCrop, cropImg);
|
||||||
|
|
||||||
//parent->ipf.lab2monitorRgb (laboCrop, cropImg);
|
|
||||||
|
|
||||||
//cropImg = baseCrop->to8();
|
|
||||||
/*
|
|
||||||
// int xref,yref;
|
|
||||||
xref=000;yref=000;
|
|
||||||
if (colortest && cropw>115 && croph>115)
|
|
||||||
for(int j=1;j<5;j++){
|
|
||||||
xref+=j*30;yref+=j*30;
|
|
||||||
int rlin = (CurveFactory::igamma2((float)cropImg->data[3*((int)(xref/skip)*cropImg->width+(int)(yref/skip))]/255.0) * 255.0);
|
|
||||||
int glin = (CurveFactory::igamma2((float)cropImg->data[3*((int)(xref/skip)*cropImg->width+(int)(yref/skip))+1]/255.0) * 255.0);
|
|
||||||
int blin = (CurveFactory::igamma2((float)cropImg->data[3*((int)(xref/skip)*cropImg->width+(int)(yref/skip))+2]/255.0) * 255.0);
|
|
||||||
|
|
||||||
printf("after lab2rgb RGB lab2 Xr%i Yr%i Skip=%d R=%d G=%d B=%d \n",xref,yref,skip,
|
|
||||||
rlin,glin,blin);
|
|
||||||
//cropImg->data[3*((int)(xref/skip)*cropImg->width+(int)(yref/skip))],
|
|
||||||
//cropImg->data[(3*((int)(xref/skip)*cropImg->width+(int)(yref/skip))+1)],
|
|
||||||
//cropImg->data[(3*((int)(xref/skip)*cropImg->width+(int)(yref/skip))+2)]);
|
|
||||||
//printf("after lab2rgb Lab lab2 Xr%i Yr%i Skip=%d l=%f a=%f b=%f \n",xref,yref,skip, labnCrop->L[(int)(xref/skip)][(int)(yref/skip)]/327,labnCrop->a[(int)(xref/skip)][(int)(yref/skip)]/327,labnCrop->b[(int)(xref/skip)][(int)(yref/skip)]/327);
|
|
||||||
printf("after lab2rgb Lab Xr%i Yr%i Skip=%d l=%f a=%f b=%f \n",xref,yref,skip,
|
|
||||||
labnCrop->L[(int)(xref/skip)][(int)(yref/skip)]/327,
|
|
||||||
labnCrop->a[(int)(xref/skip)][(int)(yref/skip)]/327,
|
|
||||||
labnCrop->b[(int)(xref/skip)][(int)(yref/skip)]/327)q;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
/*
|
|
||||||
if (colortest && cropImg->height>115 && cropImg->width>115) {//for testing
|
|
||||||
xref=000;yref=000;
|
|
||||||
printf("dcrop final R= %d G= %d B= %d \n",
|
|
||||||
cropImg->data[3*xref/(skip)*(cropImg->width+1)],
|
|
||||||
cropImg->data[3*xref/(skip)*(cropImg->width+1)+1],
|
|
||||||
cropImg->data[3*xref/(skip)*(cropImg->width+1)+2]);
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
if (cropImageListener) {
|
if (cropImageListener) {
|
||||||
// this in output space held in parallel to allow analysis like shadow/highlight
|
// this in output space held in parallel to allow analysis like shadow/highlight
|
||||||
Glib::ustring outProfile = params.icm.output;
|
Glib::ustring outProfile = params.icm.output;
|
||||||
|
@ -54,7 +54,6 @@ protected:
|
|||||||
// -----------------------------------------------------------------
|
// -----------------------------------------------------------------
|
||||||
float** cbuffer;
|
float** cbuffer;
|
||||||
|
|
||||||
bool softProofing; /// True if the Crop has to display a soft proof of the output with its profile
|
|
||||||
bool updating; /// Flag telling if an updater thread is currently processing
|
bool updating; /// Flag telling if an updater thread is currently processing
|
||||||
bool newUpdatePending; /// Flag telling the updater thread that a new update is pending
|
bool newUpdatePending; /// Flag telling the updater thread that a new update is pending
|
||||||
int skip;
|
int skip;
|
||||||
@ -104,10 +103,6 @@ public:
|
|||||||
/** @brief Asynchronously reprocess the detailed crop */
|
/** @brief Asynchronously reprocess the detailed crop */
|
||||||
void fullUpdate (); // called via thread
|
void fullUpdate (); // called via thread
|
||||||
|
|
||||||
void setSoftProofing(bool doSoftProof) {
|
|
||||||
softProofing = doSoftProof;
|
|
||||||
}
|
|
||||||
|
|
||||||
void setListener (DetailedCropListener* il);
|
void setListener (DetailedCropListener* il);
|
||||||
void destroy ();
|
void destroy ();
|
||||||
int get_skip ()
|
int get_skip ()
|
||||||
|
@ -33,7 +33,7 @@ ImProcCoordinator::ImProcCoordinator ()
|
|||||||
: orig_prev(NULL), oprevi(NULL), oprevl(NULL), nprevl(NULL), previmg(NULL), workimg(NULL),
|
: orig_prev(NULL), oprevi(NULL), oprevl(NULL), nprevl(NULL), previmg(NULL), workimg(NULL),
|
||||||
ncie(NULL), imgsrc(NULL), shmap(NULL), lastAwbEqual(0.), ipf(¶ms, true), monitorIntent(RI_PERCEPTUAL), scale(10),
|
ncie(NULL), imgsrc(NULL), shmap(NULL), lastAwbEqual(0.), ipf(¶ms, true), monitorIntent(RI_PERCEPTUAL), scale(10),
|
||||||
highDetailPreprocessComputed(false), highDetailRawComputed(false), allocated(false), isColorProfileDirty(true),
|
highDetailPreprocessComputed(false), highDetailRawComputed(false), allocated(false), isColorProfileDirty(true),
|
||||||
softProofing(false), bwAutoR(-9000.f), bwAutoG(-9000.f), bwAutoB(-9000.f), CAMMean(0.),
|
bwAutoR(-9000.f), bwAutoG(-9000.f), bwAutoB(-9000.f), CAMMean(0.),
|
||||||
|
|
||||||
hltonecurve(65536),
|
hltonecurve(65536),
|
||||||
shtonecurve(65536),
|
shtonecurve(65536),
|
||||||
@ -783,14 +783,13 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall)
|
|||||||
|
|
||||||
// Update the output color transform if necessary
|
// Update the output color transform if necessary
|
||||||
if (isColorProfileDirty || (todo & M_MONITOR)) {
|
if (isColorProfileDirty || (todo & M_MONITOR)) {
|
||||||
ipf.updateColorProfiles(params.icm, monitorProfile, monitorIntent, softProofing);
|
ipf.updateColorProfiles(params.icm, monitorProfile, monitorIntent);
|
||||||
isColorProfileDirty = false;
|
isColorProfileDirty = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// process crop, if needed
|
// process crop, if needed
|
||||||
for (size_t i = 0; i < crops.size(); i++)
|
for (size_t i = 0; i < crops.size(); i++)
|
||||||
if (crops[i]->hasListener () && cropCall != crops[i] ) {
|
if (crops[i]->hasListener () && cropCall != crops[i] ) {
|
||||||
crops[i]->setSoftProofing(softProofing);
|
|
||||||
crops[i]->update (todo); // may call ourselves
|
crops[i]->update (todo); // may call ourselves
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -805,7 +804,7 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall)
|
|||||||
MyMutex::MyLock prevImgLock(previmg->getMutex());
|
MyMutex::MyLock prevImgLock(previmg->getMutex());
|
||||||
|
|
||||||
try {
|
try {
|
||||||
ipf.lab2monitorRgb (nprevl, previmg, softProofing);
|
ipf.lab2monitorRgb (nprevl, previmg);
|
||||||
delete workimg;
|
delete workimg;
|
||||||
Glib::ustring outProfile = params.icm.output;
|
Glib::ustring outProfile = params.icm.output;
|
||||||
|
|
||||||
@ -1133,11 +1132,6 @@ void ImProcCoordinator::getAutoCrop (double ratio, int &x, int &y, int &w, int &
|
|||||||
y = (fullh - h) / 2;
|
y = (fullh - h) / 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ImProcCoordinator::setSoftProofing (bool softProof)
|
|
||||||
{
|
|
||||||
softProofing = softProof;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ImProcCoordinator::setMonitorProfile (Glib::ustring profile, RenderingIntent intent)
|
void ImProcCoordinator::setMonitorProfile (Glib::ustring profile, RenderingIntent intent)
|
||||||
{
|
{
|
||||||
if (profile != monitorProfile) {
|
if (profile != monitorProfile) {
|
||||||
|
@ -82,7 +82,6 @@ protected:
|
|||||||
bool allocated;
|
bool allocated;
|
||||||
|
|
||||||
bool isColorProfileDirty;
|
bool isColorProfileDirty;
|
||||||
bool softProofing;
|
|
||||||
|
|
||||||
void freeAll ();
|
void freeAll ();
|
||||||
|
|
||||||
@ -258,7 +257,6 @@ public:
|
|||||||
|
|
||||||
void setMonitorProfile (Glib::ustring profile, RenderingIntent intent);
|
void setMonitorProfile (Glib::ustring profile, RenderingIntent intent);
|
||||||
void getMonitorProfile (Glib::ustring &profile, RenderingIntent &intent);
|
void getMonitorProfile (Glib::ustring &profile, RenderingIntent &intent);
|
||||||
void setSoftProofing (bool softProof);
|
|
||||||
|
|
||||||
bool updateTryLock ()
|
bool updateTryLock ()
|
||||||
{
|
{
|
||||||
|
@ -140,55 +140,8 @@ void ImProcFunctions::firstAnalysisThread (Imagefloat* original, Glib::ustring w
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/*
|
|
||||||
void ImProcFunctions::CAT02 (Imagefloat* baseImg, const ProcParams* params)
|
|
||||||
{
|
|
||||||
const double toxyz[3][3] = {{0.7976749, 0.1351917, 0.0313534},
|
|
||||||
{0.2880402, 0.7118741, 0.0000857},
|
|
||||||
{0.0000000, 0.0000000, 0.8252100}};
|
|
||||||
|
|
||||||
const double xyzto[3][3] = {{1.3459433, -0.2556075, -0.0511118},
|
void ImProcFunctions::updateColorProfiles (const ColorManagementParams& icm, const Glib::ustring& monitorProfile, RenderingIntent monitorIntent)
|
||||||
{-0.5445989, 1.5081673, 0.0205351},
|
|
||||||
{0.0000000, 0.0000000, 1.2118128}};
|
|
||||||
int fw = baseImg->width;
|
|
||||||
int fh = baseImg->height;
|
|
||||||
|
|
||||||
double CAM02BB00,CAM02BB01,CAM02BB02,CAM02BB10,CAM02BB11,CAM02BB12,CAM02BB20,CAM02BB21,CAM02BB22;
|
|
||||||
double Xxx,Yyy,Zzz;
|
|
||||||
// Xxx=1.09844;
|
|
||||||
// Yyy=1.0;
|
|
||||||
// Zzz=0.355961;
|
|
||||||
//params.wb.temperature, params.wb.green, params.wb.method
|
|
||||||
double Xxyz, Zxyz;
|
|
||||||
// ColorTemp::temp2mulxyz (params->wb.temperature, params->wb.green, params->wb.method, Xxyz, Zxyz);
|
|
||||||
ColorTemp::temp2mulxyz (5000.0, 1.0, "Camera", Xxyz, Zxyz);
|
|
||||||
|
|
||||||
ColorTemp::cieCAT02(Xxx, Yyy, Zzz, CAM02BB00,CAM02BB01,CAM02BB02,CAM02BB10,CAM02BB11,CAM02BB12,CAM02BB20,CAM02BB21,CAM02BB22);
|
|
||||||
printf("00=%f 01=%f 11=%f 20=%f 22=%f\n", CAM02BB00,CAM02BB01,CAM02BB11,CAM02BB20,CAM02BB22);
|
|
||||||
|
|
||||||
|
|
||||||
for (int i=0; i<fh; i++) {
|
|
||||||
for (int j=0; j<fw; j++) {
|
|
||||||
float r = baseImg->r(i,j);
|
|
||||||
float g = baseImg->g(i,j);
|
|
||||||
float b = baseImg->b(i,j);
|
|
||||||
|
|
||||||
float x = toxyz[0][0] * r + toxyz[0][1] * g + toxyz[0][2] * b;
|
|
||||||
float y = toxyz[1][0] * r + toxyz[1][1] * g + toxyz[1][2] * b;
|
|
||||||
float z = toxyz[2][0] * r + toxyz[2][1] * g + toxyz[2][2] * b;
|
|
||||||
float Xcam=CAM02BB00* x +CAM02BB01* y + CAM02BB02* z ;
|
|
||||||
float Ycam=CAM02BB10* x +CAM02BB11* y + CAM02BB12* z ;
|
|
||||||
float Zcam=CAM02BB20* x +CAM02BB21* y + CAM02BB22* z ;
|
|
||||||
baseImg->r(i,j) = xyzto[0][0] * Xcam + xyzto[0][1] * Ycam + xyzto[0][2] * Zcam;
|
|
||||||
baseImg->g(i,j) = xyzto[1][0] * Xcam + xyzto[1][1] * Ycam + xyzto[1][2] * Zcam;
|
|
||||||
baseImg->b(i,j) = xyzto[2][0] * Xcam + xyzto[2][1] * Ycam + xyzto[2][2] * Zcam;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
void ImProcFunctions::updateColorProfiles (const ColorManagementParams &icm, Glib::ustring monitorProfile, RenderingIntent monitorIntent, bool softProofing)
|
|
||||||
{
|
{
|
||||||
// set up monitor transform
|
// set up monitor transform
|
||||||
if (monitorTransform != NULL) {
|
if (monitorTransform != NULL) {
|
||||||
@ -224,9 +177,6 @@ void ImProcFunctions::updateColorProfiles (const ColorManagementParams &icm, Gli
|
|||||||
cmsHPROFILE jprof = iccStore->getProfile(outputProfile);
|
cmsHPROFILE jprof = iccStore->getProfile(outputProfile);
|
||||||
|
|
||||||
if (jprof) {
|
if (jprof) {
|
||||||
//TODO: Create a dedicated softproof transformation (line below to be finished)
|
|
||||||
//lab2outputTransform = cmsCreateProofingTransform(iprof, TYPE_Lab_FLT, jprof, TYPE_RGB_FLT, monitor, icm.outputIntent, monitorIntent, cmsFLAGS_NOOPTIMIZE | cmsFLAGS_NOCACHE | cmsFLAGS_SOFTPROOFING );
|
|
||||||
|
|
||||||
lab2outputTransform = cmsCreateTransform (iprof, TYPE_Lab_FLT, jprof, TYPE_RGB_FLT, icm.outputIntent, cmsFLAGS_NOOPTIMIZE | cmsFLAGS_NOCACHE );
|
lab2outputTransform = cmsCreateTransform (iprof, TYPE_Lab_FLT, jprof, TYPE_RGB_FLT, icm.outputIntent, cmsFLAGS_NOOPTIMIZE | cmsFLAGS_NOCACHE );
|
||||||
output2monitorTransform = cmsCreateTransform (jprof, TYPE_RGB_FLT, monitor, TYPE_RGB_8, monitorIntent, cmsFLAGS_NOOPTIMIZE | cmsFLAGS_NOCACHE );
|
output2monitorTransform = cmsCreateTransform (jprof, TYPE_RGB_FLT, monitor, TYPE_RGB_8, monitorIntent, cmsFLAGS_NOOPTIMIZE | cmsFLAGS_NOCACHE );
|
||||||
}
|
}
|
||||||
|
@ -233,7 +233,7 @@ public:
|
|||||||
bool needsPCVignetting ();
|
bool needsPCVignetting ();
|
||||||
|
|
||||||
void firstAnalysis (Imagefloat* working, const ProcParams* params, LUTu & vhist16);
|
void firstAnalysis (Imagefloat* working, const ProcParams* params, LUTu & vhist16);
|
||||||
void updateColorProfiles (const ColorManagementParams &icm, Glib::ustring monitorProfile, RenderingIntent monitorIntent, bool softProofing);
|
void updateColorProfiles (const ColorManagementParams& icm, const Glib::ustring& monitorProfile, RenderingIntent monitorIntent);
|
||||||
void rgbProc (Imagefloat* working, LabImage* lab, EditBuffer *editBuffer, LUTf & hltonecurve, LUTf & shtonecurve, LUTf & tonecurve,
|
void rgbProc (Imagefloat* working, LabImage* lab, EditBuffer *editBuffer, LUTf & hltonecurve, LUTf & shtonecurve, LUTf & tonecurve,
|
||||||
SHMap* shmap, int sat, LUTf & rCurve, LUTf & gCurve, LUTf & bCurve, float satLimit , float satLimitOpacity, const ColorGradientCurve & ctColorCurve, const OpacityCurve & ctOpacityCurve, bool opautili, LUTf & clcurve, LUTf & cl2curve, const ToneCurve & customToneCurve1, const ToneCurve & customToneCurve2,
|
SHMap* shmap, int sat, LUTf & rCurve, LUTf & gCurve, LUTf & bCurve, float satLimit , float satLimitOpacity, const ColorGradientCurve & ctColorCurve, const OpacityCurve & ctOpacityCurve, bool opautili, LUTf & clcurve, LUTf & cl2curve, const ToneCurve & customToneCurve1, const ToneCurve & customToneCurve2,
|
||||||
const ToneCurve & customToneCurvebw1, const ToneCurve & customToneCurvebw2, double &rrm, double &ggm, double &bbm, float &autor, float &autog, float &autob, DCPProfile *dcpProf);
|
const ToneCurve & customToneCurvebw1, const ToneCurve & customToneCurvebw2, double &rrm, double &ggm, double &bbm, float &autor, float &autog, float &autob, DCPProfile *dcpProf);
|
||||||
@ -266,7 +266,7 @@ public:
|
|||||||
void transform (Imagefloat* original, Imagefloat* transformed, int cx, int cy, int sx, int sy, int oW, int oH, int fW, int fH,
|
void transform (Imagefloat* original, Imagefloat* transformed, int cx, int cy, int sx, int sy, int oW, int oH, int fW, int fH,
|
||||||
double focalLen, double focalLen35mm, float focusDist, int rawRotationDeg, bool fullImage);
|
double focalLen, double focalLen35mm, float focusDist, int rawRotationDeg, bool fullImage);
|
||||||
float resizeScale (const ProcParams* params, int fw, int fh, int &imw, int &imh);
|
float resizeScale (const ProcParams* params, int fw, int fh, int &imw, int &imh);
|
||||||
void lab2monitorRgb (LabImage* lab, Image8* image, bool softProofing=false);
|
void lab2monitorRgb (LabImage* lab, Image8* image);
|
||||||
void resize (Image16* src, Image16* dst, float dScale);
|
void resize (Image16* src, Image16* dst, float dScale);
|
||||||
void Lanczos (const LabImage* src, LabImage* dst, float scale);
|
void Lanczos (const LabImage* src, LabImage* dst, float scale);
|
||||||
void Lanczos (const Image16* src, Image16* dst, float scale);
|
void Lanczos (const Image16* src, Image16* dst, float scale);
|
||||||
|
@ -39,7 +39,7 @@ const double (*iwprof[])[3] = {sRGB_xyz, adobe_xyz, prophoto_xyz, widegamut_xyz,
|
|||||||
const char* wprofnames[] = {"sRGB", "Adobe RGB", "ProPhoto", "WideGamut", "BruceRGB", "Beta RGB", "BestRGB"};
|
const char* wprofnames[] = {"sRGB", "Adobe RGB", "ProPhoto", "WideGamut", "BruceRGB", "Beta RGB", "BestRGB"};
|
||||||
const int numprof = 7;
|
const int numprof = 7;
|
||||||
|
|
||||||
void ImProcFunctions::lab2monitorRgb (LabImage* lab, Image8* image, bool softProofing)
|
void ImProcFunctions::lab2monitorRgb (LabImage* lab, Image8* image)
|
||||||
{
|
{
|
||||||
//gamutmap(lab);
|
//gamutmap(lab);
|
||||||
|
|
||||||
@ -78,7 +78,7 @@ void ImProcFunctions::lab2monitorRgb (LabImage* lab, Image8* image, bool softPro
|
|||||||
buffer[iy++] = rb[j] / 327.68f;
|
buffer[iy++] = rb[j] / 327.68f;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (softProofing && !settings->HistogramWorking && output2monitorTransform && lab2outputTransform) {
|
if (!settings->HistogramWorking && output2monitorTransform && lab2outputTransform) {
|
||||||
AlignedBuffer<float> buf(3 * W);
|
AlignedBuffer<float> buf(3 * W);
|
||||||
cmsDoTransform (lab2outputTransform, buffer, buf.data, W);
|
cmsDoTransform (lab2outputTransform, buffer, buf.data, W);
|
||||||
cmsDoTransform (output2monitorTransform, buf.data, data + ix, W);
|
cmsDoTransform (output2monitorTransform, buf.data, data + ix, W);
|
||||||
|
@ -455,8 +455,7 @@ enum ProcEvent {
|
|||||||
// EvLgrbl = 425,
|
// EvLgrbl = 425,
|
||||||
EvRetinexlhcurve = 425,
|
EvRetinexlhcurve = 425,
|
||||||
EvOIntent = 426,
|
EvOIntent = 426,
|
||||||
EvSoftProof = 427,
|
EvMonitorTransform = 427,
|
||||||
EvMonitorTransform = 428,
|
|
||||||
NUMOFEVENTS
|
NUMOFEVENTS
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -455,7 +455,6 @@ int refreshmap[rtengine::NUMOFEVENTS] = {
|
|||||||
// DEMOSAIC, // EvLgrbl
|
// DEMOSAIC, // EvLgrbl
|
||||||
DEMOSAIC, // EvRetinexlhcurve
|
DEMOSAIC, // EvRetinexlhcurve
|
||||||
ALLNORAW, // EvOIntent
|
ALLNORAW, // EvOIntent
|
||||||
ALLNORAW, // EvSoftProof
|
|
||||||
MONITORTRANSFORM // EvMonitorTransform
|
MONITORTRANSFORM // EvMonitorTransform
|
||||||
|
|
||||||
};
|
};
|
||||||
|
@ -418,7 +418,6 @@ public:
|
|||||||
|
|
||||||
virtual void setMonitorProfile (Glib::ustring monitorProfile, RenderingIntent intent) = 0;
|
virtual void setMonitorProfile (Glib::ustring monitorProfile, RenderingIntent intent) = 0;
|
||||||
virtual void getMonitorProfile (Glib::ustring &monitorProfile, RenderingIntent &intent) = 0;
|
virtual void getMonitorProfile (Glib::ustring &monitorProfile, RenderingIntent &intent) = 0;
|
||||||
virtual void setSoftProofing (bool softProof) = 0;
|
|
||||||
|
|
||||||
virtual ~StagedImageProcessor () {}
|
virtual ~StagedImageProcessor () {}
|
||||||
|
|
||||||
|
@ -33,131 +33,113 @@
|
|||||||
|
|
||||||
using namespace rtengine::procparams;
|
using namespace rtengine::procparams;
|
||||||
|
|
||||||
class MonitorProfileSelector
|
class EditorPanel::MonitorProfileSelector
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
Gtk::ToggleButton* softProof;
|
MyComboBoxText profileBox;
|
||||||
MyComboBoxText* profileBox;
|
PopUpButton intentBox;
|
||||||
PopUpButton* intentBox;
|
sigc::connection profileConn, intentConn;
|
||||||
sigc::connection profileConn, intentConn, softProofConn;
|
|
||||||
|
|
||||||
rtengine::StagedImageProcessor* processor;
|
rtengine::StagedImageProcessor* const& processor;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void prepareSoftProofButton ()
|
|
||||||
{
|
|
||||||
Gtk::Image *softProofImg = Gtk::manage (new RTImage("softProof.png"));
|
|
||||||
softProofImg->set_padding(0, 0);
|
|
||||||
softProof = Gtk::manage(new Gtk::ToggleButton());
|
|
||||||
softProof->add(*softProofImg);
|
|
||||||
softProof->set_relief(Gtk::RELIEF_NONE);
|
|
||||||
softProof->set_tooltip_text(M("MONITOR_SOFTPROOF"));
|
|
||||||
softProofConn = softProof->signal_toggled().connect (sigc::mem_fun (this, &MonitorProfileSelector::softProofToggled));
|
|
||||||
}
|
|
||||||
|
|
||||||
void prepareProfileBox ()
|
void prepareProfileBox ()
|
||||||
{
|
{
|
||||||
profileBox = Gtk::manage(new MyComboBoxText());
|
profileBox.set_size_request (100, -1);
|
||||||
profileBox->set_size_request(100,-1);
|
|
||||||
|
|
||||||
profileBox->append_text (M("PREFERENCES_PROFILE_NONE"));
|
profileBox.append_text (M("PREFERENCES_PROFILE_NONE"));
|
||||||
#if defined(WIN32)
|
#ifdef WIN32
|
||||||
profileBox->append_text (M("MONITOR_PROFILE_SYSTEM") + " (" + rtengine::iccStore->getDefaultMonitorProfileName() + ")");
|
profileBox.append_text (M("MONITOR_PROFILE_SYSTEM") + " (" + rtengine::iccStore->getDefaultMonitorProfileName() + ")");
|
||||||
profileBox->set_active (options.rtSettings.autoMonitorProfile ? 1 : 0);
|
profileBox.set_active (options.rtSettings.autoMonitorProfile ? 1 : 0);
|
||||||
#else
|
#else
|
||||||
profileBox->set_active (0);
|
profileBox.set_active (0);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
const std::vector<Glib::ustring> profiles = rtengine::iccStore->getProfiles ();
|
const std::vector<Glib::ustring> profiles = rtengine::iccStore->getProfiles ();
|
||||||
for (std::vector<Glib::ustring>::const_iterator iterator = profiles.begin (); iterator != profiles.end (); ++iterator) {
|
for (std::vector<Glib::ustring>::const_iterator iterator = profiles.begin (); iterator != profiles.end (); ++iterator) {
|
||||||
profileBox->append_text (*iterator);
|
profileBox.append_text (*iterator);
|
||||||
}
|
}
|
||||||
profileConn = profileBox->signal_changed ().connect (sigc::mem_fun (this, &MonitorProfileSelector::updateParameters));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void prepareIntentBox ()
|
void prepareIntentBox ()
|
||||||
{
|
{
|
||||||
intentBox = Gtk::manage(new PopUpButton(Glib::ustring(), true));
|
intentBox.addEntry("intent-relative.png", M("PREFERENCES_INTENT_RELATIVE"));
|
||||||
intentBox->addEntry("intent-relative.png", M("PREFERENCES_INTENT_RELATIVE"));
|
intentBox.addEntry("intent-perceptual.png", M("PREFERENCES_INTENT_PERCEPTUAL"));
|
||||||
intentBox->addEntry("intent-perceptual.png", M("PREFERENCES_INTENT_PERCEPTUAL"));
|
intentBox.addEntry("intent-absolute.png", M("PREFERENCES_INTENT_ABSOLUTE"));
|
||||||
intentBox->addEntry("intent-absolute.png", M("PREFERENCES_INTENT_ABSOLUTE"));
|
|
||||||
intentBox->setSelected(0);
|
intentBox.setSelected(0);
|
||||||
intentConn = intentBox->signal_changed().connect (sigc::mem_fun (this, &MonitorProfileSelector::updateIntent));
|
intentBox.show ();
|
||||||
intentBox->show();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void softProofToggled ()
|
void profileBoxChanged ()
|
||||||
{
|
{
|
||||||
if (processor) {
|
updateParameters ();
|
||||||
processor->beginUpdateParams ();
|
|
||||||
processor->setSoftProofing( softProof->get_active() );
|
profileBox.set_tooltip_text (profileBox.get_active_text ());
|
||||||
processor->endUpdateParams ( rtengine::EvMonitorTransform );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void updateIntent (int i)
|
void intentBoxChanged (int)
|
||||||
{
|
{
|
||||||
updateParameters();
|
updateParameters ();
|
||||||
}
|
}
|
||||||
|
|
||||||
void updateParameters ()
|
void updateParameters ()
|
||||||
{
|
{
|
||||||
|
ConnectionBlocker profileBlocker (profileConn);
|
||||||
|
ConnectionBlocker intentBlocker (intentConn);
|
||||||
|
|
||||||
Glib::ustring profile;
|
Glib::ustring profile;
|
||||||
profileBox->set_tooltip_text(profileBox->get_active_text ());
|
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
if (profileBox->get_active_row_number () == 1) {
|
if (profileBox.get_active_row_number () == 1) {
|
||||||
profile = rtengine::iccStore->getDefaultMonitorProfileName ();
|
profile = rtengine::iccStore->getDefaultMonitorProfileName ();
|
||||||
if (profile.empty()) {
|
if (profile.empty ()) {
|
||||||
profile = options.rtSettings.monitorProfile;
|
profile = options.rtSettings.monitorProfile;
|
||||||
}
|
}
|
||||||
if (profile.empty()) {
|
if (profile.empty ()) {
|
||||||
profile = "sRGB IEC61966-2.1"; // assuming this profile always exist on Windows
|
profile = "sRGB IEC61966-2.1";
|
||||||
}
|
}
|
||||||
} else if (profileBox->get_active_row_number () > 1) {
|
} else if (profileBox.get_active_row_number () > 1) {
|
||||||
profile = profileBox->get_active_text ();
|
profile = profileBox.get_active_text ();
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
profile = profileBox->get_active_row_number () > 0 ? profileBox->get_active_text () : Glib::ustring();
|
profile = profileBox.get_active_row_number () > 0 ? profileBox.get_active_text () : Glib::ustring ();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// MonitorProfile = None , disabling everything
|
if (profileBox.get_active_row_number () == 0) {
|
||||||
if (profileBox->get_active_row_number () == 0) {
|
|
||||||
profile.clear();
|
profile.clear();
|
||||||
bool wasBlocked = intentConn.block(true);
|
|
||||||
intentBox->setSelected(1);
|
intentBox.set_sensitive (false);
|
||||||
intentBox->set_sensitive (false);
|
intentBox.setSelected (0);
|
||||||
intentConn.block(wasBlocked);
|
|
||||||
softProof->set_active(false);
|
|
||||||
softProof->set_sensitive(false);
|
|
||||||
wasBlocked = softProofConn.block(true);
|
|
||||||
softProofConn.block(wasBlocked);
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
std::uint8_t supportedIntents = rtengine::iccStore->getProofIntents (profile);
|
const std::uint8_t supportedIntents = rtengine::iccStore->getProofIntents (profile);
|
||||||
const bool supportsPerceptual = supportedIntents & 1 << INTENT_PERCEPTUAL;
|
|
||||||
const bool supportsRelativeColorimetric = supportedIntents & 1 << INTENT_RELATIVE_COLORIMETRIC;
|
const bool supportsRelativeColorimetric = supportedIntents & 1 << INTENT_RELATIVE_COLORIMETRIC;
|
||||||
|
const bool supportsPerceptual = supportedIntents & 1 << INTENT_PERCEPTUAL;
|
||||||
const bool supportsAbsoluteColorimetric = supportedIntents & 1 << INTENT_ABSOLUTE_COLORIMETRIC;
|
const bool supportsAbsoluteColorimetric = supportedIntents & 1 << INTENT_ABSOLUTE_COLORIMETRIC;
|
||||||
|
|
||||||
if (supportsPerceptual && (supportsRelativeColorimetric || supportsAbsoluteColorimetric)) {
|
if (supportsPerceptual || supportsRelativeColorimetric || supportsAbsoluteColorimetric) {
|
||||||
intentBox->set_sensitive (true);
|
intentBox.set_sensitive (true);
|
||||||
intentBox->setItemSensitivity(0, supportsRelativeColorimetric);
|
intentBox.setItemSensitivity(0, supportsRelativeColorimetric);
|
||||||
intentBox->setItemSensitivity(2, supportsAbsoluteColorimetric);
|
intentBox.setItemSensitivity(1, supportsPerceptual);
|
||||||
|
intentBox.setItemSensitivity(2, supportsAbsoluteColorimetric);
|
||||||
|
} else {
|
||||||
|
intentBox.set_sensitive (false);
|
||||||
|
intentBox.setSelected (0);
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
bool wasBlocked = intentConn.block(true);
|
|
||||||
intentBox->setSelected(supportsPerceptual ? 0 : 1);
|
|
||||||
intentBox->set_sensitive (false);
|
|
||||||
intentConn.block(wasBlocked);
|
|
||||||
}
|
|
||||||
softProof->set_sensitive(true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
rtengine::RenderingIntent intent = rtengine::RI_PERCEPTUAL;
|
rtengine::RenderingIntent intent;
|
||||||
switch (intentBox->getSelected()) {
|
switch (intentBox.getSelected ()) {
|
||||||
case (0):
|
default:
|
||||||
|
case 0:
|
||||||
intent = rtengine::RI_RELATIVE;
|
intent = rtengine::RI_RELATIVE;
|
||||||
break;
|
break;
|
||||||
case (2):
|
case 1:
|
||||||
|
intent = rtengine::RI_PERCEPTUAL;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
intent = rtengine::RI_ABSOLUTE;
|
intent = rtengine::RI_ABSOLUTE;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -166,81 +148,67 @@ private:
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// either store them in the options file for the default value when opening the next EditorPanel
|
|
||||||
//options.rtSettings.monitorProfile = profile;
|
|
||||||
//options.rtSettings.monitorIntent = intent;
|
|
||||||
|
|
||||||
// ...or store them locally
|
|
||||||
processor->beginUpdateParams ();
|
processor->beginUpdateParams ();
|
||||||
if (options.rtSettings.verbose) {
|
processor->setMonitorProfile (profile, intent);
|
||||||
Glib::ustring intentName;
|
|
||||||
switch (intent) {
|
|
||||||
case (0):
|
|
||||||
intentName = M("PREFERENCES_INTENT_RELATIVE");
|
|
||||||
break;
|
|
||||||
case (1):
|
|
||||||
intentName = M("PREFERENCES_INTENT_PERCEPTUAL");
|
|
||||||
break;
|
|
||||||
case (2):
|
|
||||||
default: // to avoid complains from gcc
|
|
||||||
intentName = M("PREFERENCES_INTENT_ABSOLUTE");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
printf("Monitor profile: %s, Intent: %s)\n", profile.empty() ? "None" : profile.c_str(), intentName.c_str());
|
|
||||||
}
|
|
||||||
processor->setMonitorProfile(profile, intent);
|
|
||||||
processor->endUpdateParams (rtengine::EvMonitorTransform);
|
processor->endUpdateParams (rtengine::EvMonitorTransform);
|
||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
MonitorProfileSelector () :
|
MonitorProfileSelector (rtengine::StagedImageProcessor* const& ipc) :
|
||||||
processor (NULL)
|
intentBox (Glib::ustring (), true),
|
||||||
|
processor (ipc)
|
||||||
{
|
{
|
||||||
prepareSoftProofButton ();
|
|
||||||
prepareProfileBox ();
|
prepareProfileBox ();
|
||||||
prepareIntentBox ();
|
prepareIntentBox ();
|
||||||
|
|
||||||
reset ();
|
reset ();
|
||||||
|
|
||||||
|
profileConn = profileBox.signal_changed ().connect (sigc::mem_fun (this, &MonitorProfileSelector::profileBoxChanged));
|
||||||
|
intentConn = intentBox.signal_changed ().connect (sigc::mem_fun (this, &MonitorProfileSelector::intentBoxChanged));
|
||||||
}
|
}
|
||||||
|
|
||||||
void pack_end_in (Gtk::Box* box)
|
void pack_end_in (Gtk::Box* box)
|
||||||
{
|
{
|
||||||
box->pack_end (*softProof, Gtk::PACK_SHRINK, 0);
|
box->pack_end (*intentBox.buttonGroup, Gtk::PACK_SHRINK, 0);
|
||||||
box->pack_end (*intentBox->buttonGroup, Gtk::PACK_SHRINK, 0);
|
box->pack_end (profileBox, Gtk::PACK_SHRINK, 0);
|
||||||
box->pack_end (*profileBox, Gtk::PACK_SHRINK, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void reset ()
|
void reset ()
|
||||||
{
|
{
|
||||||
bool wasBlocked;
|
ConnectionBlocker profileBlocker (profileConn);
|
||||||
|
ConnectionBlocker intentBlocker (intentConn);
|
||||||
|
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
wasBlocked = profileConn.block(true);
|
|
||||||
if (options.rtSettings.autoMonitorProfile) {
|
if (options.rtSettings.autoMonitorProfile) {
|
||||||
setActiveTextOrIndex (*profileBox, options.rtSettings.monitorProfile, 1);
|
setActiveTextOrIndex (profileBox, options.rtSettings.monitorProfile, 1);
|
||||||
} else {
|
} else {
|
||||||
setActiveTextOrIndex (*profileBox, options.rtSettings.monitorProfile, 0);
|
setActiveTextOrIndex (profileBox, options.rtSettings.monitorProfile, 0);
|
||||||
}
|
}
|
||||||
profileConn.block(wasBlocked);
|
|
||||||
#else
|
#else
|
||||||
wasBlocked = profileConn.block(true);
|
setActiveTextOrIndex (profileBox, options.rtSettings.monitorProfile, 0);
|
||||||
setActiveTextOrIndex (*profileBox, options.rtSettings.monitorProfile, 0);
|
|
||||||
profileConn.block(wasBlocked);
|
|
||||||
#endif
|
#endif
|
||||||
wasBlocked = intentConn.block(true);
|
|
||||||
intentBox->setSelected(options.rtSettings.monitorIntent == rtengine::RI_RELATIVE ? 0 : options.rtSettings.monitorIntent == rtengine::RI_PERCEPTUAL ? 1 : 2);
|
|
||||||
intentConn.block(wasBlocked);
|
|
||||||
|
|
||||||
updateParameters();
|
switch (options.rtSettings.monitorIntent)
|
||||||
}
|
{
|
||||||
|
default:
|
||||||
|
case rtengine::RI_RELATIVE:
|
||||||
|
intentBox.setSelected (0);
|
||||||
|
break;
|
||||||
|
case rtengine::RI_PERCEPTUAL:
|
||||||
|
intentBox.setSelected (1);
|
||||||
|
break;
|
||||||
|
case rtengine::RI_ABSOLUTE:
|
||||||
|
intentBox.setSelected (2);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
void setImageProcessor (rtengine::StagedImageProcessor* imageProc) {
|
updateParameters ();
|
||||||
processor = imageProc;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
EditorPanel::EditorPanel (FilePanel* filePanel)
|
EditorPanel::EditorPanel (FilePanel* filePanel)
|
||||||
: realized(false), iHistoryShow(NULL), iHistoryHide(NULL), iTopPanel_1_Show(NULL), iTopPanel_1_Hide(NULL), iRightPanel_1_Show(NULL), iRightPanel_1_Hide(NULL), iBeforeLockON(NULL), iBeforeLockOFF(NULL), beforePreviewHandler(NULL), monitorProfile(new MonitorProfileSelector ()), beforeIarea(NULL), beforeBox(NULL), afterBox(NULL), afterHeaderBox(NULL), parent(NULL), openThm(NULL), ipc(NULL), beforeIpc(NULL), isProcessing(false), catalogPane(NULL)
|
: realized(false), iHistoryShow(NULL), iHistoryHide(NULL), iTopPanel_1_Show(NULL), iTopPanel_1_Hide(NULL), iRightPanel_1_Show(NULL), iRightPanel_1_Hide(NULL), iBeforeLockON(NULL), iBeforeLockOFF(NULL), beforePreviewHandler(NULL), beforeIarea(NULL), beforeBox(NULL), afterBox(NULL), afterHeaderBox(NULL), parent(NULL), openThm(NULL), ipc(NULL), beforeIpc(NULL), isProcessing(false), catalogPane(NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
epih = new EditorPanelIdleHelper;
|
epih = new EditorPanelIdleHelper;
|
||||||
@ -471,8 +439,10 @@ EditorPanel::EditorPanel (FilePanel* filePanel)
|
|||||||
iops->pack_end (*navPrev, Gtk::PACK_SHRINK, 0);
|
iops->pack_end (*navPrev, Gtk::PACK_SHRINK, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Monitor profile buttons
|
|
||||||
iops->pack_end (*Gtk::manage(new Gtk::VSeparator()), Gtk::PACK_SHRINK, 0);
|
iops->pack_end (*Gtk::manage(new Gtk::VSeparator()), Gtk::PACK_SHRINK, 0);
|
||||||
|
|
||||||
|
// Monitor profile buttons
|
||||||
|
monitorProfile.reset (new MonitorProfileSelector (ipc));
|
||||||
monitorProfile->pack_end_in (iops);
|
monitorProfile->pack_end_in (iops);
|
||||||
|
|
||||||
editbox->pack_start (*Gtk::manage(new Gtk::HSeparator()), Gtk::PACK_SHRINK, 0);
|
editbox->pack_start (*Gtk::manage(new Gtk::HSeparator()), Gtk::PACK_SHRINK, 0);
|
||||||
@ -732,7 +702,6 @@ void EditorPanel::open (Thumbnail* tmb, rtengine::InitialImage* isrc)
|
|||||||
|
|
||||||
this->isrc = isrc;
|
this->isrc = isrc;
|
||||||
ipc = rtengine::StagedImageProcessor::create (isrc);
|
ipc = rtengine::StagedImageProcessor::create (isrc);
|
||||||
monitorProfile->setImageProcessor(ipc);
|
|
||||||
ipc->setProgressListener (this);
|
ipc->setProgressListener (this);
|
||||||
ipc->setPreviewImageListener (previewHandler);
|
ipc->setPreviewImageListener (previewHandler);
|
||||||
ipc->setPreviewScale (10); // Important
|
ipc->setPreviewScale (10); // Important
|
||||||
@ -783,7 +752,6 @@ void EditorPanel::open (Thumbnail* tmb, rtengine::InitialImage* isrc)
|
|||||||
|
|
||||||
history->resetSnapShotNumber();
|
history->resetSnapShotNumber();
|
||||||
|
|
||||||
//HOMBRE: not sure if we want to reset on opening a new image
|
|
||||||
monitorProfile->reset ();
|
monitorProfile->reset ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -42,8 +42,6 @@ struct EditorPanelIdleHelper {
|
|||||||
int pending;
|
int pending;
|
||||||
};
|
};
|
||||||
|
|
||||||
class MonitorProfileSelector;
|
|
||||||
|
|
||||||
class RTWindow;
|
class RTWindow;
|
||||||
class EditorPanel : public Gtk::VBox,
|
class EditorPanel : public Gtk::VBox,
|
||||||
public PParamsChangeListener,
|
public PParamsChangeListener,
|
||||||
@ -86,6 +84,7 @@ protected:
|
|||||||
Gtk::Button* navNext;
|
Gtk::Button* navNext;
|
||||||
Gtk::Button* navPrev;
|
Gtk::Button* navPrev;
|
||||||
|
|
||||||
|
class MonitorProfileSelector;
|
||||||
std::auto_ptr<MonitorProfileSelector> monitorProfile;
|
std::auto_ptr<MonitorProfileSelector> monitorProfile;
|
||||||
|
|
||||||
ImageAreaPanel* iareapanel;
|
ImageAreaPanel* iareapanel;
|
||||||
|
@ -76,6 +76,22 @@ public:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class ConnectionBlocker
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ConnectionBlocker (sigc::connection& connection) : connection (connection)
|
||||||
|
{
|
||||||
|
wasBlocked = connection.block();
|
||||||
|
}
|
||||||
|
~ConnectionBlocker ()
|
||||||
|
{
|
||||||
|
connection.block(wasBlocked);
|
||||||
|
}
|
||||||
|
private:
|
||||||
|
sigc::connection& connection;
|
||||||
|
bool wasBlocked;
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Glue box to control visibility of the MyExpender's content ; also handle the frame around it
|
* @brief Glue box to control visibility of the MyExpender's content ; also handle the frame around it
|
||||||
*/
|
*/
|
||||||
|
@ -55,7 +55,6 @@ PopUpCommon::~PopUpCommon ()
|
|||||||
|
|
||||||
delete menu;
|
delete menu;
|
||||||
delete buttonImage;
|
delete buttonImage;
|
||||||
delete buttonGroup;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool PopUpCommon::addEntry (const Glib::ustring& fileName, const Glib::ustring& label)
|
bool PopUpCommon::addEntry (const Glib::ustring& fileName, const Glib::ustring& label)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user