From e55af3e3c8480eac8f9afb9658b8da0057feac76 Mon Sep 17 00:00:00 2001 From: ibaker Date: Mon, 6 Jan 2020 12:49:43 +0000 Subject: [PATCH] Add RubySpan This will be used when parsing Ruby info from WebVTT and TTML/IMSC subtitles. PiperOrigin-RevId: 288280181 --- .../exoplayer2/text/span/RubySpan.java | 86 +++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 library/core/src/main/java/com/google/android/exoplayer2/text/span/RubySpan.java diff --git a/library/core/src/main/java/com/google/android/exoplayer2/text/span/RubySpan.java b/library/core/src/main/java/com/google/android/exoplayer2/text/span/RubySpan.java new file mode 100644 index 0000000000..8ed84d6f6b --- /dev/null +++ b/library/core/src/main/java/com/google/android/exoplayer2/text/span/RubySpan.java @@ -0,0 +1,86 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.google.android.exoplayer2.text.span; + +import static java.lang.annotation.RetentionPolicy.SOURCE; + +import androidx.annotation.IntDef; +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; + +/** + * A styling span for ruby text. + * + *

The text covered by this span is known as the "base text", and the ruby text is stored in + * {@link #rubyText}. + * + *

More information on ruby characters + * and span styling. + */ +// NOTE: There's no Android layout support for rubies, so this span currently doesn't extend any +// styling superclasses (e.g. MetricAffectingSpan). The only way to render these rubies is to +// extract the spans and do the layout manually. +// TODO: Consider adding support for parenthetical text to be used when rendering doesn't support +// rubies (e.g. HTML tag). +public final class RubySpan { + + /** The ruby position is unknown. */ + public static final int POSITION_UNKNOWN = -1; + + /** + * The ruby text should be positioned above the base text. + * + *

For vertical text it should be positioned to the right, same as CSS's ruby-position. + */ + public static final int POSITION_OVER = 1; + + /** + * The ruby text should be positioned below the base text. + * + *

For vertical text it should be positioned to the left, same as CSS's ruby-position. + */ + public static final int POSITION_UNDER = 2; + + /** + * The possible positions of the ruby text relative to the base text. + * + *

One of: + * + *

+ */ + @Documented + @Retention(SOURCE) + @IntDef({POSITION_UNKNOWN, POSITION_OVER, POSITION_UNDER}) + public @interface Position {} + + /** The ruby text, i.e. the smaller explanatory characters. */ + public final String rubyText; + + /** The position of the ruby text relative to the base text. */ + @Position public final int position; + + public RubySpan(String rubyText, @Position int position) { + this.rubyText = rubyText; + this.position = position; + } +}