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

124 lines
3.9 KiB
Diff

Index: subtitles/RTS.cpp
===================================================================
--- subtitles/RTS.cpp (revision 2285)
+++ subtitles/RTS.cpp (working copy)
@@ -796,6 +796,7 @@
{
memset(m_effects, 0, sizeof(Effect*)*EF_NUMBEROFEFFECTS);
m_pClipper = NULL;
+ m_clipInverse = false;
m_scalex = m_scaley = 1;
}
@@ -1455,6 +1456,8 @@
params.Add(cmd.Mid(3)), cmd = cmd.Left(3);
else if(!cmd.Find(L"fs"))
params.Add(cmd.Mid(2)), cmd = cmd.Left(2);
+ else if(!cmd.Find(L"iclip"))
+ ;
else if(!cmd.Find(L"i"))
params.Add(cmd.Mid(1)), cmd = cmd.Left(1);
else if(!cmd.Find(L"kt") || !cmd.Find(L"kf") || !cmd.Find(L"ko"))
@@ -1573,7 +1576,7 @@
? (n == 0 ? FW_NORMAL : n == 1 ? FW_BOLD : n >= 100 ? n : org.fontWeight)
: org.fontWeight;
}
- else if(cmd == L"clip")
+ else if(cmd == L"clip" || cmd == L"iclip")
{
if(params.GetCount() == 1 && !sub->m_pClipper)
{
@@ -1588,6 +1591,9 @@
{
CRect r;
+ if(cmd == L"iclip") // TODO: Also support inverse vector clips?
+ sub->m_clipInverse = true;
+
r.SetRect(
wcstol(params[0], NULL, 10),
wcstol(params[1], NULL, 10),
@@ -2458,6 +2464,13 @@
p = p2;
+ // Rectangles for inverse clip
+ CRect iclipRect[4];
+ iclipRect[0] = CRect(0, 0, spd.w, clipRect.top);
+ iclipRect[1] = CRect(0, clipRect.top, clipRect.left, clipRect.bottom);
+ iclipRect[2] = CRect(clipRect.right, clipRect.top, spd.w, clipRect.bottom);
+ iclipRect[3] = CRect(0, clipRect.bottom, spd.w, spd.h);
+
pos = s->GetHeadPosition();
while(pos)
{
@@ -2467,7 +2480,17 @@
: (s->m_scrAlignment%3) == 0 ? org.x - l->m_width
: org.x - (l->m_width/2);
- bbox2 |= l->PaintShadow(spd, clipRect, pAlphaMask, p, org2, m_time, alpha);
+ if (s->m_clipInverse)
+ {
+ bbox2 |= l->PaintShadow(spd, iclipRect[0], pAlphaMask, p, org2, m_time, alpha);
+ bbox2 |= l->PaintShadow(spd, iclipRect[1], pAlphaMask, p, org2, m_time, alpha);
+ bbox2 |= l->PaintShadow(spd, iclipRect[2], pAlphaMask, p, org2, m_time, alpha);
+ bbox2 |= l->PaintShadow(spd, iclipRect[3], pAlphaMask, p, org2, m_time, alpha);
+ }
+ else
+ {
+ bbox2 |= l->PaintShadow(spd, clipRect, pAlphaMask, p, org2, m_time, alpha);
+ }
p.y += l->m_ascent + l->m_descent;
}
@@ -2483,7 +2506,17 @@
: (s->m_scrAlignment%3) == 0 ? org.x - l->m_width
: org.x - (l->m_width/2);
- bbox2 |= l->PaintOutline(spd, clipRect, pAlphaMask, p, org2, m_time, alpha);
+ if (s->m_clipInverse)
+ {
+ bbox2 |= l->PaintOutline(spd, iclipRect[0], pAlphaMask, p, org2, m_time, alpha);
+ bbox2 |= l->PaintOutline(spd, iclipRect[1], pAlphaMask, p, org2, m_time, alpha);
+ bbox2 |= l->PaintOutline(spd, iclipRect[2], pAlphaMask, p, org2, m_time, alpha);
+ bbox2 |= l->PaintOutline(spd, iclipRect[3], pAlphaMask, p, org2, m_time, alpha);
+ }
+ else
+ {
+ bbox2 |= l->PaintOutline(spd, clipRect, pAlphaMask, p, org2, m_time, alpha);
+ }
p.y += l->m_ascent + l->m_descent;
}
@@ -2499,7 +2532,17 @@
: (s->m_scrAlignment%3) == 0 ? org.x - l->m_width
: org.x - (l->m_width/2);
- bbox2 |= l->PaintBody(spd, clipRect, pAlphaMask, p, org2, m_time, alpha);
+ if (s->m_clipInverse)
+ {
+ bbox2 |= l->PaintBody(spd, iclipRect[0], pAlphaMask, p, org2, m_time, alpha);
+ bbox2 |= l->PaintBody(spd, iclipRect[1], pAlphaMask, p, org2, m_time, alpha);
+ bbox2 |= l->PaintBody(spd, iclipRect[2], pAlphaMask, p, org2, m_time, alpha);
+ bbox2 |= l->PaintBody(spd, iclipRect[3], pAlphaMask, p, org2, m_time, alpha);
+ }
+ else
+ {
+ bbox2 |= l->PaintBody(spd, clipRect, pAlphaMask, p, org2, m_time, alpha);
+ }
p.y += l->m_ascent + l->m_descent;
}
Index: subtitles/RTS.h
===================================================================
--- subtitles/RTS.h (revision 2279)
+++ subtitles/RTS.h (working copy)
@@ -172,6 +172,7 @@
CRect m_rect, m_clip;
int m_topborder, m_bottomborder;
+ bool m_clipInverse;
double m_scalex, m_scaley;