From d001d66b122232b7b76fa1a9ca4d562c0fe684d0 Mon Sep 17 00:00:00 2001 From: Thomas Goyne Date: Thu, 26 Jan 2012 00:29:08 +0000 Subject: [PATCH] Add support for the scale parameter of vector clips. Closes #1415. Originally committed to SVN as r6364. --- aegisub/src/spline.cpp | 40 +++++++++++++++++-------- aegisub/src/spline.h | 18 ++++++++++- aegisub/src/visual_tool.cpp | 2 +- aegisub/src/visual_tool_vector_clip.cpp | 9 +++++- 4 files changed, 54 insertions(+), 15 deletions(-) diff --git a/aegisub/src/spline.cpp b/aegisub/src/spline.cpp index 594cd801d..3d010b954 100644 --- a/aegisub/src/spline.cpp +++ b/aegisub/src/spline.cpp @@ -47,10 +47,26 @@ #include "utils.h" #include "visual_tool.h" -Spline::Spline(const VisualToolBase &scale) : scale(scale) { +Spline::Spline(const VisualToolBase &tl) +: coord_translator(tl) +, scale(1) +, raw_scale(1) +{ +} + +Vector2D Spline::ToScript(Vector2D vec) const { + return coord_translator.ToScriptCoords(vec) * scale; +} + +Vector2D Spline::FromScript(Vector2D vec) const { + return coord_translator.FromScriptCoords(vec / scale); +} + +void Spline::SetScale(int new_scale) { + raw_scale = new_scale; + scale = 1 << (raw_scale - 1); } -/// @brief Encode to ASS wxString Spline::EncodeToASS() { wxString result; result.reserve(size() * 10); @@ -63,7 +79,7 @@ wxString Spline::EncodeToASS() { result += "m "; last = 'm'; } - result += scale.ToScriptCoords(cur->p1).DStr(' '); + result += ToScript(cur->p1).DStr(' '); break; case SplineCurve::LINE: @@ -71,7 +87,7 @@ wxString Spline::EncodeToASS() { result += "l "; last = 'l'; } - result += scale.ToScriptCoords(cur->p2).DStr(' '); + result += ToScript(cur->p2).DStr(' '); break; case SplineCurve::BICUBIC: @@ -79,9 +95,9 @@ wxString Spline::EncodeToASS() { result += "b "; last = 'b'; } - result += scale.ToScriptCoords(cur->p2).DStr(' ') + " "; - result += scale.ToScriptCoords(cur->p3).DStr(' ') + " "; - result += scale.ToScriptCoords(cur->p4).DStr(' '); + result += ToScript(cur->p2).DStr(' ') + " "; + result += ToScript(cur->p3).DStr(' ') + " "; + result += ToScript(cur->p4).DStr(' '); break; default: break; @@ -110,7 +126,7 @@ void Spline::DecodeFromASS(wxString str) { // Move if (stack.size() == 2 && command == 'm') { - pt = scale.FromScriptCoords(Vector2D(stack[0], stack[1])); + pt = FromScript(Vector2D(stack[0], stack[1])); stack.clear(); push_back(pt); @@ -118,7 +134,7 @@ void Spline::DecodeFromASS(wxString str) { // Line if (stack.size() == 2 && command == 'l') { - SplineCurve curve(pt, scale.FromScriptCoords(Vector2D(stack[0], stack[1]))); + SplineCurve curve(pt, FromScript(Vector2D(stack[0], stack[1]))); push_back(curve); pt = curve.p2; @@ -128,9 +144,9 @@ void Spline::DecodeFromASS(wxString str) { // Bicubic else if (stack.size() == 6 && command == 'b') { SplineCurve curve(pt, - scale.FromScriptCoords(Vector2D(stack[0], stack[1])), - scale.FromScriptCoords(Vector2D(stack[2], stack[3])), - scale.FromScriptCoords(Vector2D(stack[4], stack[5]))); + FromScript(Vector2D(stack[0], stack[1])), + FromScript(Vector2D(stack[2], stack[3])), + FromScript(Vector2D(stack[4], stack[5]))); push_back(curve); pt = curve.p4; diff --git a/aegisub/src/spline.h b/aegisub/src/spline.h index 0eabd68f1..940aceef9 100644 --- a/aegisub/src/spline.h +++ b/aegisub/src/spline.h @@ -49,7 +49,17 @@ class VisualToolBase; /// @class Spline /// @brief DOCME class Spline : private std::list { - const VisualToolBase &scale; + /// Visual tool to do the conversion between script and video pixels + const VisualToolBase &coord_translator; + /// Spline scale + int scale; + int raw_scale; + + /// Video coordinates -> Script coordinates + Vector2D ToScript(Vector2D vec) const; + + /// Script coordinates -> Video coordinates + Vector2D FromScript(Vector2D vec) const; public: Spline(const VisualToolBase &scale); @@ -59,6 +69,12 @@ public: /// Decode an ASS vector drawing void DecodeFromASS(wxString str); + /// Set the scale + /// @param new_scale Power-of-two to scale coordinates by + void SetScale(int new_scale); + /// Get the current scale + int GetScale() const { return raw_scale; } + /// @brief Moves a specific point in the spline /// @param curve Curve which the point is in /// @param point Index in the curve diff --git a/aegisub/src/visual_tool.cpp b/aegisub/src/visual_tool.cpp index 80ef2799f..d1443b565 100644 --- a/aegisub/src/visual_tool.cpp +++ b/aegisub/src/visual_tool.cpp @@ -553,7 +553,7 @@ wxString VisualToolBase::GetLineVectorClip(AssDialogue *diag, int &scale, bool & (*tag)[0]->Get(), (*tag)[3]->Get()); } if (tag) { - scale = (*tag)[0]->Get(scale); + scale = std::max((*tag)[0]->Get(scale), 1); return (*tag)[1]->Get(""); } diff --git a/aegisub/src/visual_tool_vector_clip.cpp b/aegisub/src/visual_tool_vector_clip.cpp index d9737f768..12ffa76d1 100644 --- a/aegisub/src/visual_tool_vector_clip.cpp +++ b/aegisub/src/visual_tool_vector_clip.cpp @@ -196,7 +196,13 @@ void VisualToolVectorClip::MakeFeatures() { } void VisualToolVectorClip::Save() { - SetOverride(active_line, inverse ? "\\iclip" : "\\clip", "(" + spline.EncodeToASS() + ")"); + wxString tag = inverse ? "\\iclip" : "\\clip"; + wxString value = "("; + if (spline.GetScale() != 1) + value += wxString::Format("%d,", spline.GetScale()); + value += spline.EncodeToASS() + ")"; + + SetOverride(active_line, tag, value); } void VisualToolVectorClip::UpdateDrag(feature_iterator feature) { @@ -382,6 +388,7 @@ void VisualToolVectorClip::DoRefresh() { wxString vect; int scale; vect = GetLineVectorClip(active_line, scale, inverse); + spline.SetScale(scale); spline.DecodeFromASS(vect); MakeFeatures();