From 5108f81cc1cf4b4b6921e5cb3c9eaa04091ce294 Mon Sep 17 00:00:00 2001 From: Rodrigo Braz Monteiro Date: Wed, 10 Jan 2007 21:53:00 +0000 Subject: [PATCH] Visual typesetting for \clip implemented. Originally committed to SVN as r764. --- aegisub/subs_edit_box.cpp | 11 ++-- aegisub/video_display_visual.cpp | 108 +++++++++++++++++++++++++++++++ aegisub/video_display_visual.h | 3 +- 3 files changed, 117 insertions(+), 5 deletions(-) diff --git a/aegisub/subs_edit_box.cpp b/aegisub/subs_edit_box.cpp index 230960fc2..79a8cb88e 100644 --- a/aegisub/subs_edit_box.cpp +++ b/aegisub/subs_edit_box.cpp @@ -932,7 +932,7 @@ void SubsEditBox::SetOverride (wxString tagname,wxString preValue,int forcePos) float startScale; bool isColor = false; bool isFont = false; - bool isPos = false; + bool isGeneric = false; bool isFlag = false; bool isAngle = false; bool isScale = false; @@ -981,7 +981,7 @@ void SubsEditBox::SetOverride (wxString tagname,wxString preValue,int forcePos) isColor = true; } else if (tagname == _T("\\pos")) { - isPos = true; + isGeneric = true; } else if (tagname == _T("\\frz")) { startangle = style->angle; @@ -999,6 +999,9 @@ void SubsEditBox::SetOverride (wxString tagname,wxString preValue,int forcePos) startScale = style->scaley; isScale = true; } + else if (tagname == _T("\\clip")) { + isGeneric = true; + } bool hasEnd = isFlag; // Find current value of style @@ -1082,8 +1085,8 @@ void SubsEditBox::SetOverride (wxString tagname,wxString preValue,int forcePos) if (insert.IsEmpty()) return; } - // Pos - if (isPos) { + // Generic tag + if (isGeneric) { insert = tagname + preValue; } diff --git a/aegisub/video_display_visual.cpp b/aegisub/video_display_visual.cpp index ef5151e9e..d16793fa0 100644 --- a/aegisub/video_display_visual.cpp +++ b/aegisub/video_display_visual.cpp @@ -344,6 +344,33 @@ void VideoDisplayVisual::DrawOverlay() { dc.DrawLine(drawX+5,dy-len/2+1,drawX+15,dy-len/2+1); dc.DrawLine(drawX+5,dy+len/2,drawX+15,dy+len/2); } + + // Clip + if (mode == 5) { + int dx1,dx2,dy1,dy2; + + // Get position + if (isCur) { + dx1 = startX; + dy1 = startY; + dx2 = x; + dy2 = y; + } + else GetLineClip(diag,dx1,dy1,dx2,dy2); + + // Draw rectangle + dc.SetPen(wxPen(colour[3],1)); + dc.SetBrush(*wxTRANSPARENT_BRUSH); + dc.DrawRectangle(dx1,dy1,dx2-dx1+1,dy2-dy1+1); + + // Draw circles + dc.SetPen(wxPen(colour[0],1)); + dc.SetBrush(wxBrush(colour[brushCol])); + dc.DrawCircle(dx1,dy1,4); + dc.DrawCircle(dx1,dy2,4); + dc.DrawCircle(dx2,dy1,4); + dc.DrawCircle(dx2,dy2,4); + } } } } @@ -584,6 +611,41 @@ void VideoDisplayVisual::GetLineScale(AssDialogue *diag,float &scalX,float &scal } +/////////////////// +// Get line's clip +void VideoDisplayVisual::GetLineClip(AssDialogue *diag,int &x1,int &y1,int &x2,int &y2) { + // Default values + x1 = y1 = 0; + x2 = parent->w-1; + y2 = parent->h-1; + + // Prepare overrides + diag->ParseASSTags(); + AssDialogueBlockOverride *override; + AssOverrideTag *tag; + size_t blockn = diag->Blocks.size(); + if (blockn == 0) { + diag->ClearBlocks(); + return; + } + + // Process override + override = AssDialogueBlock::GetAsOverride(diag->Blocks.at(0)); + if (override) { + for (size_t j=0;jTags.size();j++) { + tag = override->Tags.at(j); + if (tag->Name == _T("\\clip") && tag->Params.size() == 4) { + x1 = tag->Params[0]->AsInt(); + y1 = tag->Params[1]->AsInt(); + x2 = tag->Params[2]->AsInt(); + y2 = tag->Params[3]->AsInt(); + } + } + } + diag->ClearBlocks(); +} + + ////////////////// // Draw Tracking Overlay void VideoDisplayVisual::DrawTrackingOverlay( wxDC &dc ) @@ -852,6 +914,12 @@ void VideoDisplayVisual::OnMouseEvent (wxMouseEvent &event) { curScaleY = scalY; } + // Clip + if (mode == 5) { + startX = x; + startY = y; + } + // Hold it holding = true; hold = mode; @@ -928,6 +996,34 @@ void VideoDisplayVisual::OnMouseEvent (wxMouseEvent &event) { } } + // Clip + else if (hold == 5) { + // Coordinates + curX = startX * sw / w; + curY = startY * sh / h; + curX2 = x * sw / w; + curY2 = y * sh / h; + int temp; + if (curX > curX2) { + temp = curX; + curX = curX2; + curX2 = temp; + } + if (curY > curY2) { + temp = curY; + curY = curY2; + curY2 = temp; + } + + // Update + if (realTime) { + AssLimitToVisibleFilter::SetFrame(frame_n); + grid->editBox->SetOverride(_T("\\clip"),wxString::Format(_T("%i,%i,%i,%i"),curX,curY,curX2,curY2),0); + grid->editBox->CommitText(true); + grid->CommitChanges(false,true); + } + } + // End dragging if (holding && !event.LeftIsDown()) { // Disable limiting @@ -949,6 +1045,17 @@ void VideoDisplayVisual::OnMouseEvent (wxMouseEvent &event) { grid->editBox->SetOverride(_T("\\fry"),PrettyFloat(wxString::Format(_T("(%0.3f)"),curAngle2)),0); } + // Finished scaling + else if (hold == 4) { + grid->editBox->SetOverride(_T("\\fscx"),PrettyFloat(wxString::Format(_T("(%0.3f)"),curScaleX)),0); + grid->editBox->SetOverride(_T("\\fscy"),PrettyFloat(wxString::Format(_T("(%0.3f)"),curScaleY)),0); + } + + // Finished clipping + else if (hold == 5) { + grid->editBox->SetOverride(_T("\\clip"),wxString::Format(_T("%i,%i,%i,%i"),curX,curY,curX2,curY2),0); + } + // Commit grid->editBox->CommitText(); grid->ass->FlagAsModified(); @@ -997,4 +1104,5 @@ void VideoDisplayVisual::OnKeyEvent(wxKeyEvent &event) { if (event.GetKeyCode() == 'D') SetMode(2); if (event.GetKeyCode() == 'F') SetMode(3); if (event.GetKeyCode() == 'G') SetMode(4); + if (event.GetKeyCode() == 'H') SetMode(5); } diff --git a/aegisub/video_display_visual.h b/aegisub/video_display_visual.h index c81e021cb..3808f938d 100644 --- a/aegisub/video_display_visual.h +++ b/aegisub/video_display_visual.h @@ -53,7 +53,7 @@ private: int mouseX,mouseY; int startX,startY; - int curX,curY; + int curX,curY,curX2,curY2; int origX,origY; float curAngle,startAngle,origAngle; float curAngle2,startAngle2,origAngle2; @@ -74,6 +74,7 @@ private: void GetLinePosition(AssDialogue *diag,int &x,int &y,int &orgx,int &orgy); void GetLineRotation(AssDialogue *diag,float &rx,float &ry,float &rz); void GetLineScale(AssDialogue *diag,float &scalX,float &scalY); + void GetLineClip(AssDialogue *diag,int &x1,int &y1,int &x2,int &y2); void DrawTrackingOverlay(wxDC &dc); void DrawOverlay();