Commit 205adb7f by ibaker Committed by Oliver Woodman

Rewrite the vertical text support in SubtitleWebView

The attempt in <unknown commit> was hacky and incomplete.

PiperOrigin-RevId: 304356038
parent 7323b535
...@@ -167,45 +167,39 @@ import java.util.List; ...@@ -167,45 +167,39 @@ import java.util.List;
.append("\">"); .append("\">");
for (int i = 0; i < cues.size(); i++) { for (int i = 0; i < cues.size(); i++) {
float horizontalPositionPercent;
int horizontalTranslatePercent;
Cue cue = cues.get(i); Cue cue = cues.get(i);
if (cue.position != Cue.DIMEN_UNSET) { float positionPercent = (cue.position != Cue.DIMEN_UNSET) ? (cue.position * 100) : 50;
horizontalPositionPercent = cue.position * 100; int positionAnchorTranslatePercent = anchorTypeToTranslatePercent(cue.positionAnchor);
horizontalTranslatePercent = translatePercentFromAnchorType(cue.positionAnchor);
} else {
horizontalPositionPercent = 50;
horizontalTranslatePercent = -50;
}
float verticalPositionPercent; float linePercent;
int verticalTranslatePercent; int lineTranslatePercent;
if (cue.line != Cue.DIMEN_UNSET) { if (cue.line != Cue.DIMEN_UNSET) {
verticalTranslatePercent = translatePercentFromAnchorType(cue.lineAnchor);
switch (cue.lineType) { switch (cue.lineType) {
case Cue.LINE_TYPE_FRACTION:
verticalPositionPercent = cue.line * 100;
break;
case Cue.LINE_TYPE_NUMBER: case Cue.LINE_TYPE_NUMBER:
if (cue.line >= 0) { if (cue.line >= 0) {
verticalPositionPercent = 0; linePercent = 0;
verticalTranslatePercent += Math.round(cue.line) * 100; lineTranslatePercent = Math.round(cue.line) * 100;
} else { } else {
verticalPositionPercent = 100; linePercent = 100;
verticalTranslatePercent += Math.round(cue.line + 1) * 100; lineTranslatePercent = Math.round(cue.line + 1) * 100;
} }
break; break;
case Cue.LINE_TYPE_FRACTION:
case Cue.TYPE_UNSET: case Cue.TYPE_UNSET:
default: default:
verticalPositionPercent = 0; linePercent = cue.line * 100;
break; lineTranslatePercent = 0;
} }
} else { } else {
verticalPositionPercent = 100; linePercent = 100;
verticalTranslatePercent = -100; lineTranslatePercent = 0;
} }
int lineAnchorTranslatePercent =
cue.verticalType == Cue.VERTICAL_TYPE_RL
? -anchorTypeToTranslatePercent(cue.lineAnchor)
: anchorTypeToTranslatePercent(cue.lineAnchor);
String width = String size =
cue.size != Cue.DIMEN_UNSET cue.size != Cue.DIMEN_UNSET
? Util.formatInvariant("%.2f%%", cue.size * 100) ? Util.formatInvariant("%.2f%%", cue.size * 100)
: "fit-content"; : "fit-content";
...@@ -214,31 +208,53 @@ import java.util.List; ...@@ -214,31 +208,53 @@ import java.util.List;
String writingMode = convertVerticalTypeToCss(cue.verticalType); String writingMode = convertVerticalTypeToCss(cue.verticalType);
// All measurements are done orthogonally for vertical text (i.e. from left of screen instead String positionProperty;
// of top, or vice versa). So flip the position & translation values. String lineProperty;
switch (cue.verticalType) {
case Cue.VERTICAL_TYPE_LR:
lineProperty = "left";
positionProperty = "top";
break;
case Cue.VERTICAL_TYPE_RL:
lineProperty = "right";
positionProperty = "top";
break;
case Cue.TYPE_UNSET:
default:
lineProperty = "top";
positionProperty = "left";
}
String sizeProperty;
int horizontalTranslatePercent;
int verticalTranslatePercent;
if (cue.verticalType == Cue.VERTICAL_TYPE_LR || cue.verticalType == Cue.VERTICAL_TYPE_RL) { if (cue.verticalType == Cue.VERTICAL_TYPE_LR || cue.verticalType == Cue.VERTICAL_TYPE_RL) {
float tmpFloat = horizontalPositionPercent; sizeProperty = "height";
horizontalPositionPercent = verticalPositionPercent; horizontalTranslatePercent = lineTranslatePercent + lineAnchorTranslatePercent;
verticalPositionPercent = tmpFloat; verticalTranslatePercent = positionAnchorTranslatePercent;
int tmpInt = horizontalTranslatePercent; } else {
horizontalTranslatePercent = verticalTranslatePercent; sizeProperty = "width";
verticalTranslatePercent = tmpInt; horizontalTranslatePercent = positionAnchorTranslatePercent;
verticalTranslatePercent = lineTranslatePercent + lineAnchorTranslatePercent;
} }
html.append( html.append(
Util.formatInvariant( Util.formatInvariant(
"<div style=\"" "<div style=\""
+ "position:relative;" + "position:absolute;"
+ "left:%.2f%%;" + "%s:%.2f%%;"
+ "top:%.2f%%;" + "%s:%.2f%%;"
+ "width:%s;" + "%s:%s;"
+ "text-align:%s;" + "text-align:%s;"
+ "writing-mode:%s;" + "writing-mode:%s;"
+ "transform:translate(%s%%,%s%%);" + "transform:translate(%s%%,%s%%);"
+ "\">", + "\">",
horizontalPositionPercent, positionProperty,
verticalPositionPercent, positionPercent,
width, lineProperty,
linePercent,
sizeProperty,
size,
textAlign, textAlign,
writingMode, writingMode,
horizontalTranslatePercent, horizontalTranslatePercent,
...@@ -284,16 +300,24 @@ import java.util.List; ...@@ -284,16 +300,24 @@ import java.util.List;
} }
} }
private static int translatePercentFromAnchorType(@Cue.AnchorType int anchorType) { /**
* Converts a {@link Cue.AnchorType} to a percentage for use in a CSS {@code transform:
* translate(x,y)} function.
*
* <p>We use {@code position: absolute} and always use the same CSS positioning property (top,
* bottom, left, right) regardless of the anchor type. The anchor is effectively 'moved' by using
* a CSS {@code translate(x,y)} operation on the value returned from this function.
*/
private static int anchorTypeToTranslatePercent(@Cue.AnchorType int anchorType) {
switch (anchorType) { switch (anchorType) {
case Cue.TYPE_UNSET:
case Cue.ANCHOR_TYPE_START:
return 0;
case Cue.ANCHOR_TYPE_MIDDLE:
return -50;
case Cue.ANCHOR_TYPE_END: case Cue.ANCHOR_TYPE_END:
return -100; return -100;
case Cue.ANCHOR_TYPE_MIDDLE:
return -50;
case Cue.ANCHOR_TYPE_START:
case Cue.TYPE_UNSET:
default:
return 0;
} }
throw new IllegalArgumentException();
} }
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment