-
/*
* 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 <stdio.h>
+#include <stdint.h>
+
#include "automation.h"
-#include "cicolors.h"
+#include "bccolors.h"
#include "clip.h"
#include "condition.h"
#include "cpanel.h"
}
-
-
-
-
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 *title1, *title2, *title3, *title4, *title5, *title6, *title7;
+ BC_Title *title0, *title1, *title2, *title3, *title4, *title5, *title6, *title7;
+ add_subwindow(title0 = new BC_Title(x, y,_("X,Y:")));
+ y += title0->get_h() + margin;
add_subwindow(title7 = new BC_Title(x, y, _("Radius:")));
y += BC_TextBox::calculate_h(this, MEDIUMFONT, 1, 1) + margin;
y += title5->get_h() + margin;
add_subwindow(title6 = new BC_Title(x, y, "V:"));
+ add_subwindow(current = new BC_Title(x2, title0->get_y(), ""));
radius = new CWindowCoord(this, x2, title7->get_y(),
mwindow->edl->session->eyedrop_radius);
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();
}
void CWindowEyedropGUI::update()
{
- radius->update((int64_t)mwindow->edl->session->eyedrop_radius);
+ char string[BCTEXTLEN];
+ sprintf(string, "%d, %d",
+ thread->gui->eyedrop_x,
+ thread->gui->eyedrop_y);
+ current->update(string);
- red->update(mwindow->edl->local_session->red);
- green->update(mwindow->edl->local_session->green);
- blue->update(mwindow->edl->local_session->blue);
+ radius->update((int64_t)mwindow->edl->session->eyedrop_radius);
+ 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());
{ FloatAuto::SMOOTH,
true,
"tan_smooth",
- _("\"smooth\" Curve on current Camera Keyframes")
+ N_("\"smooth\" Curve on current Camera Keyframes")
};
const _CVD Camera_Crv_Linear =
{ FloatAuto::LINEAR,
true,
"tan_linear",
- _("\"linear\" Curve on current Camera Keyframes")
+ N_("\"linear\" Curve on current Camera Keyframes")
};
const _CVD Projector_Crv_Smooth =
{ FloatAuto::SMOOTH,
false,
"tan_smooth",
- _("\"smooth\" Curve on current Projector Keyframes")
+ N_("\"smooth\" Curve on current Projector Keyframes")
};
const _CVD Projector_Crv_Linear =
{ FloatAuto::LINEAR,
false,
"tan_linear",
- _("\"linear\" Curve on current Projector Keyframes")
+ N_("\"linear\" Curve on current Projector Keyframes")
};
-
// Implementation Class für Keyframe Curve Mode buttons
//
// This button reflects the state of the "current" keyframe
{
this->gui = gui;
this->mwindow = mwindow;
- set_tooltip(cfg.tooltip);
+ set_tooltip(_(cfg.tooltip));
}
void CWindowCurveToggle::check_toggle_state(FloatAuto *x, FloatAuto *y, FloatAuto *z)
}
+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)
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();
if(z_auto)
{
float zoom = atof(z->get_text());
- if(zoom > 10) zoom = 10;
+ if(zoom > 100.) zoom = 100.;
else
- if(zoom < 0) zoom = 0;
+ if(zoom < 0.01) zoom = 0.01;
// Doesn't allow user to enter from scratch
// if(zoom != atof(z->get_text()))
// z->update(zoom);
x->update(x_auto->get_value());
if(y_auto)
y->update(y_auto->get_value());
- if(z_auto)
- z->update(z_auto->get_value());
+ if(z_auto) {
+ float value = z_auto->get_value();
+ z->update(value);
+ thread->gui->composite_panel->cpanel_zoom->update(value);
+ }
if( x_auto && y_auto && z_auto )
{
}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
CWindowProjectorGUI::CWindowProjectorGUI(MWindow *mwindow, CWindowTool *thread)
: CWindowToolGUI(mwindow,
thread,
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();
if(z_auto)
{
float zoom = atof(z->get_text());
- if(zoom > 10000) zoom = 10000;
- else
- if(zoom < 0) zoom = 0;
+ if(zoom > 100.) zoom = 100.;
+ else if(zoom < 0.01) zoom = 0.01;
// if (zoom != atof(z->get_text()))
// z->update(zoom);
z_auto->set_value(zoom);
x->update(x_auto->get_value());
if(y_auto)
y->update(y_auto->get_value());
- if(z_auto)
- z->update(z_auto->get_value());
+ if(z_auto) {
+ float value = z_auto->get_value();
+ z->update(value);
+ thread->gui->composite_panel->cpanel_zoom->update(value);
+ }
if( x_auto && y_auto && z_auto )
{
}
}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
CWindowProjectorLeft::CWindowProjectorLeft(MWindow *mwindow, CWindowProjectorGUI *gui, int x, int y)
: BC_Button(x, y, mwindow->theme->get_image_set("left_justify"))
{
}
-
-
-
-
-
-
CWindowMaskMode::CWindowMaskMode(MWindow *mwindow,
CWindowToolGUI *gui, int x, int y, const char *text)
: BC_PopupMenu(x, y, 220, text, 1)
Track *track;
MaskPoint *point;
SubMask *mask;
+ int total_points = 0;
// Get existing keyframe
((CWindowMaskGUI*)gui)->get_keyframe(track, autos, keyframe, mask, point, 0);
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++)
submask->points.remove_object(
submask->points.values[submask->points.total - 1]);
}
+ total_points = submask->points.total;
+
// Commit change to span of keyframes
((MaskAutos*)track->automation->autos[AUTOMATION_MASK])->update_parameter(&temp_keyframe);
#else
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;
submask->points.remove_object(
submask->points.values[submask->points.total - 1]);
}
-
+ total_points = submask->points.total;
if(current == (MaskAuto*)autos->default_auto)
current = (MaskAuto*)autos->first;
current = (MaskAuto*)NEXT;
}
#endif
+ if( mwindow->cwindow->gui->affected_point >= total_points )
+ mwindow->cwindow->gui->affected_point =
+ total_points > 0 ? total_points-1 : 0;
gui->update();
gui->update_preview();
}
+CWindowMaskAffectedPoint::CWindowMaskAffectedPoint(MWindow *mwindow,
+ CWindowToolGUI *gui, int x, int y)
+ : BC_TumbleTextBox(gui,
+ (int64_t)mwindow->cwindow->gui->affected_point,
+ (int64_t)0, INT64_MAX, x, y, 100)
+{
+ this->mwindow = mwindow;
+ this->gui = gui;
+}
+
+CWindowMaskAffectedPoint::~CWindowMaskAffectedPoint()
+{
+}
+
+int CWindowMaskAffectedPoint::handle_event()
+{
+ int total_points = 0;
+ int affected_point = atol(get_text());
+ Track *track = mwindow->cwindow->calculate_affected_track();
+ if(track) {
+ MaskAutos *autos = (MaskAutos*)track->automation->autos[AUTOMATION_MASK];
+ MaskAuto *keyframe = (MaskAuto*)mwindow->cwindow->calculate_affected_auto(autos, 0);
+ if( keyframe ) {
+ SubMask *mask = keyframe->get_submask(mwindow->edl->session->cwindow_mask);
+ total_points = mask->points.size();
+ }
+ }
+ int active_point = affected_point;
+ if( affected_point >= total_points )
+ affected_point = total_points - 1;
+ else if( affected_point < 0 )
+ affected_point = 0;
+ if( active_point != affected_point )
+ update((int64_t)affected_point);
+ mwindow->cwindow->gui->affected_point = affected_point;
+ gui->update();
+ gui->update_preview();
+ return 1;
+}
+
+
mask, point, create_it);
if(track)
- {
+ {
#ifdef USE_KEYFRAME_SPANNING
// Create temp keyframe
MaskAuto temp_keyframe(mwindow->edl, autos);
#else
int create_it = 1;
#endif
-
+
mwindow->undo->update_undo_before(_("mask value"), this);
((CWindowMaskGUI*)gui)->get_keyframe(track, autos, keyframe,
mask, point, create_it);
}
+CWindowDisableOpenGLMasking::CWindowDisableOpenGLMasking(CWindowToolGUI *gui, int x, int y)
+ : BC_CheckBox(x, y, 1, _("Disable OpenGL masking"))
+{
+ this->gui = gui;
+}
+
+int CWindowDisableOpenGLMasking::handle_event()
+{
+ Track *track;
+ MaskAutos *autos;
+ MaskAuto *keyframe;
+ SubMask *mask;
+ MaskPoint *point;
+ ((CWindowMaskGUI*)gui)->get_keyframe(track, autos, keyframe, mask, point, 1);
+
+ if (keyframe) {
+ keyframe->disable_opengl_masking = get_value();
+ gui->update_preview();
+ }
+ return 1;
+}
+
+
+
thread,
_(PROGRAM_NAME ": Mask"),
330,
- 280)
+ 310)
{
this->mwindow = mwindow;
this->thread = thread;
+ number = 0;
+ active_point = 0;
+ feather = 0;
}
CWindowMaskGUI::~CWindowMaskGUI()
{
lock_window("CWindowMaskGUI::~CWindowMaskGUI");
delete number;
+ delete active_point;
delete feather;
unlock_window();
}
add_subwindow(value = new CWindowMaskValue(mwindow, this, x + title->get_w() + margin, y));
y += value->get_h() + margin;
add_subwindow(delete_point = new CWindowMaskDelete(mwindow, this, x, y));
+ int x1 = x + delete_point->get_w() + 2*margin;
+ add_subwindow(title = new BC_Title(x1, y, _("Point:")));
+ x1 += title->get_w() + margin;
+ active_point = new CWindowMaskAffectedPoint(mwindow, this, x1, y);
+ active_point->create_objects();
y += delete_point->get_h() + margin;
add_subwindow(title = new BC_Title(x, y, _("Mask number:")));
number = new CWindowMaskNumber(mwindow,
x = 10;
y += this->y->get_h() + margin;
- add_subwindow(title = new BC_Title(x, y, _("Press Ctrl to move a point")));
+ add_subwindow(title = new BC_Title(x, y, _("Press Shift to move an end point")));
y += title->get_h() + margin;
- add_subwindow(title = new BC_Title(x, y, _("Press Alt to translate the mask")));
+ 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, _("Press Shift to edit bezier curve")));
-
+ add_subwindow(title = new BC_Title(x, y, _("Press Alt to translate the mask")));
y += 30;
-// add_subwindow(title = new BC_Title(x, y, _("Apply mask before plugins:")));
- add_subwindow(this->apply_before_plugins = new CWindowMaskBeforePlugins(this,
- 10,
- y));
-// this->apply_before_plugins->create_objects();
+ add_subwindow(this->apply_before_plugins = new CWindowMaskBeforePlugins(this, 10, y));
+ y += this->apply_before_plugins->get_h() + margin;
+ add_subwindow(this->disable_opengl_masking = new CWindowDisableOpenGLMasking(this, 10, y));
update();
unlock_window();
feather->update((int64_t)autos->get_feather(position_i, PLAY_FORWARD));
value->update((int64_t)autos->get_value(position_i, PLAY_FORWARD));
apply_before_plugins->update((int64_t)keyframe->apply_before_plugins);
+ disable_opengl_masking->update((int64_t)keyframe->disable_opengl_masking);
}
}
-//printf("CWindowMaskGUI::update 1\n");
+//printf("CWindowMaskGUI::update 1\n");
+ active_point->update((int64_t)mwindow->cwindow->gui->affected_point);
number->update((int64_t)mwindow->edl->session->cwindow_mask);
//printf("CWindowMaskGUI::update 1\n");
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();