Skip to content

Commit 0a1002c

Browse files
astiobarch1t3cht
authored andcommitted
Fix/improve non-3D tag resampling categories
1 parent 0a229cc commit 0a1002c

File tree

3 files changed

+35
-20
lines changed

3 files changed

+35
-20
lines changed

src/ass_override.cpp

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -181,12 +181,12 @@ static void load_protos() {
181181
// Longer tag names must appear before shorter tag names
182182

183183
proto[0].Set("\\alpha", VariableDataType::TEXT, AssParameterClass::ALPHA); // \alpha&H<aa>&
184-
proto[++i].Set("\\bord", VariableDataType::FLOAT, AssParameterClass::ABSOLUTE_SIZE); // \bord<depth>
185-
proto[++i].Set("\\xbord", VariableDataType::FLOAT, AssParameterClass::ABSOLUTE_SIZE); // \xbord<depth>
186-
proto[++i].Set("\\ybord", VariableDataType::FLOAT, AssParameterClass::ABSOLUTE_SIZE); // \ybord<depth>
187-
proto[++i].Set("\\shad", VariableDataType::FLOAT, AssParameterClass::ABSOLUTE_SIZE); // \shad<depth>
188-
proto[++i].Set("\\xshad", VariableDataType::FLOAT, AssParameterClass::ABSOLUTE_SIZE); // \xshad<depth>
189-
proto[++i].Set("\\yshad", VariableDataType::FLOAT, AssParameterClass::ABSOLUTE_SIZE); // \yshad<depth>
184+
proto[++i].Set("\\bord", VariableDataType::FLOAT, AssParameterClass::ABSOLUTE_SIZE_XY); // \bord<depth>
185+
proto[++i].Set("\\xbord", VariableDataType::FLOAT, AssParameterClass::ABSOLUTE_SIZE_X); // \xbord<depth>
186+
proto[++i].Set("\\ybord", VariableDataType::FLOAT, AssParameterClass::ABSOLUTE_SIZE_Y); // \ybord<depth>
187+
proto[++i].Set("\\shad", VariableDataType::FLOAT, AssParameterClass::ABSOLUTE_SIZE_XY); // \shad<depth>
188+
proto[++i].Set("\\xshad", VariableDataType::FLOAT, AssParameterClass::ABSOLUTE_SIZE_X); // \xshad<depth>
189+
proto[++i].Set("\\yshad", VariableDataType::FLOAT, AssParameterClass::ABSOLUTE_SIZE_Y); // \yshad<depth>
190190

191191
// \fade(<a1>,<a2>,<a3>,<t1>,<t2>,<t3>,<t4>)
192192
i++;
@@ -249,17 +249,17 @@ static void load_protos() {
249249
// \org(<x>,<y>)
250250
i++;
251251
proto[i].name = "\\org";
252-
proto[i].AddParam(VariableDataType::INT, AssParameterClass::ABSOLUTE_POS_X);
253-
proto[i].AddParam(VariableDataType::INT, AssParameterClass::ABSOLUTE_POS_Y);
252+
proto[i].AddParam(VariableDataType::FLOAT, AssParameterClass::ABSOLUTE_POS_X);
253+
proto[i].AddParam(VariableDataType::FLOAT, AssParameterClass::ABSOLUTE_POS_Y);
254254

255-
proto[++i].Set("\\pbo", VariableDataType::INT, AssParameterClass::ABSOLUTE_POS_Y); // \pbo<y>
255+
proto[++i].Set("\\pbo", VariableDataType::INT, AssParameterClass::ABSOLUTE_SIZE_Y); // \pbo<y>
256256
// \fad(<t1>,<t2>)
257257
i++;
258258
proto[i].name = "\\fad";
259259
proto[i].AddParam(VariableDataType::INT, AssParameterClass::RELATIVE_TIME_START);
260260
proto[i].AddParam(VariableDataType::INT, AssParameterClass::RELATIVE_TIME_END);
261261

262-
proto[++i].Set("\\fsp", VariableDataType::FLOAT, AssParameterClass::ABSOLUTE_SIZE); // \fsp<pixels>
262+
proto[++i].Set("\\fsp", VariableDataType::FLOAT, AssParameterClass::ABSOLUTE_SIZE_Y); // \fsp<pixels> (affected by \fscx)
263263
proto[++i].Set("\\frx", VariableDataType::FLOAT); // \frx<degrees>
264264
proto[++i].Set("\\fry", VariableDataType::FLOAT); // \fry<degrees>
265265
proto[++i].Set("\\frz", VariableDataType::FLOAT); // \frz<degrees>
@@ -277,12 +277,12 @@ static void load_protos() {
277277
proto[++i].Set("\\fe", VariableDataType::TEXT); // \fe<charset>
278278
proto[++i].Set("\\ko", VariableDataType::INT, AssParameterClass::KARAOKE); // \ko<duration>
279279
proto[++i].Set("\\kf", VariableDataType::INT, AssParameterClass::KARAOKE); // \kf<duration>
280-
proto[++i].Set("\\be", VariableDataType::INT, AssParameterClass::ABSOLUTE_SIZE); // \be<strength>
281-
proto[++i].Set("\\blur", VariableDataType::FLOAT, AssParameterClass::ABSOLUTE_SIZE); // \blur<strength>
280+
proto[++i].Set("\\be", VariableDataType::INT, AssParameterClass::ABSOLUTE_SIZE_XY); // \be<strength>
281+
proto[++i].Set("\\blur", VariableDataType::FLOAT, AssParameterClass::ABSOLUTE_SIZE_XY); // \blur<strength>
282282
proto[++i].Set("\\fn", VariableDataType::TEXT); // \fn<name>
283283
proto[++i].Set("\\fs+", VariableDataType::FLOAT); // \fs+<size>
284284
proto[++i].Set("\\fs-", VariableDataType::FLOAT); // \fs-<size>
285-
proto[++i].Set("\\fs", VariableDataType::FLOAT, AssParameterClass::ABSOLUTE_SIZE); // \fs<size>
285+
proto[++i].Set("\\fs", VariableDataType::FLOAT, AssParameterClass::ABSOLUTE_SIZE_Y); // \fs<size>
286286
proto[++i].Set("\\an", VariableDataType::INT); // \an<alignment>
287287
proto[++i].Set("\\c", VariableDataType::TEXT, AssParameterClass::COLOR); // \c&H<bbggrr>&
288288
proto[++i].Set("\\b", VariableDataType::INT); // \b<0/1/weight>

src/ass_override.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,9 @@ class AssDialogueBlockOverride;
4040
/// Type of parameter
4141
enum class AssParameterClass {
4242
NORMAL,
43-
ABSOLUTE_SIZE,
43+
ABSOLUTE_SIZE_X,
44+
ABSOLUTE_SIZE_Y,
45+
ABSOLUTE_SIZE_XY,
4446
ABSOLUTE_POS_X,
4547
ABSOLUTE_POS_Y,
4648
RELATIVE_SIZE_X,

src/resolution_resampler.cpp

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ namespace {
9898
const int *margin;
9999
double rx;
100100
double ry;
101+
double rm;
101102
double ar;
102103
agi::ycbcr_converter conv;
103104
bool convert_colors;
@@ -110,10 +111,18 @@ namespace {
110111
int shift = 0;
111112

112113
switch (cur->classification) {
113-
case AssParameterClass::ABSOLUTE_SIZE:
114+
case AssParameterClass::ABSOLUTE_SIZE_X:
115+
resizer = state->rx;
116+
break;
117+
118+
case AssParameterClass::ABSOLUTE_SIZE_Y:
114119
resizer = state->ry;
115120
break;
116121

122+
case AssParameterClass::ABSOLUTE_SIZE_XY:
123+
resizer = state->rm;
124+
break;
125+
117126
case AssParameterClass::ABSOLUTE_POS_X:
118127
resizer = state->rx;
119128
shift = state->margin[LEFT];
@@ -176,9 +185,9 @@ namespace {
176185

177186
void resample_style(resample_state *state, AssStyle &style) {
178187
style.fontsize = int(style.fontsize * state->ry + 0.5);
179-
style.outline_w *= state->ry;
180-
style.shadow_w *= state->ry;
181-
style.spacing *= state->rx;
188+
style.outline_w *= state->rm;
189+
style.shadow_w *= state->rm;
190+
style.spacing *= state->ry; // gets multiplied by scalex (and hence by ar) during rendering
182191
style.scalex *= state->ar;
183192
for (int i = 0; i < 3; i++)
184193
style.Margin[i] = int((style.Margin[i] + state->margin[i]) * (i < 2 ? state->rx : state->ry) + 0.5);
@@ -260,10 +269,14 @@ void ResampleResolution(AssFile *ass, ResampleSettings settings) {
260269
settings.source_matrix != YCbCrMatrix::rgb &&
261270
settings.dest_matrix != YCbCrMatrix::rgb;
262271

272+
double rx = double(settings.dest_x) / double(settings.source_x);
273+
double ry = double(settings.dest_y) / double(settings.source_y);
274+
263275
resample_state state = {
264276
settings.margin,
265-
double(settings.dest_x) / double(settings.source_x),
266-
double(settings.dest_y) / double(settings.source_y),
277+
rx,
278+
ry,
279+
rx == ry ? rx : std::sqrt(rx * ry),
267280
horizontal_stretch,
268281
agi::ycbcr_converter{
269282
matrix(settings.source_matrix),

0 commit comments

Comments
 (0)