Skip to content

Commit bd8578e

Browse files
committed
Update base, update base tone mapper
1 parent d4d0ca7 commit bd8578e

File tree

9 files changed

+236
-208
lines changed

9 files changed

+236
-208
lines changed

app/src/main/java/com/awxkee/jxlcoder/MainActivity.kt

Lines changed: 54 additions & 96 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,19 @@
11
package com.awxkee.jxlcoder
22

3-
import android.content.Intent
43
import android.graphics.Bitmap
54
import android.graphics.BitmapFactory
6-
import android.graphics.ColorSpace
75
import android.graphics.Matrix
8-
import android.graphics.drawable.BitmapDrawable
96
import android.graphics.drawable.Drawable
10-
import android.hardware.DataSpace
117
import android.os.Build
128
import android.os.Bundle
139
import android.util.Log
10+
import android.view.Display
1411
import androidx.activity.ComponentActivity
1512
import androidx.activity.compose.setContent
1613
import androidx.compose.foundation.Image
17-
import androidx.compose.foundation.background
1814
import androidx.compose.foundation.layout.fillMaxSize
1915
import androidx.compose.foundation.layout.fillMaxWidth
2016
import androidx.compose.foundation.lazy.LazyColumn
21-
import androidx.compose.foundation.lazy.LazyRow
2217
import androidx.compose.material3.MaterialTheme
2318
import androidx.compose.material3.Surface
2419
import androidx.compose.material3.Text
@@ -27,48 +22,28 @@ import androidx.compose.runtime.LaunchedEffect
2722
import androidx.compose.runtime.mutableStateListOf
2823
import androidx.compose.runtime.remember
2924
import androidx.compose.ui.Modifier
30-
import androidx.compose.ui.graphics.Color
3125
import androidx.compose.ui.graphics.asImageBitmap
3226
import androidx.compose.ui.layout.ContentScale
3327
import androidx.compose.ui.tooling.preview.Preview
3428
import androidx.core.graphics.scale
3529
import androidx.lifecycle.lifecycleScope
36-
import com.awxkee.jxlcoder.animation.AnimatedDrawable
37-
import com.awxkee.jxlcoder.animation.JxlAnimatedStore
3830
import com.awxkee.jxlcoder.ui.theme.JXLCoderTheme
3931
import com.bumptech.glide.integration.compose.ExperimentalGlideComposeApi
40-
import com.google.accompanist.drawablepainter.rememberDrawablePainter
4132
import kotlinx.coroutines.Dispatchers
33+
import kotlinx.coroutines.delay
4234
import kotlinx.coroutines.launch
4335
import okio.buffer
44-
import okio.sink
4536
import okio.source
46-
import okio.use
47-
import java.io.ByteArrayInputStream
48-
import java.io.File
4937
import java.io.FileNotFoundException
50-
import java.io.FileOutputStream
51-
import java.security.MessageDigest
5238
import java.util.UUID
5339
import kotlin.system.measureTimeMillis
5440

41+
5542
class MainActivity : ComponentActivity() {
5643
@OptIn(ExperimentalGlideComposeApi::class)
5744
override fun onCreate(savedInstanceState: Bundle?) {
5845
super.onCreate(savedInstanceState)
5946

60-
// val buffer1 = this.assets.open("hdr_cosmos.jxl").source().buffer().readByteArray()
61-
// assert(JxlCoder.isJXL(buffer1))
62-
// assert(JxlCoder().getSize(buffer1) != null)
63-
// val iccCosmosImage = JxlCoder().decode(buffer1)
64-
// val buffer2 = this.assets.open("second_jxl.jxl").source().buffer().readByteArray()
65-
// assert(JxlCoder.isJXL(buffer2))
66-
// assert(JxlCoder().getSize(buffer2) != null)
67-
// val buffer3 = this.assets.open("alpha_jxl.jxl").source().buffer().readByteArray()
68-
// assert(JxlCoder.isJXL(buffer3))
69-
// assert(JxlCoder().getSize(buffer3) != null)
70-
71-
7247
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
7348
// val buffer4 = this.assets.open("happy_india.jxl").source().buffer().readByteArray()
7449
// assert(JxlCoder.isJXL(buffer4))
@@ -204,11 +179,19 @@ class MainActivity : ComponentActivity() {
204179
// imagesArray.add(decoded)
205180
// }
206181

182+
val display: Display = this@MainActivity.windowManager.defaultDisplay
183+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
184+
val hdrCapabilities = display.hdrCapabilities
185+
val maxNits = hdrCapabilities.desiredMaxLuminance
186+
val whitePoint = hdrCapabilities.desiredMaxAverageLuminance
187+
Log.d("Max HDR value", "$maxNits whitePoint $whitePoint")
188+
}
189+
207190
var assets =
208191
(this@MainActivity.assets.list("") ?: return@launch).toList()
209192
// assets = assets.filter { it.contains("20181110_213419__MMC1561-HDR.jxl") }
210193
// assets = assets.take(15)
211-
assets = assets.filter { it.contains("cow_image_jxl.jxl") }
194+
assets = assets.filter { it.contains("Lake_HDR.jxl") }
212195
for (asset in assets) {
213196
try {
214197
val buffer4 =
@@ -218,63 +201,68 @@ class MainActivity : ComponentActivity() {
218201
val largeImageSize = JxlCoder.getSize(buffer4)
219202
if (largeImageSize != null) {
220203
val decodingTime = measureTimeMillis {
221-
val srcImage = JxlCoder.decode(
222-
buffer4,
223-
preferredColorConfig = PreferredColorConfig.HARDWARE,
224-
com.awxkee.jxlcoder.ScaleMode.FIT,
225-
toneMapper = JxlToneMapper.REC2408,
226-
)
227-
}
228-
Log.d("JXLMain", "Decoding time ${decodingTime}ms")
229-
val time = measureTimeMillis {
230-
// val srcImage = JxlCoder.decodeSampled(
204+
// val srcImage = JxlCoder.decode(
231205
// buffer4,
232-
// largeImageSize.width / 2,
233-
// largeImageSize.height / 2,
234206
// preferredColorConfig = PreferredColorConfig.HARDWARE,
235207
// com.awxkee.jxlcoder.ScaleMode.FIT,
236208
// toneMapper = JxlToneMapper.REC2408,
237209
// )
238-
val srcImage = JxlCoder.decode(
210+
211+
// Resizable version
212+
val srcImage = JxlCoder.decodeSampled(
239213
buffer4,
214+
width = largeImageSize.width / 2,
215+
height = largeImageSize.height / 2,
240216
preferredColorConfig = PreferredColorConfig.HARDWARE,
241217
com.awxkee.jxlcoder.ScaleMode.FIT,
242218
toneMapper = JxlToneMapper.REC2408,
219+
jxlResizeFilter = JxlResizeFilter.LANCZOS
243220
)
244-
val fosRec2408 = FileOutputStream(File(cacheDir, File(asset).nameWithoutExtension + ".jpg"))
245-
fosRec2408.use {
246-
srcImage.compress(Bitmap.CompressFormat.JPEG, 90, it)
247-
it.flush()
221+
lifecycleScope.launch {
222+
imagesArray.add(srcImage)
248223
}
249-
// val srcPerceptual = JxlCoder.decodeSampled(
250-
// buffer4,
251-
// largeImageSize.width / 2,
252-
// largeImageSize.height / 2,
253-
// preferredColorConfig = PreferredColorConfig.HARDWARE,
254-
// com.awxkee.jxlcoder.ScaleMode.FIT,
255-
// toneMapper = JxlToneMapper.REC2408_PERCEPTUAL,
256-
// )
257-
val srcPerceptual = JxlCoder.decode(
224+
val srcImage1 = JxlCoder.decodeSampled(
258225
buffer4,
226+
width = largeImageSize.width / 2,
227+
height = largeImageSize.height / 2,
259228
preferredColorConfig = PreferredColorConfig.HARDWARE,
260229
com.awxkee.jxlcoder.ScaleMode.FIT,
261230
toneMapper = JxlToneMapper.REC2408_PERCEPTUAL,
231+
jxlResizeFilter = JxlResizeFilter.NEAREST
262232
)
263-
val fosRec2408Perc = FileOutputStream(File(cacheDir, File(asset).nameWithoutExtension + "_perceptual.jpg"))
264-
fosRec2408Perc.use {
265-
srcPerceptual.compress(Bitmap.CompressFormat.JPEG, 90, it)
266-
it.flush()
233+
lifecycleScope.launch {
234+
imagesArray.add(srcImage1)
267235
}
268-
// val srcImage = JxlCoder.decode(buffer4,
269-
// preferredColorConfig = PreferredColorConfig.RGB_565,
270-
// toneMapper = JxlToneMapper.REC2408)
236+
val srcImage2 = JxlCoder.decodeSampled(
237+
buffer4,
238+
width = largeImageSize.width / 2,
239+
height = largeImageSize.height / 2,
240+
preferredColorConfig = PreferredColorConfig.HARDWARE,
241+
com.awxkee.jxlcoder.ScaleMode.FIT,
242+
toneMapper = JxlToneMapper.FILMIC,
243+
jxlResizeFilter = JxlResizeFilter.NEAREST
244+
)
271245
lifecycleScope.launch {
272-
imagesArray.add(srcImage)
273-
imagesArray.add(srcPerceptual)
246+
imagesArray.add(srcImage2)
247+
}
248+
val srcImage3 = JxlCoder.decodeSampled(
249+
buffer4,
250+
width = largeImageSize.width / 2,
251+
height = largeImageSize.height / 2,
252+
preferredColorConfig = PreferredColorConfig.HARDWARE,
253+
com.awxkee.jxlcoder.ScaleMode.FIT,
254+
toneMapper = JxlToneMapper.ACES,
255+
jxlResizeFilter = JxlResizeFilter.NEAREST
256+
)
257+
lifecycleScope.launch {
258+
imagesArray.add(srcImage3)
274259
}
275-
276260
}
277-
Log.d("JXLCoder", "Decoding done in ${time}ms")
261+
Log.d("JXLMain", "Decoding time ${decodingTime}ms")
262+
launch {
263+
delay(1500)
264+
Log.d("JXLMain", "Decoding time ${decodingTime}ms")
265+
}
278266
}
279267
} catch (e: Exception) {
280268
if (e !is FileNotFoundException) {
@@ -289,25 +277,6 @@ class MainActivity : ComponentActivity() {
289277
modifier = Modifier.fillMaxSize(),
290278
color = MaterialTheme.colorScheme.background
291279
) {
292-
// AsyncImage(
293-
// model = "https://pdfconverter1984.blob.core.windows.net/simple/wide_gamut.jxl",
294-
// contentDescription = null,
295-
// imageLoader = ImageLoader.Builder(this)
296-
// .components {
297-
// add(JxlDecoder.Factory())
298-
// }
299-
// .build()
300-
// )
301-
302-
// Image(
303-
// bitmap = image.asImageBitmap(),
304-
//// painter = rememberDrawablePainter(drawable = drawable),
305-
// modifier = Modifier
306-
// .fillMaxWidth()
307-
// .fillMaxHeight(),
308-
// contentScale = ContentScale.FillWidth,
309-
// contentDescription = "ok"
310-
// )
311280
LazyColumn(
312281
modifier = Modifier
313282
.fillMaxSize()
@@ -322,17 +291,6 @@ class MainActivity : ComponentActivity() {
322291
contentDescription = "ok"
323292
)
324293
}
325-
326-
// items(drawablesArray.count(), key = {
327-
// return@items UUID.randomUUID().toString()
328-
// }) {
329-
// Image(
330-
// rememberDrawablePainter(drawable = drawablesArray[it]),
331-
// modifier = Modifier.fillMaxWidth(),
332-
// contentScale = ContentScale.FillWidth,
333-
// contentDescription = "ok"
334-
// )
335-
// }
336294
}
337295
}
338296
}
-166 KB
Binary file not shown.
-26.6 KB
Binary file not shown.
-43.4 KB
Binary file not shown.
-64.4 KB
Binary file not shown.

weaver/Cargo.lock

Lines changed: 6 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

weaver/Cargo.toml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,18 @@ version = "0.1.0"
44
edition = "2021"
55

66
[dependencies]
7-
colorutils-rs = "0.7.1"
7+
colorutils-rs = "0.7.4"
88
half = { version = "2.4.1", features = ["num-traits", "default"] }
99
num-traits = "0.2.19"
10-
pic-scale = { version = "0.3.2", features = ["half"] }
10+
pic-scale = { version = "0.4.2", features = ["half"] }
1111
rayon = "1.10.0"
1212

1313
[build-dependencies]
14-
cbindgen = "0.27.0"
14+
cbindgen = "0.28.0"
1515

1616
[lib]
1717
crate-type = ["staticlib"]
1818

1919
[profile.release]
2020
lto = true
21-
codegen-units = 2
21+
codegen-units = 1

weaver/include/weaver.h

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -19,27 +19,27 @@ enum class ScalingFunction {
1919

2020
extern "C" {
2121

22-
void weave_scale_u8(const uint8_t *src,
23-
uint32_t src_stride,
24-
uint32_t width,
25-
uint32_t height,
26-
const uint8_t *dst,
27-
uint32_t dst_stride,
28-
uint32_t new_width,
29-
uint32_t new_height,
30-
ScalingFunction scaling_function,
31-
bool premultiply_alpha);
22+
uintptr_t weave_scale_u8(const uint8_t *src,
23+
uint32_t src_stride,
24+
uint32_t width,
25+
uint32_t height,
26+
uint8_t *dst,
27+
uint32_t dst_stride,
28+
uint32_t new_width,
29+
uint32_t new_height,
30+
ScalingFunction scaling_function,
31+
bool premultiply_alpha);
3232

33-
void weave_scale_u16(const uint16_t *src,
34-
uintptr_t src_stride,
35-
uint32_t width,
36-
uint32_t height,
37-
uint16_t *dst,
38-
uintptr_t dst_stride,
39-
uint32_t new_width,
40-
uint32_t new_height,
41-
uintptr_t bit_depth,
42-
ScalingFunction scaling_function,
43-
bool premultiply_alpha);
33+
uintptr_t weave_scale_u16(const uint16_t *src,
34+
uintptr_t src_stride,
35+
uint32_t width,
36+
uint32_t height,
37+
uint16_t *dst,
38+
uintptr_t dst_stride,
39+
uint32_t new_width,
40+
uint32_t new_height,
41+
uintptr_t bit_depth,
42+
ScalingFunction scaling_function,
43+
bool premultiply_alpha);
4444

4545
} // extern "C"

0 commit comments

Comments
 (0)