{
BC_WindowBase *cwdw = get_canvas();
if( !cwdw ) return;
- cwdw->set_bg_color(BLACK);
+ cwdw->set_bg_color(get_clear_color());
cwdw->clear_box(0,0, cwdw->get_w(), cwdw->get_h());
if( flash ) cwdw->flash();
}
CanvasOutput::CanvasOutput(Canvas *canvas,
- int x,
- int y,
- int w,
- int h)
+ int x, int y, int w, int h)
: BC_SubWindow(x, y, w, h, BLACK)
{
this->canvas = canvas;
CWindowMaskFeather::CWindowMaskFeather(MWindow *mwindow, CWindowMaskGUI *gui, int x, int y)
- : BC_TumbleTextBox(gui, 0, -FEATHER_MAX, FEATHER_MAX, x, y, 64, 2)
+ : BC_TumbleTextBox(gui, 0, INT_MIN, INT_MAX, x, y, 64, 2)
{
this->mwindow = mwindow;
this->gui = gui;
if( !gui->mask_enables[i]->get_value() ) continue;
SubMask *sub_mask = keyframe->get_submask(i);
float feather = sub_mask->feather + change;
- bclamp(feather, -FEATHER_MAX, FEATHER_MAX);
sub_mask->feather = feather;
}
#ifdef USE_KEYFRAME_SPANNING
CWindowMaskFeatherSlider::CWindowMaskFeatherSlider(MWindow *mwindow,
CWindowMaskGUI *gui, int x, int y, int w, float v)
- : BC_FSlider(x, y, 0, w, w, -FEATHER_MAX, FEATHER_MAX, v)
+ : BC_FSlider(x, y, 0, w, w, -FEATHER_MAX-5, FEATHER_MAX+5, v)
{
this->mwindow = mwindow;
this->gui = gui;
timer = new Timer();
stick = 0;
last_v = 0;
+ max = FEATHER_MAX;
}
CWindowMaskFeatherSlider::~CWindowMaskFeatherSlider()
int CWindowMaskFeatherSlider::handle_event()
{
+ int sticky = 0;
float v = get_value();
- if( stick > 0 ) {
- int64_t ms = timer->get_difference();
- if( ms < 250 && --stick > 0 ) {
- if( get_value() == 0 ) return 1;
- update(v = 0);
+ if( stick && timer->get_difference() >= 250 )
+ stick = 0; // no events for .25 sec
+ if( stick && (last_v * (v-last_v)) < 0 )
+ stick = 0; // dv changed direction
+ if( stick ) {
+ if( --stick > 0 ) {
+ timer->update();
+ update(last_v);
+ return 1;
}
- else {
- stick = 0;
- last_v = v;
+ if( last_v ) {
+ max *= 1.25;
+ update(get_w(), v=last_v, -max-5, max+5);
+ button_release_event();
}
}
- else if( (last_v>=0 && v<0) || (last_v<0 && v>=0) ) {
- stick = 16;
- v = 0;
- }
- else
- last_v = v;
- timer->update();
+ else if( v > max ) { v = max; sticky = 24; }
+ else if( v < -max ) { v = -max; sticky = 24; }
+ else if( v>=0 ? last_v<0 : last_v>=0 ) { v = 0; sticky = 16; }
+ if( sticky ) { update(v); stick = sticky; timer->update(); }
+ last_v = v;
gui->feather->BC_TumbleTextBox::update(v);
return gui->feather->update_value(v);
}
int CWindowMaskFeatherSlider::update(float v)
{
- return BC_FSlider::update(v);
+ while( max < v ) max *= 1.25;
+ return update(get_w(), v, -max-5, max+5);
+}
+int CWindowMaskFeatherSlider::update(int r, float v, float mn, float mx)
+{
+ return BC_FSlider::update(r, v, mn, mx);
}
CWindowMaskFade::CWindowMaskFade(MWindow *mwindow, CWindowMaskGUI *gui, int x, int y)
" float fg = rv>=0 ? vv : 1.;\n"
" float bg = rv>=0 ? 1. : vv;\n"
" int len = points.length();\n"
+ " float sig2 = -log(255.0);\n"
" for( int i=0; i<len; ++i ) {\n"
" float dx = float(points[i].x) - gl_FragCoord.x;\n"
" float dy = float(points[i].y) - gl_FragCoord.y;\n"
" float dd = dx*dx + dy*dy;\n"
" if( dd >= rr ) continue;\n"
- " float d = dd*dr;\n"
- " float a = (1.-d)*fg + d*bg;\n"
+ " float ss = dd / rr;\n"
+ " float d = exp(ss * sig2);\n"
+ " float a = d*fg + (1.-d)*bg;\n"
" if( rv*(color.a-a) > 0 ) color = vec4(a);\n"
" }\n"
"}\n";