Skip to content

Commit bab2b19

Browse files
committed
feat: add experimental positioning for default EPUB decoration styles
this will position decorations between text and background, allowing for opaque highlight colors
1 parent 2f75ab2 commit bab2b19

File tree

3 files changed

+54
-6
lines changed

3 files changed

+54
-6
lines changed

readium/navigator/src/main/java/org/readium/r2/navigator/epub/EpubNavigatorFragment.kt

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
package org.readium.r2.navigator.epub
1010

11+
import android.graphics.Color
1112
import android.graphics.PointF
1213
import android.graphics.RectF
1314
import android.os.Bundle
@@ -20,6 +21,7 @@ import android.webkit.JavascriptInterface
2021
import android.webkit.WebResourceRequest
2122
import android.webkit.WebResourceResponse
2223
import android.webkit.WebView
24+
import androidx.annotation.ColorInt
2325
import androidx.collection.forEach
2426
import androidx.constraintlayout.widget.ConstraintLayout
2527
import androidx.core.os.BundleCompat
@@ -214,14 +216,17 @@ public class EpubNavigatorFragment internal constructor(
214216
public constructor(
215217
servedAssets: List<String> = emptyList(),
216218
readiumCssRsProperties: RsProperties = RsProperties(),
217-
decorationTemplates: HtmlDecorationTemplates = HtmlDecorationTemplates.defaultTemplates(),
219+
decorationTemplates: HtmlDecorationTemplates? = null,
218220
disablePageTurnsWhileScrolling: Boolean = false,
219221
selectionActionModeCallback: ActionMode.Callback? = null,
220222
shouldApplyInsetsPadding: Boolean? = true,
223+
experimentalDecorationPositioning: Boolean? = false,
221224
) : this(
222225
servedAssets = servedAssets,
223226
readiumCssRsProperties = readiumCssRsProperties,
224-
decorationTemplates = decorationTemplates,
227+
decorationTemplates = decorationTemplates ?: HtmlDecorationTemplates.defaultTemplates(
228+
experimentalPositioning = experimentalDecorationPositioning == true
229+
),
225230
disablePageTurnsWhileScrolling = disablePageTurnsWhileScrolling,
226231
selectionActionModeCallback = selectionActionModeCallback,
227232
shouldApplyInsetsPadding = shouldApplyInsetsPadding,
@@ -259,6 +264,27 @@ public class EpubNavigatorFragment internal constructor(
259264
)
260265
}
261266

267+
/**
268+
* Update default decorations, to change styling and positioning.
269+
*/
270+
public fun updateDefaultDecorations(
271+
@ColorInt defaultTint: Int = Color.YELLOW,
272+
lineWeight: Int = 2,
273+
cornerRadius: Int = 3,
274+
alpha: Double = 0.3,
275+
experimentalPositioning: Boolean = false,
276+
) {
277+
val updatedDefaultTemplates =
278+
HtmlDecorationTemplates.defaultTemplates(
279+
defaultTint,
280+
lineWeight,
281+
cornerRadius,
282+
alpha,
283+
experimentalPositioning,
284+
)
285+
decorationTemplates = decorationTemplates.copyWith(updatedDefaultTemplates)
286+
}
287+
262288
public companion object {
263289
public operator fun invoke(builder: Configuration.() -> Unit): Configuration =
264290
Configuration().apply(builder)

readium/navigator/src/main/java/org/readium/r2/navigator/html/HtmlDecorationTemplate.kt

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -94,13 +94,15 @@ public data class HtmlDecorationTemplate(
9494
lineWeight: Int,
9595
cornerRadius: Int,
9696
alpha: Double,
97+
experimentalPositioning: Boolean = false,
9798
): HtmlDecorationTemplate =
9899
createTemplate(
99100
asHighlight = true,
100101
defaultTint = defaultTint,
101102
lineWeight = lineWeight,
102103
cornerRadius = cornerRadius,
103-
alpha = alpha
104+
alpha = alpha,
105+
experimentalPositioning = experimentalPositioning,
104106
)
105107

106108
/** Creates a new decoration template for the underline style. */
@@ -109,13 +111,15 @@ public data class HtmlDecorationTemplate(
109111
lineWeight: Int,
110112
cornerRadius: Int,
111113
alpha: Double,
114+
experimentalPositioning: Boolean = false,
112115
): HtmlDecorationTemplate =
113116
createTemplate(
114117
asHighlight = false,
115118
defaultTint = defaultTint,
116119
lineWeight = lineWeight,
117120
cornerRadius = cornerRadius,
118-
alpha = alpha
121+
alpha = alpha,
122+
experimentalPositioning = experimentalPositioning,
119123
)
120124

121125
/**
@@ -128,6 +132,7 @@ public data class HtmlDecorationTemplate(
128132
lineWeight: Int,
129133
cornerRadius: Int,
130134
alpha: Double,
135+
experimentalPositioning: Boolean = false,
131136
): HtmlDecorationTemplate {
132137
val className = createUniqueClassName(if (asHighlight) "highlight" else "underline")
133138
val padding = Padding(left = 1, right = 1)
@@ -141,6 +146,9 @@ public data class HtmlDecorationTemplate(
141146
if (asHighlight || isActive) {
142147
append("background-color: ${tint.toCss(alpha = alpha)} !important;")
143148
}
149+
if (experimentalPositioning) {
150+
append("--decoration-z-index: -1;")
151+
}
144152
if (!asHighlight || isActive) {
145153
append("--underline-color: ${tint.toCss()};")
146154
}
@@ -154,6 +162,7 @@ public data class HtmlDecorationTemplate(
154162
border-radius: ${cornerRadius}px;
155163
box-sizing: border-box;
156164
border: 0 solid var(--underline-color);
165+
z-index: var(--decoration-z-index);
157166
}
158167
159168
/* Horizontal (default) */
@@ -201,6 +210,13 @@ public class HtmlDecorationTemplates private constructor(
201210

202211
public fun copy(): HtmlDecorationTemplates = HtmlDecorationTemplates(styles.toMutableMap())
203212

213+
public fun copyWith(other: HtmlDecorationTemplates): HtmlDecorationTemplates =
214+
copy().apply {
215+
other.styles.forEach { (key, value) ->
216+
styles[key] = value
217+
}
218+
}
219+
204220
public companion object {
205221
public operator fun invoke(build: HtmlDecorationTemplates.() -> Unit): HtmlDecorationTemplates =
206222
HtmlDecorationTemplates().apply(build)
@@ -213,14 +229,16 @@ public class HtmlDecorationTemplates private constructor(
213229
lineWeight: Int = 2,
214230
cornerRadius: Int = 3,
215231
alpha: Double = 0.3,
232+
experimentalPositioning: Boolean = false,
216233
): HtmlDecorationTemplates = HtmlDecorationTemplates {
217234
set(
218235
Style.Highlight::class,
219236
HtmlDecorationTemplate.highlight(
220237
defaultTint = defaultTint,
221238
lineWeight = lineWeight,
222239
cornerRadius = cornerRadius,
223-
alpha = alpha
240+
alpha = alpha,
241+
experimentalPositioning = experimentalPositioning,
224242
)
225243
)
226244
set(
@@ -229,7 +247,8 @@ public class HtmlDecorationTemplates private constructor(
229247
defaultTint = defaultTint,
230248
lineWeight = lineWeight,
231249
cornerRadius = cornerRadius,
232-
alpha = alpha
250+
alpha = alpha,
251+
experimentalPositioning = experimentalPositioning,
233252
)
234253
)
235254
}

test-app/src/main/java/org/readium/r2/testapp/reader/EpubReaderFragment.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,9 @@ class EpubReaderFragment : VisualReaderFragment() {
8787
decorationTemplates[DecorationStyleAnnotationMark::class] = annotationMarkTemplate()
8888
decorationTemplates[DecorationStylePageNumber::class] = pageNumberTemplate()
8989

90+
// Update default decorations to be opaque and use experimental positioning.
91+
updateDefaultDecorations(experimentalPositioning = true, alpha = 1.0)
92+
9093
// Declare a custom font family for reflowable EPUBs.
9194
addFontFamilyDeclaration(FontFamily.LITERATA) {
9295
addFontFace {

0 commit comments

Comments
 (0)