#include "bctextbox.h"
#include "bcsubwindow.h"
#include "clip.h"
+#include "colorpicker.inc"
#include "condition.inc"
#include "guicast.h"
#include "mutex.inc"
#include "vframe.inc"
#define PALLETTE_HISTORY_SIZE 16
+#define COLOR_PICKER_W xS(540)
+#define COLOR_PICKER_H yS(330)
-class ColorWindow;
-class PaletteWheel;
-class PaletteWheelValue;
-class PaletteOutput;
-class PaletteHue;
-class PaletteSat;
-class PaletteVal;
-class PaletteRed;
-class PaletteGrn;
-class PaletteBlu;
-class PaletteLum;
-class PaletteCr;
-class PaletteCb;
-class PaletteAlpha;
-class PaletteHSV;
-class PaletteRGB;
-class PaletteYUV;
-class PaletteAPH;
-class PaletteHexButton;
-class PaletteHex;
-class PaletteGrabButton;
-class PaletteHistory;
class ColorPicker : public BC_DialogThread
{
public:
ColorPicker(int do_alpha = 0, const char *title = 0);
~ColorPicker();
-
- void start_window(int output, int alpha, int do_okcancel=0);
- virtual int handle_new_color(int output, int alpha);
- void update_gui(int output, int alpha);
+ void start_window(int color, int alpha, int ok_cancel=0);
+ virtual void create_objects(ColorWindow *window) {}
+ virtual void update_gui(int color, int alpha);
+ virtual int handle_new_color(int color, int alpha);
BC_Window* new_gui();
- int output, alpha;
- int do_alpha, do_okcancel;
+ int color, alpha;
+ int ok_cancel, do_alpha;
const char *title;
};
-class ColorWindow : public BC_Window
+class ColorGUI
{
public:
- ColorWindow(ColorPicker *thread, int x, int y, int w, int h, const char *title);
- ~ColorWindow();
+ ColorGUI(BC_WindowBase *window);
+ ~ColorGUI();
+ void add_tool(BC_WindowBase *sub_wdw);
+ void start_selection(int color, int alpha, int ok_cancel);
void create_objects();
void change_values();
- int close_event();
+ int close_gui();
void update_display();
void update_rgb();
void update_hsv();
void update_yuv();
- int handle_event();
+ int handle_gui();
void get_screen_sample();
- int cursor_motion_event();
- int button_press_event();
- int button_release_event();
+ int cursor_motion_gui();
+ int button_press_gui();
+ int button_release_gui();
+
+ virtual void update_gui(int color, int alpha);
+ virtual int handle_new_color(int color, int alpha);
+ virtual void create_objects(ColorGUI *gui) {}
+
+ static int calculate_w() { return COLOR_PICKER_W; }
+ static int calculate_h() { return COLOR_PICKER_H; }
+
struct { float r, g, b; } rgb;
struct { float y, u, v; } yuv;
void update_yuv(float y, float u, float v);
void update_rgb_hex(const char *hex);
int rgb888();
+ int alpha8();
- ColorPicker *thread;
+ BC_WindowBase *window;
PaletteWheel *wheel;
PaletteWheelValue *wheel_value;
- PaletteOutput *output;
+ PaletteOutput *poutput;
PaletteHue *hue;
PaletteSat *sat;
PaletteVal *val;
PaletteLum *lum;
PaletteCr *c_r;
PaletteCb *c_b;
- PaletteAlpha *alpha;
+ PaletteAlpha *palpha;
PaletteHSV *hsv_h, *hsv_s, *hsv_v;
PaletteRGB *rgb_r, *rgb_g, *rgb_b;
VFrame *value_bitmap;
int button_grabbed;
+ int orig_color, orig_alpha;
+ int color, alpha;
+ int do_alpha, ok_cancel;
+ const char *title;
+
int palette_history[PALLETTE_HISTORY_SIZE];
void load_history();
void save_history();
void update_history();
};
+class ColorWindow : public BC_Window, public ColorGUI
+{
+public:
+ ColorWindow(ColorPicker *thread, int x, int y, int w, int h, const char *title);
+ ~ColorWindow();
+
+ void update_gui(int color, int alpha);
+ int handle_new_color(int color, int alpha);
+ void create_objects();
+
+ int close_event() { return close_gui(); }
+ int cursor_motion_event() { return cursor_motion_gui(); }
+ int button_press_event() { return button_press_gui(); }
+ int button_release_event() { return button_release_gui(); }
+
+ ColorPicker *thread;
+};
+
+class ColorOK : public BC_OKButton
+{
+public:
+ ColorOK(ColorGUI *gui, BC_WindowBase *window);
+ int handle_event();
+
+ BC_WindowBase *window;
+ ColorGUI *gui;
+};
+
+class ColorCancel : public BC_CancelButton
+{
+public:
+ ColorCancel(ColorGUI *gui, BC_WindowBase *window);
+ int handle_event();
+
+ BC_WindowBase *window;
+ ColorGUI *gui;
+};
class PaletteWheel : public BC_SubWindow
{
public:
- PaletteWheel(ColorWindow *window, int x, int y);
+ PaletteWheel(ColorGUI *gui, int x, int y);
~PaletteWheel();
int button_press_event();
int cursor_motion_event();
int draw(float hue, float saturation);
int get_angle(float x1, float y1, float x2, float y2);
float torads(float angle);
- ColorWindow *window;
+ ColorGUI *gui;
float oldhue;
float oldsaturation;
int button_down;
class PaletteWheelValue : public BC_SubWindow
{
public:
- PaletteWheelValue(ColorWindow *window, int x, int y);
+ PaletteWheelValue(ColorGUI *gui, int x, int y);
~PaletteWheelValue();
void create_objects();
int button_press_event();
int cursor_motion_event();
int button_release_event();
int draw(float hue, float saturation, float value);
- ColorWindow *window;
+ ColorGUI *gui;
int button_down;
// Gradient
VFrame *frame;
class PaletteOutput : public BC_SubWindow
{
public:
- PaletteOutput(ColorWindow *window, int x, int y);
+ PaletteOutput(ColorGUI *gui, int x, int y);
~PaletteOutput();
void create_objects();
int handle_event();
int draw();
- ColorWindow *window;
+ ColorGUI *gui;
};
class PaletteHue : public BC_ISlider
{
public:
- PaletteHue(ColorWindow *window, int x, int y);
+ PaletteHue(ColorGUI *gui, int x, int y);
~PaletteHue();
int handle_event();
- ColorWindow *window;
+ ColorGUI *gui;
};
class PaletteSat : public BC_FSlider
{
public:
- PaletteSat(ColorWindow *window, int x, int y);
+ PaletteSat(ColorGUI *gui, int x, int y);
~PaletteSat();
int handle_event();
- ColorWindow *window;
+ ColorGUI *gui;
};
class PaletteVal : public BC_FSlider
{
public:
- PaletteVal(ColorWindow *window, int x, int y);
+ PaletteVal(ColorGUI *gui, int x, int y);
~PaletteVal();
int handle_event();
- ColorWindow *window;
+ ColorGUI *gui;
};
class PaletteRed : public BC_FSlider
{
public:
- PaletteRed(ColorWindow *window, int x, int y);
+ PaletteRed(ColorGUI *gui, int x, int y);
~PaletteRed();
int handle_event();
- ColorWindow *window;
+ ColorGUI *gui;
};
class PaletteGrn : public BC_FSlider
{
public:
- PaletteGrn(ColorWindow *window, int x, int y);
+ PaletteGrn(ColorGUI *gui, int x, int y);
~PaletteGrn();
int handle_event();
- ColorWindow *window;
+ ColorGUI *gui;
};
class PaletteBlu : public BC_FSlider
{
public:
- PaletteBlu(ColorWindow *window, int x, int y);
+ PaletteBlu(ColorGUI *gui, int x, int y);
~PaletteBlu();
int handle_event();
- ColorWindow *window;
+ ColorGUI *gui;
};
class PaletteAlpha : public BC_FSlider
{
public:
- PaletteAlpha(ColorWindow *window, int x, int y);
+ PaletteAlpha(ColorGUI *gui, int x, int y);
~PaletteAlpha();
int handle_event();
- ColorWindow *window;
+ ColorGUI *gui;
};
class PaletteLum : public BC_FSlider
{
public:
- PaletteLum(ColorWindow *window, int x, int y);
+ PaletteLum(ColorGUI *gui, int x, int y);
~PaletteLum();
int handle_event();
- ColorWindow *window;
+ ColorGUI *gui;
};
class PaletteCr : public BC_FSlider
{
public:
- PaletteCr(ColorWindow *window, int x, int y);
+ PaletteCr(ColorGUI *gui, int x, int y);
~PaletteCr();
int handle_event();
- ColorWindow *window;
+ ColorGUI *gui;
};
class PaletteCb : public BC_FSlider
{
public:
- PaletteCb(ColorWindow *window, int x, int y);
+ PaletteCb(ColorGUI *gui, int x, int y);
~PaletteCb();
int handle_event();
- ColorWindow *window;
+ ColorGUI *gui;
};
class PaletteNum : public BC_TumbleTextBox
{
public:
- ColorWindow *window;
+ ColorGUI *gui;
float *output;
- PaletteNum(ColorWindow *window, int x, int y,
+ PaletteNum(ColorGUI *gui, int x, int y,
float &output, float min, float max);
~PaletteNum();
void update_output() { *output = atof(get_text()); }
class PaletteRGB : public PaletteNum
{
public:
- PaletteRGB(ColorWindow *window, int x, int y,
+ PaletteRGB(ColorGUI *gui, int x, int y,
float &output, float min, float max)
- : PaletteNum(window, x, y, output, min, max) {}
+ : PaletteNum(gui, x, y, output, min, max) {}
int handle_event();
};
class PaletteYUV : public PaletteNum
{
public:
- PaletteYUV(ColorWindow *window, int x, int y,
+ PaletteYUV(ColorGUI *gui, int x, int y,
float &output, float min, float max)
- : PaletteNum(window, x, y, output, min, max) {}
+ : PaletteNum(gui, x, y, output, min, max) {}
int handle_event();
};
class PaletteHSV : public PaletteNum
{
public:
- PaletteHSV(ColorWindow *window, int x, int y,
+ PaletteHSV(ColorGUI *gui, int x, int y,
float &output, float min, float max)
- : PaletteNum(window, x, y, output, min, max) {}
+ : PaletteNum(gui, x, y, output, min, max) {}
int handle_event();
};
class PaletteAPH : public PaletteNum
{
public:
- PaletteAPH(ColorWindow *window, int x, int y,
+ PaletteAPH(ColorGUI *gui, int x, int y,
float &output, float min, float max)
- : PaletteNum(window, x, y, output, min, max) {}
+ : PaletteNum(gui, x, y, output, min, max) {}
int handle_event();
};
class PaletteHexButton : public BC_GenericButton
{
public:
- PaletteHexButton(ColorWindow *window, int x, int y);
+ PaletteHexButton(ColorGUI *gui, int x, int y);
~PaletteHexButton();
int handle_event();
- ColorWindow *window;
+ ColorGUI *gui;
};
class PaletteHex : public BC_TextBox
{
public:
- PaletteHex(ColorWindow *window, int x, int y, const char *hex);
+ PaletteHex(ColorGUI *gui, int x, int y, const char *hex);
~PaletteHex();
int keypress_event();
void update();
- ColorWindow *window;
+ ColorGUI *gui;
};
class PaletteGrabButton : public BC_Button
{
public:
- PaletteGrabButton(ColorWindow *window, int x, int y);
+ PaletteGrabButton(ColorGUI *gui, int x, int y);
~PaletteGrabButton();
int handle_event();
- ColorWindow *window;
+ ColorGUI *gui;
VFrame *vframes[3];
};
class PaletteHistory : public BC_SubWindow
{
public:
- PaletteHistory(ColorWindow *window, int x, int y);
+ PaletteHistory(ColorGUI *gui, int x, int y);
~PaletteHistory();
void update(int flush=1);
int button_press_event();
int cursor_leave_event();
int repeat_event(int64_t duration);
- ColorWindow *window;
+ ColorGUI *gui;
int button_down;
};
+class ColorButton : public BC_Button
+{
+public:
+ ColorButton(const char *title,
+ int x, int y, int w, int h,
+ int color, int alpha, int ok_cancel);
+ ~ColorButton();
+
+ virtual void set_color(int color);
+ virtual int handle_new_color(int color, int alpha);
+ virtual void handle_done_event(int result);
+
+ void close_picker();
+ void update_gui(int color, int alpha);
+ void update_gui(int color);
+ int handle_event();
+
+ const char *title;
+ int color, alpha, ok_cancel;
+ int orig_color, orig_alpha;
+
+ VFrame *vframes[3];
+ ColorButtonPicker *color_picker;
+ ColorButtonThread *color_thread;
+};
+
+class ColorButtonPicker : public ColorPicker
+{
+public:
+ ColorButtonPicker(ColorButton *color_button);
+ ~ColorButtonPicker();
+ void update(int color, int alpha);
+ int handle_new_color(int color, int alpha);
+ void handle_done_event(int result);
+ void update_gui();
+ void update_gui(int color, int alpha);
+
+ ColorButton *color_button;
+};
+
+class ColorButtonThread : public Thread
+{
+public:
+ ColorButtonThread(ColorButton *color_button);
+ ~ColorButtonThread();
+
+ void start();
+ void stop();
+ void run();
+
+ ColorButton *color_button;
+ Condition *update_lock;
+ int done;
+};
+
+class ColorBoxButton : public ColorButton
+{
+public:
+ ColorBoxButton(const char *title,
+ int x, int y, int w, int h,
+ int color, int alpha, int ok_cancel);
+ ~ColorBoxButton();
+ void create_objects();
+
+ virtual int handle_new_color(int color, int alpha);
+ virtual void handle_done_event(int result);
+ void set_color(int color);
+};
+
+class ColorCircleButton : public ColorButton
+{
+public:
+ ColorCircleButton(const char *title,
+ int x, int y, int w, int h,
+ int color, int alpha, int ok_cancel);
+ ~ColorCircleButton();
+ void create_objects();
+
+ virtual int handle_new_color(int color, int alpha);
+ virtual void handle_done_event(int result);
+ void set_color(int color);
+};
+
#endif