-
/*
* CINELERRA
- * Copyright (C) 2008-2014 Adam Williams <broadcast at earthling dot net>
+ * Copyright (C) 2008-2017 Adam Williams <broadcast at earthling dot net>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
#include <stdint.h>
#include "automation.h"
-#include "cicolors.h"
+#include "bccolors.h"
#include "clip.h"
#include "condition.h"
#include "cpanel.h"
//printf("CWindowTool::start_tool 1\n");
if(current_tool != operation)
{
+ int previous_tool = current_tool;
current_tool = operation;
switch(operation)
{
case CWINDOW_RULER:
new_gui = new CWindowRulerGUI(mwindow, this);
break;
+ case CWINDOW_PROTECT:
+ mwindow->edl->session->tool_window = 0;
+ gui->composite_panel->operation[CWINDOW_TOOL_WINDOW]->update(0);
+ // fall thru
default:
result = 1;
stop_tool();
output_lock->lock("CWindowTool::start_tool");
this->tool_gui = new_gui;
tool_gui->create_objects();
-
- if(mwindow->edl->session->tool_window &&
- mwindow->session->show_cwindow) tool_gui->show_window();
- tool_gui->lock_window("CWindowTool::start_tool 1");
- tool_gui->flush();
- tool_gui->unlock_window();
-
+ if( previous_tool == CWINDOW_PROTECT || previous_tool == CWINDOW_NONE ) {
+ mwindow->edl->session->tool_window = 1;
+ gui->composite_panel->operation[CWINDOW_TOOL_WINDOW]->update(1);
+ }
+ update_show_window();
// Signal thread to run next tool GUI
input_lock->unlock();
int CWindowToolGUI::keypress_event()
{
- if(get_keypress() == 'w' || get_keypress() == 'W')
+ int result = 0;
+
+ switch( get_keypress() ) {
+ case 'w':
+ case 'W':
return close_event();
- return 0;
+ case KEY_F1:
+ case KEY_F2:
+ case KEY_F3:
+ case KEY_F4:
+ case KEY_F5:
+ case KEY_F6:
+ case KEY_F7:
+ case KEY_F8:
+ case KEY_F9:
+ case KEY_F10:
+ case KEY_F11:
+ case KEY_F12:
+ resend_event(thread->gui);
+ result = 1;
+ }
+
+ return result;
}
int CWindowToolGUI::translation_event()
CWindowEyedropGUI::CWindowEyedropGUI(MWindow *mwindow, CWindowTool *thread)
- : CWindowToolGUI(mwindow,
- thread,
- _(PROGRAM_NAME ": Color"),
- 200,
- 250)
+ : CWindowToolGUI(mwindow, thread, _(PROGRAM_NAME ": Color"), 220, 290)
{
}
void CWindowEyedropGUI::create_objects()
{
int margin = mwindow->theme->widget_border;
- int x = margin;
- int y = margin;
- int x2 = 70;
+ int x = 10 + margin;
+ int y = 10 + margin;
+ int x2 = 70, x3 = x2 + 60;
lock_window("CWindowEyedropGUI::create_objects");
BC_Title *title0, *title1, *title2, *title3, *title4, *title5, *title6, *title7;
add_subwindow(title0 = new BC_Title(x, y,_("X,Y:")));
radius->create_objects();
radius->set_boundaries((int64_t)0, (int64_t)255);
-
add_subwindow(red = new BC_Title(x2, title1->get_y(), "0"));
add_subwindow(green = new BC_Title(x2, title2->get_y(), "0"));
add_subwindow(blue = new BC_Title(x2, title3->get_y(), "0"));
+ add_subwindow(rgb_hex = new BC_Title(x3, red->get_y(), "#000000"));
add_subwindow(this->y = new BC_Title(x2, title4->get_y(), "0"));
add_subwindow(this->u = new BC_Title(x2, title5->get_y(), "0"));
add_subwindow(this->v = new BC_Title(x2, title6->get_y(), "0"));
+ add_subwindow(yuv_hex = new BC_Title(x3, this->y->get_y(), "#000000"));
- y = title6->get_y() + this->v->get_h() + margin;
+ y = title6->get_y() + this->v->get_h() + 2*margin;
add_subwindow(sample = new BC_SubWindow(x, y, 50, 50));
+ y += sample->get_h() + margin;
+ add_subwindow(use_max = new CWindowEyedropCheckBox(mwindow, this, x, y));
update();
unlock_window();
}
radius->update((int64_t)mwindow->edl->session->eyedrop_radius);
- red->update(mwindow->edl->local_session->red);
- green->update(mwindow->edl->local_session->green);
- blue->update(mwindow->edl->local_session->blue);
-
+ LocalSession *local_session = mwindow->edl->local_session;
+ int use_max = local_session->use_max;
+ float r = use_max ? local_session->red_max : local_session->red;
+ float g = use_max ? local_session->green_max : local_session->green;
+ float b = use_max ? local_session->blue_max : local_session->blue;
+ this->red->update(r);
+ this->green->update(g);
+ this->blue->update(b);
+
+ int rx = 255*r + 0.5; bclamp(rx,0,255);
+ int gx = 255*g + 0.5; bclamp(gx,0,255);
+ int bx = 255*b + 0.5; bclamp(bx,0,255);
+ char rgb_text[BCSTRLEN];
+ sprintf(rgb_text, "#%02x%02x%02x", rx, gx, bx);
+ rgb_hex->update(rgb_text);
+
float y, u, v;
- YUV::rgb_to_yuv_f(mwindow->edl->local_session->red,
- mwindow->edl->local_session->green,
- mwindow->edl->local_session->blue,
- y,
- u,
- v);
+ YUV::yuv.rgb_to_yuv_f(r, g, b, y, u, v);
this->y->update(y);
- this->u->update(u);
- this->v->update(v);
-
- int red = (int)(CLIP(mwindow->edl->local_session->red, 0, 1) * 0xff);
- int green = (int)(CLIP(mwindow->edl->local_session->green, 0, 1) * 0xff);
- int blue = (int)(CLIP(mwindow->edl->local_session->blue, 0, 1) * 0xff);
- sample->set_color((red << 16) | (green << 8) | blue);
+ this->u->update(u); u += 0.5;
+ this->v->update(v); v += 0.5;
+
+ int yx = 255*y + 0.5; bclamp(yx,0,255);
+ int ux = 255*u + 0.5; bclamp(ux,0,255);
+ int vx = 255*v + 0.5; bclamp(vx,0,255);
+ char yuv_text[BCSTRLEN];
+ sprintf(yuv_text, "#%02x%02x%02x", yx, ux, vx);
+ yuv_hex->update(yuv_text);
+
+ int rgb = (rx << 16) | (gx << 8) | (bx << 0);
+ sample->set_color(rgb);
sample->draw_box(0, 0, sample->get_w(), sample->get_h());
sample->set_color(BLACK);
sample->draw_rectangle(0, 0, sample->get_w(), sample->get_h());
}
+CWindowEyedropCheckBox::CWindowEyedropCheckBox(MWindow *mwindow,
+ CWindowEyedropGUI *gui, int x, int y)
+ : BC_CheckBox(x, y, mwindow->edl->local_session->use_max, _("Use maximum"))
+{
+ this->mwindow = mwindow;
+ this->gui = gui;
+}
+
+int CWindowEyedropCheckBox::handle_event()
+{
+ mwindow->edl->local_session->use_max = get_value();
+
+ gui->update();
+ return 1;
+}
+
+
CWindowCameraGUI::CWindowCameraGUI(MWindow *mwindow, CWindowTool *thread)
: CWindowToolGUI(mwindow,
thread,
void CWindowCameraGUI::update_preview()
{
- mwindow->restart_brender();
- mwindow->sync_parameters(CHANGE_PARAMS);
-
- mwindow->cwindow->playback_engine->que->send_command(CURRENT_FRAME,
- CHANGE_NONE,
- mwindow->edl,
- 1);
mwindow->gui->lock_window("CWindowCameraGUI::update_preview");
+ mwindow->restart_brender();
mwindow->gui->draw_overlays(1);
+ mwindow->sync_parameters(CHANGE_PARAMS);
mwindow->gui->unlock_window();
+ mwindow->cwindow->refresh_frame(CHANGE_NONE);
mwindow->cwindow->gui->lock_window("CWindowCameraGUI::update_preview");
mwindow->cwindow->gui->canvas->draw_refresh();
mwindow->cwindow->gui->unlock_window();
void CWindowProjectorGUI::update_preview()
{
+ mwindow->gui->lock_window("CWindowProjectorGUI::update_preview");
mwindow->restart_brender();
mwindow->sync_parameters(CHANGE_PARAMS);
- mwindow->cwindow->playback_engine->que->send_command(CURRENT_FRAME,
- CHANGE_NONE,
- mwindow->edl,
- 1);
- // TODO: really need to lock the main window??
- mwindow->gui->lock_window("CWindowProjectorGUI::update_preview");
mwindow->gui->draw_overlays(1);
mwindow->gui->unlock_window();
+ mwindow->cwindow->refresh_frame(CHANGE_NONE);
mwindow->cwindow->gui->lock_window("CWindowProjectorGUI::update_preview");
mwindow->cwindow->gui->canvas->draw_refresh();
mwindow->cwindow->gui->unlock_window();
temp_keyframe.copy_data(keyframe);
// Update parameter
SubMask *submask = temp_keyframe.get_submask(mwindow->edl->session->cwindow_mask);
+ if( shift_down() )
+ submask->points.remove_all_objects();
+
for(int i = mwindow->cwindow->gui->affected_point;
i < submask->points.total - 1;
i++)
current; )
{
SubMask *submask = current->get_submask(mwindow->edl->session->cwindow_mask);
+ if( shift_down() )
+ submask->points.remove_all_objects();
for(int i = mwindow->cwindow->gui->affected_point;
i < submask->points.total - 1;
CWindowMaskGUI::CWindowMaskGUI(MWindow *mwindow, CWindowTool *thread)
- : CWindowToolGUI(mwindow,
- thread,
- _(PROGRAM_NAME ": Mask"),
- 330,
- 310)
+ : CWindowToolGUI(mwindow, thread,
+ _(PROGRAM_NAME ": Mask"), 330, 320)
{
this->mwindow = mwindow;
this->thread = thread;
y += title->get_h() + margin;
add_subwindow(title = new BC_Title(x, y, _("Press Ctrl to move a control point")));
y += title->get_h() + margin;
+ add_subwindow(title = new BC_Title(x, y, _("Shift+click Delete to delete the mask")));
+ y += title->get_h() + margin;
add_subwindow(title = new BC_Title(x, y, _("Press Alt to translate the mask")));
y += 30;
void CWindowMaskGUI::update_preview()
{
+ mwindow->gui->lock_window("CWindowMaskGUI::update_preview");
mwindow->restart_brender();
mwindow->sync_parameters(CHANGE_PARAMS);
- mwindow->cwindow->playback_engine->que->send_command(CURRENT_FRAME,
- CHANGE_NONE,
- mwindow->edl,
- 1);
+ mwindow->gui->draw_overlays(1);
+ mwindow->gui->unlock_window();
+ mwindow->cwindow->refresh_frame(CHANGE_NONE);
mwindow->cwindow->gui->lock_window("CWindowMaskGUI::update_preview");
mwindow->cwindow->gui->canvas->draw_refresh();
mwindow->cwindow->gui->unlock_window();
void CWindowRulerGUI::create_objects()
{
- int x = 10, y = 10;
+ int x = 10, y = 10, x1 = 100;
BC_Title *title;
lock_window("CWindowRulerGUI::create_objects");
add_subwindow(title = new BC_Title(x, y, _("Current:")));
- add_subwindow(current = new BC_Title(x + title->get_w() + 10, y, ""));
+ add_subwindow(current = new BC_TextBox(x1, y, 200, 1, ""));
y += title->get_h() + 5;
-
add_subwindow(title = new BC_Title(x, y, _("Point 1:")));
- add_subwindow(point1 = new BC_Title(x + title->get_w() + 10, y, ""));
+ add_subwindow(point1 = new BC_TextBox(x1, y, 200, 1, ""));
y += title->get_h() + 5;
-
add_subwindow(title = new BC_Title(x, y, _("Point 2:")));
- add_subwindow(point2 = new BC_Title(x + title->get_w() + 10, y, ""));
+ add_subwindow(point2 = new BC_TextBox(x1, y, 200, 1, ""));
+ y += title->get_h() + 5;
+ add_subwindow(title = new BC_Title(x, y, _("Deltas:")));
+ add_subwindow(deltas = new BC_TextBox(x1, y, 200, 1, ""));
y += title->get_h() + 5;
-
add_subwindow(title = new BC_Title(x, y, _("Distance:")));
- add_subwindow(distance = new BC_Title(x + title->get_w() + 10, y, ""));
+ add_subwindow(distance = new BC_TextBox(x1, y, 200, 1, ""));
y += title->get_h() + 5;
add_subwindow(title = new BC_Title(x, y, _("Angle:")));
- add_subwindow(angle = new BC_Title(x + title->get_w() + 10, y, ""));
+ add_subwindow(angle = new BC_TextBox(x1, y, 200, 1, ""));
y += title->get_h() + 10;
char string[BCTEXTLEN];
- sprintf(string, _("Press Ctrl to lock ruler to the\nnearest 45%c angle."), 0xb0);
+ sprintf(string,
+ _("Press Ctrl to lock ruler to the\nnearest 45%c%c angle."),
+ 0xc2, 0xb0); // degrees utf
add_subwindow(title = new BC_Title(x,
y,
string));
void CWindowRulerGUI::update()
{
- double distance_value =
- sqrt(SQR(mwindow->edl->session->ruler_x2 - mwindow->edl->session->ruler_x1) +
- SQR(mwindow->edl->session->ruler_y2 - mwindow->edl->session->ruler_y1));
- double angle_value = atan((mwindow->edl->session->ruler_y2 - mwindow->edl->session->ruler_y1) /
- (mwindow->edl->session->ruler_x2 - mwindow->edl->session->ruler_x1)) *
- 360 /
- 2 /
- M_PI;
-
- if(EQUIV(distance_value, 0.0))
- {
- angle_value = 0.0;
- }
- else
- if(angle_value < 0)
- {
- angle_value *= -1;
- }
-
char string[BCTEXTLEN];
- sprintf(string, "%d, %d",
- mwindow->session->cwindow_output_x,
- mwindow->session->cwindow_output_y);
+ int cx = mwindow->session->cwindow_output_x;
+ int cy = mwindow->session->cwindow_output_y;
+ sprintf(string, "%d, %d", cx, cy);
current->update(string);
- sprintf(string, "%.0f, %.0f",
- mwindow->edl->session->ruler_x1,
- mwindow->edl->session->ruler_y1);
+ double x1 = mwindow->edl->session->ruler_x1;
+ double y1 = mwindow->edl->session->ruler_y1;
+ sprintf(string, "%.0f, %.0f", x1, y1);
point1->update(string);
- sprintf(string, "%.0f, %.0f",
- mwindow->edl->session->ruler_x2,
- mwindow->edl->session->ruler_y2);
+ double x2 = mwindow->edl->session->ruler_x2;
+ double y2 = mwindow->edl->session->ruler_y2;
+ sprintf(string, "%.0f, %.0f", x2, y2);
point2->update(string);
-
- sprintf(string, _("%0.01f pixels"), distance_value);
+ double dx = x2 - x1, dy = y2 - y1;
+ sprintf(string, "%s%.0f, %s%.0f", (dx>=0? "+":""), dx, (dy>=0? "+":""), dy);
+ deltas->update(string);
+ double d = sqrt(dx*dx + dy*dy);
+ sprintf(string, _("%0.01f pixels"), d);
distance->update(string);
- sprintf(string, "%0.02f %c", angle_value, 0xb0);
+ double a = d > 0 ? (atan2(-dy, dx) * 180/M_PI) : 0.;
+ sprintf(string, "%0.02f %c%c", a, 0xc2, 0xb0);
angle->update(string);
}