X-Git-Url: http://git.cinelerra-gg.org/git/?p=goodguy%2Fhistory.git;a=blobdiff_plain;f=cinelerra-5.1%2Fplugins%2Ftitler%2Ftitler.C;h=8d964918177dbe488f46e9b6b95227ee106e5b2a;hp=3e13abecfff6ec0ba0f4888175f80dc099ea242c;hb=9a16c85641dee9f15136f40c8a3195d88d45513f;hpb=5e3715ec449272335bab3419bf21ed4cd6d4bcbf diff --git a/cinelerra-5.1/plugins/titler/titler.C b/cinelerra-5.1/plugins/titler/titler.C index 3e13abec..8d964918 100644 --- a/cinelerra-5.1/plugins/titler/titler.C +++ b/cinelerra-5.1/plugins/titler/titler.C @@ -25,7 +25,6 @@ // Additional support for UTF-8 by // Paolo Rampino aka Akirad - #include "asset.h" #include "bccmodels.h" #include "bcsignals.h" @@ -83,7 +82,7 @@ TitleConfig::TitleConfig() { strcpy(font, "fixed"); strcpy(encoding, DEFAULT_ENCODING); - style = 0; + style = FONT_ALIAS; size = 24; color = BLACK; alpha = 0xff; @@ -290,6 +289,17 @@ GlyphUnit::~GlyphUnit() FT_Done_FreeType(freetype_library); } +static inline void to_mono(VFrame *data) +{ + if( !data ) return; + int w = data->get_w(), h = data->get_h(); + uint8_t **rows = data->get_rows(); + for( int y=0; y= 0x80 ? 0xff : 0; + } +} + void GlyphUnit::process_package(LoadPackage *package) { GlyphPackage *pkg = (GlyphPackage*)package; @@ -492,6 +502,11 @@ printf("GlyphUnit::process_package 1 glyph not found (%s) %04x, '%c'\n", //printf("GlyphUnit::process_package 2\n"); } + + if( !(glyph->style & FONT_ALIAS) ) { + to_mono(glyph->data); + to_mono(glyph->data_stroke); + } } } @@ -544,7 +559,7 @@ TitleUnit::TitleUnit(TitleMain *plugin, TitleEngine *server) static void get_mask_colors(int rgb, int color_model, int &rr, int &gg, int &bb) { int r = 0xff & (rgb>>16), g = 0xff & (rgb>>8), b = 0xff & (rgb>>0); - if( BC_CModels::is_yuv(color_model) ) bc_rgb2yuv(r,g,b, r,g,b); + if( BC_CModels::is_yuv(color_model) ) YUV::yuv.rgb_to_yuv_8(r,g,b); rr = r; gg = g; bb = b; } @@ -573,7 +588,7 @@ void TitleUnit::draw_frame(int mode, VFrame *dst, VFrame *src, int x, int y) while( y_inp < inp_h && y_out < out_h ) { uint8_t *inp = inp_rows[y_inp], *out = out_rows[y_out]; for( int xin=x_inp,xout=x_out*4+3; xin= out_a ) { // crayola for top draw + out[xout+0] = r; out[xout+1] = g; out[xout+2] = b; + out[xout+3] = alpha * in_a / max; + } + else { + int i_r = r, i_g = g-ofs, i_b = b-ofs; + int o_r = out[xout+0], o_g = out[xout+1]-ofs, o_b = out[xout+2]-ofs; + out[xout+0] = COLOR_NORMAL(max, i_r, in_a, o_r, out_a); + out[xout+1] = COLOR_NORMAL(max, i_g, in_a, o_g, out_a) + ofs; + out[xout+2] = COLOR_NORMAL(max, i_b, in_a, o_b, out_a) + ofs; + out[xout+3] = alpha * STD_ALPHA(max, in_a, out_a) / max; + } } ++y_inp; ++y_out; } @@ -599,13 +621,22 @@ void TitleUnit::draw_frame(int mode, VFrame *dst, VFrame *src, int x, int y) while( y_inp < inp_h && y_out < out_h ) { uint8_t *inp = inp_rows[y_inp], *out = out_rows[y_out]; for( int xin=x_inp,xout=x_out*4+0; xin= out_a ) { + int i_r = inp[xinp+0], i_g = inp[xinp+1], i_b = inp[xinp+2]; + out[xout+0] = i_r; out[xout+1] = i_g; out[xout+2] = i_b; + out[xout+3] = alpha * in_a / max; + } + else { + int i_r = inp[xinp+0], i_g = inp[xinp+1]-ofs, i_b = inp[xinp+2]-ofs; + int o_r = out[xout+0], o_g = out[xout+1]-ofs, o_b = out[xout+2]-ofs; + out[xout+0] = COLOR_NORMAL(max, i_r, in_a, o_r, out_a); + out[xout+1] = COLOR_NORMAL(max, i_g, in_a, o_g, out_a) + ofs; + out[xout+2] = COLOR_NORMAL(max, i_b, in_a, o_b, out_a) + ofs; + out[xout+3] = alpha * STD_ALPHA(max, in_a, out_a) / max; + } } ++y_inp; ++y_out; } @@ -675,69 +706,6 @@ LoadPackage* TitleEngine::new_package() return new TitlePackage; } -void TitleTranslateUnit::translation_array_f(transfer_table_f* &table, - float in_x1, float in_x2, int in_total, - float out_x1, float out_x2, int out_total, - int &x1_out, int &x2_out) -{ - int out_w; - //float offset = out_x1 - in_x1; - - x1_out = (int)out_x1; - x2_out = MIN((int)ceil(out_x2), out_total); - if( x1_out >= x2_out ) return; - - out_w = x2_out - x1_out; - table = new transfer_table_f[out_w]; - bzero(table, sizeof(transfer_table_f) * out_w); - - float in_x = in_x1; - for( int out_x=x1_out; out_xin_x1 = (int)in_x; - entry->in_x2 = (int)in_x + 1; - -// Get fraction of output pixel to fill - entry->output_fraction = 1; - - if( out_x1 > out_x ) { - entry->output_fraction -= out_x1 - out_x; - } - - if( out_x2 < out_x + 1 ) { - entry->output_fraction = (out_x2 - out_x); - } - -// Advance in_x until out_x_fraction is filled - float out_x_fraction = entry->output_fraction; - float in_x_fraction = floor(in_x + 1) - in_x; - - if( out_x_fraction <= in_x_fraction ) { - entry->in_fraction1 = out_x_fraction; - entry->in_fraction2 = 0.0; - in_x += out_x_fraction; - } - else { - entry->in_fraction1 = in_x_fraction; - in_x += out_x_fraction; - entry->in_fraction2 = in_x - floor(in_x); - } - -// Clip in_x and zero out fraction. This doesn't work for YUV. - if( entry->in_x2 >= in_total ) { - entry->in_x2 = in_total - 1; - entry->in_fraction2 = 0.0; - } - - if( entry->in_x1 >= in_total ) { - entry->in_x1 = in_total - 1; - entry->in_fraction1 = 0.0; - } - } -} - - // Copy a single character to the text mask TitleOutlinePackage::TitleOutlinePackage() @@ -763,16 +731,16 @@ void TitleOutlineUnit::process_package(LoadPackage *package) unsigned char **text_rows = plugin->text_mask->get_rows(); int mask_w1 = plugin->text_mask->get_w()-1; int mask_h1 = plugin->text_mask->get_h()-1; - int ofs = plugin->config.outline_size; + int oln_sz = plugin->config.outline_size; if( engine->pass == 0 ) { // get max alpha under outline size macropixel for( int y=pkg->y1, my=pkg->y2; ytext_mask->get_w(); xplugin = plugin; -} - -void TitleTranslate::run_packages() -{ -// Generate scaling tables - delete [] x_table; x_table = 0; - delete [] y_table; y_table = 0; - - float in_w = xlat_mask->get_w(); - float in_h = xlat_mask->get_h(); - float ix1 = 0, ix2 = ix1 + in_w; - float iy1 = 0, iy2 = iy1 + in_h; - - float out_w = plugin->output->get_w(); - float out_h = plugin->output->get_h(); - float x1 = plugin->title_x, x2 = x1 + plugin->title_w; - float y1 = plugin->title_y, y2 = y1 + plugin->title_h; - bclamp(x1, 0, out_w); bclamp(y1, 0, out_h); - bclamp(x2, 0, out_w); bclamp(y2, 0, out_h); - - float ox1 = plugin->title_x + plugin->text_x - plugin->text_x1 + plugin->mask_x1, ox2 = ox1 + in_w; - float oy1 = plugin->title_y + plugin->text_y - plugin->text_y1 + plugin->mask_y1, oy2 = oy1 + in_h; - if( ox1 < x1 ) { ix1 -= (ox1-x1); ox1 = x1; } - if( oy1 < y1 ) { iy1 -= (oy1-y1); oy1 = y1; } - if( ox2 > x2 ) { ix2 -= (ox2-x2); ox2 = x2; } - if( oy2 > y2 ) { iy2 -= (oy2-x2); oy2 = y2; } -#if 0 -printf("TitleTranslate text txy=%7.2f,%-7.2f\n" - " mxy1=%7d,%-7d mxy2=%7d,%-7d\n" - " xy1=%7.2f,%-7.2f xy2=%7.2f,%-7.2f\n" - " ixy1=%7.2f,%-7.2f ixy2=%7.2f,%-7.2f\n" - " oxy1=%7.2f,%-7.2f oxy2=%7.2f,%-7.2f\n", - plugin->text_x, plugin->text_y, - plugin->mask_x1, plugin->mask_y1, plugin->mask_x2, plugin->mask_y2, - x1,y1, x2,y2, ix1,iy1, ix2,iy2, ox1,oy1, ox2,oy2); -#endif - out_x1 = out_x2 = out_y1 = out_y2 = 0; - TitleTranslateUnit::translation_array_f(x_table, - ix1, ix2, in_w, ox1, ox2, out_w, out_x1, out_x2); - TitleTranslateUnit::translation_array_f(y_table, - iy1, iy2, in_h, oy1, oy2, out_h, out_y1, out_y2); - - process_packages(); -} - - - -#define TRANSLATE(type, max, components, ofs) { \ - unsigned char **in_rows = server->xlat_mask->get_rows(); \ - type **out_rows = (type**)plugin->output->get_rows(); \ - \ - for( int y=pkg->y1; yy2; ++y ) { \ - int in_y1 = server->y_table[y].in_x1; \ - int in_y2 = server->y_table[y].in_x2; \ - float y_f1 = server->y_table[y].in_fraction1; \ - float y_f2 = server->y_table[y].in_fraction2; \ - unsigned char *in_row1 = in_rows[in_y1]; \ - unsigned char *in_row2 = in_rows[in_y2]; \ - type *out_row = out_rows[y + server->out_y1]; \ - for( int i=0,x=server->out_x1; xout_x2; ++i,++x ) { \ - int in_x1 = 4*server->x_table[i].in_x1; \ - int in_x2 = 4*server->x_table[i].in_x2; \ - float x_f1 = server->x_table[i].in_fraction1; \ - float x_f2 = server->x_table[i].in_fraction2; \ - float f11 = x_f1 * y_f1 / (256.f-max); \ - float f12 = x_f2 * y_f1 / (256.f-max); \ - float f21 = x_f1 * y_f2 / (256.f-max); \ - float f22 = x_f2 * y_f2 / (256.f-max); \ - type input_r = (type)( \ - in_row1[in_x1 + 0] * f11 + in_row1[in_x2 + 0] * f12 + \ - in_row2[in_x1 + 0] * f21 + in_row2[in_x2 + 0] * f22 ); \ - type input_g = (type)( \ - in_row1[in_x1 + 1] * f11 + in_row1[in_x2 + 1] * f12 + \ - in_row2[in_x1 + 1] * f21 + in_row2[in_x2 + 1] * f22 ); \ - type input_b = (type)( \ - in_row1[in_x1 + 2] * f11 + in_row1[in_x2 + 2] * f12 + \ - in_row2[in_x1 + 2] * f21 + in_row2[in_x2 + 2] * f22 ); \ - type input_a = (type)( \ - in_row1[in_x1 + 3] * f11 + in_row1[in_x2 + 3] * f12 + \ - in_row2[in_x1 + 3] * f21 + in_row2[in_x2 + 3] * f22 ); \ - input_a = input_a * plugin->fade; \ - if( components == 4 ) { \ - type transparency = out_row[x * components + 3] * (max - input_a) / max; \ - out_row[x * components + 0] = (input_r * input_a + \ - out_row[x * components + 0] * transparency) / max; \ - out_row[x * components + 1] = ((input_g-ofs) * input_a + \ - (out_row[x * components + 1]-ofs) * transparency) / max + ofs; \ - out_row[x * components + 2] = ((input_b-ofs) * input_a + \ - (out_row[x * components + 2]-ofs) * transparency) / max + ofs; \ - out_row[x * components + 3] = MAX(input_a, out_row[x * components + 3]); \ - } \ - else { \ - type transparency = max - input_a; \ - out_row[x * components + 0] = (input_r * input_a + \ - out_row[x * components + 0] * transparency) / max; \ - out_row[x * components + 1] = ((input_g-ofs) * input_a + \ - (out_row[x * components + 1]-ofs) * transparency) / max + ofs; \ - out_row[x * components + 2] = ((input_b-ofs) * input_a + \ - (out_row[x * components + 2]-ofs) * transparency) / max + ofs; \ - } \ - } \ - } \ -} - - -void TitleTranslateUnit::process_package(LoadPackage *package) -{ - TitleTranslatePackage *pkg = (TitleTranslatePackage*)package; - TitleTranslate *server = (TitleTranslate*)this->server; - - switch( plugin->output->get_color_model() ) { - case BC_RGB888: TRANSLATE(unsigned char, 0xff, 3, 0); break; - case BC_RGB_FLOAT: TRANSLATE(float, 1.0, 3, 0); break; - case BC_YUV888: TRANSLATE(unsigned char, 0xff, 3, 0x80); break; - case BC_RGBA_FLOAT: TRANSLATE(float, 1.0, 4, 0); break; - case BC_RGBA8888: TRANSLATE(unsigned char, 0xff, 4, 0); break; - case BC_YUVA8888: TRANSLATE(unsigned char, 0xff, 4, 0x80); break; - } -//printf("TitleTranslateUnit::process_package 5\n"); -} - - -TitleTranslate::TitleTranslate(TitleMain *plugin, int cpus) - : LoadServer(cpus, cpus) -{ - this->plugin = plugin; - x_table = 0; - y_table = 0; - out_x1 = out_x2 = 0; - out_y1 = out_y2 = 0; -} - -TitleTranslate::~TitleTranslate() -{ - delete [] x_table; - delete [] y_table; -} - -void TitleTranslate::init_packages() -{ - int out_h = out_y2 - out_y1; - int py1 = 0, py2 = 0; - int pkgs = get_total_packages(); - for( int i=0; iy1 = py1; pkg->y2 = py2; - } -//printf("TitleTranslate::init_packages 2\n"); -} - -LoadClient* TitleTranslate::new_client() -{ - return new TitleTranslateUnit(plugin, this); -} - -LoadPackage* TitleTranslate::new_package() -{ - return new TitleTranslatePackage; -} - TitleCurNudge::TitleCurNudge(TitleParser *parser, TitleMain *plugin) : TitleStack(parser, 0) { @@ -1062,6 +857,10 @@ TitleCurFixed::TitleCurFixed(TitleParser *parser, TitleMain *plugin) : TitleStack(parser, 0) { } +TitleCurAlias::TitleCurAlias(TitleParser *parser, TitleMain *plugin) + : TitleStack(parser, (plugin->config.style & FONT_ALIAS) ? 1 : 0) +{ +} TitleCurSuper::TitleCurSuper(TitleParser *parser, TitleMain *plugin) : TitleStack(parser, 0) { @@ -1080,6 +879,7 @@ TitleParser::TitleParser(TitleMain *plugin) cur_under(this, plugin), cur_blink(this, plugin), cur_fixed(this, plugin), + cur_alias(this, plugin), cur_super(this, plugin) { bfr = out = plugin->config.wtext; @@ -1145,7 +945,7 @@ TitleMain::~TitleMain() delete outline_engine; } -const char* TitleMain::plugin_title() { return _("Title"); } +const char* TitleMain::plugin_title() { return N_("Title"); } int TitleMain::is_realtime() { return 1; } int TitleMain::is_synthesis() { return 1; } @@ -1465,7 +1265,7 @@ void TitleMain::draw_background() delete bg_frame; bg_frame = 0; } if( !bg_frame ) - bg_frame = new VFrame(0, -1, bw, bh, output_model, -1); + bg_frame = new VFrame(bw, bh, output_model); int64_t position = get_source_position() - get_source_start(); if( !read_background(bg_frame, position, output_model) ) { if( !overlay_frame ) @@ -1608,7 +1408,8 @@ VFrame *TitleMain::add_image(const char *path) VFrame *vframe = get_image(path); if( !vframe && (vframe=VFramePng::vframe_png(path)) != 0 ) { if( vframe->get_color_model() != text_model ) { - VFrame *frame = new VFrame(vframe->get_w(), vframe->get_h(), text_model); + VFrame *frame = new VFrame(vframe->get_w(), vframe->get_h(), + text_model, 0); frame->transfer_from(vframe); delete vframe; vframe = frame; } @@ -1798,6 +1599,14 @@ int TitleCurFixed::set(const char *txt) return 0; } +int TitleCurAlias::set(const char *txt) +{ + int alias = !*txt ? 1 : strtol(txt,(char **)&txt,0); + if( *txt ) return 1; + push(alias); + return 0; +} + int TitleCurSuper::set(const char *txt) { int super = !*txt ? 1 : strtol(txt,(char **)&txt,0); @@ -1831,6 +1640,7 @@ int TitleParser::set_attributes(int ret) if( !strcmp(id,KW_UL) ) return ret>1 ? cur_under.unset(text) : cur_under.set(text); if( !strcmp(id,KW_BLINK) ) return ret>1 ? cur_blink.unset(text) : cur_blink.set(text); if( !strcmp(id,KW_FIXED) ) return ret>1 ? cur_fixed.unset(text) : cur_fixed.set(text); + if( !strcmp(id,KW_ALIAS) ) return ret>1 ? cur_alias.unset(text) : cur_alias.set(text); if( !strcmp(id,KW_SUP) ) return ret>1 ? cur_super.unset(text) : cur_super.set(text); return 1; } @@ -1864,6 +1674,8 @@ void TitleMain::load_glyphs() if( cur_bold ) cur_style |= BC_FONT_BOLD; int cur_italic = wchrs.cur_italic; if( cur_italic ) cur_style |= BC_FONT_ITALIC; + int cur_alias = wchrs.cur_alias; + if( cur_alias ) cur_style |= FONT_ALIAS; int cur_super = wchrs.cur_super; if( cur_super ) cur_size /= 2; int exists = 0; @@ -1978,6 +1790,8 @@ int TitleMain::get_text() int cur_style = 0; int cur_bold = wchrs.cur_bold; if( cur_bold ) cur_style |= BC_FONT_BOLD; + int cur_alias = wchrs.cur_alias; + if( cur_alias ) cur_style |= FONT_ALIAS; int cur_italic = wchrs.cur_italic; if( cur_italic ) cur_style |= BC_FONT_ITALIC; short nx = cur_nudge >> 16, ny = cur_nudge; @@ -2337,17 +2151,158 @@ void TitleMain::draw_overlay() if( !translate ) translate = new TitleTranslate(this, cpus); + int tx = text_x - text_x1 + mask_x1; if( tx < title_w && tx+mask_w > 0 ) { - translate->xlat_mask = text_mask; - translate->run_packages(); + translate->copy(text_mask); if( config.stroke_width >= SMALL && (config.style & BC_FONT_OUTLINE) ) { - translate->xlat_mask = stroke_mask; - translate->run_packages(); + translate->copy(stroke_mask); } } } + +TitleTranslate::TitleTranslate(TitleMain *plugin, int cpus) + : LoadServer(cpus, cpus) +{ + this->plugin = plugin; +} + +TitleTranslate::~TitleTranslate() +{ +} + +void TitleTranslate::copy(VFrame *input) +{ + this->input = input; + in_w = input->get_w(); + in_h = input->get_h(); + ix1 = 0, ix2 = ix1 + in_w; + iy1 = 0, iy2 = iy1 + in_h; + + out_w = plugin->output->get_w(); + out_h = plugin->output->get_h(); + float x1 = plugin->title_x, x2 = x1 + plugin->title_w; + float y1 = plugin->title_y, y2 = y1 + plugin->title_h; + bclamp(x1, 0, out_w); bclamp(y1, 0, out_h); + bclamp(x2, 0, out_w); bclamp(y2, 0, out_h); + + ox1 = plugin->title_x + plugin->text_x - plugin->text_x1 + plugin->mask_x1; + ox2 = ox1 + in_w; + oy1 = plugin->title_y + plugin->text_y - plugin->text_y1 + plugin->mask_y1; + oy2 = oy1 + in_h; + if( ox1 < x1 ) { ix1 -= (ox1-x1); ox1 = x1; } + if( oy1 < y1 ) { iy1 -= (oy1-y1); oy1 = y1; } + if( ox2 > x2 ) { ix2 -= (ox2-x2); ox2 = x2; } + if( oy2 > y2 ) { iy2 -= (oy2-x2); oy2 = y2; } +#if 0 +printf("TitleTranslate text txy=%7.2f,%-7.2f\n" + " mxy1=%7d,%-7d mxy2=%7d,%-7d\n" + " xy1=%7.2f,%-7.2f xy2=%7.2f,%-7.2f\n" + " ixy1=%7.2f,%-7.2f ixy2=%7.2f,%-7.2f\n" + " oxy1=%7.2f,%-7.2f oxy2=%7.2f,%-7.2f\n", + plugin->text_x, plugin->text_y, + plugin->mask_x1, plugin->mask_y1, plugin->mask_x2, plugin->mask_y2, + x1,y1, x2,y2, ix1,iy1, ix2,iy2, ox1,oy1, ox2,oy2); +#endif + process_packages(); +} + + +TitleTranslatePackage::TitleTranslatePackage() + : LoadPackage() +{ + y1 = y2 = 0; +} + +TitleTranslateUnit::TitleTranslateUnit(TitleMain *plugin, TitleTranslate *server) + : LoadClient(server) +{ +} + +#define TRANSLATE(type, max, comps, ofs) { \ + type **out_rows = (type**)output->get_rows(); \ + float fr = 1./(256.-max), fs = max/255.; \ + float r = max > 1 ? 0.5 : 0; \ + for( int y=y1; y=iy ? fy - iy : fy+1-iy; \ + float yf0 = 1. - yf1; \ + unsigned char *in_row0 = in_rows[iy<0 ? 0 : iy]; \ + unsigned char *in_row1 = in_rows[iyfade, b = max - a, px; \ + /*if( comps == 4 ) { b = (b * op[3]) / max; }*/ \ + px = *op; *op++ = (a*in_r + b*px) / max; \ + px = *op; *op++ = (a*(in_g-ofs) + b*(px-ofs)) / max + ofs; \ + px = *op; *op++ = (a*(in_b-ofs) + b*(px-ofs)) / max + ofs; \ + if( comps == 4 ) { b = *op; *op++ = a + b - a*b / max; } \ + } \ + } \ +} + +void TitleTranslateUnit::process_package(LoadPackage *package) +{ + TitleTranslatePackage *pkg = (TitleTranslatePackage*)package; + TitleTranslate *server = (TitleTranslate*)this->server; + TitleMain *plugin = server->plugin; + VFrame *input = server->input, *output = plugin->output; + int iw = input->get_w(), ih = input->get_h(); + int iw1 = iw-1, ih1 = ih-1; + float x1 = server->ox1, x2 = server->ox2; + float y1 = pkg->y1, y2 = pkg->y2; + float xofs = server->ix1 - server->ox1; + float yofs = server->iy1 - server->oy1; + unsigned char **in_rows = input->get_rows(); + + switch( output->get_color_model() ) { + case BC_RGB888: TRANSLATE(unsigned char, 0xff, 3, 0); break; + case BC_RGB_FLOAT: TRANSLATE(float, 1.0, 3, 0); break; + case BC_YUV888: TRANSLATE(unsigned char, 0xff, 3, 0x80); break; + case BC_RGBA_FLOAT: TRANSLATE(float, 1.0, 4, 0); break; + case BC_RGBA8888: TRANSLATE(unsigned char, 0xff, 4, 0); break; + case BC_YUVA8888: TRANSLATE(unsigned char, 0xff, 4, 0x80); break; + } +} + +void TitleTranslate::init_packages() +{ + int oh = oy2 - oy1; + int py = oy1; + int i = 0, pkgs = get_total_packages(); + while( i < pkgs ) { + TitleTranslatePackage *pkg = (TitleTranslatePackage*)get_package(i++); + pkg->y1 = py; + py = oy1 + i*oh / pkgs; + pkg->y2 = py; + } +} + +LoadClient* TitleTranslate::new_client() +{ + return new TitleTranslateUnit(plugin, this); +} + +LoadPackage* TitleTranslate::new_package() +{ + return new TitleTranslatePackage; +} + + + const char* TitleMain::motion_to_text(int motion) { switch( motion ) { @@ -2393,46 +2348,9 @@ int TitleMain::init_freetype() void TitleMain::draw_boundry() { - VFrame &out = *output; - int iw = output->get_w(), ih = output->get_h(); - int mr = MIN(iw, ih)/200 + 2, rr = 2*mr; - int x = title_x, y = title_y, w = title_w, h = title_h; - int r2 = (rr+1)/2; - int x0 = x-r2, x1 = x+(w+1)/2, x2 = x+w+r2; - int y0 = y-r2, y1 = y+(h+1)/2, y2 = y+h+r2; - int st = 1; - for( int r=2; r=0; ) { // bbox - int lft = x+r, rgt = x+w-1-r; - int top = y+r, bot = y+h-1-r; - out.draw_line(lft,top, rgt,top); - out.draw_line(rgt,top, rgt,bot); - out.draw_line(rgt,bot, lft,bot); - out.draw_line(lft,bot, lft,top); - } - - for( int r=mr; r=0; ) { // edge arrows - out.draw_line(x1-r,y0+r, x1+r,y0+r); - out.draw_line(x2-r,y1-r, x2-r,y1+r); - out.draw_line(x1-r,y2-r, x1+r,y2-r); - out.draw_line(x0+r,y1+r, x0+r,y1-r); - } - x0 += r2; y0 += r2; x2 -= r2; y2 -= r2; - for( int r=2*mr; --r>=0; ) { // corner arrows - out.draw_line(x0,y0+r, x0+r,y0); - out.draw_line(x2,y0+r, x2-r,y0); - out.draw_line(x2,y2-r, x2-r,y2); - out.draw_line(x0,y2-r, x0+r,y2); - } + if( !gui_open() ) return; + DragCheckBox::draw_boundary(output, + title_x, title_y, title_w, title_h); }