diff --git a/app/src/main/kotlin/com/hippo/ehviewer/Settings.kt b/app/src/main/kotlin/com/hippo/ehviewer/Settings.kt
index cf0e2c946..06eeb0bbe 100644
--- a/app/src/main/kotlin/com/hippo/ehviewer/Settings.kt
+++ b/app/src/main/kotlin/com/hippo/ehviewer/Settings.kt
@@ -171,6 +171,13 @@ object Settings : DataStorePreferences(null) {
// TODO: Remove this after swipe gestures are correctly handled in compose
var touchSlopFactor by intPref("touch_slop", 3)
+ // Tachiyomi Reader
+ val colorFilter = boolPref("pref_color_filter_key", false)
+ val colorFilterValue = intPref("color_filter_value", 0)
+ val colorFilterMode = intPref("color_filter_mode", 0)
+ val customBrightness = boolPref("pref_custom_brightness_key", false)
+ val customBrightnessValue = intPref("custom_brightness_value", 0)
+
init {
if ("CN" == Locale.getDefault().country) {
edit {
diff --git a/app/src/main/kotlin/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt b/app/src/main/kotlin/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt
index 1daea4954..13cff3fe0 100644
--- a/app/src/main/kotlin/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt
+++ b/app/src/main/kotlin/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt
@@ -23,7 +23,6 @@ import android.content.ClipData
import android.content.ContentValues
import android.content.Intent
import android.content.pm.ActivityInfo
-import android.graphics.Color
import android.graphics.ColorMatrix
import android.graphics.ColorMatrixColorFilter
import android.graphics.Paint
@@ -50,6 +49,7 @@ import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
+import androidx.compose.ui.graphics.BlendMode
import androidx.core.content.FileProvider
import androidx.core.graphics.ColorUtils
import androidx.core.view.WindowCompat
@@ -61,8 +61,10 @@ import androidx.lifecycle.lifecycleScope
import com.google.android.material.shape.MaterialShapeDrawable
import com.hippo.ehviewer.BuildConfig
import com.hippo.ehviewer.R
+import com.hippo.ehviewer.Settings
import com.hippo.ehviewer.client.EhUrl
import com.hippo.ehviewer.client.data.BaseGalleryInfo
+import com.hippo.ehviewer.collectAsState
import com.hippo.ehviewer.databinding.ReaderActivityBinding
import com.hippo.ehviewer.gallery.ArchivePageLoader
import com.hippo.ehviewer.gallery.EhPageLoader
@@ -104,7 +106,6 @@ import eu.kanade.tachiyomi.util.view.setTooltip
import eu.kanade.tachiyomi.widget.listener.SimpleAnimationListener
import java.io.File
import java.io.IOException
-import kotlin.math.abs
import kotlinx.coroutines.FlowPreview
import kotlinx.coroutines.flow.drop
import kotlinx.coroutines.flow.launchIn
@@ -301,7 +302,26 @@ class ReaderActivity : EhActivity() {
buildProvider()
binding = ReaderActivityBinding.inflate(layoutInflater)
binding.dialogStub.setMD3Content {
+ val brightness by Settings.customBrightness.collectAsState()
+ val brightnessValue by Settings.customBrightnessValue.collectAsState()
+ val colorOverlayEnabled by Settings.colorFilter.collectAsState()
+ val colorOverlay by Settings.colorFilterValue.collectAsState()
+ val colorOverlayMode by Settings.colorFilterMode.collectAsState {
+ when (it) {
+ 1 -> BlendMode.Multiply
+ 2 -> BlendMode.Screen
+ 3 -> BlendMode.Overlay
+ 4 -> BlendMode.Lighten
+ 5 -> BlendMode.Darken
+ else -> BlendMode.SrcOver
+ }
+ }
dialogState.Intercept()
+ ReaderContentOverlay(
+ brightness = { brightnessValue }.takeIf { brightness && brightnessValue < 0 },
+ color = { colorOverlay }.takeIf { colorOverlayEnabled },
+ colorBlendMode = colorOverlayMode,
+ )
}
setContentView(binding.root)
mGalleryProvider.let {
@@ -923,14 +943,6 @@ class ReaderActivity : EhActivity() {
.onEach { setCustomBrightness(it) }
.launchIn(lifecycleScope)
- ReaderPreferences.colorFilter().changes()
- .onEach { setColorFilter(it) }
- .launchIn(lifecycleScope)
-
- ReaderPreferences.colorFilterMode().changes()
- .onEach { setColorFilter(ReaderPreferences.colorFilter().get()) }
- .launchIn(lifecycleScope)
-
merge(
ReaderPreferences.grayscale().changes(),
ReaderPreferences.invertedColors().changes(),
@@ -1014,21 +1026,6 @@ class ReaderActivity : EhActivity() {
}
}
- /**
- * Sets the color filter overlay according to [enabled].
- */
- @OptIn(FlowPreview::class)
- private fun setColorFilter(enabled: Boolean) {
- if (enabled) {
- ReaderPreferences.colorFilterValue().changes()
- .sample(100)
- .onEach { setColorFilterValue(it) }
- .launchIn(lifecycleScope)
- } else {
- binding.colorOverlay.isVisible = false
- }
- }
-
/**
* Sets the brightness of the screen. Range is [-75, 100].
* From -75 to -1 a semi-transparent black view is overlaid with the minimum brightness.
@@ -1050,23 +1047,6 @@ class ReaderActivity : EhActivity() {
}
window.attributes = window.attributes.apply { screenBrightness = readerBrightness }
-
- // Set black overlay visibility.
- if (value < 0) {
- binding.brightnessOverlay.isVisible = true
- val alpha = (abs(value) * 2.56).toInt()
- binding.brightnessOverlay.setBackgroundColor(Color.argb(alpha, 0, 0, 0))
- } else {
- binding.brightnessOverlay.isVisible = false
- }
- }
-
- /**
- * Sets the color filter [value].
- */
- private fun setColorFilterValue(value: Int) {
- binding.colorOverlay.isVisible = true
- binding.colorOverlay.setFilterColor(value, ReaderPreferences.colorFilterMode().get())
}
private fun setLayerPaint(grayscale: Boolean, invertedColors: Boolean) {
diff --git a/app/src/main/kotlin/eu/kanade/tachiyomi/ui/reader/ReaderColorFilterView.kt b/app/src/main/kotlin/eu/kanade/tachiyomi/ui/reader/ReaderColorFilterView.kt
deleted file mode 100644
index 6266ab239..000000000
--- a/app/src/main/kotlin/eu/kanade/tachiyomi/ui/reader/ReaderColorFilterView.kt
+++ /dev/null
@@ -1,36 +0,0 @@
-package eu.kanade.tachiyomi.ui.reader
-
-import android.content.Context
-import android.graphics.Canvas
-import android.graphics.Paint
-import android.graphics.PorterDuff
-import android.util.AttributeSet
-import android.view.View
-import androidx.core.graphics.toXfermode
-
-class ReaderColorFilterView(
- context: Context,
- attrs: AttributeSet? = null,
-) : View(context, attrs) {
-
- private val colorFilterPaint: Paint = Paint()
-
- fun setFilterColor(color: Int, filterMode: Int) {
- colorFilterPaint.color = color
- colorFilterPaint.xfermode = when (filterMode) {
- 1 -> PorterDuff.Mode.MULTIPLY
- 2 -> PorterDuff.Mode.SCREEN
- 3 -> PorterDuff.Mode.OVERLAY
- 4 -> PorterDuff.Mode.LIGHTEN
- 5 -> PorterDuff.Mode.DARKEN
- else -> PorterDuff.Mode.SRC_OVER
- }.toXfermode()
-
- invalidate()
- }
-
- override fun onDraw(canvas: Canvas) {
- super.onDraw(canvas)
- canvas.drawPaint(colorFilterPaint)
- }
-}
diff --git a/app/src/main/kotlin/eu/kanade/tachiyomi/ui/reader/ReaderContentOverlay.kt b/app/src/main/kotlin/eu/kanade/tachiyomi/ui/reader/ReaderContentOverlay.kt
new file mode 100644
index 000000000..0df206953
--- /dev/null
+++ b/app/src/main/kotlin/eu/kanade/tachiyomi/ui/reader/ReaderContentOverlay.kt
@@ -0,0 +1,36 @@
+package eu.kanade.tachiyomi.ui.reader
+
+import androidx.compose.foundation.Canvas
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.BlendMode
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.graphicsLayer
+import kotlin.math.abs
+
+@Composable
+fun ReaderContentOverlay(
+ brightness: (() -> Int)?,
+ color: (() -> Int)?,
+ colorBlendMode: BlendMode = BlendMode.SrcOver,
+) {
+ if (brightness != null) {
+ Canvas(
+ modifier = Modifier.fillMaxSize().graphicsLayer {
+ alpha = abs(brightness()) / 100f
+ },
+ ) {
+ drawRect(Color.Black)
+ }
+ }
+
+ if (color != null) {
+ Canvas(modifier = Modifier.fillMaxSize()) {
+ drawRect(
+ color = Color(color()),
+ blendMode = colorBlendMode,
+ )
+ }
+ }
+}
diff --git a/app/src/main/res/layout/reader_activity.xml b/app/src/main/res/layout/reader_activity.xml
index d0f7094c1..32f5382f1 100644
--- a/app/src/main/res/layout/reader_activity.xml
+++ b/app/src/main/res/layout/reader_activity.xml
@@ -5,11 +5,6 @@
android:layout_height="match_parent"
android:gravity="center">
-
-
-
-
+
+
-
-
-
-