diff --git a/rtdata/languages/default b/rtdata/languages/default index 6a8bae887..d21857d98 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -1061,6 +1061,8 @@ PREFERENCES_LANGAUTODETECT;Use system language PREFERENCES_LEVAUTDN;Denoising level PREFERENCES_LEVDN;Cell size PREFERENCES_LISS;Auto multi-zone smoothing +PREFERENCES_LOCAL;Local adjustements +PREFERENCES_LOCALSHOWDELIMSPOT;Show spot delimiters PREFERENCES_MAX;Maxi (Tile) PREFERENCES_MAXRECENTFOLDERS;Maximum number of recent folders PREFERENCES_MED;Medium (Tile/2) @@ -1131,8 +1133,8 @@ PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;When working with folders full of uncomp PREFERENCES_SET;Set PREFERENCES_SHOWBASICEXIF;Show basic Exif info PREFERENCES_SHOWDATETIME;Show date and time -PREFERENCES_SHOWEXPOSURECOMPENSATION;Append exposure compensation PREFERENCES_SHOWFILMSTRIPTOOLBAR;Show filmstrip toolbar +PREFERENCES_SHOWEXPOSURECOMPENSATION;Append exposure compensation PREFERENCES_SHTHRESHOLD;Threshold for clipped shadows PREFERENCES_SIMPLAUT;Tool mode PREFERENCES_SINGLETAB;Single Editor Tab Mode diff --git a/rtgui/edit.cc b/rtgui/edit.cc index 3e9d298d7..570239634 100644 --- a/rtgui/edit.cc +++ b/rtgui/edit.cc @@ -295,6 +295,327 @@ void Circle::drawToMOChannel (Cairo::RefPtr &cr, unsigned short } } +void Arcellipse::drawOuterGeometry (Cairo::RefPtr &cr, ObjectMOBuffer *objectBuffer, EditCoordSystem &coordSystem) +{ + if ((flags & F_VISIBLE) && state != INSENSITIVE) { + RGBColor color; + + if (flags & F_AUTO_COLOR) { + color = getOuterLineColor(); + } else { + color = outerLineColor; + } + + cr->set_source_rgb (color.getR(), color.getG(), color.getB()); + cr->set_line_width ( getOuterLineWidth() ); + + rtengine::Coord center_ = center; + double radius_ = radiusInImageSpace ? coordSystem.scaleValueToCanvas (double (radius)) : double (radius); + double radius2_ = radiusInImageSpace ? coordSystem.scaleValueToCanvas (double (radius2)) : double (radius2); + double scalx_ = scalx; //radius2_ / radius_; + + double scaly_ = scaly; + double begang_ = begang; + double endang_ = endang; + double translax_ = translax; + double translay_ = translay; + + if (datum == IMAGE) { + coordSystem.imageCoordToScreen (center.x, center.y, center_.x, center_.y); + } else if (datum == CLICKED_POINT) { + center_ += objectBuffer->getDataProvider()->posScreen; + } else if (datum == CURSOR) { + center_ += objectBuffer->getDataProvider()->posScreen + objectBuffer->getDataProvider()->deltaScreen; + } + + cr->save(); + cr->move_to (center_.x , center_.y); + cr->translate (translax_, translay_); + + cr->scale (scalx_, scaly_); + cr->translate (- translax_ , - translay_); + + cr->arc (center_.x + 0.5, center_.y + 0.5, radius_, begang_, endang_); + + cr->restore(); + cr->stroke(); + } +} + + + +void Arcellipse::drawInnerGeometry (Cairo::RefPtr &cr, ObjectMOBuffer *objectBuffer, EditCoordSystem &coordSystem) +{ + if (flags & F_VISIBLE) { + if (state != INSENSITIVE) { + RGBColor color; + + if (flags & F_AUTO_COLOR) { + color = getInnerLineColor(); + } else { + color = innerLineColor; + } + + cr->set_source_rgb (color.getR(), color.getG(), color.getB()); + } + + cr->set_line_width ( innerLineWidth ); + + rtengine::Coord center_ = center; + double radius_ = radiusInImageSpace ? coordSystem.scaleValueToCanvas (double (radius)) : double (radius); + double radius2_ = radiusInImageSpace ? coordSystem.scaleValueToCanvas (double (radius2)) : double (radius2); + + double scalx_ = scalx; //radius2_ / radius_; + + double scaly_ = scaly; + double begang_ = begang; + double endang_ = endang; + double translax_ = translax; + double translay_ = translay; + + if (datum == IMAGE) { + coordSystem.imageCoordToScreen (center.x, center.y, center_.x, center_.y); + } else if (datum == CLICKED_POINT) { + center_ += objectBuffer->getDataProvider()->posScreen; + } else if (datum == CURSOR) { + center_ += objectBuffer->getDataProvider()->posScreen + objectBuffer->getDataProvider()->deltaScreen; + } + + if (filled && state != INSENSITIVE) { + cr->save(); + cr->move_to (center_.x , center_.y); + + cr->translate (translax_, translay_); + + cr->scale (scalx_, scaly_); + cr->translate (- translax_ , - translay_); + + cr->arc (center_.x + 0.5, center_.y + 0.5, radius_, begang_, endang_); + + cr->restore(); + + if (innerLineWidth > 0.) { + cr->fill_preserve(); + cr->stroke(); + } else { + cr->fill(); + } + } else if (innerLineWidth > 0.) { + cr->save(); + cr->move_to (center_.x , center_.y); + + cr->translate (translax_ , translay_); + + cr->scale (scalx_, scaly_); + cr->translate (- translax_ , - translay_); + + cr->arc (center_.x + 0.5, center_.y + 0.5, radius_, begang_, endang_); + + cr->restore(); + + if (state == INSENSITIVE) { + std::valarray ds (1); + ds[0] = 4; + cr->set_source_rgba (1.0, 1.0, 1.0, 0.618); + cr->stroke_preserve(); + cr->set_source_rgba (0.0, 0.0, 0.0, 0.618); + cr->set_dash (ds, 0); + cr->stroke(); + ds.resize (0); + cr->set_dash (ds, 0); + } else { + cr->stroke(); + } + } + } +} + + + + +void Arcellipse::drawToMOChannel (Cairo::RefPtr &cr, unsigned short id, ObjectMOBuffer *objectBuffer, EditCoordSystem &coordSystem) +{ + if (flags & F_HOVERABLE) { + cr->set_line_width ( getMouseOverLineWidth() ); + rtengine::Coord center_ = center; + double radius_ = radiusInImageSpace ? coordSystem.scaleValueToCanvas (double (radius)) : double (radius); + double radius2_ = radiusInImageSpace ? coordSystem.scaleValueToCanvas (double (radius2)) : double (radius2); + + double scalx_ = scalx ; //radius2_ / radius_; + double scaly_ = scaly; + double begang_ = begang; + double endang_ = endang; + double translax_ = translax; + double translay_ = translay; + + if (datum == IMAGE) { + coordSystem.imageCoordToCropCanvas (center.x, center.y, center_.x, center_.y); + } else if (datum == CLICKED_POINT) { + center_ += objectBuffer->getDataProvider()->posScreen; + } else if (datum == CURSOR) { + center_ += objectBuffer->getDataProvider()->posScreen + objectBuffer->getDataProvider()->deltaScreen; + } + + cr->save(); + cr->move_to (center_.x , center_.y); + + cr->translate (translax_ , translay_); + + cr->scale (scalx_, scaly_); + cr->translate (- translax_ , - translay_); + cr->arc (center_.x + 0.5, center_.y + 0.5, radius_, begang_, endang_); + + cr->restore(); + + if (filled) { + if (innerLineWidth > 0.) { + cr->fill_preserve(); + cr->stroke(); + } else { + cr->fill(); + } + } else { + cr->stroke(); + } + } +} + +void Beziers::drawOuterGeometry (Cairo::RefPtr &cr, ObjectMOBuffer *objectBuffer, EditCoordSystem &coordSystem) +{ + if ((flags & F_VISIBLE) && state != INSENSITIVE) { + RGBColor color; + + if (flags & F_AUTO_COLOR) { + color = getOuterLineColor(); + } else { + color = outerLineColor; + } + + cr->set_source_rgb (color.getR(), color.getG(), color.getB()); + cr->set_line_width ( getOuterLineWidth() ); + + rtengine::Coord begin_ = begin; + rtengine::Coord inter_ = inter; + rtengine::Coord end_ = end; + + if (datum == IMAGE) { + coordSystem.imageCoordToScreen (begin.x, begin.y, begin_.x, begin_.y); + coordSystem.imageCoordToScreen (inter.x, inter.y, inter_.x, inter_.y); + coordSystem.imageCoordToScreen (end.x, end.y, end_.x, end_.y); + } else if (datum == CLICKED_POINT) { + begin_ += objectBuffer->getDataProvider()->posScreen; + inter_ += objectBuffer->getDataProvider()->posScreen; + end_ += objectBuffer->getDataProvider()->posScreen; + } else if (datum == CURSOR) { + begin_ += objectBuffer->getDataProvider()->posScreen + objectBuffer->getDataProvider()->deltaScreen; + inter_ += objectBuffer->getDataProvider()->posScreen + objectBuffer->getDataProvider()->deltaScreen; + end_ += objectBuffer->getDataProvider()->posScreen + objectBuffer->getDataProvider()->deltaScreen; + } + + cr->save(); + cr->move_to (begin_.x + 0.5, begin_.y + 0.5); + cr->curve_to (begin_.x + 0.5, begin_.y + 0.5, inter_.x + 0.5, inter_.y + 0.5, end_.x + 0.5, end_.y + 0.5); + cr->restore(); + cr->stroke(); + } +} + +void Beziers::drawInnerGeometry (Cairo::RefPtr &cr, ObjectMOBuffer *objectBuffer, EditCoordSystem &coordSystem) +{ + if ((flags & F_VISIBLE) && innerLineWidth > 0.) { + if (state != INSENSITIVE) { + RGBColor color; + + if (flags & F_AUTO_COLOR) { + color = getInnerLineColor(); + } else { + color = innerLineColor; + } + + cr->set_source_rgb (color.getR(), color.getG(), color.getB()); + } + + cr->set_line_width (innerLineWidth); + + rtengine::Coord begin_ = begin; + rtengine::Coord inter_ = inter; + rtengine::Coord end_ = end; + + if (datum == IMAGE) { + coordSystem.imageCoordToScreen (begin.x, begin.y, begin_.x, begin_.y); + coordSystem.imageCoordToScreen (inter.x, inter.y, inter_.x, inter_.y); + coordSystem.imageCoordToScreen (end.x, end.y, end_.x, end_.y); + } else if (datum == CLICKED_POINT) { + begin_ += objectBuffer->getDataProvider()->posScreen; + inter_ += objectBuffer->getDataProvider()->posScreen; + end_ += objectBuffer->getDataProvider()->posScreen; + } else if (datum == CURSOR) { + begin_ += objectBuffer->getDataProvider()->posScreen + objectBuffer->getDataProvider()->deltaScreen; + inter_ += objectBuffer->getDataProvider()->posScreen + objectBuffer->getDataProvider()->deltaScreen; + end_ += objectBuffer->getDataProvider()->posScreen + objectBuffer->getDataProvider()->deltaScreen; + } + + cr->save(); + + cr->move_to (begin_.x + 0.5, begin_.y + 0.5); + cr->curve_to (begin_.x + 0.5, begin_.y + 0.5, inter_.x + 0.5, inter_.y + 0.5, end_.x + 0.5, end_.y + 0.5); + cr->restore(); + + if (state == INSENSITIVE) { + std::valarray ds (1); + ds[0] = 4; + cr->set_source_rgba (1.0, 1.0, 1.0, 0.618); + cr->stroke_preserve(); + cr->set_source_rgba (0.0, 0.0, 0.0, 0.618); + cr->set_dash (ds, 0); + cr->stroke(); + ds.resize (0); + cr->set_dash (ds, 0); + } else { + cr->stroke(); + } + } +} + +void Beziers::drawToMOChannel (Cairo::RefPtr &cr, unsigned short id, ObjectMOBuffer *objectBuffer, EditCoordSystem &coordSystem) +{ + if (flags & F_HOVERABLE) { + cr->set_line_width ( getMouseOverLineWidth() ); + rtengine::Coord begin_ = begin; + rtengine::Coord inter_ = inter; + rtengine::Coord end_ = end; + + if (datum == IMAGE) { + coordSystem.imageCoordToCropCanvas (begin.x, begin.y, begin_.x, begin_.y); + coordSystem.imageCoordToCropCanvas (inter.x, inter.y, inter_.x, inter_.y); + coordSystem.imageCoordToCropCanvas (end.x, end.y, end_.x, end_.y); + } else if (datum == CLICKED_POINT) { + begin_ += objectBuffer->getDataProvider()->posScreen; + inter_ += objectBuffer->getDataProvider()->posScreen; + end_ += objectBuffer->getDataProvider()->posScreen; + } else if (datum == CURSOR) { + begin_ += objectBuffer->getDataProvider()->posScreen + objectBuffer->getDataProvider()->deltaScreen; + inter_ += objectBuffer->getDataProvider()->posScreen + objectBuffer->getDataProvider()->deltaScreen; + end_ += objectBuffer->getDataProvider()->posScreen + objectBuffer->getDataProvider()->deltaScreen; + } + + // setting the color to the objet's ID + if (objectBuffer->getObjectMode() == OM_255) { + cr->set_source_rgba (0., 0., 0., ((id + 1) & 0xFF) / 255.); + } else { + cr->set_source_rgba (0., 0., 0., (id + 1) / 65535.); + } + + cr->save(); + + cr->move_to (begin_.x + 0.5, begin_.y + 0.5); + cr->curve_to (begin_.x + 0.5, begin_.y + 0.5, inter_.x + 0.5, inter_.y + 0.5, end_.x + 0.5, end_.y + 0.5); + cr->restore(); + + cr->stroke(); + } +} + void Line::drawOuterGeometry (Cairo::RefPtr &cr, ObjectMOBuffer *objectBuffer, EditCoordSystem &coordSystem) { if ((flags & F_VISIBLE) && state != INSENSITIVE) { diff --git a/rtgui/edit.h b/rtgui/edit.h index e28a6acec..f731a269e 100644 --- a/rtgui/edit.h +++ b/rtgui/edit.h @@ -171,8 +171,8 @@ protected: // instead of pointing to the EditSubscriber directly EditDataProvider* dataProvider; - void createBuffer(int width, int height); - void resize(int newWidth, int newHeight); + void createBuffer (int width, int height); + void resize (int newWidth, int newHeight); void flush(); EditSubscriber *getEditSubscriber (); @@ -189,7 +189,7 @@ public: // return true if the buffer has been allocated bool bufferCreated(); - int getObjectID(const rtengine::Coord& location); + int getObjectID (const rtengine::Coord& location); }; @@ -353,6 +353,50 @@ public: void drawToMOChannel (Cairo::RefPtr &cr, unsigned short id, ObjectMOBuffer *objectBuffer, EditCoordSystem &coordSystem); }; +class Arcellipse : public Geometry +{ +public: + rtengine::Coord center; +// rtengine::Coord scalx; +// rtengine::Coord scaly; + + double radius; + double radius2; + double translax; + double translay; + bool filled; + bool radiusInImageSpace; /// If true, the radius depend on the image scale; if false, it is a fixed 'screen' size + double scalx; + double scaly; + double begang; + double endang; + + Arcellipse (); + Arcellipse (rtengine::Coord& center, double radius, double radius2, double translax, double translay, double scalx, double scaly, double begang, double endang, bool filled = false, bool radiusInImageSpace = false); + Arcellipse (int centerX, int centerY, double radius, double radius2, double translax, double translay, double scalx, double scaly, double begang, double endang, bool filled = false, bool radiusInImageSpace = false); + + void drawOuterGeometry (Cairo::RefPtr &cr, ObjectMOBuffer *objectBuffer, EditCoordSystem &coordSystem); + void drawInnerGeometry (Cairo::RefPtr &cr, ObjectMOBuffer *objectBuffer, EditCoordSystem &coordSystem); + void drawToMOChannel (Cairo::RefPtr &cr, unsigned short id, ObjectMOBuffer *objectBuffer, EditCoordSystem &coordSystem); +}; + +class Beziers : public Geometry +{ +public: + rtengine::Coord begin; + rtengine::Coord inter; + rtengine::Coord end; + + Beziers (); + Beziers (rtengine::Coord& begin, rtengine::Coord& inter, rtengine::Coord& end); + Beziers (float beginX, float beginY, float interX, float interY, float endX, float endY); + + void drawOuterGeometry (Cairo::RefPtr &cr, ObjectMOBuffer *objectBuffer, EditCoordSystem &coordSystem); + void drawInnerGeometry (Cairo::RefPtr &cr, ObjectMOBuffer *objectBuffer, EditCoordSystem &coordSystem); + void drawToMOChannel (Cairo::RefPtr &cr, unsigned short id, ObjectMOBuffer *objectBuffer, EditCoordSystem &coordSystem); +}; + + class Line : public Geometry { public: @@ -390,10 +434,10 @@ public: Rectangle (); - void setXYWH(int left, int top, int width, int height); - void setXYXY(int left, int top, int right, int bottom); - void setXYWH(rtengine::Coord topLeft, rtengine::Coord widthHeight); - void setXYXY(rtengine::Coord topLeft, rtengine::Coord bottomRight); + void setXYWH (int left, int top, int width, int height); + void setXYXY (int left, int top, int right, int bottom); + void setXYWH (rtengine::Coord topLeft, rtengine::Coord widthHeight); + void setXYXY (rtengine::Coord topLeft, rtengine::Coord bottomRight); void drawOuterGeometry (Cairo::RefPtr &cr, ObjectMOBuffer *objectBuffer, EditCoordSystem &coordSystem); void drawInnerGeometry (Cairo::RefPtr &cr, ObjectMOBuffer *objectBuffer, EditCoordSystem &coordSystem); void drawToMOChannel (Cairo::RefPtr &cr, unsigned short id, ObjectMOBuffer *objectBuffer, EditCoordSystem &coordSystem); @@ -409,13 +453,13 @@ private: Cairo::RefPtr draggedImg; Cairo::RefPtr insensitiveImg; - static void setPaths(Options &opt); + static void setPaths (Options &opt); static void updateImages(); - void changeImage(Glib::ustring &newImage); - static Glib::ustring findIconAbsolutePath(const Glib::ustring &iconFName); + void changeImage (Glib::ustring &newImage); + static Glib::ustring findIconAbsolutePath (const Glib::ustring &iconFName); void drawImage (const Cairo::RefPtr &img, Cairo::RefPtr &cr, ObjectMOBuffer *objectBuffer, EditCoordSystem &coordSystem); void drawMOImage (const Cairo::RefPtr &img, Cairo::RefPtr &cr, unsigned short id, ObjectMOBuffer *objectBuffer, EditCoordSystem &coordSystem); - void drivenPointToRectangle(const rtengine::Coord &pos, rtengine::Coord &topLeft, rtengine::Coord &bottomRight, int W, int H); + void drivenPointToRectangle (const rtengine::Coord &pos, rtengine::Coord &topLeft, rtengine::Coord &bottomRight, int W, int H); public: DrivenPoint drivenPoint; @@ -468,9 +512,9 @@ public: explicit EditSubscriber (EditType editType); virtual ~EditSubscriber () {} - void setEditProvider(EditDataProvider *provider); + void setEditProvider (EditDataProvider *provider); EditDataProvider* getEditProvider (); - void setEditID(EditUniqueID ID, BufferType buffType); + void setEditID (EditUniqueID ID, BufferType buffType); bool isCurrentSubscriber(); virtual void subscribe(); virtual void unsubscribe(); @@ -587,94 +631,112 @@ public: EditDataProvider(); virtual ~EditDataProvider() {} - virtual void subscribe(EditSubscriber *subscriber); + virtual void subscribe (EditSubscriber *subscriber); virtual void unsubscribe(); /// Occurs when the subscriber has been switched off first virtual void switchOffEditMode (); /// Occurs when the user want to stop the editing mode - virtual CursorShape getCursor(int objectID); + virtual CursorShape getCursor (int objectID); int getPipetteRectSize (); EditSubscriber* getCurrSubscriber(); virtual void getImageSize (int &w, int&h) = 0; }; -inline EditDataProvider* ObjectMOBuffer::getDataProvider () { +inline EditDataProvider* ObjectMOBuffer::getDataProvider () +{ return dataProvider; } -inline ObjectMode ObjectMOBuffer::getObjectMode () { +inline ObjectMode ObjectMOBuffer::getObjectMode () +{ return objectMode; } -inline Cairo::RefPtr& ObjectMOBuffer::getObjectMap () { +inline Cairo::RefPtr& ObjectMOBuffer::getObjectMap () +{ return objectMap; } -inline void RGBColor::setColor (double r, double g, double b) { +inline void RGBColor::setColor (double r, double g, double b) +{ this->r = r; this->g = g; this->b = b; } -inline void RGBColor::setColor (char r, char g, char b) { +inline void RGBColor::setColor (char r, char g, char b) +{ this->r = double (r) / 255.; this->g = double (g) / 255.; this->b = double (b) / 255.; } -inline double RGBColor::getR () { +inline double RGBColor::getR () +{ return r; } -inline double RGBColor::getG () { +inline double RGBColor::getG () +{ return g; } -inline double RGBColor::getB () { +inline double RGBColor::getB () +{ return b; } -inline void RGBAColor::setColor (double r, double g, double b, double a) { +inline void RGBAColor::setColor (double r, double g, double b, double a) +{ RGBColor::setColor (r, g, b); this->a = a; } -inline void RGBAColor::setColor (char r, char g, char b, char a) { +inline void RGBAColor::setColor (char r, char g, char b, char a) +{ RGBColor::setColor (r, g, b); this->a = double (a) / 255.; } -inline double RGBAColor::getA () { +inline double RGBAColor::getA () +{ return a; } -inline void Geometry::setInnerLineColor (double r, double g, double b) { +inline void Geometry::setInnerLineColor (double r, double g, double b) +{ innerLineColor.setColor (r, g, b); flags &= ~F_AUTO_COLOR; } -inline void Geometry::setInnerLineColor (char r, char g, char b) { +inline void Geometry::setInnerLineColor (char r, char g, char b) +{ innerLineColor.setColor (r, g, b); flags &= ~F_AUTO_COLOR; } -inline void Geometry::setOuterLineColor (double r, double g, double b) { +inline void Geometry::setOuterLineColor (double r, double g, double b) +{ outerLineColor.setColor (r, g, b); flags &= ~F_AUTO_COLOR; } -inline double Geometry::getOuterLineWidth () { +inline double Geometry::getOuterLineWidth () +{ return double (innerLineWidth) + 2.; } -inline void Geometry::setOuterLineColor (char r, char g, char b) { +inline void Geometry::setOuterLineColor (char r, char g, char b) +{ outerLineColor.setColor (r, g, b); flags &= ~F_AUTO_COLOR; } -inline double Geometry::getMouseOverLineWidth () { +inline double Geometry::getMouseOverLineWidth () +{ return getOuterLineWidth () + 2.; } -inline void Geometry::setAutoColor (bool aColor) { +inline void Geometry::setAutoColor (bool aColor) +{ if (aColor) { flags |= F_AUTO_COLOR; } else { @@ -682,11 +744,13 @@ inline void Geometry::setAutoColor (bool aColor) { } } -inline bool Geometry::isVisible () { +inline bool Geometry::isVisible () +{ return flags & F_VISIBLE; } -inline void Geometry::setVisible (bool visible) { +inline void Geometry::setVisible (bool visible) +{ if (visible) { flags |= F_VISIBLE; } else { @@ -694,11 +758,13 @@ inline void Geometry::setVisible (bool visible) { } } -inline bool Geometry::isHoverable () { +inline bool Geometry::isHoverable () +{ return flags & F_HOVERABLE; } -inline void Geometry::setHoverable (bool hoverable) { +inline void Geometry::setHoverable (bool hoverable) +{ if (hoverable) { flags |= F_HOVERABLE; } else { @@ -706,152 +772,220 @@ inline void Geometry::setHoverable (bool hoverable) { } } -inline void Geometry::setActive (bool active) { +inline void Geometry::setActive (bool active) +{ if (active) { flags |= (F_VISIBLE | F_HOVERABLE); } else { - flags &= ~(F_VISIBLE | F_HOVERABLE); + flags &= ~ (F_VISIBLE | F_HOVERABLE); } } -inline EditDataProvider* EditSubscriber::getEditProvider () { +inline EditDataProvider* EditSubscriber::getEditProvider () +{ return provider; } -inline CursorShape EditSubscriber::getCursor (const int objectID) { +inline CursorShape EditSubscriber::getCursor (const int objectID) +{ return CSOpenHand; } -inline bool EditSubscriber::mouseOver (const int modifierKey) { +inline bool EditSubscriber::mouseOver (const int modifierKey) +{ return false; } -inline bool EditSubscriber::button1Pressed (const int modifierKey) { +inline bool EditSubscriber::button1Pressed (const int modifierKey) +{ return false; } -inline bool EditSubscriber::button1Released () { +inline bool EditSubscriber::button1Released () +{ return false; } -inline bool EditSubscriber::button2Pressed (const int modifierKey) { +inline bool EditSubscriber::button2Pressed (const int modifierKey) +{ return false; } -inline bool EditSubscriber::button2Released () { +inline bool EditSubscriber::button2Released () +{ return false; } -inline bool EditSubscriber::button3Pressed (const int modifierKey) { +inline bool EditSubscriber::button3Pressed (const int modifierKey) +{ return false; } -inline bool EditSubscriber::button3Released () { +inline bool EditSubscriber::button3Released () +{ return false; } -inline bool EditSubscriber::drag1 (const int modifierKey) { +inline bool EditSubscriber::drag1 (const int modifierKey) +{ return false; } -inline bool EditSubscriber::drag2 (const int modifierKey) { +inline bool EditSubscriber::drag2 (const int modifierKey) +{ return false; } -inline bool EditSubscriber::drag3 (const int modifierKey) { +inline bool EditSubscriber::drag3 (const int modifierKey) +{ return false; } -inline bool EditSubscriber::pick1 (const bool picked) { +inline bool EditSubscriber::pick1 (const bool picked) +{ return false; } -inline bool EditSubscriber::pick2 (const bool picked) { +inline bool EditSubscriber::pick2 (const bool picked) +{ return false; } -inline bool EditSubscriber::pick3 (const bool picked) { +inline bool EditSubscriber::pick3 (const bool picked) +{ return false; } -inline const std::vector& EditSubscriber::getVisibleGeometry () { +inline const std::vector& EditSubscriber::getVisibleGeometry () +{ return visibleGeometry; } -inline const std::vector& EditSubscriber::getMouseOverGeometry () { +inline const std::vector& EditSubscriber::getMouseOverGeometry () +{ return mouseOverGeometry; } -inline int EditDataProvider::getPipetteRectSize () { +inline int EditDataProvider::getPipetteRectSize () +{ return 8; // TODO: make a GUI } inline Geometry::Geometry () : - innerLineColor (char (255), char (255), char (255)), outerLineColor ( - char (0), char (0), char (0)), flags ( - F_VISIBLE | F_HOVERABLE | F_AUTO_COLOR), innerLineWidth (1.5f), datum ( - IMAGE), state (NORMAL) { + innerLineColor (char (255), char (255), char (255)), outerLineColor ( + char (0), char (0), char (0)), flags ( + F_VISIBLE | F_HOVERABLE | F_AUTO_COLOR), innerLineWidth (1.5f), datum ( + IMAGE), state (NORMAL) +{ } inline Circle::Circle () : - center (100, 100), radius (10), filled (false), radiusInImageSpace ( - false) { + center (100, 100), radius (10), filled (false), radiusInImageSpace ( + false) +{ +} + +inline Arcellipse::Arcellipse () : + center (100, 100), radius (10), radius2 (10), translax (0), translay (0), filled (false), radiusInImageSpace ( + false) +{ } inline Rectangle::Rectangle () : - topLeft (0, 0), bottomRight (10, 10), filled (false) { + topLeft (0, 0), bottomRight (10, 10), filled (false) +{ } inline Polyline::Polyline () : - filled (false) { + filled (false) +{ } inline Line::Line () : - begin (10, 10), end (100, 100) { + begin (10, 10), end (100, 100) +{ +} +inline Beziers::Beziers () : + begin (10, 10), inter (50, 50), end (100, 100) +{ } inline RGBAColor::RGBAColor () : - RGBColor (0., 0., 0.), a (0.) { + RGBColor (0., 0., 0.), a (0.) +{ } inline RGBColor::RGBColor () : - r (0.), g (0.), b (0.) { + r (0.), g (0.), b (0.) +{ } inline RGBColor::RGBColor (double r, double g, double b) : - r (r), g (g), b (b) { + r (r), g (g), b (b) +{ } inline RGBColor::RGBColor (char r, char g, char b) : - r (double (r) / 255.), g (double (g) / 255.), b (double (b) / 255.) { + r (double (r) / 255.), g (double (g) / 255.), b (double (b) / 255.) +{ } inline RGBAColor::RGBAColor (double r, double g, double b, double a) : - RGBColor (r, g, b), a (a) { + RGBColor (r, g, b), a (a) +{ } inline RGBAColor::RGBAColor (char r, char g, char b, char a) : - RGBColor (r, g, b), a (double (a) / 255.) { + RGBColor (r, g, b), a (double (a) / 255.) +{ } inline Circle::Circle (rtengine::Coord& center, int radius, bool filled, - bool radiusInImageSpace) : - center (center), radius (radius), filled (filled), radiusInImageSpace ( - radiusInImageSpace) { + bool radiusInImageSpace) : + center (center), radius (radius), filled (filled), radiusInImageSpace ( + radiusInImageSpace) +{ } inline Circle::Circle (int centerX, int centerY, int radius, bool filled, - bool radiusInImageSpace) : - center (centerX, centerY), radius (radius), filled (filled), radiusInImageSpace ( - radiusInImageSpace) { + bool radiusInImageSpace) : + center (centerX, centerY), radius (radius), filled (filled), radiusInImageSpace ( + radiusInImageSpace) +{ +} + +inline Arcellipse::Arcellipse (rtengine::Coord& center, double radius, double radius2, double translax, double translay, double scalx, double scaly, double begang, double endang, bool filled, + bool radiusInImageSpace) : + center (center), radius (radius), radius2 (radius2), translax (translax), translay (translay), scalx (scalx), scaly (scaly), begang (begang), endang (endang), filled (filled), radiusInImageSpace ( + radiusInImageSpace) +{ +} + +inline Arcellipse::Arcellipse (int centerX, int centerY, double radius, double radius2, double translax, double translay, double scalx, double scaly, double begang, double endang, bool filled, + bool radiusInImageSpace) : + center (centerX, centerY), radius (radius), radius2 (radius2), translax (translax), translay (translay), scalx (scalx), scaly (scaly), begang (begang), endang (endang), filled (filled), radiusInImageSpace ( + radiusInImageSpace) +{ +} + +inline Beziers::Beziers (rtengine::Coord& begin, rtengine::Coord& inter, rtengine::Coord& end) : + begin (begin), inter (inter), end (end) +{ +} + +inline Beziers::Beziers (float beginX, float beginY, float interX, float interY, float endX, float endY) : + begin (beginX, beginY), inter (interX, interY), end (endX, endY) +{ } inline Line::Line (rtengine::Coord& begin, rtengine::Coord& end) : - begin (begin), end (end) { + begin (begin), end (end) +{ } inline Line::Line (int beginX, int beginY, int endX, int endY) : - begin (beginX, beginY), end (endX, endY) { + begin (beginX, beginY), end (endX, endY) +{ } #endif diff --git a/rtgui/locallab.cc b/rtgui/locallab.cc index c5f7e46ff..f7d4ae7a0 100644 --- a/rtgui/locallab.cc +++ b/rtgui/locallab.cc @@ -651,6 +651,12 @@ Locallab::Locallab (): // Instantiating the Editing geometry; positions will be initialized later Line *hLine, *vLine, *locYLine[2], *locXLine[2]; Circle *centerCircle; +// Arcellipse *oneellipse; + + Beziers *onebeziers[3]; + Beziers *twobeziers[3]; + Beziers *thrbeziers[3]; + Beziers *foubeziers[3]; // Visible geometry locXLine[0] = new Line(); @@ -671,12 +677,81 @@ Locallab::Locallab (): centerCircle->radius = circrad->getValue(); //19; centerCircle->filled = false; + if (options.showdelimspot) { + onebeziers[0] = new Beziers(); + onebeziers[0]->datum = Geometry::IMAGE; + onebeziers[0]->innerLineWidth = 1; + + onebeziers[1] = new Beziers(); + onebeziers[1]->datum = Geometry::IMAGE; + onebeziers[1]->innerLineWidth = 1; + + onebeziers[2] = new Beziers(); + onebeziers[2]->datum = Geometry::IMAGE; + onebeziers[2]->innerLineWidth = 1; + + twobeziers[0] = new Beziers(); + twobeziers[0]->datum = Geometry::IMAGE; + twobeziers[0]->innerLineWidth = 1; + + twobeziers[1] = new Beziers(); + twobeziers[1]->datum = Geometry::IMAGE; + twobeziers[1]->innerLineWidth = 1; + + twobeziers[2] = new Beziers(); + twobeziers[2]->datum = Geometry::IMAGE; + twobeziers[2]->innerLineWidth = 1; + + thrbeziers[0] = new Beziers(); + thrbeziers[0]->datum = Geometry::IMAGE; + thrbeziers[0]->innerLineWidth = 1; + + thrbeziers[1] = new Beziers(); + thrbeziers[1]->datum = Geometry::IMAGE; + thrbeziers[1]->innerLineWidth = 1; + + thrbeziers[2] = new Beziers(); + thrbeziers[2]->datum = Geometry::IMAGE; + thrbeziers[2]->innerLineWidth = 1; + + foubeziers[0] = new Beziers(); + foubeziers[0]->datum = Geometry::IMAGE; + foubeziers[0]->innerLineWidth = 1; + + foubeziers[1] = new Beziers(); + foubeziers[1]->datum = Geometry::IMAGE; + foubeziers[1]->innerLineWidth = 1; + + foubeziers[2] = new Beziers(); + foubeziers[2]->datum = Geometry::IMAGE; + foubeziers[2]->innerLineWidth = 1; + } + + // oneellipse->radiusInImageSpace = true; + // oneellipse->radius = locX->getValue(); + // oneellipse->filled = false; + EditSubscriber::visibleGeometry.push_back ( locXLine[0] ); EditSubscriber::visibleGeometry.push_back ( locXLine[1] ); EditSubscriber::visibleGeometry.push_back ( locYLine[0] ); EditSubscriber::visibleGeometry.push_back ( locYLine[1] ); EditSubscriber::visibleGeometry.push_back ( centerCircle ); + if (options.showdelimspot) { + EditSubscriber::visibleGeometry.push_back ( onebeziers[0] ); + EditSubscriber::visibleGeometry.push_back ( onebeziers[1] ); + EditSubscriber::visibleGeometry.push_back ( onebeziers[2] ); + EditSubscriber::visibleGeometry.push_back ( twobeziers[0] ); + EditSubscriber::visibleGeometry.push_back ( twobeziers[1] ); + EditSubscriber::visibleGeometry.push_back ( twobeziers[2] ); + EditSubscriber::visibleGeometry.push_back ( thrbeziers[0] ); + EditSubscriber::visibleGeometry.push_back ( thrbeziers[1] ); + EditSubscriber::visibleGeometry.push_back ( thrbeziers[2] ); + EditSubscriber::visibleGeometry.push_back ( foubeziers[0] ); + EditSubscriber::visibleGeometry.push_back ( foubeziers[1] ); + EditSubscriber::visibleGeometry.push_back ( foubeziers[2] ); + } + // MouseOver geometry locXLine[0] = new Line(); locXLine[0]->innerLineWidth = 2; @@ -696,6 +771,60 @@ Locallab::Locallab (): centerCircle->radius = circrad->getValue();//19; centerCircle->filled = true; + if (options.showdelimspot) { + onebeziers[0] = new Beziers(); + onebeziers[0]->datum = Geometry::IMAGE; + onebeziers[0]->innerLineWidth = 1; + + onebeziers[1] = new Beziers(); + onebeziers[1]->datum = Geometry::IMAGE; + onebeziers[1]->innerLineWidth = 1; + + onebeziers[2] = new Beziers(); + onebeziers[2]->datum = Geometry::IMAGE; + onebeziers[2]->innerLineWidth = 1; + + twobeziers[0] = new Beziers(); + twobeziers[0]->datum = Geometry::IMAGE; + twobeziers[0]->innerLineWidth = 1; + + twobeziers[1] = new Beziers(); + twobeziers[1]->datum = Geometry::IMAGE; + twobeziers[1]->innerLineWidth = 1; + + twobeziers[2] = new Beziers(); + twobeziers[2]->datum = Geometry::IMAGE; + twobeziers[2]->innerLineWidth = 1; + + thrbeziers[0] = new Beziers(); + thrbeziers[0]->datum = Geometry::IMAGE; + thrbeziers[0]->innerLineWidth = 1; + + thrbeziers[1] = new Beziers(); + thrbeziers[1]->datum = Geometry::IMAGE; + thrbeziers[1]->innerLineWidth = 1; + + thrbeziers[2] = new Beziers(); + thrbeziers[2]->datum = Geometry::IMAGE; + thrbeziers[2]->innerLineWidth = 1; + + foubeziers[0] = new Beziers(); + foubeziers[0]->datum = Geometry::IMAGE; + foubeziers[0]->innerLineWidth = 1; + + foubeziers[1] = new Beziers(); + foubeziers[1]->datum = Geometry::IMAGE; + foubeziers[1]->innerLineWidth = 1; + + foubeziers[2] = new Beziers(); + foubeziers[2]->datum = Geometry::IMAGE; + foubeziers[2]->innerLineWidth = 1; + } + +// oneellipse->radiusInImageSpace = true; +// oneellipse->radius = 10;//locX->getValue(); +// oneellipse->filled = false; + EditSubscriber::mouseOverGeometry.push_back ( locXLine[0] ); EditSubscriber::mouseOverGeometry.push_back ( locXLine[1] ); @@ -704,6 +833,21 @@ Locallab::Locallab (): EditSubscriber::mouseOverGeometry.push_back ( centerCircle ); + if (options.showdelimspot) { + EditSubscriber::mouseOverGeometry.push_back ( onebeziers[0] ); + EditSubscriber::mouseOverGeometry.push_back ( onebeziers[1] ); + EditSubscriber::mouseOverGeometry.push_back ( onebeziers[2] ); + EditSubscriber::mouseOverGeometry.push_back ( twobeziers[0] ); + EditSubscriber::mouseOverGeometry.push_back ( twobeziers[1] ); + EditSubscriber::mouseOverGeometry.push_back ( twobeziers[2] ); + EditSubscriber::mouseOverGeometry.push_back ( thrbeziers[0] ); + EditSubscriber::mouseOverGeometry.push_back ( thrbeziers[1] ); + EditSubscriber::mouseOverGeometry.push_back ( thrbeziers[2] ); + EditSubscriber::mouseOverGeometry.push_back ( foubeziers[0] ); + EditSubscriber::mouseOverGeometry.push_back ( foubeziers[1] ); + EditSubscriber::mouseOverGeometry.push_back ( foubeziers[2] ); + } + show_all(); } @@ -1733,7 +1877,7 @@ void Locallab::updateGeometry (const int centerX_, const int centerY_, const int double decayX = (locX_) * (double (imW)) / 2000.; double decayXL = (locXL_) * (double (imW)) / 2000.; rtengine::Coord origin (imW / 2 + centerX_ * imW / 2000.f, imH / 2 + centerY_ * imH / 2000.f); -// printf("deX=%f dexL=%f deY=%f deyT=%f\n", decayX, decayXL, decayY, decayYT); +// printf("deX=%f dexL=%f deY=%f deyT=%f locX=%i locY=%i\n", decayX, decayXL, decayY, decayYT, locX_, locY_); if (Smethod->get_active_row_number() == 1 || Smethod->get_active_row_number() == 3) { decayYT = decayY; @@ -1742,6 +1886,8 @@ void Locallab::updateGeometry (const int centerX_, const int centerY_, const int Line *currLine; Circle *currCircle; + // Arcellipse *currArcellipse; + Beziers *currBeziers; double decay; const auto updateLine = [&] (Geometry * geometry, const float radius, const float begin, const float end) { const auto line = static_cast (geometry); @@ -1763,31 +1909,134 @@ void Locallab::updateGeometry (const int centerX_, const int centerY_, const int const auto circle = static_cast (geometry); circle->center = origin; circle->radius = circrad_; - }; + const auto updateBeziers = [&] (Geometry * geometry, const double dX_, const double dI_, const double dY_, const float begi, const float inte, const float en) { + const auto beziers = static_cast (geometry); + beziers->begin = PolarCoord (dX_, begi); + beziers->begin += origin;//0 + beziers->inter = PolarCoord (dI_, inte); + beziers->inter += origin;//0 + beziers->end = PolarCoord (dY_, en); + beziers->end += origin; + // printf("dX=%f dI=%f dY=%f begx=%i begy=%i intx=%i inty=%i endx=%i endy=%i\n", dX_, dI_, dY_, beziers->begin.x, beziers->begin.y, beziers->inter.x, beziers->inter.y, beziers->end.x, beziers->end.y); + }; + + /* + const auto updateArcellipse = [&] (Geometry * geometry, const double dX_, const double dY_, const float kbegang, const float kendang) { + const auto arcellipse = static_cast (geometry); + arcellipse->center = origin; + arcellipse->radius = dY_; + arcellipse->radius2 = dX_; + arcellipse->translax = (double) imW /2.; //dX_ - dY_; + arcellipse->translay = (double) imH /2.; + arcellipse->scalx = dX_ / dY_; // double(locX_) / double (locY_); //arcellipse->radius2 / arcellipse->radius ; // dX_ / dY_; + arcellipse->scaly = 1.; //dX_ / dY_; //locY_/locX_; + arcellipse->begang = kbegang * M_PI; + arcellipse->endang = kendang * M_PI; + + + }; + */ + double dimline = 100.; + + if (options.showdelimspot) { + dimline = 500.; + } + + decay = decayX; - updateLineWithDecay (visibleGeometry.at (0), 100., 90., 0.); - updateLineWithDecay (mouseOverGeometry.at (0), 100., 90., 0.); + updateLineWithDecay (visibleGeometry.at (0), dimline, 90., 0.); + updateLineWithDecay (mouseOverGeometry.at (0), dimline, 90., 0.); decay = decayXL; - updateLineWithDecay (visibleGeometry.at (1), 100., 90., 180.); - updateLineWithDecay (mouseOverGeometry.at (1), 100., 90., 180.); + updateLineWithDecay (visibleGeometry.at (1), dimline, 90., 180.); + updateLineWithDecay (mouseOverGeometry.at (1), dimline, 90., 180.); decay = decayYT; - updateLineWithDecay (visibleGeometry.at (2), 100., 180., 270.); - updateLineWithDecay (mouseOverGeometry.at (2), 100., 180., 270.); + updateLineWithDecay (visibleGeometry.at (2), dimline, 180., 270.); + updateLineWithDecay (mouseOverGeometry.at (2), dimline, 180., 270.); decay = decayY; - updateLineWithDecay (visibleGeometry.at (3), 100., 180, 90.); - updateLineWithDecay (mouseOverGeometry.at (3), 100., 180., 90.); + updateLineWithDecay (visibleGeometry.at (3), dimline, 180, 90.); + updateLineWithDecay (mouseOverGeometry.at (3), dimline, 180., 90.); updateCircle (visibleGeometry.at (4)); updateCircle (mouseOverGeometry.at (4)); + //double decay10 = ((decayX * decayY)/ sqrt(0.03107 * SQR(decayX) + SQR(decayY)))/0.9848; + //double decay5 = ((decayX * decayY)/ sqrt(0.007655 * SQR(decayX) + SQR(decayY)))/0.9659; + if (options.showdelimspot) { + //this decayww evaluate approximation of a point in the ellipse for an angle alpha + double decay15 = 1.07854 * ((decayX * decayY) / sqrt (0.07179 * SQR (decayX) + SQR (decayY))); //0.07179 = SQR(sin(15)/cos(15)) 1.07854 = 1 / cos(15) + double decay30 = 1.15473 * ((decayX * decayY) / sqrt (0.33335 * SQR (decayX) + SQR (decayY))); + double decay60 = 2. * ((decayX * decayY) / sqrt (3.0 * SQR (decayX) + SQR (decayY))); + double decay75 = 3.86398 * ((decayX * decayY) / sqrt (13.929 * SQR (decayX) + SQR (decayY))); + + double decay15L = 1.07854 * ((decayXL * decayY) / sqrt (0.07179 * SQR (decayXL) + SQR (decayY))); + double decay30L = 1.15473 * ((decayXL * decayY) / sqrt (0.33335 * SQR (decayXL) + SQR (decayY))); + double decay60L = 2. * ((decayXL * decayY) / sqrt (3.0 * SQR (decayXL) + SQR (decayY))); + double decay75L = 3.86398 * ((decayXL * decayY) / sqrt (13.929 * SQR (decayXL) + SQR (decayY))); + + double decay15LT = 1.07854 * ((decayXL * decayYT) / sqrt (0.07179 * SQR (decayXL) + SQR (decayYT))); + double decay30LT = 1.15473 * ((decayXL * decayYT) / sqrt (0.33335 * SQR (decayXL) + SQR (decayYT))); + double decay60LT = 2. * ((decayXL * decayYT) / sqrt (3.0 * SQR (decayXL) + SQR (decayYT))); + double decay75LT = 3.86398 * ((decayXL * decayYT) / sqrt (13.929 * SQR (decayXL) + SQR (decayYT))); + + double decay15T = 1.07854 * ((decayX * decayYT) / sqrt (0.07179 * SQR (decayX) + SQR (decayYT))); + double decay30T = 1.15473 * ((decayX * decayYT) / sqrt (0.33335 * SQR (decayX) + SQR (decayYT))); + double decay60T = 2. * ((decayX * decayYT) / sqrt (3.0 * SQR (decayX) + SQR (decayYT))); + double decay75T = 3.86398 * ((decayX * decayYT) / sqrt (13.929 * SQR (decayX) + SQR (decayYT))); + + double decay45 = (1.414 * decayX * decayY) / sqrt (SQR (decayX) + SQR (decayY)); + double decay45L = (1.414 * decayXL * decayY) / sqrt (SQR (decayXL) + SQR (decayY)); + double decay45LT = (1.414 * decayXL * decayYT) / sqrt (SQR (decayXL) + SQR (decayYT)); + double decay45T = (1.414 * decayX * decayYT) / sqrt (SQR (decayX) + SQR (decayYT)); + + //printf("decayX=%f decayY=%f decay10=%f decay45=%f oriX=%i origY=%i\n", decayX, decayY, decay10, decay45, origin.x, origin.y); + updateBeziers (visibleGeometry.at (5), decayX, decay15 , decay30, 0., 15., 30.); + updateBeziers (mouseOverGeometry.at (5), decayX, decay15 , decay30, 0., 15., 30.); + + updateBeziers (visibleGeometry.at (6), decay30, decay45 , decay60, 30., 45., 60.); + updateBeziers (mouseOverGeometry.at (6), decay30, decay45 , decay60, 30., 45., 60.); + + updateBeziers (visibleGeometry.at (7), decay60, decay75 , decayY, 60., 75., 90.); + updateBeziers (mouseOverGeometry.at (7), decay60, decay75 , decayY, 60., 75., 90.); + + updateBeziers (visibleGeometry.at (8), decayY, decay75L , decay60L, 90., 105., 120.); + updateBeziers (mouseOverGeometry.at (8), decayY, decay75L , decay60L, 90., 105., 120.); + + updateBeziers (visibleGeometry.at (9), decay60L, decay45L , decay30L, 120., 135., 150.); + updateBeziers (mouseOverGeometry.at (9), decay60L, decay45L , decay30L, 120., 135., 150.); + + updateBeziers (visibleGeometry.at (10), decay30L, decay15L , decayXL, 150., 165., 180.); + updateBeziers (mouseOverGeometry.at (10), decay30L, decay15L , decayXL, 150., 165., 180.); + + updateBeziers (visibleGeometry.at (11), decayXL, decay15LT , decay30LT, 180., 195., 210.); + updateBeziers (mouseOverGeometry.at (11), decayXL, decay15LT , decay30LT, 180., 195., 210.); + + updateBeziers (visibleGeometry.at (12), decay30LT, decay45LT , decay60LT, 210., 225., 240.); + updateBeziers (mouseOverGeometry.at (12), decay30LT, decay45LT , decay60LT, 210., 225., 240.); + + updateBeziers (visibleGeometry.at (13), decay60LT, decay75LT , decayYT, 240., 255., 270.); + updateBeziers (mouseOverGeometry.at (13), decay60LT, decay75LT , decayYT, 240., 255., 270.); + + updateBeziers (visibleGeometry.at (14), decayYT, decay75T , decay60T, 270., 285., 300.); + updateBeziers (mouseOverGeometry.at (14), decayYT, decay75T , decay60T, 270., 285., 300.); + + updateBeziers (visibleGeometry.at (15), decay60T, decay45T , decay30T, 300., 315., 330.); + updateBeziers (mouseOverGeometry.at (15), decay60T, decay45T , decay30T, 300., 315., 330.); + + updateBeziers (visibleGeometry.at (16), decay30T, decay15T , decayX, 330., 345., 360.); + updateBeziers (mouseOverGeometry.at (16), decay30T, decay15T , decayX, 330., 345., 360.); + + } + + // updateArcellipse (visibleGeometry.at (5), decayX, decayY, 0., 0.5); + // updateArcellipse (mouseOverGeometry.at (5), decayX, decayY, 0., 0.5); } @@ -2963,13 +3212,16 @@ bool Locallab::mouseOver (int modifierKey) if (lastObject == 2 || lastObject == 3) { EditSubscriber::visibleGeometry.at (2)->state = Geometry::NORMAL; EditSubscriber::visibleGeometry.at (3)->state = Geometry::NORMAL; + } else if (lastObject == 0 || lastObject == 1) { EditSubscriber::visibleGeometry.at (0)->state = Geometry::NORMAL; EditSubscriber::visibleGeometry.at (1)->state = Geometry::NORMAL; + } else { - EditSubscriber::visibleGeometry.at (lastObject)->state = Geometry::NORMAL; + EditSubscriber::visibleGeometry.at (4)->state = Geometry::NORMAL; +// EditSubscriber::visibleGeometry.at (lastObject)->state = Geometry::NORMAL; } } @@ -2977,13 +3229,16 @@ bool Locallab::mouseOver (int modifierKey) if (editProvider->object == 2 || editProvider->object == 3) { EditSubscriber::visibleGeometry.at (2)->state = Geometry::PRELIGHT; EditSubscriber::visibleGeometry.at (3)->state = Geometry::PRELIGHT; + } else if (editProvider->object == 0 || editProvider->object == 1) { EditSubscriber::visibleGeometry.at (0)->state = Geometry::PRELIGHT; EditSubscriber::visibleGeometry.at (1)->state = Geometry::PRELIGHT; + } else { - EditSubscriber::visibleGeometry.at (editProvider->object)->state = Geometry::PRELIGHT; + EditSubscriber::visibleGeometry.at (4)->state = Geometry::PRELIGHT; + // EditSubscriber::visibleGeometry.at (editProvider->object)->state = Geometry::PRELIGHT; } } @@ -3039,6 +3294,7 @@ bool Locallab::button1Pressed (int modifierKey) if (lastObject == 2) { //draggedlocYOffset = -draggedlocYOffset; draggedlocYOffset -= (locYT->getValue() / 2000. * verti); + } } else if (lastObject == 3) { // Dragging a line to change the angle @@ -3062,6 +3318,7 @@ bool Locallab::button1Pressed (int modifierKey) if (lastObject == 3) { draggedlocYOffset = -draggedlocYOffset; draggedlocYOffset -= (locY->getValue() / 2000. * verti); + } } @@ -3095,6 +3352,7 @@ bool Locallab::button1Pressed (int modifierKey) if (Smethod->get_active_row_number() == 0 || Smethod->get_active_row_number() == 2) { if (lastObject == 0) { // Dragging a line to change the angle + PolarCoord draggedPoint; rtengine::Coord currPos; currPos = provider->posImage; @@ -3110,12 +3368,13 @@ bool Locallab::button1Pressed (int modifierKey) // draggedPoint.setFromCartesian(centerPos, currPos); // compute the projected value of the dragged point - printf ("rad=%f ang=%f\n", draggedPoint.radius, draggedPoint.angle - degree->getValue()); + //printf ("rad=%f ang=%f\n", draggedPoint.radius, draggedPoint.angle - degree->getValue()); draggedlocXOffset = draggedPoint.radius * sin ((draggedPoint.angle - degree->getValue() + 90.) / 180.*M_PI); // if (lastObject==1) // draggedlocXOffset = -draggedlocXOffset;//- draggedlocXOffset -= (locX->getValue() / 2000. * horiz); } else if (lastObject == 1) { + // Dragging a line to change the angle PolarCoord draggedPoint; rtengine::Coord currPos; @@ -3128,7 +3387,7 @@ bool Locallab::button1Pressed (int modifierKey) draggedPoint = currPos - centerPos; // draggedPoint.setFromCartesian(centerPos, currPos); - printf ("rad=%f ang=%f\n", draggedPoint.radius, draggedPoint.angle - degree->getValue()); + // printf ("rad=%f ang=%f\n", draggedPoint.radius, draggedPoint.angle - degree->getValue()); draggedlocXOffset = draggedPoint.radius * sin ((draggedPoint.angle - degree->getValue() + 90.) / 180.*M_PI); if (lastObject == 1) { @@ -3152,7 +3411,7 @@ bool Locallab::button1Pressed (int modifierKey) draggedPoint = currPos - centerPos; // draggedPoint.setFromCartesian(centerPos, currPos); - printf ("rad=%f ang=%f\n", draggedPoint.radius, draggedPoint.angle - degree->getValue()); + //printf ("rad=%f ang=%f\n", draggedPoint.radius, draggedPoint.angle - degree->getValue()); draggedlocXOffset = draggedPoint.radius * sin ((draggedPoint.angle - degree->getValue() + 90.) / 180.*M_PI); if (lastObject == 1) { @@ -3220,8 +3479,10 @@ bool Locallab::button1Pressed (int modifierKey) if (lastObject == 0 || lastObject == 1) { EditSubscriber::visibleGeometry.at (0)->state = Geometry::NORMAL; EditSubscriber::visibleGeometry.at (1)->state = Geometry::NORMAL; + } else { - EditSubscriber::visibleGeometry.at (lastObject)->state = Geometry::NORMAL; + EditSubscriber::visibleGeometry.at (4)->state = Geometry::NORMAL; +// EditSubscriber::visibleGeometry.at (lastObject)->state = Geometry::NORMAL; } } @@ -3385,7 +3646,7 @@ bool Locallab::drag1 (int modifierKey) if (Smethod->get_active_row_number() == 0 || Smethod->get_active_row_number() == 2) { //else if (lastObject==0) { - if (lastObject == 0) { + if (lastObject == 0) {// >=4 // Dragging the upper or lower locY bar PolarCoord draggedPoint; rtengine::Coord currPos; @@ -3401,7 +3662,7 @@ bool Locallab::drag1 (int modifierKey) // draggedPoint.setFromCartesian(centerPos, currPos); double currDraggedStrOffset = draggedPoint.radius * sin ((draggedPoint.angle - degree->getValue() + 90.) / 180.*M_PI); - if (lastObject == 0) + if (lastObject == 0) //>=4 // Dragging the upper locY bar { currDraggedStrOffset -= draggedlocXOffset; diff --git a/rtgui/options.cc b/rtgui/options.cc index 613f988cf..22ccc142e 100644 --- a/rtgui/options.cc +++ b/rtgui/options.cc @@ -441,6 +441,7 @@ void Options::setDefaults () UseIconNoText = true; whiteBalanceSpotSize = 8; showFilmStripToolBar = false; + showdelimspot = false; menuGroupRank = true; menuGroupLabel = true; menuGroupFileOperations = true; @@ -1474,6 +1475,10 @@ int Options::readFromFile (Glib::ustring fname) showFilmStripToolBar = keyFile.get_boolean ("GUI", "ShowFilmStripToolBar"); } + if (keyFile.has_key ("GUI", "Showdelimspot")) { + showdelimspot = keyFile.get_boolean ("GUI", "Showdelimspot"); + } + if (keyFile.has_key ("GUI", "FileBrowserToolbarSingleRow")) { FileBrowserToolbarSingleRow = keyFile.get_boolean ("GUI", "FileBrowserToolbarSingleRow"); } @@ -2101,6 +2106,7 @@ int Options::saveToFile (Glib::ustring fname) keyFile.set_integer ("GUI", "NavigatorRGBUnit", (int)navRGBUnit); keyFile.set_integer ("GUI", "NavigatorHSVUnit", (int)navHSVUnit); keyFile.set_boolean ("GUI", "ShowFilmStripToolBar", showFilmStripToolBar); + keyFile.set_boolean ("GUI", "Showdelimspot", showdelimspot); keyFile.set_boolean ("GUI", "FileBrowserToolbarSingleRow", FileBrowserToolbarSingleRow); keyFile.set_boolean ("GUI", "HideTPVScrollbar", hideTPVScrollbar); keyFile.set_boolean ("GUI", "UseIconNoText", UseIconNoText); diff --git a/rtgui/options.h b/rtgui/options.h index 819799af1..350221dd2 100644 --- a/rtgui/options.h +++ b/rtgui/options.h @@ -226,6 +226,7 @@ public: int curvebboxpos; // 0=above, 1=right, 2=below, 3=left bool showFilmStripToolBar; + bool showdelimspot; // Performance options Glib::ustring clutsDir; diff --git a/rtgui/preferences.cc b/rtgui/preferences.cc index 9eb4f34d4..59b89e30a 100644 --- a/rtgui/preferences.cc +++ b/rtgui/preferences.cc @@ -993,11 +993,28 @@ Gtk::Widget* Preferences::getGeneralPanel () workflowGrid->attach_next_to (*ckbHideTPVScrollbar, *hb4label, Gtk::POS_RIGHT, 1, 1); workflowGrid->attach_next_to (*ckbUseIconNoText, *ckbHideTPVScrollbar, Gtk::POS_RIGHT, 1, 1); + fworklflow->add (*workflowGrid); mvbsd->attach_next_to (*fworklflow, Gtk::POS_TOP, 2, 1); // --------------------------------------------- + Gtk::Frame* flocal = Gtk::manage ( new Gtk::Frame (M ("PREFERENCES_LOCAL")) ); + setExpandAlignProperties (flocal, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); + Gtk::Grid* localGrid = Gtk::manage ( new Gtk::Grid() ); + localGrid->set_column_spacing (4); + localGrid->set_row_spacing (4); + setExpandAlignProperties (localGrid, false, false, Gtk::ALIGN_FILL, Gtk::ALIGN_BASELINE); + + ckbShowdelimspot = Gtk::manage ( new Gtk::CheckButton (M ("PREFERENCES_LOCALSHOWDELIMSPOT")) ); + setExpandAlignProperties (ckbShowdelimspot, false, false, Gtk::ALIGN_START, Gtk::ALIGN_START); + localGrid->attach_next_to (*ckbShowdelimspot, Gtk::POS_LEFT, 3, 1); + + flocal->add (*localGrid); + mvbsd->attach_next_to (*flocal, *fworklflow, Gtk::POS_BOTTOM, 2, 1); + + // --------------------------------------------- + Gtk::Frame* flang = Gtk::manage ( new Gtk::Frame (M ("PREFERENCES_DEFAULTLANG")) ); setExpandAlignProperties (flang, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); Gtk::Grid* langGrid = Gtk::manage ( new Gtk::Grid() ); @@ -1029,7 +1046,8 @@ Gtk::Widget* Preferences::getGeneralPanel () langGrid->attach_next_to (*languages, *langlab, Gtk::POS_RIGHT, 1, 1); langGrid->attach_next_to (*langw, *languages, Gtk::POS_RIGHT, 1, 1); flang->add (*langGrid); - mvbsd->attach_next_to (*flang, *fworklflow, Gtk::POS_BOTTOM, 2, 1); +// mvbsd->attach_next_to (*flang, *fworklflow, Gtk::POS_BOTTOM, 2, 1); + mvbsd->attach_next_to (*flang, *flocal, Gtk::POS_BOTTOM, 2, 1); // --------------------------------------------- @@ -1781,6 +1799,7 @@ void Preferences::storePreferences () moptions.histogramPosition = ckbHistogramPositionLeft->get_active() ? 1 : 2; moptions.FileBrowserToolbarSingleRow = ckbFileBrowserToolbarSingleRow->get_active(); moptions.showFilmStripToolBar = ckbShowFilmStripToolBar->get_active(); + moptions.showdelimspot = ckbShowdelimspot->get_active(); moptions.hideTPVScrollbar = ckbHideTPVScrollbar->get_active(); moptions.overwriteOutputFile = chOverwriteOutputFile->get_active (); moptions.UseIconNoText = ckbUseIconNoText->get_active(); @@ -1988,6 +2007,7 @@ void Preferences::fillPreferences () // ckbHistogramWorking->set_active(moptions.histogramWorking==1); ckbFileBrowserToolbarSingleRow->set_active (moptions.FileBrowserToolbarSingleRow); ckbShowFilmStripToolBar->set_active (moptions.showFilmStripToolBar); + ckbShowdelimspot->set_active (moptions.showdelimspot); ckbHideTPVScrollbar->set_active (moptions.hideTPVScrollbar); ckbUseIconNoText->set_active (moptions.UseIconNoText); diff --git a/rtgui/preferences.h b/rtgui/preferences.h index c9f36e178..2a6e3ea6d 100644 --- a/rtgui/preferences.h +++ b/rtgui/preferences.h @@ -200,6 +200,7 @@ class Preferences : public Gtk::Dialog, public ProfileStoreListener Gtk::CheckButton* ckbHistogramWorking; Gtk::CheckButton* ckbFileBrowserToolbarSingleRow; Gtk::CheckButton* ckbShowFilmStripToolBar; + Gtk::CheckButton* ckbShowdelimspot; Gtk::CheckButton* ckbHideTPVScrollbar; Gtk::CheckButton* ckbUseIconNoText;