#endif
#define DEFAULT_TIMECODEFORMAT TIME_HMS
+static inline int kw_strcmp(const char *ap, const char *bp) {
+ return !strcmp(ap, bp) ? 0 : strcmp(ap,_(bp));
+}
+
TitleConfig::TitleConfig()
{
strcpy(font, "fixed");
vjustification = JUSTIFY_MID;
fade_in = 0.0; fade_out = 0.0;
pixels_per_second = 100.0;
- wtext[0] = 0; wlen = 0;
+ wtext = 0; wsize = 0; wlen = 0;
title_x = title_y = 0.0;
title_w = title_h = 0;
window_w = 860;
TitleConfig::~TitleConfig()
{
+ delete [] wtext;
}
int TitleConfig::equivalent(TitleConfig &that)
fade_in = that.fade_in;
fade_out = that.fade_out;
pixels_per_second = that.pixels_per_second;
- wlen = that.wlen;
+ demand(wlen = that.wlen);
memcpy(wtext, that.wtext, that.wlen * sizeof(wchar_t));
title_x = that.title_x; title_y = that.title_y;
title_w = that.title_w; title_h = that.title_h;
fade_in = prev.fade_in;
fade_out = prev.fade_out;
pixels_per_second = prev.pixels_per_second;
- wlen = prev.wlen;
+ demand(wlen = prev.wlen);
memcpy(wtext, prev.wtext, prev.wlen * sizeof(wchar_t));
wtext[wlen] = 0;
this->title_x = prev.title_x == next.title_x ? prev.title_x :
loop_playback = prev.loop_playback;
}
+int TitleConfig::demand(long sz)
+{
+ if( wtext && wsize >= sz ) return 0;
+ delete [] wtext;
+ wsize = sz + wlen/2 + 0x1000;
+ wtext = new wchar_t[wsize+1];
+ wtext[wsize] = 0;
+ return 1;
+}
+
void TitleConfig::to_wtext(const char *from_enc, const char *text, int tlen)
{
+ demand(tlen);
wlen = BC_Resources::encode(from_enc, BC_Resources::wide_encoding,
- (char*)text,tlen, (char *)wtext,sizeof(wtext)) / sizeof(wchar_t);
+ (char*)text,tlen, (char *)wtext,sizeof(*wtext)*wsize) / sizeof(wchar_t);
while( wlen > 0 && !wtext[wlen-1] ) --wlen;
}
int TitleParser::set_attributes(int ret)
{
- if( !strcmp(id,KW_NUDGE) ) return ret>1 ? cur_nudge.unset(text) : cur_nudge.set(text);
- if( !strcmp(id,KW_COLOR) ) return ret>1 ? cur_color.unset(text) : cur_color.set(text);
- if( !strcmp(id,KW_ALPHA) ) return ret>1 ? cur_alpha.unset(text) : cur_alpha.set(text);
- if( !strcmp(id,KW_FONT) ) return ret>1 ? cur_font.unset(text) : cur_font.set(text);
- if( !strcmp(id,KW_SIZE) ) return ret>1 ? cur_size.unset(text) : cur_size.set(text);
- if( !strcmp(id,KW_BOLD) ) return ret>1 ? cur_bold.unset(text) : cur_bold.set(text);
- if( !strcmp(id,KW_ITALIC) ) return ret>1 ? cur_italic.unset(text) : cur_italic.set(text);
- if( !strcmp(id,KW_CAPS) ) return ret>1 ? cur_caps.unset(text) : cur_caps.set(text);
- 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);
+ if( !kw_strcmp(id,KW_NUDGE) ) return ret>1 ? cur_nudge.unset(text) : cur_nudge.set(text);
+ if( !kw_strcmp(id,KW_COLOR) ) return ret>1 ? cur_color.unset(text) : cur_color.set(text);
+ if( !kw_strcmp(id,KW_ALPHA) ) return ret>1 ? cur_alpha.unset(text) : cur_alpha.set(text);
+ if( !kw_strcmp(id,KW_FONT) ) return ret>1 ? cur_font.unset(text) : cur_font.set(text);
+ if( !kw_strcmp(id,KW_SIZE) ) return ret>1 ? cur_size.unset(text) : cur_size.set(text);
+ if( !kw_strcmp(id,KW_BOLD) ) return ret>1 ? cur_bold.unset(text) : cur_bold.set(text);
+ if( !kw_strcmp(id,KW_ITALIC) ) return ret>1 ? cur_italic.unset(text) : cur_italic.set(text);
+ if( !kw_strcmp(id,KW_CAPS) ) return ret>1 ? cur_caps.unset(text) : cur_caps.set(text);
+ if( !kw_strcmp(id,KW_UL) ) return ret>1 ? cur_under.unset(text) : cur_under.set(text);
+ if( !kw_strcmp(id,KW_BLINK) ) return ret>1 ? cur_blink.unset(text) : cur_blink.set(text);
+ if( !kw_strcmp(id,KW_FIXED) ) return ret>1 ? cur_fixed.unset(text) : cur_fixed.set(text);
+ if( !kw_strcmp(id,KW_ALIAS) ) return ret>1 ? cur_alias.unset(text) : cur_alias.set(text);
+ if( !kw_strcmp(id,KW_SUP) ) return ret>1 ? cur_super.unset(text) : cur_super.set(text);
return 1;
}
int ret = wchrs.tget(wch);
if( ret > 0 ) {
if( !wchrs.set_attributes(ret) ) continue;
- if( !strcmp(wchrs.id,KW_PNG) && add_image(wchrs.text) ) continue;
+ if( !kw_strcmp(wchrs.id,KW_PNG) && add_image(wchrs.text) ) continue;
wch = wch1; wchrs.seek(ipos+1);
ret = 0;
}
if( ret > 0 ) {
if( !wchrs.set_attributes(ret) ) continue;
ret = -1;
- if( !strcmp(wchrs.id,KW_PNG) ) {
+ if( !kw_strcmp(wchrs.id,KW_PNG) ) {
VFrame *png_image = get_image(wchrs.text);
if( png_image ) {
chr = title_chars.add(CHAR_IMAGE, png_image);
{
FileXML output;
- output.set_shared_output(keyframe->get_data(), MESSAGESIZE);
+ output.set_shared_output(keyframe->xbuf);
output.tag.set_title("TITLE");
output.tag.set_property("FONT", config.font);
output.tag.set_property("ENCODING", config.encoding);
output.tag.set_property("LOOP_PLAYBACK", config.loop_playback);
output.append_tag();
output.append_newline();
- char text[2*sizeof(config.wtext)];
+ long tsz = 2*config.wsize + 0x1000;
+ char text[tsz];
int text_len = BC_Resources::encode(
BC_Resources::wide_encoding, DEFAULT_ENCODING,
(char*)config.wtext, config.wlen*sizeof(wchar_t),
- text, sizeof(text));
- int len = output.length(), avail = MESSAGESIZE-16 - len;
- if( text_len >= avail ) { // back off last utf8 char
- text_len = avail;
- while( text_len > 0 && (text[text_len-1] & 0xc0) == 0x80 )
- text[--text_len] = 0;
- if( text_len > 0 )
- text[--text_len] = 0;
- }
+ text, tsz);
output.append_text(text, text_len);
output.tag.set_title("/TITLE");
output.append_tag();
{
FileXML input;
- input.set_shared_input(keyframe->get_data(), strlen(keyframe->get_data()));
+ input.set_shared_input(keyframe->xbuf);
int result = 0;
void TitleMain::insert_text(const wchar_t *wtxt, int pos)
{
int len = wcslen(wtxt);
- wchar_t *wtext = config.wtext;
- int wsize = sizeof(config.wtext)-1;
int wlen = config.wlen;
if( pos < 0 ) pos = 0;
if( pos > wlen ) pos = wlen;
-
- for( int i=wlen-1, j=wlen+len-1; i>=pos; --i,--j ) {
- if( j >= wsize ) continue;
+ config.demand(wlen + len);
+ int wsize1 = config.wsize-1;
+ wchar_t *wtext = config.wtext;
+ for( int i=wlen, j=wlen+len; --i>=pos; ) {
+ if( --j >= wsize1 ) continue;
wtext[j] = wtext[i];
}
for( int i=pos, j=0; j<len; ++i,++j ) {
- if( i >= wsize ) break;
+ if( i >= wsize1 ) break;
wtext[i] = wtxt[j];
}
- if( (wlen+=len) > wsize ) wlen = wsize;
+ if( (wlen+=len) > wsize1 ) wlen = wsize1;
wtext[wlen] = 0;
config.wlen = wlen;
}