Aegisub/vsfilter/patchfiles/iclip+vector.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

107 lines
3.1 KiB
Diff

Index: subtitles/RTS.cpp
===================================================================
--- subtitles/RTS.cpp (revision 2286)
+++ subtitles/RTS.cpp (working copy)
@@ -519,7 +519,7 @@
// CClipper
-CClipper::CClipper(CStringW str, CSize size, double scalex, double scaley)
+CClipper::CClipper(CStringW str, CSize size, double scalex, double scaley, bool inverse)
: CPolygon(STSStyle(), str, 0, 0, 0, scalex, scaley, 0)
{
m_size.cx = m_size.cy = 0;
@@ -528,6 +528,7 @@
if(size.cx < 0 || size.cy < 0 || !(m_pAlphaMask = new BYTE[size.cx*size.cy])) return;
m_size = size;
+ m_inverse = inverse;
memset(m_pAlphaMask, 0, size.cx*size.cy);
@@ -556,6 +557,13 @@
src += 2*mOverlayWidth;
dst += m_size.cx;
}
+
+ if(inverse)
+ {
+ BYTE* dst = m_pAlphaMask;
+ for(int i = size.cx*size.cy; i>0; --i, ++dst)
+ *dst = 0x40 - *dst; // mask is 6 bit
+ }
}
CClipper::~CClipper()
@@ -566,7 +574,7 @@
CWord* CClipper::Copy()
{
- return(new CClipper(m_str, m_size, m_scalex, m_scaley));
+ return(new CClipper(m_str, m_size, m_scalex, m_scaley, m_inverse));
}
bool CClipper::Append(CWord* w)
@@ -969,7 +977,7 @@
{
CStringW str;
str.Format(L"m %d %d l %d %d %d %d %d %d", 0, 0, w, 0, w, h, 0, h);
- m_pClipper = new CClipper(str, size, 1, 1);
+ m_pClipper = new CClipper(str, size, 1, 1, false);
if(!m_pClipper) return;
}
@@ -1003,7 +1011,7 @@
{
CStringW str;
str.Format(L"m %d %d l %d %d %d %d %d %d", 0, 0, w, 0, w, h, 0, h);
- m_pClipper = new CClipper(str, size, 1, 1);
+ m_pClipper = new CClipper(str, size, 1, 1, false);
if(!m_pClipper) return;
}
@@ -1578,21 +1586,22 @@
}
else if(cmd == L"clip" || cmd == L"iclip")
{
+ bool invert = (cmd == L"iclip");
+
if(params.GetCount() == 1 && !sub->m_pClipper)
{
- sub->m_pClipper = new CClipper(params[0], CSize(m_size.cx>>3, m_size.cy>>3), sub->m_scalex, sub->m_scaley);
+ sub->m_pClipper = new CClipper(params[0], CSize(m_size.cx>>3, m_size.cy>>3), sub->m_scalex, sub->m_scaley, invert);
}
else if(params.GetCount() == 2 && !sub->m_pClipper)
{
int scale = max(wcstol(p, NULL, 10), 1);
- sub->m_pClipper = new CClipper(params[1], CSize(m_size.cx>>3, m_size.cy>>3), sub->m_scalex/(1<<(scale-1)), sub->m_scaley/(1<<(scale-1)));
+ sub->m_pClipper = new CClipper(params[1], CSize(m_size.cx>>3, m_size.cy>>3), sub->m_scalex/(1<<(scale-1)), sub->m_scaley/(1<<(scale-1)), invert);
}
else if(params.GetCount() == 4)
{
CRect r;
- if(cmd == L"iclip") // TODO: Also support inverse vector clips?
- sub->m_clipInverse = true;
+ sub->m_clipInverse = invert;
r.SetRect(
wcstol(params[0], NULL, 10),
Index: subtitles/RTS.h
===================================================================
--- subtitles/RTS.h (revision 2286)
+++ subtitles/RTS.h (working copy)
@@ -111,10 +111,11 @@
virtual bool Append(CWord* w);
public:
- CClipper(CStringW str, CSize size, double scalex, double scaley);
+ CClipper(CStringW str, CSize size, double scalex, double scaley, bool inverse);
virtual ~CClipper();
CSize m_size;
+ bool m_inverse;
BYTE* m_pAlphaMask;
};