/* * This file is part of RawTherapee. * * Copyright (c) 2004-2010 Gabor Horvath * * RawTherapee is free software: you can redistribute it and/or modify * 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 * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ #ifndef _HISTOGRAMPANEL_ #define _HISTOGRAMPANEL_ #include #include #include #include class HistogramArea; struct HistogramAreaIdleHelper { HistogramArea* harea; bool destroyed; int pending; }; class HistogramRGBArea; struct HistogramRGBAreaIdleHelper { HistogramRGBArea* harea; bool destroyed; int pending; }; class HistogramRGBArea : public Gtk::DrawingArea { protected: Glib::RefPtr rgbgc_; Glib::RefPtr overlay; Gdk::Color black; Gdk::Color white; Gdk::Color red; Gdk::Color green; Gdk::Color blue; Gdk::Color lgray; Gdk::Color mgray; Gdk::Color dgray; int val; int r; int g; int b; bool frozen; bool valid; bool needRed; bool needGreen; bool needBlue; bool needLuma; bool rawMode; bool showMode; Gtk::VBox* parent; HistogramRGBAreaIdleHelper* harih; public: HistogramRGBArea(); ~HistogramRGBArea(); void renderRGBMarks (int r, int g, int b); void updateFreeze (bool f); bool getFreeze (); bool getShow (); void setParent (Gtk::VBox* p) { parent = p; }; void update (int val, int rh, int gh, int bh); void updateOptions (bool r, bool g, bool b, bool l, bool raw, bool show); void on_realize(); bool on_expose_event(GdkEventExpose* event); bool on_button_press_event (GdkEventButton* event); void styleChanged (const Glib::RefPtr& style); private: // Some ... }; class HistogramArea : public Gtk::DrawingArea { protected: Glib::RefPtr gc_; Glib::RefPtr backBuffer; Gdk::Color black; Gdk::Color white; Gdk::Color red; Gdk::Color green; Gdk::Color blue; Gdk::Color lgray; Gdk::Color mgray; Gdk::Color dgray; LUTu lhist, rhist, ghist, bhist; LUTu lhistRaw, rhistRaw, ghistRaw, bhistRaw; bool valid; bool showFull; int oldwidth, oldheight; bool needLuma, needRed, needGreen, needBlue, rawMode; HistogramAreaIdleHelper* haih; public: HistogramArea(); ~HistogramArea(); void renderHistogram (); void update (LUTu &histRed, LUTu &histGreen, LUTu &histBlue, LUTu &histLuma, LUTu &histRedRaw, LUTu &histGreenRaw, LUTu &histBlueRaw); void updateOptions (bool r, bool g, bool b, bool l, bool raw); void on_realize(); bool on_expose_event(GdkEventExpose* event); bool on_button_press_event (GdkEventButton* event); void styleChanged (const Glib::RefPtr& style); private: void drawCurve(Cairo::RefPtr &cr, LUTu & data, double scale, int hsize, int vsize); void drawMarks(Cairo::RefPtr &cr, LUTu & data, double scale, int hsize, int & ui, int & oi); }; class HistogramPanel : public Gtk::HBox, public PointerMotionListener { protected: Gtk::VBox* gfxVBox; HistogramArea* histogramArea; HistogramRGBArea* histogramRGBArea; Gtk::ToggleButton* showRed; Gtk::ToggleButton* showGreen; Gtk::ToggleButton* showBlue; Gtk::ToggleButton* showValue; Gtk::ToggleButton* showRAW; Gtk::ToggleButton* showBAR; sigc::connection rconn; void setHistInvalid (); public: HistogramPanel (); void histogramChanged (LUTu &histRed, LUTu &histGreen, LUTu &histBlue, LUTu &histLuma, LUTu &histRedRaw, LUTu &histGreenRaw, LUTu &histBlueRaw) { histogramArea->update (histRed, histGreen, histBlue, histLuma, histRedRaw, histGreenRaw, histBlueRaw); } // pointermotionlistener interface void pointerMoved (bool validPos, Glib::ustring profile, int x, int y, int r, int g, int b); // added pointermotionlistener interface void toggleFreeze(); // TODO should be protected void setHistRGBInvalid (); void rgbv_toggled (); void resized (Gtk::Allocation& req); }; #endif