Skip to content

Commit 425947d

Browse files
authored
Add experimental EPUB decoration positioning (#721)
1 parent 0bb690e commit 425947d

File tree

3 files changed

+33
-5
lines changed

3 files changed

+33
-5
lines changed

CHANGELOG.md

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,15 @@ All notable changes to this project will be documented in this file. Take a look
44

55
**Warning:** Features marked as *experimental* may change or be removed in a future release without notice. Use with caution.
66

7-
<!-- ## [Unreleased] -->
7+
## [Unreleased]
8+
9+
### Added
10+
11+
#### Navigator
12+
13+
* New experimental positioning of EPUB decorations that places highlights behind text to improve legibility with opaque decorations (contributed by [@ddfreiling](https://github.com/readium/kotlin-toolkit/pull/721)).
14+
* To opt-in, initialize the `EpubNavigatorFragment.Configuration` object with `decorationTemplates = HtmlDecorationTemplates.defaultTemplates(alpha = 1.0, experimentalPositioning = true)`.
15+
816

917
## [3.1.2]
1018

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

Lines changed: 16 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) */
@@ -213,14 +222,16 @@ public class HtmlDecorationTemplates private constructor(
213222
lineWeight: Int = 2,
214223
cornerRadius: Int = 3,
215224
alpha: Double = 0.3,
225+
experimentalPositioning: Boolean = false,
216226
): HtmlDecorationTemplates = HtmlDecorationTemplates {
217227
set(
218228
Style.Highlight::class,
219229
HtmlDecorationTemplate.highlight(
220230
defaultTint = defaultTint,
221231
lineWeight = lineWeight,
222232
cornerRadius = cornerRadius,
223-
alpha = alpha
233+
alpha = alpha,
234+
experimentalPositioning = experimentalPositioning,
224235
)
225236
)
226237
set(
@@ -229,7 +240,8 @@ public class HtmlDecorationTemplates private constructor(
229240
defaultTint = defaultTint,
230241
lineWeight = lineWeight,
231242
cornerRadius = cornerRadius,
232-
alpha = alpha
243+
alpha = alpha,
244+
experimentalPositioning = experimentalPositioning,
233245
)
234246
)
235247
}

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import org.readium.r2.navigator.Decoration
2929
import org.readium.r2.navigator.epub.*
3030
import org.readium.r2.navigator.epub.css.FontStyle
3131
import org.readium.r2.navigator.html.HtmlDecorationTemplate
32+
import org.readium.r2.navigator.html.HtmlDecorationTemplates
3233
import org.readium.r2.navigator.html.toCss
3334
import org.readium.r2.navigator.preferences.FontFamily
3435
import org.readium.r2.shared.ExperimentalReadiumApi
@@ -83,6 +84,13 @@ class EpubReaderFragment : VisualReaderFragment() {
8384
"annotation-icon.svg"
8485
)
8586

87+
// Enable experimental decorations positioning that places highlights behind
88+
// text to improve legibility with opaque decorations.
89+
decorationTemplates = HtmlDecorationTemplates.defaultTemplates(
90+
alpha = 1.0,
91+
experimentalPositioning = true
92+
)
93+
8694
// Register the HTML templates for our custom decoration styles.
8795
decorationTemplates[DecorationStyleAnnotationMark::class] = annotationMarkTemplate()
8896
decorationTemplates[DecorationStylePageNumber::class] = pageNumberTemplate()

0 commit comments

Comments
 (0)