Add support for the scale parameter of vector clips. Closes #1415.
Originally committed to SVN as r6364.
This commit is contained in:
parent
214079af58
commit
d001d66b12
4 changed files with 54 additions and 15 deletions
|
@ -47,10 +47,26 @@
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
#include "visual_tool.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 Spline::EncodeToASS() {
|
||||||
wxString result;
|
wxString result;
|
||||||
result.reserve(size() * 10);
|
result.reserve(size() * 10);
|
||||||
|
@ -63,7 +79,7 @@ wxString Spline::EncodeToASS() {
|
||||||
result += "m ";
|
result += "m ";
|
||||||
last = 'm';
|
last = 'm';
|
||||||
}
|
}
|
||||||
result += scale.ToScriptCoords(cur->p1).DStr(' ');
|
result += ToScript(cur->p1).DStr(' ');
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SplineCurve::LINE:
|
case SplineCurve::LINE:
|
||||||
|
@ -71,7 +87,7 @@ wxString Spline::EncodeToASS() {
|
||||||
result += "l ";
|
result += "l ";
|
||||||
last = 'l';
|
last = 'l';
|
||||||
}
|
}
|
||||||
result += scale.ToScriptCoords(cur->p2).DStr(' ');
|
result += ToScript(cur->p2).DStr(' ');
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SplineCurve::BICUBIC:
|
case SplineCurve::BICUBIC:
|
||||||
|
@ -79,9 +95,9 @@ wxString Spline::EncodeToASS() {
|
||||||
result += "b ";
|
result += "b ";
|
||||||
last = 'b';
|
last = 'b';
|
||||||
}
|
}
|
||||||
result += scale.ToScriptCoords(cur->p2).DStr(' ') + " ";
|
result += ToScript(cur->p2).DStr(' ') + " ";
|
||||||
result += scale.ToScriptCoords(cur->p3).DStr(' ') + " ";
|
result += ToScript(cur->p3).DStr(' ') + " ";
|
||||||
result += scale.ToScriptCoords(cur->p4).DStr(' ');
|
result += ToScript(cur->p4).DStr(' ');
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default: break;
|
default: break;
|
||||||
|
@ -110,7 +126,7 @@ void Spline::DecodeFromASS(wxString str) {
|
||||||
|
|
||||||
// Move
|
// Move
|
||||||
if (stack.size() == 2 && command == 'm') {
|
if (stack.size() == 2 && command == 'm') {
|
||||||
pt = scale.FromScriptCoords(Vector2D(stack[0], stack[1]));
|
pt = FromScript(Vector2D(stack[0], stack[1]));
|
||||||
stack.clear();
|
stack.clear();
|
||||||
|
|
||||||
push_back(pt);
|
push_back(pt);
|
||||||
|
@ -118,7 +134,7 @@ void Spline::DecodeFromASS(wxString str) {
|
||||||
|
|
||||||
// Line
|
// Line
|
||||||
if (stack.size() == 2 && command == 'l') {
|
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);
|
push_back(curve);
|
||||||
|
|
||||||
pt = curve.p2;
|
pt = curve.p2;
|
||||||
|
@ -128,9 +144,9 @@ void Spline::DecodeFromASS(wxString str) {
|
||||||
// Bicubic
|
// Bicubic
|
||||||
else if (stack.size() == 6 && command == 'b') {
|
else if (stack.size() == 6 && command == 'b') {
|
||||||
SplineCurve curve(pt,
|
SplineCurve curve(pt,
|
||||||
scale.FromScriptCoords(Vector2D(stack[0], stack[1])),
|
FromScript(Vector2D(stack[0], stack[1])),
|
||||||
scale.FromScriptCoords(Vector2D(stack[2], stack[3])),
|
FromScript(Vector2D(stack[2], stack[3])),
|
||||||
scale.FromScriptCoords(Vector2D(stack[4], stack[5])));
|
FromScript(Vector2D(stack[4], stack[5])));
|
||||||
push_back(curve);
|
push_back(curve);
|
||||||
|
|
||||||
pt = curve.p4;
|
pt = curve.p4;
|
||||||
|
|
|
@ -49,7 +49,17 @@ class VisualToolBase;
|
||||||
/// @class Spline
|
/// @class Spline
|
||||||
/// @brief DOCME
|
/// @brief DOCME
|
||||||
class Spline : private std::list<SplineCurve> {
|
class Spline : private std::list<SplineCurve> {
|
||||||
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:
|
public:
|
||||||
Spline(const VisualToolBase &scale);
|
Spline(const VisualToolBase &scale);
|
||||||
|
|
||||||
|
@ -59,6 +69,12 @@ public:
|
||||||
/// Decode an ASS vector drawing
|
/// Decode an ASS vector drawing
|
||||||
void DecodeFromASS(wxString str);
|
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
|
/// @brief Moves a specific point in the spline
|
||||||
/// @param curve Curve which the point is in
|
/// @param curve Curve which the point is in
|
||||||
/// @param point Index in the curve
|
/// @param point Index in the curve
|
||||||
|
|
|
@ -553,7 +553,7 @@ wxString VisualToolBase::GetLineVectorClip(AssDialogue *diag, int &scale, bool &
|
||||||
(*tag)[0]->Get<int>(), (*tag)[3]->Get<int>());
|
(*tag)[0]->Get<int>(), (*tag)[3]->Get<int>());
|
||||||
}
|
}
|
||||||
if (tag) {
|
if (tag) {
|
||||||
scale = (*tag)[0]->Get<int>(scale);
|
scale = std::max((*tag)[0]->Get(scale), 1);
|
||||||
return (*tag)[1]->Get<wxString>("");
|
return (*tag)[1]->Get<wxString>("");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -196,7 +196,13 @@ void VisualToolVectorClip::MakeFeatures() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void VisualToolVectorClip::Save() {
|
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) {
|
void VisualToolVectorClip::UpdateDrag(feature_iterator feature) {
|
||||||
|
@ -382,6 +388,7 @@ void VisualToolVectorClip::DoRefresh() {
|
||||||
wxString vect;
|
wxString vect;
|
||||||
int scale;
|
int scale;
|
||||||
vect = GetLineVectorClip(active_line, scale, inverse);
|
vect = GetLineVectorClip(active_line, scale, inverse);
|
||||||
|
spline.SetScale(scale);
|
||||||
spline.DecodeFromASS(vect);
|
spline.DecodeFromASS(vect);
|
||||||
|
|
||||||
MakeFeatures();
|
MakeFeatures();
|
||||||
|
|
Loading…
Reference in a new issue