Index: C:/Users/jfs/Dev/Aegisub/vsfilter/subtitles/Rasterizer.h =================================================================== --- C:/Users/jfs/Dev/Aegisub/vsfilter/subtitles/Rasterizer.h (revision 2278) +++ C:/Users/jfs/Dev/Aegisub/vsfilter/subtitles/Rasterizer.h (revision 2279) @@ -85,7 +85,7 @@ bool ScanConvert(); bool CreateWidenedRegion(int borderX, int borderY); void DeleteOutlines(); - bool Rasterize(int xsub, int ysub, bool fBlur); + bool Rasterize(int xsub, int ysub, int fBlur); CRect Draw(SubPicDesc& spd, CRect& clipRect, byte* pAlphaMask, int xsub, int ysub, const long* switchpts, bool fBody, bool fBorder); }; Index: C:/Users/jfs/Dev/Aegisub/vsfilter/subtitles/RTS.cpp =================================================================== --- C:/Users/jfs/Dev/Aegisub/vsfilter/subtitles/RTS.cpp (revision 2278) +++ C:/Users/jfs/Dev/Aegisub/vsfilter/subtitles/RTS.cpp (revision 2279) @@ -1550,9 +1550,9 @@ } else if(cmd == L"be") { - int n = wcstol(p, NULL, 10); + int n = (int)(CalcAnimation(wcstol(p, NULL, 10), style.fBlur, fAnimate)+0.5); style.fBlur = !p.IsEmpty() - ? (n == 0 ? false : n == 1 ? true : org.fBlur) + ? n : org.fBlur; } else if(cmd == L"b") Index: C:/Users/jfs/Dev/Aegisub/vsfilter/subtitles/STS.cpp =================================================================== --- C:/Users/jfs/Dev/Aegisub/vsfilter/subtitles/STS.cpp (revision 2278) +++ C:/Users/jfs/Dev/Aegisub/vsfilter/subtitles/STS.cpp (revision 2279) @@ -1578,7 +1578,7 @@ style->fItalic = !!GetInt(buff); style->fUnderline = !!GetInt(buff); style->fStrikeOut = !!GetInt(buff); - style->fBlur = !!GetInt(buff); + style->fBlur = GetInt(buff) ? 1 : 0; style->fontScaleX = GetFloat(buff); style->fontScaleY = GetFloat(buff); style->fontSpacing = GetFloat(buff); @@ -2906,7 +2906,7 @@ fItalic = false; fUnderline = false; fStrikeOut = false; - fBlur = false; + fBlur = 0; fontShiftX = fontShiftY = fontAngleZ = fontAngleX = fontAngleY = 0; relativeTo = 2; } @@ -3004,7 +3004,7 @@ s.colors[0], s.colors[1], s.colors[2], s.colors[3], s.alpha[0], s.alpha[1], s.alpha[2], s.alpha[3], s.charSet, s.fontName, s.fontSize, s.fontScaleX, s.fontScaleY, s.fontSpacing, s.fontWeight, - (int)s.fItalic, (int)s.fUnderline, (int)s.fStrikeOut, (int)s.fBlur, + (int)s.fItalic, (int)s.fUnderline, (int)s.fStrikeOut, s.fBlur, s.fontAngleZ, s.fontAngleX, s.fontAngleY, s.relativeTo); @@ -3027,7 +3027,7 @@ s.fontName = WToT(GetStr(str)); s.fontSize = GetFloat(str); s.fontScaleX = GetFloat(str); s.fontScaleY = GetFloat(str); s.fontSpacing = GetFloat(str); s.fontWeight = GetInt(str); - s.fItalic = !!GetInt(str); s.fUnderline = !!GetInt(str); s.fStrikeOut = !!GetInt(str); s.fBlur = !!GetInt(str); + s.fItalic = !!GetInt(str); s.fUnderline = !!GetInt(str); s.fStrikeOut = !!GetInt(str); s.fBlur = GetInt(str); s.fontAngleZ = GetFloat(str); s.fontAngleX = GetFloat(str); s.fontAngleY = GetFloat(str); s.relativeTo = GetInt(str); } Index: C:/Users/jfs/Dev/Aegisub/vsfilter/subtitles/STS.h =================================================================== --- C:/Users/jfs/Dev/Aegisub/vsfilter/subtitles/STS.h (revision 2278) +++ C:/Users/jfs/Dev/Aegisub/vsfilter/subtitles/STS.h (revision 2279) @@ -49,7 +49,7 @@ bool fItalic; bool fUnderline; bool fStrikeOut; - bool fBlur; + int fBlur; double fontAngleZ, fontAngleX, fontAngleY; double fontShiftX, fontShiftY; int relativeTo; // 0: window, 1: video, 2: undefined (~window) Index: C:/Users/jfs/Dev/Aegisub/vsfilter/subtitles/Rasterizer.cpp =================================================================== --- C:/Users/jfs/Dev/Aegisub/vsfilter/subtitles/Rasterizer.cpp (revision 2278) +++ C:/Users/jfs/Dev/Aegisub/vsfilter/subtitles/Rasterizer.cpp (revision 2279) @@ -679,7 +679,7 @@ mOutline.clear(); } -bool Rasterizer::Rasterize(int xsub, int ysub, bool fBlur) +bool Rasterizer::Rasterize(int xsub, int ysub, int fBlur) { _TrashOverlay(); @@ -700,16 +700,17 @@ mWideBorder = (mWideBorder+7)&~7; - if(!mWideOutline.empty()) + if(!mWideOutline.empty() || fBlur) { - width += 2*mWideBorder; - height += 2*mWideBorder; + // Expand the buffer a bit when we're blurring, since that can also widen the borders a bit + width += 2*mWideBorder + (fBlur ? 16 : 0); + height += 2*mWideBorder + (fBlur ? 16 : 0); - xsub += mWideBorder; - ysub += mWideBorder; + xsub += mWideBorder + (fBlur ? 8 : 0); + ysub += mWideBorder + (fBlur ? 8 : 0); - mOffsetX -= mWideBorder; - mOffsetY -= mWideBorder; + mOffsetX -= mWideBorder + (fBlur ? 8 : 0); + mOffsetY -= mWideBorder + (fBlur ? 8 : 0); } mOverlayWidth = ((width+7)>>3) + 1; @@ -760,32 +761,35 @@ // If we're blurring, do a 3x3 box blur // Can't do it on subpictures smaller than 3x3 pixels - if(fBlur && mOverlayWidth >= 3 && mOverlayHeight >= 3) + for (int pass = 0; pass < fBlur; pass++) { - int pitch = mOverlayWidth*2; + if(mOverlayWidth >= 3 && mOverlayHeight >= 3) + { + int pitch = mOverlayWidth*2; - byte* tmp = new byte[pitch*mOverlayHeight]; - if(!tmp) return(false); + byte* tmp = new byte[pitch*mOverlayHeight]; + if(!tmp) return(false); - memcpy(tmp, mpOverlayBuffer, pitch*mOverlayHeight); + memcpy(tmp, mpOverlayBuffer, pitch*mOverlayHeight); - int border = !mWideOutline.empty() ? 1 : 0; + int border = !mWideOutline.empty() ? 1 : 0; - // This could be done in a separated way and win some speed - for(int j = 1; j < mOverlayHeight-1; j++) - { - byte* src = tmp + pitch*j + 2 + border; - byte* dst = mpOverlayBuffer + pitch*j + 2 + border; + // This could be done in a separated way and win some speed + for(int j = 1; j < mOverlayHeight-1; j++) + { + byte* src = tmp + pitch*j + 2 + border; + byte* dst = mpOverlayBuffer + pitch*j + 2 + border; - for(int i = 1; i < mOverlayWidth-1; i++, src+=2, dst+=2) - { - *dst = (src[-2-pitch] + (src[-pitch]<<1) + src[+2-pitch] - + (src[-2]<<1) + (src[0]<<2) + (src[+2]<<1) - + src[-2+pitch] + (src[+pitch]<<1) + src[+2+pitch]) >> 4; + for(int i = 1; i < mOverlayWidth-1; i++, src+=2, dst+=2) + { + *dst = (src[-2-pitch] + (src[-pitch]<<1) + src[+2-pitch] + + (src[-2]<<1) + (src[0]<<2) + (src[+2]<<1) + + src[-2+pitch] + (src[+pitch]<<1) + src[+2+pitch]) >> 4; + } } + + delete [] tmp; } - - delete [] tmp; } return true;