#include "bcsignals.h"
#include "clip.h"
-#include "colormodels.h"
+#include "bccmodels.h"
#include "filexml.h"
#include "filesystem.h"
#include "transportque.inc"
fade_out = 0.0;
x = 0.0;
y = 0.0;
- dropshadow = 10;
+ dropshadow = 2;
sprintf(font, "fixed");
sprintf(encoding, DEFAULT_ENCODING);
timecode_format = DEFAULT_TIMECODEFORMAT;
// this->y = prev.y;
timecode = prev.timecode;
timecode_format = prev.timecode_format;
-// this->dropshadow = (int)(prev.dropshadow * prev_scale + next.dropshadow * next_scale);
- this->dropshadow = prev.dropshadow;
+ this->dropshadow = prev.dropshadow * prev_scale + next.dropshadow * next_scale;
+// this->dropshadow = prev.dropshadow;
}
void TitleConfig::limits()
unsigned char **out_rows = output->get_rows();
int baseline = plugin->get_char_height();
- if(engine->do_dropshadow) {
+ if( engine->do_dropshadow ) {
x += plugin->config.dropshadow;
y += plugin->config.dropshadow;
}
+ else if( plugin->config.dropshadow < 0 ) {
+ x -= plugin->config.dropshadow;
+ y -= plugin->config.dropshadow;
+ }
int x_in = 0, y_in = 0;
int x_out = x + glyph->left;
int r, g, b, a;
plugin->get_color_components(&r, &g, &b, &a, 0);
- int outline = plugin->config.outline_size;
- if(outline) a = 0xff;
+ //int outline = plugin->config.outline_size;
+ //if(outline) a = 0xff;
while( y_in < glyph_h && y_out < output_h ) {
unsigned char *in_row = in_rows[y_in];
TitleOutlinePackage *pkg = (TitleOutlinePackage*)package;
int r, g, b, outline_a;
plugin->get_color_components(&r, &g, &b, &outline_a, 1);
- int title_r, title_g, title_b, title_a;
- plugin->get_color_components(&title_r, &title_g, &title_b, &title_a, 0);
unsigned char **outline_rows = plugin->outline_mask->get_rows();
unsigned char **text_rows = plugin->text_mask->get_rows();
int mask_w1 = plugin->text_mask->get_w()-1;
}
else {
// Overlay text mask on top of outline mask
+ int ofs = BC_CModels::is_yuv(plugin->output->get_color_model()) ? 0x80 : 0;
for(int y = pkg->y1; y < pkg->y2; y++) {
unsigned char *outline_row = outline_rows[y];
unsigned char *text_row = text_rows[y];
int out_a = out[3], in_a = inp[3];
int transparency = in_a * (0xff - out_a) / 0xff;
out[0] = (out[0] * out_a + inp[0] * transparency) / 0xff;
- out[1] = (out[1] * out_a + inp[1] * transparency) / 0xff;
- out[2] = (out[2] * out_a + inp[2] * transparency) / 0xff;
- out[3] = out_a + transparency;
+ out[1] = ((out[1]-ofs) * out_a + (inp[1]-ofs) * transparency) / 0xff + ofs;
+ out[2] = ((out[2]-ofs) * out_a + (inp[2]-ofs) * transparency) / 0xff + ofs;
+ out[3] = in_a + out_a - in_a*out_a / 0xff;
}
}
}
-#define TRANSLATE(type, max, components) \
+#define TRANSLATE(type, max, components, ofs) \
{ \
unsigned char **in_rows = plugin->text_mask->get_rows(); \
type **out_rows = (type**)plugin->output->get_rows(); \
x_fraction2 = \
server->x_table[j - server->out_x1_int].in_fraction2; \
\
- float fraction1 = x_fraction1 * y_fraction1; \
- float fraction2 = x_fraction2 * y_fraction1; \
- float fraction3 = x_fraction1 * y_fraction2; \
- float fraction4 = x_fraction2 * y_fraction2; \
+ float fraction1 = x_fraction1 * y_fraction1 / (256.f-max); \
+ float fraction2 = x_fraction2 * y_fraction1 / (256.f-max); \
+ float fraction3 = x_fraction1 * y_fraction2 / (256.f-max); \
+ float fraction4 = x_fraction2 * y_fraction2 / (256.f-max); \
type input_r = (type)(in_row1[in_x1 * 4 + 0] * fraction1 + \
in_row1[in_x2 * 4 + 0] * fraction2 + \
in_row2[in_x1 * 4 + 0] * fraction3 + \
out_row[j * components + 0] = \
(input_r * input_a + out_row[j * components + 0] * transparency) / max; \
out_row[j * components + 1] = \
- (input_g * input_a + out_row[j * components + 1] * transparency) / max; \
+ ((input_g-ofs) * input_a + (out_row[j * components + 1]-ofs) * transparency) / max + ofs; \
out_row[j * components + 2] = \
- (input_b * input_a + out_row[j * components + 2] * transparency) / max; \
+ ((input_b-ofs) * input_a + (out_row[j * components + 2]-ofs) * transparency) / max + ofs; \
out_row[j * components + 3] = \
MAX(input_a, out_row[j * components + 3]); \
} \
out_row[j * components + 0] = \
(input_r * input_a + out_row[j * components + 0] * transparency) / max; \
out_row[j * components + 1] = \
- (input_g * input_a + out_row[j * components + 1] * transparency) / max; \
+ ((input_g-ofs) * input_a + (out_row[j * components + 1]-ofs) * transparency) / max + ofs; \
out_row[j * components + 2] = \
- (input_b * input_a + out_row[j * components + 2] * transparency) / max; \
+ ((input_b-ofs) * input_a + (out_row[j * components + 2]-ofs) * transparency) / max + ofs; \
} \
} \
} \
TitleTranslate *server = (TitleTranslate*)this->server;
switch(plugin->output->get_color_model()) {
- case BC_RGB888: TRANSLATE(unsigned char, 0xff, 3); break;
- case BC_RGB_FLOAT: TRANSLATE(float, 1.0, 3); break;
- case BC_YUV888: TRANSLATE(unsigned char, 0xff, 3); break;
- case BC_RGBA_FLOAT: TRANSLATE(float, 1.0, 4); break;
- case BC_RGBA8888: TRANSLATE(unsigned char, 0xff, 4); break;
- case BC_YUVA8888: TRANSLATE(unsigned char, 0xff, 4); break;
+ 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");
}
delete outline_engine;
}
-const char* TitleMain::plugin_title() { return N_("Title"); }
+const char* TitleMain::plugin_title() { return _("Title"); }
int TitleMain::is_realtime() { return 1; }
int TitleMain::is_synthesis() { return 1; }
extent.x1 -= config.outline_size*2;
extent.y1 -= config.outline_size*2;
- extent.x2 += config.dropshadow + config.outline_size*2;
- extent.y2 += config.dropshadow + config.outline_size*2;
+ extent.x2 += abs(config.dropshadow) + config.outline_size*2;
+ extent.y2 += abs(config.dropshadow) + config.outline_size*2;
// Determine mask geometry
mask_w = extent.x2 - extent.x1;
text_mask = new VFrame;
text_mask->set_use_shm(0);
text_mask->reallocate(0, -1, 0, 0, 0, mask_w, mask_h, color_model, -1);
- int drop = !config.dropshadow ? 0 : config.dropshadow;
+ float drop = abs(config.dropshadow);
int drop_w = mask_w + drop;
int drop_h = mask_h + drop;
text_mask_stroke = new VFrame;
void TitleMain::get_color_components(int *r, int *g, int *b, int *a, int is_outline)
{
- int r_in, g_in, b_in, a_in;
-
- if(is_outline)
- {
- r_in = (config.outline_color & 0xff0000) >> 16;
- g_in = (config.outline_color & 0xff00) >> 8;
- b_in = config.outline_color & 0xff;
- a_in = config.outline_alpha;
- }
- else
- {
- r_in = (config.color & 0xff0000) >> 16;
- g_in = (config.color & 0xff00) >> 8;
- b_in = config.color & 0xff;
- a_in = config.alpha;
- }
- *r = r_in;
- *g = g_in;
- *b = b_in;
- *a = a_in;
+ int color = is_outline ? config.outline_color : config.color;
+ unsigned char r_in = color >> 16;
+ unsigned char g_in = color >> 8;
+ unsigned char b_in = color;
+ *a = is_outline ? config.outline_alpha : config.alpha;
- switch(output->get_color_model())
- {
+ switch(output->get_color_model()) {
case BC_YUV888:
yuv.rgb_to_yuv_8(r_in, g_in, b_in, *r, *g, *b);
break;
case BC_YUVA8888:
yuv.rgb_to_yuv_8(r_in, g_in, b_in, *r, *g, *b);
break;
+ default:
+ *r = r_in; *g = g_in; *b = b_in;
+ break;
}
}