Aegisub/vsfilter/patchfiles/xy-shad-bord.patch
Niels Martin Hansen 65990cc0eb Update patch files as far as possible. Not everything is properly included.
csriapi.cpp is removed since the version a one dir up is the correct one, this one wasn't maintained.
These patch files were used as base for porting the patches to guliverkli2.

Originally committed to SVN as r2288.
2008-07-25 19:33:55 +00:00

549 lines
21 KiB
Diff

Index: C:/Users/jfs/Dev/Aegisub/vsfilter/StyleEditorDialog.cpp
===================================================================
--- C:/Users/jfs/Dev/Aegisub/vsfilter/StyleEditorDialog.cpp (revision 2277)
+++ C:/Users/jfs/Dev/Aegisub/vsfilter/StyleEditorDialog.cpp (revision 2278)
@@ -115,8 +115,8 @@
m_stss.fontScaleY = m_scaley;
m_stss.borderStyle = m_borderstyle;
- m_stss.outlineWidth = m_borderwidth;
- m_stss.shadowDepth = m_shadowdepth;
+ m_stss.outlineWidthX = m_stss.outlineWidthY = m_borderwidth;
+ m_stss.shadowDepthX = m_stss.shadowDepthY = m_shadowdepth;
m_stss.scrAlignment = m_screenalignment+1;
m_stss.marginRect = m_margin;
@@ -147,9 +147,9 @@
m_scaleyspin.SetRange32(-10000, 10000);
m_borderstyle = m_stss.borderStyle;
- m_borderwidth = m_stss.outlineWidth;
+ m_borderwidth = min(m_stss.outlineWidthX, m_stss.outlineWidthY);
m_borderwidthspin.SetRange32(0, 10000);
- m_shadowdepth = m_stss.shadowDepth;
+ m_shadowdepth = min(m_stss.shadowDepthX, m_stss.shadowDepthY);
m_shadowdepthspin.SetRange32(0, 10000);
m_screenalignment = m_stss.scrAlignment-1;
Index: C:/Users/jfs/Dev/Aegisub/vsfilter/DirectVobSub.cpp
===================================================================
--- C:/Users/jfs/Dev/Aegisub/vsfilter/DirectVobSub.cpp (revision 2277)
+++ C:/Users/jfs/Dev/Aegisub/vsfilter/DirectVobSub.cpp (revision 2278)
@@ -246,8 +246,8 @@
}
if(color) *color = m_defStyle.colors[0];
- if(fShadow) *fShadow = m_defStyle.shadowDepth>0;
- if(fOutline) *fOutline = m_defStyle.outlineWidth>0;
+ if(fShadow) *fShadow = (m_defStyle.shadowDepthX+m_defStyle.shadowDepthY)>0;
+ if(fOutline) *fOutline = (m_defStyle.outlineWidthX+m_defStyle.outlineWidthY)>0;
if(fAdvancedRenderer) *fAdvancedRenderer = m_fAdvancedRenderer;
return S_OK;
@@ -283,8 +283,8 @@
}
m_defStyle.colors[0] = color;
- m_defStyle.shadowDepth = fShadow?2:0;
- m_defStyle.outlineWidth = fOutline?2:0;
+ m_defStyle.shadowDepthX = m_defStyle.shadowDepthY = fShadow?2:0;
+ m_defStyle.outlineWidthX = m_defStyle.outlineWidthY = fOutline?2:0;
return S_OK;
Index: C:/Users/jfs/Dev/Aegisub/vsfilter/subtitles/Rasterizer.h
===================================================================
--- C:/Users/jfs/Dev/Aegisub/vsfilter/subtitles/Rasterizer.h (revision 2277)
+++ C:/Users/jfs/Dev/Aegisub/vsfilter/subtitles/Rasterizer.h (revision 2278)
@@ -83,7 +83,7 @@
bool PartialBeginPath(HDC hdc, bool bClearPath);
bool PartialEndPath(HDC hdc, long dx, long dy);
bool ScanConvert();
- bool CreateWidenedRegion(int border);
+ bool CreateWidenedRegion(int borderX, int borderY);
void DeleteOutlines();
bool Rasterize(int xsub, int ysub, bool 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 2277)
+++ C:/Users/jfs/Dev/Aegisub/vsfilter/subtitles/RTS.cpp (revision 2278)
@@ -116,9 +116,9 @@
if(!ScanConvert()) return;
- if(m_style.borderStyle == 0 && m_style.outlineWidth > 0)
+ if(m_style.borderStyle == 0 && (m_style.outlineWidthX+m_style.outlineWidthY > 0))
{
- if(!CreateWidenedRegion((int)(m_style.outlineWidth+0.5))) return;
+ if(!CreateWidenedRegion((int)(m_style.outlineWidthX+0.5), (int)(m_style.outlineWidthY+0.5))) return;
}
else if(m_style.borderStyle == 1)
{
@@ -188,18 +188,19 @@
STSStyle style = m_style;
style.borderStyle = 0;
- style.outlineWidth = 0;
+ style.outlineWidthX = style.outlineWidthY = 0;
style.colors[0] = m_style.colors[2];
style.alpha[0] = m_style.alpha[2];
- int w = (int)(m_style.outlineWidth + 0.5);
+ int w = (int)(m_style.outlineWidthX + 0.5);
+ int h = (int)(m_style.outlineWidthY + 0.5);
CStringW str;
str.Format(L"m %d %d l %d %d %d %d %d %d",
- -w, -w,
- m_width+w, -w,
- m_width+w, m_ascent+m_descent+w,
- -w, m_ascent+m_descent+w);
+ -w, -h,
+ m_width+w, -h,
+ m_width+w, m_ascent+m_descent+h,
+ -w, m_ascent+m_descent+h);
m_pOpaqueBox = new CPolygon(style, str, 0, 0, 0, 1.0/8, 1.0/8, 0);
@@ -622,7 +623,7 @@
AddTail(last = w->Copy());
}
- m_ascent = m_descent = m_border = 0;
+ m_ascent = m_descent = m_borderX = m_borderY = 0;
pos = GetHeadPosition();
while(pos)
@@ -631,7 +632,8 @@
if(m_ascent < w->m_ascent) m_ascent = w->m_ascent;
if(m_descent < w->m_descent) m_descent = w->m_descent;
- if(m_border < w->m_style.outlineWidth) m_border = (int)(w->m_style.outlineWidth+0.5);
+ if(m_borderX < w->m_style.outlineWidthX) m_borderX = (int)(w->m_style.outlineWidthX+0.5);
+ if(m_borderY < w->m_style.outlineWidthY) m_borderY = (int)(w->m_style.outlineWidthY+0.5);
}
}
@@ -646,10 +648,10 @@
if(w->m_fLineBreak) return(bbox); // should not happen since this class is just a line of text without any breaks
- if(w->m_style.shadowDepth > 0)
+ if(w->m_style.shadowDepthX != 0 || w->m_style.shadowDepthY != 0)
{
- int x = p.x + (int)(w->m_style.shadowDepth+0.5);
- int y = p.y + m_ascent - w->m_ascent + (int)(w->m_style.shadowDepth+0.5);
+ int x = p.x + (int)(w->m_style.shadowDepthX+0.5);
+ int y = p.y + m_ascent - w->m_ascent + (int)(w->m_style.shadowDepthY+0.5);
DWORD a = 0xff - w->m_style.alpha[3];
if(alpha > 0) a = MulDiv(a, 0xff - alpha, 0xff);
@@ -662,7 +664,7 @@
{
bbox |= w->Draw(spd, clipRect, pAlphaMask, x, y, sw,
w->m_ktype > 0 || w->m_style.alpha[0] < 0xff,
- w->m_style.outlineWidth > 0 && !(w->m_ktype == 2 && time < w->m_kstart));
+ (w->m_style.outlineWidthX+w->m_style.outlineWidthY > 0) && !(w->m_ktype == 2 && time < w->m_kstart));
}
else if(w->m_style.borderStyle == 1 && w->m_pOpaqueBox)
{
@@ -687,8 +689,7 @@
if(w->m_fLineBreak) return(bbox); // should not happen since this class is just a line of text without any breaks
-// if((w->m_style.outlineWidth > 0 || w->m_style.borderStyle == 1 && w->m_style.outlineWidth == 0) && !(w->m_ktype == 2 && time < w->m_kstart))
- if(w->m_style.outlineWidth > 0 && !(w->m_ktype == 2 && time < w->m_kstart))
+ if(w->m_style.outlineWidthX+w->m_style.outlineWidthY > 0 && !(w->m_ktype == 2 && time < w->m_kstart))
{
int x = p.x;
int y = p.y + m_ascent - w->m_ascent;
@@ -772,7 +773,7 @@
sw[1] = 0xffffffff;
}
- sw[3] = (int)(w->m_style.outlineWidth + t*w->m_width) >> 3;
+ sw[3] = (int)(w->m_style.outlineWidthX + t*w->m_width) >> 3;
sw[4] = sw[2];
sw[5] = 0x00ffffff;
@@ -884,7 +885,7 @@
CLine* ret = new CLine();
if(!ret) return(NULL);
- ret->m_width = ret->m_ascent = ret->m_descent = ret->m_border = 0;
+ ret->m_width = ret->m_ascent = ret->m_descent = ret->m_borderX = ret->m_borderY = 0;
maxwidth = GetWrapWidth(pos, maxwidth);
@@ -896,11 +897,12 @@
if(ret->m_ascent < w->m_ascent) ret->m_ascent = w->m_ascent;
if(ret->m_descent < w->m_descent) ret->m_descent = w->m_descent;
- if(ret->m_border < w->m_style.outlineWidth) ret->m_border = (int)(w->m_style.outlineWidth+0.5);
+ if(ret->m_borderX < w->m_style.outlineWidthX) ret->m_borderX = (int)(w->m_style.outlineWidthX+0.5);
+ if(ret->m_borderY < w->m_style.outlineWidthY) ret->m_borderY = (int)(w->m_style.outlineWidthY+0.5);
if(w->m_fLineBreak)
{
- if(fEmptyLine) {ret->m_ascent /= 2; ret->m_descent /= 2; ret->m_border = 0;}
+ if(fEmptyLine) {ret->m_ascent /= 2; ret->m_descent /= 2; ret->m_borderX = ret->m_borderY = 0;}
ret->Compact();
@@ -1061,15 +1063,15 @@
l = GetNextLine(pos, size.cx - marginRect.left - marginRect.right);
if(!l) break;
- if(fFirstLine) {m_topborder = l->m_border; fFirstLine = false;}
+ if(fFirstLine) {m_topborder = l->m_borderY; fFirstLine = false;}
- spaceNeeded.cx = max(l->m_width, spaceNeeded.cx);
+ spaceNeeded.cx = max(l->m_width+l->m_borderX, spaceNeeded.cx);
spaceNeeded.cy += l->m_ascent + l->m_descent;
AddTail(l);
}
- if(l) m_bottomborder = l->m_border;
+ if(l) m_bottomborder = l->m_borderY;
m_rect = CRect(
CPoint((m_scrAlignment%3) == 1 ? marginRect.left
@@ -1477,6 +1479,14 @@
;
else if(!cmd.Find(L"u"))
params.Add(cmd.Mid(1)), cmd = cmd.Left(1);
+ else if(!cmd.Find(L"xbord"))
+ params.Add(cmd.Mid(5)), cmd = cmd.Left(5);
+ else if(!cmd.Find(L"xshad"))
+ params.Add(cmd.Mid(5)), cmd = cmd.Left(5);
+ else if(!cmd.Find(L"ybord"))
+ params.Add(cmd.Mid(5)), cmd = cmd.Left(5);
+ else if(!cmd.Find(L"yshad"))
+ params.Add(cmd.Mid(5)), cmd = cmd.Left(5);
else
nUnrecognizedTags++;
@@ -1528,10 +1538,15 @@
}
else if(cmd == L"bord")
{
- double n = CalcAnimation(wcstod(p, NULL), style.outlineWidth, fAnimate);
- style.outlineWidth = !p.IsEmpty()
- ? (n < 0 ? 0 : n)
- : org.outlineWidth;
+ double dst = wcstod(p, NULL);
+ double nx = CalcAnimation(dst, style.outlineWidthX, fAnimate);
+ style.outlineWidthX = !p.IsEmpty()
+ ? (nx < 0 ? 0 : nx)
+ : org.outlineWidthX;
+ double ny = CalcAnimation(dst, style.outlineWidthY, fAnimate);
+ style.outlineWidthY = !p.IsEmpty()
+ ? (ny < 0 ? 0 : ny)
+ : org.outlineWidthY;
}
else if(cmd == L"be")
{
@@ -1819,10 +1834,15 @@
}
else if(cmd == L"shad")
{
- double n = CalcAnimation(wcstod(p, NULL), style.shadowDepth, fAnimate);
- style.shadowDepth = !p.IsEmpty()
- ? (n < 0 ? 0 : n)
- : org.shadowDepth;
+ double dst = wcstod(p, NULL);
+ double nx = CalcAnimation(dst, style.shadowDepthX, fAnimate);
+ style.shadowDepthX = !p.IsEmpty()
+ ? (nx < 0 ? 0 : nx)
+ : org.shadowDepthX;
+ double ny = CalcAnimation(dst, style.shadowDepthY, fAnimate);
+ style.shadowDepthY = !p.IsEmpty()
+ ? (ny < 0 ? 0 : ny)
+ : org.shadowDepthY;
}
else if(cmd == L"s")
{
@@ -1872,6 +1892,38 @@
? (n == 0 ? false : n == 1 ? true : org.fUnderline)
: org.fUnderline;
}
+ else if(cmd == L"xbord")
+ {
+ double dst = wcstod(p, NULL);
+ double nx = CalcAnimation(dst, style.outlineWidthX, fAnimate);
+ style.outlineWidthX = !p.IsEmpty()
+ ? (nx < 0 ? 0 : nx)
+ : org.outlineWidthX;
+ }
+ else if(cmd == L"xshad")
+ {
+ double dst = wcstod(p, NULL);
+ double nx = CalcAnimation(dst, style.shadowDepthX, fAnimate);
+ style.shadowDepthX = !p.IsEmpty()
+ ? nx
+ : org.shadowDepthX;
+ }
+ else if(cmd == L"ybord")
+ {
+ double dst = wcstod(p, NULL);
+ double ny = CalcAnimation(dst, style.outlineWidthY, fAnimate);
+ style.outlineWidthY = !p.IsEmpty()
+ ? (ny < 0 ? 0 : ny)
+ : org.outlineWidthY;
+ }
+ else if(cmd == L"yshad")
+ {
+ double dst = wcstod(p, NULL);
+ double ny = CalcAnimation(dst, style.shadowDepthY, fAnimate);
+ style.shadowDepthY = !p.IsEmpty()
+ ? ny
+ : org.shadowDepthY;
+ }
}
// return(nUnrecognizedTags < nTags);
@@ -1949,7 +2001,7 @@
}
else if(attribs[i] == L"outline-level")
{
- style.outlineWidth = wcstol(params[i], NULL, 10);
+ style.outlineWidthX = style.outlineWidthY = wcstol(params[i], NULL, 10);
}
else if(attribs[i] == L"shadow-color")
{
@@ -1957,7 +2009,7 @@
}
else if(attribs[i] == L"shadow-level")
{
- style.shadowDepth = wcstol(params[i], NULL, 10);
+ style.shadowDepthX = style.shadowDepthY = wcstol(params[i], NULL, 10);
}
if(nColor >= 0 && nColor < 4)
@@ -2079,8 +2131,10 @@
tmp.fontSize = sub->m_scaley*tmp.fontSize*64;
tmp.fontSpacing = sub->m_scalex*tmp.fontSpacing*64;
- tmp.outlineWidth *= (m_fScaledBAS ? ((sub->m_scalex+sub->m_scaley)/2) : 1) * 8;
- tmp.shadowDepth *= (m_fScaledBAS ? ((sub->m_scalex+sub->m_scaley)/2) : 1) * 8;
+ tmp.outlineWidthX *= (m_fScaledBAS ? sub->m_scalex : 1) * 8;
+ tmp.outlineWidthY *= (m_fScaledBAS ? sub->m_scaley : 1) * 8;
+ tmp.shadowDepthX *= (m_fScaledBAS ? sub->m_scalex : 1) * 8;
+ tmp.shadowDepthY *= (m_fScaledBAS ? sub->m_scaley : 1) * 8;
if(m_nPolygon)
{
Index: C:/Users/jfs/Dev/Aegisub/vsfilter/subtitles/STS.cpp
===================================================================
--- C:/Users/jfs/Dev/Aegisub/vsfilter/subtitles/STS.cpp (revision 2277)
+++ C:/Users/jfs/Dev/Aegisub/vsfilter/subtitles/STS.cpp (revision 2278)
@@ -1413,8 +1413,8 @@
if(sver >= 5) style->fontSpacing = GetFloat(buff);
if(sver >= 5) style->fontAngleZ = GetFloat(buff);
if(sver >= 4) style->borderStyle = GetInt(buff);
- style->outlineWidth = GetFloat(buff);
- style->shadowDepth = GetFloat(buff);
+ style->outlineWidthX = style->outlineWidthY = GetFloat(buff);
+ style->shadowDepthX = style->shadowDepthY = GetFloat(buff);
style->scrAlignment = GetInt(buff);
style->marginRect.left = GetInt(buff);
style->marginRect.right = GetInt(buff);
@@ -1433,8 +1433,10 @@
if(sver >= 5) style->fontSpacing = max(style->fontSpacing, 0);
style->fontAngleX = style->fontAngleY = 0;
style->borderStyle = style->borderStyle == 1 ? 0 : style->borderStyle == 3 ? 1 : 0;
- style->outlineWidth = max(style->outlineWidth, 0);
- style->shadowDepth = max(style->shadowDepth, 0);
+ style->outlineWidthX = max(style->outlineWidthX, 0);
+ style->outlineWidthY = max(style->outlineWidthY, 0);
+ style->shadowDepthX = max(style->shadowDepthX, 0);
+ style->shadowDepthY = max(style->shadowDepthY, 0);
if(sver <= 4) style->scrAlignment = (style->scrAlignment&4) ? ((style->scrAlignment&3)+6) // top
: (style->scrAlignment&8) ? ((style->scrAlignment&3)+3) // mid
: (style->scrAlignment&3); // bottom
@@ -1584,8 +1586,8 @@
style->fontAngleY = GetFloat(buff);
style->fontAngleZ = GetFloat(buff);
style->borderStyle = GetInt(buff);
- style->outlineWidth = GetFloat(buff);
- style->shadowDepth = GetFloat(buff);
+ style->outlineWidthX = style->outlineWidthY = GetFloat(buff);
+ style->shadowDepthX = style->shadowDepthY = GetFloat(buff);
style->scrAlignment = GetInt(buff);
style->marginRect.left = GetInt(buff);
style->marginRect.right = GetInt(buff);
@@ -1596,8 +1598,10 @@
style->fontScaleY = max(style->fontScaleY, 0);
style->fontSpacing = max(style->fontSpacing, 0);
style->borderStyle = style->borderStyle == 1 ? 0 : style->borderStyle == 3 ? 1 : 0;
- style->outlineWidth = max(style->outlineWidth, 0);
- style->shadowDepth = max(style->shadowDepth, 0);
+ style->outlineWidthX = max(style->outlineWidthX, 0);
+ style->outlineWidthY = max(style->outlineWidthY, 0);
+ style->shadowDepthX = max(style->shadowDepthX, 0);
+ style->shadowDepthY = max(style->shadowDepthY, 0);
ret.AddStyle(StyleName, style);
}
@@ -2707,7 +2711,7 @@
s->colors[3]&0xffffff,
s->fontWeight > FW_NORMAL ? -1 : 0, s->fItalic ? -1 : 0,
s->borderStyle == 0 ? 1 : s->borderStyle == 1 ? 3 : 0,
- (int)s->outlineWidth, (int)s->shadowDepth,
+ (int)s->outlineWidthY, (int)s->shadowDepthY,
s->scrAlignment <= 3 ? s->scrAlignment : s->scrAlignment <= 6 ? ((s->scrAlignment-3)|8) : s->scrAlignment <= 9 ? ((s->scrAlignment-6)|4) : 2,
s->marginRect.left, s->marginRect.right, (s->marginRect.top + s->marginRect.bottom) / 2,
s->alpha[0],
@@ -2728,7 +2732,7 @@
(int)s->fontScaleX, (int)s->fontScaleY,
(int)s->fontSpacing, (float)s->fontAngleZ,
s->borderStyle == 0 ? 1 : s->borderStyle == 1 ? 3 : 0,
- (int)s->outlineWidth, (int)s->shadowDepth,
+ (int)s->outlineWidthY, (int)s->shadowDepthY,
s->scrAlignment,
s->marginRect.left, s->marginRect.right, (s->marginRect.top + s->marginRect.bottom) / 2,
s->charSet);
@@ -2861,7 +2865,7 @@
(int)s->fontScaleX, (int)s->fontScaleY,
(int)s->fontSpacing, (float)s->fontAngleZ,
s->borderStyle == 0 ? 1 : s->borderStyle == 1 ? 3 : 0,
- (int)s->outlineWidth, (int)s->shadowDepth,
+ (int)s->outlineWidthY, (int)s->shadowDepthY,
s->scrAlignment,
s->marginRect.left, s->marginRect.right, (s->marginRect.top + s->marginRect.bottom) / 2,
s->charSet);
@@ -2883,8 +2887,8 @@
marginRect = CRect(20, 20, 20, 20);
scrAlignment = 2;
borderStyle = 0;
- outlineWidth = 2;
- shadowDepth = 3;
+ outlineWidthX = outlineWidthY = 2;
+ shadowDepthX = shadowDepthY = 3;
colors[0] = 0x00ffffff;
colors[1] = 0x0000ffff;
colors[2] = 0x00000000;
@@ -2912,8 +2916,10 @@
return(marginRect == s.marginRect
&& scrAlignment == s.scrAlignment
&& borderStyle == s.borderStyle
- && outlineWidth == s.outlineWidth
- && shadowDepth == s.shadowDepth
+ && outlineWidthX == s.outlineWidthX
+ && outlineWidthY == s.outlineWidthY
+ && shadowDepthX == s.shadowDepthX
+ && shadowDepthY == s.shadowDepthY
&& *((int*)&colors[0]) == *((int*)&s.colors[0])
&& *((int*)&colors[1]) == *((int*)&s.colors[1])
&& *((int*)&colors[2]) == *((int*)&s.colors[2])
@@ -2994,7 +3000,7 @@
{
style.Format(_T("%d,%d,%d,%d,%d,%d,%f,%f,0x%06x,0x%06x,0x%06x,0x%06x,0x%02x,0x%02x,0x%02x,0x%02x,%d,%s,%f,%f,%f,%f,%d,%d,%d,%d,%d,%f,%f,%f,%d"),
s.marginRect.left,s.marginRect.right,s.marginRect.top,s.marginRect.bottom,
- s.scrAlignment, s.borderStyle, s.outlineWidth, s.shadowDepth,
+ s.scrAlignment, s.borderStyle, s.outlineWidthY, s.shadowDepthY,
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,
@@ -3013,7 +3019,8 @@
{
CStringW str = TToW(style);
s.marginRect.left = GetInt(str); s.marginRect.right = GetInt(str); s.marginRect.top = GetInt(str); s.marginRect.bottom = GetInt(str);
- s.scrAlignment = GetInt(str); s.borderStyle = GetInt(str); s.outlineWidth = GetFloat(str); s.shadowDepth = GetFloat(str);
+ s.scrAlignment = GetInt(str); s.borderStyle = GetInt(str);
+ s.outlineWidthX = s.outlineWidthY = GetFloat(str); s.shadowDepthX = s.shadowDepthY = GetFloat(str);
for(int i = 0; i < 4; i++) s.colors[i] = (COLORREF)GetInt(str);
for(int i = 0; i < 4; i++) s.alpha[i] = GetInt(str);
s.charSet = GetInt(str);
Index: C:/Users/jfs/Dev/Aegisub/vsfilter/subtitles/RTS.h
===================================================================
--- C:/Users/jfs/Dev/Aegisub/vsfilter/subtitles/RTS.h (revision 2277)
+++ C:/Users/jfs/Dev/Aegisub/vsfilter/subtitles/RTS.h (revision 2278)
@@ -121,7 +121,7 @@
class CLine : public CAtlList<CWord*>
{
public:
- int m_width, m_ascent, m_descent, m_border;
+ int m_width, m_ascent, m_descent, m_borderX, m_borderY;
virtual ~CLine();
Index: C:/Users/jfs/Dev/Aegisub/vsfilter/subtitles/STS.h
===================================================================
--- C:/Users/jfs/Dev/Aegisub/vsfilter/subtitles/STS.h (revision 2277)
+++ C:/Users/jfs/Dev/Aegisub/vsfilter/subtitles/STS.h (revision 2278)
@@ -34,8 +34,10 @@
CRect marginRect; // measured from the sides
int scrAlignment; // 1 - 9: as on the numpad, 0: default
int borderStyle; // 0: outline, 1: opaque box
- double outlineWidth;
- double shadowDepth;
+ double outlineWidthX;
+ double outlineWidthY;
+ double shadowDepthX;
+ double shadowDepthY;
COLORREF colors[4]; // usually: {primary, secondary, outline/background, shadow}
BYTE alpha[4];
int charSet;
Index: C:/Users/jfs/Dev/Aegisub/vsfilter/subtitles/Rasterizer.cpp
===================================================================
--- C:/Users/jfs/Dev/Aegisub/vsfilter/subtitles/Rasterizer.cpp (revision 2277)
+++ C:/Users/jfs/Dev/Aegisub/vsfilter/subtitles/Rasterizer.cpp (revision 2278)
@@ -644,20 +644,31 @@
}
}
-bool Rasterizer::CreateWidenedRegion(int r)
+bool Rasterizer::CreateWidenedRegion(int rx, int ry)
{
- if(r < 0) r = 0;
+ if(rx < 0) rx = 0;
+ if(ry < 0) ry = 0;
- // Do a half circle.
- // _OverlapRegion mirrors this so both halves are done.
- for(int y = -r; y <= r; ++y)
+ if (ry > 0 && rx > 0)
{
- int x = (int)(0.5 + sqrt(float(r*r - y*y)));
+ // Do a half circle.
+ // _OverlapRegion mirrors this so both halves are done.
+ for(int y = -ry; y <= ry; ++y)
+ {
+ int x = (int)(0.5 + sqrt(float(ry*ry - y*y)) * float(rx)/float(ry));
- _OverlapRegion(mWideOutline, mOutline, x, y);
+ // If x=0 nothing will be drawn for this overlap, not sure why
+ _OverlapRegion(mWideOutline, mOutline, max(x,1), y);
+ }
}
+ else if (ry == 0 && rx > 0)
+ {
+ // There are artifacts if we don't make at least two overlaps of the line, even at same Y coord
+ _OverlapRegion(mWideOutline, mOutline, rx, 0);
+ _OverlapRegion(mWideOutline, mOutline, rx, 0);
+ }
- mWideBorder = r;
+ mWideBorder = max(rx,ry);
return true;
}
Index: C:/Users/jfs/Dev/Aegisub/vsfilter/subtitles/USFSubtitles.cpp
===================================================================
--- C:/Users/jfs/Dev/Aegisub/vsfilter/subtitles/USFSubtitles.cpp (revision 2277)
+++ C:/Users/jfs/Dev/Aegisub/vsfilter/subtitles/USFSubtitles.cpp (revision 2278)
@@ -286,8 +286,8 @@
0;
stss->borderStyle = 0;
- if(!s->fontstyle.outline.IsEmpty()) stss->outlineWidth = wcstol(s->fontstyle.outline, NULL, 10);
- if(!s->fontstyle.shadow.IsEmpty()) stss->shadowDepth = wcstol(s->fontstyle.shadow, NULL, 10);
+ if(!s->fontstyle.outline.IsEmpty()) stss->outlineWidthX = stss->outlineWidthY = wcstol(s->fontstyle.outline, NULL, 10);
+ if(!s->fontstyle.shadow.IsEmpty()) stss->shadowDepthX = stss->shadowDepthY = wcstol(s->fontstyle.shadow, NULL, 10);
for(int i = 0; i < 4; i++)
{