X-Git-Url: http://git.cinelerra-gg.org/git/?a=blobdiff_plain;f=cinelerra-5.1%2Fplugins%2Ftitler%2Ftitler.C;h=d0f4f681ca08fddd629e7cffa36f392c6aa8317f;hb=26f3c4335351a3938db78303c57a2ba6551a2a10;hp=fefbbdb119c371a3e860ee45a72382f9c0836a1d;hpb=a94468d6de897136e77c70662177f4b8b4454b6b;p=goodguy%2Fhistory.git diff --git a/cinelerra-5.1/plugins/titler/titler.C b/cinelerra-5.1/plugins/titler/titler.C index fefbbdb1..d0f4f681 100644 --- a/cinelerra-5.1/plugins/titler/titler.C +++ b/cinelerra-5.1/plugins/titler/titler.C @@ -51,7 +51,7 @@ #include "titlerwindow.h" #include "transportque.h" #include "vrender.h" - +#include "workarounds.h" #include #include @@ -78,6 +78,10 @@ REGISTER_PLUGIN(TitleMain) #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"); @@ -98,7 +102,7 @@ TitleConfig::TitleConfig() 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; @@ -116,6 +120,7 @@ TitleConfig::TitleConfig() TitleConfig::~TitleConfig() { + delete [] wtext; } int TitleConfig::equivalent(TitleConfig &that) @@ -174,7 +179,7 @@ void TitleConfig::copy_from(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; @@ -212,7 +217,7 @@ void TitleConfig::interpolate(TitleConfig &prev, TitleConfig &next, 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 : @@ -235,10 +240,21 @@ void TitleConfig::interpolate(TitleConfig &prev, TitleConfig &next, 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; } @@ -286,7 +302,7 @@ GlyphUnit::GlyphUnit(TitleMain *plugin, GlyphEngine *server) GlyphUnit::~GlyphUnit() { if( freetype_library ) - FT_Done_FreeType(freetype_library); + ft_Done_FreeType(freetype_library); } static inline void to_mono(VFrame *data) @@ -316,11 +332,11 @@ void GlyphUnit::process_package(LoadPackage *package) result = 1; } if( !result ) { - int gindex = FT_Get_Char_Index(freetype_face, glyph->char_code); + int gindex = ft_Get_Char_Index(freetype_face, glyph->char_code); if( !gindex && !freetype_face->charmap && // if no default charmap freetype_face->charmaps && freetype_face->charmaps[0] && - !FT_Select_Charmap(freetype_face, freetype_face->charmaps[0]->encoding) ) { - gindex = FT_Get_Char_Index(freetype_face, glyph->char_code); + !ft_Select_Charmap(freetype_face, freetype_face->charmaps[0]->encoding) ) { + gindex = ft_Get_Char_Index(freetype_face, glyph->char_code); } if( gindex == 0 ) { printf("GlyphUnit::process_package 1 glyph not found (%s) %04x, '%c'\n", @@ -329,10 +345,10 @@ printf("GlyphUnit::process_package 1 glyph not found (%s) %04x, '%c'\n", if( resources->find_font_by_char(glyph->char_code, new_path, freetype_face) ) { plugin->load_freetype_face(freetype_library, freetype_face, new_path); - gindex = FT_Get_Char_Index(freetype_face, glyph->char_code); + gindex = ft_Get_Char_Index(freetype_face, glyph->char_code); } } - FT_Set_Pixel_Sizes(freetype_face, glyph->size, 0); + ft_Set_Pixel_Sizes(freetype_face, glyph->size, 0); if( gindex == 0 ) { // carrige return @@ -362,9 +378,9 @@ printf("GlyphUnit::process_package 1 glyph not found (%s) %04x, '%c'\n", FT_Glyph glyph_image; FT_BBox bbox; FT_Bitmap bm; - FT_Load_Glyph(freetype_face, gindex, FT_LOAD_DEFAULT); - FT_Get_Glyph(freetype_face->glyph, &glyph_image); - FT_Outline_Get_BBox(&((FT_OutlineGlyph) glyph_image)->outline, &bbox); + ft_Load_Glyph(freetype_face, gindex, FT_LOAD_DEFAULT); + ft_Get_Glyph(freetype_face->glyph, &glyph_image); + ft_Outline_Get_BBox(&((FT_OutlineGlyph) glyph_image)->outline, &bbox); // printf("Stroke: Xmin: %ld, Xmax: %ld, Ymin: %ld, yMax: %ld\n", // bbox.xMin,bbox.xMax, bbox.yMin, bbox.yMax); @@ -385,12 +401,12 @@ printf("GlyphUnit::process_package 1 glyph not found (%s) %04x, '%c'\n", glyph->data = new VFrame(glyph->width, glyph->height, BC_A8, glyph->pitch); glyph->data->clear_frame(); bm.buffer = glyph->data->get_data(); - FT_Outline_Translate(&((FT_OutlineGlyph) glyph_image)->outline, + ft_Outline_Translate(&((FT_OutlineGlyph) glyph_image)->outline, - bbox.xMin, - bbox.yMin); - FT_Outline_Get_Bitmap( freetype_library, + ft_Outline_Get_Bitmap( freetype_library, &((FT_OutlineGlyph) glyph_image)->outline, &bm); - FT_Done_Glyph(glyph_image); + ft_Done_Glyph(glyph_image); } else { // Outline desired and glyph found @@ -401,14 +417,14 @@ printf("GlyphUnit::process_package 1 glyph not found (%s) %04x, '%c'\n", FT_BBox bbox; FT_UInt npoints, ncontours; - FT_Load_Glyph(freetype_face, gindex, FT_LOAD_DEFAULT); - FT_Get_Glyph(freetype_face->glyph, &glyph_image); + ft_Load_Glyph(freetype_face, gindex, FT_LOAD_DEFAULT); + ft_Get_Glyph(freetype_face->glyph, &glyph_image); // check if the outline is ok (non-empty); - FT_Outline_Get_BBox(&((FT_OutlineGlyph) glyph_image)->outline, &bbox); + ft_Outline_Get_BBox(&((FT_OutlineGlyph) glyph_image)->outline, &bbox); if( bbox.xMin == 0 && bbox.xMax == 0 && bbox.yMin == 0 && bbox.yMax == 0 ) { - FT_Done_Glyph(glyph_image); + ft_Done_Glyph(glyph_image); glyph->width = 0; glyph->height = 0; glyph->left = 0; glyph->top = 0; glyph->right = 0; glyph->bottom = 0; @@ -422,18 +438,18 @@ printf("GlyphUnit::process_package 1 glyph not found (%s) %04x, '%c'\n", return; } #if FREETYPE_MAJOR > 2 || (FREETYPE_MAJOR == 2 && FREETYPE_MINOR >= 2) - FT_Stroker_New(freetype_library, &stroker); + ft_Stroker_New(freetype_library, &stroker); #else - FT_Stroker_New(((FT_LibraryRec *)freetype_library)->memory, &stroker); + ft_Stroker_New(((FT_LibraryRec *)freetype_library)->memory, &stroker); #endif - FT_Stroker_Set(stroker, (int)(plugin->config.stroke_width * 64), + ft_Stroker_Set(stroker, (int)(plugin->config.stroke_width * 64), FT_STROKER_LINECAP_ROUND, FT_STROKER_LINEJOIN_ROUND, 0); - FT_Stroker_ParseOutline(stroker, &((FT_OutlineGlyph) glyph_image)->outline,1); - FT_Stroker_GetCounts(stroker,&npoints, &ncontours); + ft_Stroker_ParseOutline(stroker, &((FT_OutlineGlyph) glyph_image)->outline,1); + ft_Stroker_GetCounts(stroker,&npoints, &ncontours); if( npoints == 0 && ncontours == 0 ) { // this never happens, but FreeType has a bug regarding Linotype's Palatino font - FT_Stroker_Done(stroker); - FT_Done_Glyph(glyph_image); + ft_Stroker_Done(stroker); + ft_Done_Glyph(glyph_image); glyph->width = 0; glyph->height = 0; glyph->left = 0; glyph->top = 0; glyph->right = 0; glyph->bottom = 0; @@ -447,13 +463,13 @@ printf("GlyphUnit::process_package 1 glyph not found (%s) %04x, '%c'\n", return; }; - FT_Outline_New(freetype_library, npoints, ncontours, &outline); + ft_Outline_New(freetype_library, npoints, ncontours, &outline); outline.n_points=0; outline.n_contours=0; - FT_Stroker_Export (stroker, &outline); - FT_Outline_Get_BBox(&outline, &bbox); - FT_Outline_Translate(&outline, - bbox.xMin, - bbox.yMin); - FT_Outline_Translate(&((FT_OutlineGlyph) glyph_image)->outline, + ft_Stroker_Export(stroker, &outline); + ft_Outline_Get_BBox(&outline, &bbox); + ft_Outline_Translate(&outline, - bbox.xMin, - bbox.yMin); + ft_Outline_Translate(&((FT_OutlineGlyph) glyph_image)->outline, - bbox.xMin, - bbox.yMin + (int)(plugin->config.stroke_width*32)); // printf("Stroke: Xmin: %ld, Xmax: %ld, Ymin: %ld, yMax: %ld\n" @@ -489,16 +505,16 @@ printf("GlyphUnit::process_package 1 glyph not found (%s) %04x, '%c'\n", glyph->data_stroke->clear_frame(); // for debugging memset( glyph->data_stroke->get_data(), 60, glyph->pitch * glyph->height); bm.buffer=glyph->data->get_data(); - FT_Outline_Get_Bitmap( freetype_library, + ft_Outline_Get_Bitmap( freetype_library, &((FT_OutlineGlyph) glyph_image)->outline, &bm); bm.buffer=glyph->data_stroke->get_data(); - FT_Outline_Get_Bitmap( freetype_library, + ft_Outline_Get_Bitmap( freetype_library, &outline, &bm); - FT_Outline_Done(freetype_library,&outline); - FT_Stroker_Done(stroker); - FT_Done_Glyph(glyph_image); + ft_Outline_Done(freetype_library,&outline); + ft_Stroker_Done(stroker); + ft_Done_Glyph(glyph_image); //printf("GlyphUnit::process_package 2\n"); } @@ -938,9 +954,9 @@ TitleMain::~TitleMain() delete glyph_engine; delete title_engine; if( freetype_face ) - FT_Done_Face(freetype_face); + ft_Done_Face(freetype_face); if( freetype_library ) - FT_Done_FreeType(freetype_library); + ft_Done_FreeType(freetype_library); delete translate; delete outline_engine; } @@ -1025,8 +1041,8 @@ void TitleMain::build_previews(TitleWindow *gui) // (char *)new_path); strcpy(new_path, font->path); if( load_freetype_face(freetype_library, freetype_face, new_path)) continue; - FT_Set_Pixel_Sizes(freetype_face, text_height, 0); - if( FT_Load_Char(freetype_face, c, FT_LOAD_RENDER) ) continue; + ft_Set_Pixel_Sizes(freetype_face, text_height, 0); + if( ft_Load_Char(freetype_face, c, FT_LOAD_RENDER) ) continue; int glyph_w = freetype_face->glyph->bitmap.width; int glyph_h = freetype_face->glyph->bitmap.rows; if( glyph_h > max_height ) glyph_h = max_height; @@ -1070,7 +1086,7 @@ void TitleMain::build_previews(TitleWindow *gui) } } - if( freetype_library ) FT_Done_FreeType(freetype_library); + if( freetype_library ) ft_Done_FreeType(freetype_library); } @@ -1086,20 +1102,20 @@ int TitleMain::check_char_code_path(FT_Library &freetype_library, FcConfig *config; FcPattern *font; - FcInit(); - config = FcConfigGetCurrent(); - FcConfigSetRescanInterval(config, 0); + fcInit(); + config = fcConfigGetCurrent(); + fcConfigSetRescanInterval(config, 0); - pat = FcPatternCreate(); - os = FcObjectSetBuild ( FC_FILE, FC_FONTFORMAT, (char *) 0); - fs = FcFontList(config, pat, os); + pat = fcPatternCreate(); + os = fcObjectSetBuild( FC_FILE, FC_FONTFORMAT, (char *) 0); + fs = fcFontList(config, pat, os); int found = 0; char tmpstring[BCTEXTLEN]; int limit_to_truetype = 0; //if you want to limit search to truetype put 1 - if( !freetype_library ) FT_Init_FreeType(&freetype_library); - if( !FT_New_Face(freetype_library, path_old, 0, &temp_freetype_face) ) { - FT_Set_Pixel_Sizes(temp_freetype_face, 128, 0); - int gindex = FT_Get_Char_Index(temp_freetype_face, char_code); + if( !freetype_library ) ft_Init_FreeType(&freetype_library); + if( !ft_New_Face(freetype_library, path_old, 0, &temp_freetype_face) ) { + ft_Set_Pixel_Sizes(temp_freetype_face, 128, 0); + int gindex = ft_Get_Char_Index(temp_freetype_face, char_code); if( gindex != 0 && char_code == 10 ) { strcpy(path_new, path_old); found = 1; @@ -1109,13 +1125,13 @@ int TitleMain::check_char_code_path(FT_Library &freetype_library, if( !found ) { for( int i=0; fs && infont; ++i ) { font = fs->fonts[i]; - FcPatternGetString(font, FC_FONTFORMAT, 0, &format); + fcPatternGetString(font, FC_FONTFORMAT, 0, &format); if( strcmp((char *)format, "TrueType") && !limit_to_truetype ) continue; - if( FcPatternGetString(font, FC_FILE, 0, &file) != FcResultMatch ) continue; + if( fcPatternGetString(font, FC_FILE, 0, &file) != FcResultMatch ) continue; sprintf(tmpstring, "%s", file); - if( !FT_New_Face(freetype_library, tmpstring, 0, &temp_freetype_face) ) continue; - FT_Set_Pixel_Sizes(temp_freetype_face, 128, 0); - int gindex = FT_Get_Char_Index(temp_freetype_face, char_code); + if( !ft_New_Face(freetype_library, tmpstring, 0, &temp_freetype_face) ) continue; + ft_Set_Pixel_Sizes(temp_freetype_face, 128, 0); + int gindex = ft_Get_Char_Index(temp_freetype_face, char_code); if( gindex != 0 && char_code == 10 ) { sprintf(path_new, "%s", tmpstring); found = 1; @@ -1125,8 +1141,8 @@ int TitleMain::check_char_code_path(FT_Library &freetype_library, } done: - if( fs ) FcFontSetDestroy(fs); - if( temp_freetype_face ) FT_Done_Face(temp_freetype_face); + if( fs ) fcFontSetDestroy(fs); + if( temp_freetype_face ) ft_Done_Face(temp_freetype_face); temp_freetype_face = 0; if( !found ) { @@ -1143,14 +1159,14 @@ int TitleMain::load_freetype_face(FT_Library &freetype_library, { //printf("TitleMain::load_freetype_face 1\n"); if( !freetype_library ) - FT_Init_FreeType(&freetype_library); + ft_Init_FreeType(&freetype_library); if( freetype_face ) - FT_Done_Face(freetype_face); + ft_Done_Face(freetype_face); freetype_face = 0; //printf("TitleMain::load_freetype_face 2\n"); // Use freetype's internal function for loading font - if( FT_New_Face(freetype_library, path, 0, &freetype_face) ) { + if( ft_New_Face(freetype_library, path, 0, &freetype_face) ) { fprintf(stderr, _("TitleMain::load_freetype_face %s failed.\n"), path); freetype_face = 0; freetype_library = 0; @@ -1386,7 +1402,7 @@ int TitleMain::get_width(TitleGlyph *cur, TitleGlyph *nxt) int result = cur->advance_x; if( !nxt ) return result; FT_Vector kerning; - if( !FT_Get_Kerning(freetype_face, + if( !ft_Get_Kerning(freetype_face, cur->freetype_index, nxt->freetype_index, ft_kerning_default, &kerning) ) result += (kerning.x >> 6); @@ -1629,19 +1645,19 @@ int TitleCurNudge::set(const char *txt) 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; } @@ -1658,7 +1674,7 @@ void TitleMain::load_glyphs() 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; } @@ -1799,7 +1815,7 @@ int TitleMain::get_text() 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); @@ -2338,7 +2354,7 @@ void TitleMain::reset_render() title_glyphs.clear(); title_images.clear(); if( freetype_face ) { - FT_Done_Face(freetype_face); + ft_Done_Face(freetype_face); freetype_face = 0; } } @@ -2346,7 +2362,7 @@ void TitleMain::reset_render() int TitleMain::init_freetype() { if( !freetype_library ) - FT_Init_FreeType(&freetype_library); + ft_Init_FreeType(&freetype_library); return 0; } @@ -2499,7 +2515,7 @@ void TitleMain::save_data(KeyFrame *keyframe) { 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); @@ -2535,19 +2551,12 @@ void TitleMain::save_data(KeyFrame *keyframe) 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(); @@ -2561,7 +2570,7 @@ void TitleMain::read_data(KeyFrame *keyframe) { FileXML input; - input.set_shared_input(keyframe->get_data(), strlen(keyframe->get_data())); + input.set_shared_input(keyframe->xbuf); int result = 0; @@ -2616,22 +2625,22 @@ void TitleMain::read_data(KeyFrame *keyframe) 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= 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; }