Skip to content

Commit 806207f

Browse files
committed
fix alpha on non-8bit or limited range
1 parent ff0c9da commit 806207f

3 files changed

Lines changed: 106 additions & 6 deletions

File tree

app/src/main/res/values/strings.xml

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,70 @@
22
<string name="app_name">AndroidGlideAvifDecoder</string>
33
<string name="resource_root">https://raw.githubusercontent.com/link-u/avif-sample-images/master/</string>
44
<string-array name="resource_names">
5+
<item>plum-blossom-large.profile0.10bpc.yuv420.alpha-full.avif</item>
6+
<item>plum-blossom-large.profile0.10bpc.yuv420.alpha-full.monochrome.avif</item>
7+
<item>plum-blossom-large.profile0.10bpc.yuv420.alpha-limited.avif</item>
8+
<item>plum-blossom-large.profile0.10bpc.yuv420.alpha-limited.monochrome.avif</item>
9+
<item>plum-blossom-large.profile0.8bpc.yuv420.alpha-full.avif</item>
10+
<item>plum-blossom-large.profile0.8bpc.yuv420.alpha-full.monochrome.avif</item>
11+
<item>plum-blossom-large.profile0.8bpc.yuv420.alpha-limited.avif</item>
12+
<item>plum-blossom-large.profile0.8bpc.yuv420.alpha-limited.monochrome.avif</item>
13+
<item>plum-blossom-large.profile1.10bpc.yuv444.alpha-full.avif</item>
14+
<item>plum-blossom-large.profile1.10bpc.yuv444.alpha-limited.avif</item>
15+
<item>plum-blossom-large.profile1.8bpc.yuv444.alpha-full.avif</item>
16+
<item>plum-blossom-large.profile1.8bpc.yuv444.alpha-limited.avif</item>
17+
<item>plum-blossom-large.profile2.10bpc.yuv422.alpha-full.avif</item>
18+
<item>plum-blossom-large.profile2.10bpc.yuv422.alpha-full.monochrome.avif</item>
19+
<item>plum-blossom-large.profile2.10bpc.yuv422.alpha-limited.avif</item>
20+
<item>plum-blossom-large.profile2.10bpc.yuv422.alpha-limited.monochrome.avif</item>
21+
<item>plum-blossom-large.profile2.12bpc.yuv420.alpha-full.avif</item>
22+
<item>plum-blossom-large.profile2.12bpc.yuv420.alpha-full.monochrome.avif</item>
23+
<item>plum-blossom-large.profile2.12bpc.yuv420.alpha-limited.avif</item>
24+
<item>plum-blossom-large.profile2.12bpc.yuv420.alpha-limited.monochrome.avif</item>
25+
<item>plum-blossom-large.profile2.12bpc.yuv422.alpha-full.avif</item>
26+
<item>plum-blossom-large.profile2.12bpc.yuv422.alpha-full.monochrome.avif</item>
27+
<item>plum-blossom-large.profile2.12bpc.yuv422.alpha-limited.avif</item>
28+
<item>plum-blossom-large.profile2.12bpc.yuv422.alpha-limited.monochrome.avif</item>
29+
<item>plum-blossom-large.profile2.12bpc.yuv444.alpha-full.avif</item>
30+
<item>plum-blossom-large.profile2.12bpc.yuv444.alpha-full.monochrome.avif</item>
31+
<item>plum-blossom-large.profile2.12bpc.yuv444.alpha-limited.avif</item>
32+
<item>plum-blossom-large.profile2.12bpc.yuv444.alpha-limited.monochrome.avif</item>
33+
<item>plum-blossom-large.profile2.8bpc.yuv422.alpha-full.avif</item>
34+
<item>plum-blossom-large.profile2.8bpc.yuv422.alpha-full.monochrome.avif</item>
35+
<item>plum-blossom-large.profile2.8bpc.yuv422.alpha-limited.avif</item>
36+
<item>plum-blossom-large.profile2.8bpc.yuv422.alpha-limited.monochrome.avif</item>
37+
<item>plum-blossom-small.profile0.10bpc.yuv420.alpha-full.avif</item>
38+
<item>plum-blossom-small.profile0.10bpc.yuv420.alpha-full.monochrome.avif</item>
39+
<item>plum-blossom-small.profile0.10bpc.yuv420.alpha-limited.avif</item>
40+
<item>plum-blossom-small.profile0.10bpc.yuv420.alpha-limited.monochrome.avif</item>
41+
<item>plum-blossom-small.profile0.8bpc.yuv420.alpha-full.avif</item>
42+
<item>plum-blossom-small.profile0.8bpc.yuv420.alpha-full.monochrome.avif</item>
43+
<item>plum-blossom-small.profile0.8bpc.yuv420.alpha-limited.avif</item>
44+
<item>plum-blossom-small.profile0.8bpc.yuv420.alpha-limited.monochrome.avif</item>
45+
<item>plum-blossom-small.profile1.10bpc.yuv444.alpha-full.avif</item>
46+
<item>plum-blossom-small.profile1.10bpc.yuv444.alpha-limited.avif</item>
47+
<item>plum-blossom-small.profile1.8bpc.yuv444.alpha-full.avif</item>
48+
<item>plum-blossom-small.profile1.8bpc.yuv444.alpha-limited.avif</item>
49+
<item>plum-blossom-small.profile2.10bpc.yuv422.alpha-full.avif</item>
50+
<item>plum-blossom-small.profile2.10bpc.yuv422.alpha-full.monochrome.avif</item>
51+
<item>plum-blossom-small.profile2.10bpc.yuv422.alpha-limited.avif</item>
52+
<item>plum-blossom-small.profile2.10bpc.yuv422.alpha-limited.monochrome.avif</item>
53+
<item>plum-blossom-small.profile2.12bpc.yuv420.alpha-full.avif</item>
54+
<item>plum-blossom-small.profile2.12bpc.yuv420.alpha-full.monochrome.avif</item>
55+
<item>plum-blossom-small.profile2.12bpc.yuv420.alpha-limited.avif</item>
56+
<item>plum-blossom-small.profile2.12bpc.yuv420.alpha-limited.monochrome.avif</item>
57+
<item>plum-blossom-small.profile2.12bpc.yuv422.alpha-full.avif</item>
58+
<item>plum-blossom-small.profile2.12bpc.yuv422.alpha-full.monochrome.avif</item>
59+
<item>plum-blossom-small.profile2.12bpc.yuv422.alpha-limited.avif</item>
60+
<item>plum-blossom-small.profile2.12bpc.yuv422.alpha-limited.monochrome.avif</item>
61+
<item>plum-blossom-small.profile2.12bpc.yuv444.alpha-full.avif</item>
62+
<item>plum-blossom-small.profile2.12bpc.yuv444.alpha-full.monochrome.avif</item>
63+
<item>plum-blossom-small.profile2.12bpc.yuv444.alpha-limited.avif</item>
64+
<item>plum-blossom-small.profile2.12bpc.yuv444.alpha-limited.monochrome.avif</item>
65+
<item>plum-blossom-small.profile2.8bpc.yuv422.alpha-full.avif</item>
66+
<item>plum-blossom-small.profile2.8bpc.yuv422.alpha-full.monochrome.avif</item>
67+
<item>plum-blossom-small.profile2.8bpc.yuv422.alpha-limited.avif</item>
68+
<item>plum-blossom-small.profile2.8bpc.yuv422.alpha-limited.monochrome.avif</item>
569
<item>fox.png</item>
670
<item>fox.profile0.10bpc.yuv420.avif</item>
771
<item>fox.profile0.10bpc.yuv420.monochrome.avif</item>

glideavif/src/main/cpp/avif_decoder.cpp

Lines changed: 41 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#include <avif/avif.h>
44
#include <jni_util.hpp>
55
#include <libyuv/convert_argb.h>
6+
#include <algorithm>
67

78
#include "common.hpp"
89
#include "my_bitmap.hpp"
@@ -25,6 +26,26 @@ void copyGrayscalePixels(JNIEnv *env, avifImage *im, std::vector<uint8_t> &rgbaL
2526
}
2627
}
2728

29+
template<typename T>
30+
void
31+
copyAlphaPixels(JNIEnv *env, avifImage *im, bool limitedRange, std::vector<uint8_t> &rgbaList) {
32+
uint32_t w = im->width * sizeof(T) / sizeof(uint8_t);
33+
if (im->alphaRowBytes < w) {
34+
throwException(env, "invalid alpha bytes");
35+
}
36+
37+
for (int i = 0; i < im->height; ++i) {
38+
auto p = (T *) (im->alphaPlane + (i * im->alphaRowBytes));
39+
for (int j = 0; j < im->width; ++j) {
40+
uint32_t c0 = p[j] >> (im->depth - 8);
41+
if (limitedRange) {
42+
c0 = std::max<uint32_t>(std::min<uint32_t>((c0 - 16) * 255 / (235 - 16), 255), 0);
43+
}
44+
rgbaList.at(4 * (i * im->width + j) + 3) = (uint8_t) c0;
45+
}
46+
}
47+
}
48+
2849
bool isGrayscale(avifImage *im) {
2950
return !(im->yuvRowBytes[1] && im->yuvRowBytes[2]);
3051
}
@@ -156,6 +177,7 @@ jobject decodeAvif(JNIEnv *env, const uint8_t *sourceData, int sourceDataLength)
156177
}
157178
memcpy(rgbaList.data(), rgb->pixels, rgb->rowBytes * rgb->height);
158179

180+
// On non-alpha image, A of RGBA is decoded 0x00
159181
if (!im->alphaPlane) {
160182
for (int i = 0; i < im->height; ++i) {
161183
for (int j = 0; j < im->width; ++j) {
@@ -167,11 +189,25 @@ jobject decodeAvif(JNIEnv *env, const uint8_t *sourceData, int sourceDataLength)
167189
}();
168190

169191
if (im->alphaPlane) {
170-
for (int i = 0; i < im->height; ++i) {
171-
for (int j = 0; j < im->width; ++j) {
172-
uint8_t c = im->alphaPlane[i * im->alphaRowBytes + j];
173-
rgbaList.at(4 * (i * im->width + j) + 3) = c;
174-
}
192+
bool limitedRange = false;
193+
switch (im->alphaRange) {
194+
case AVIF_RANGE_LIMITED:
195+
limitedRange = true;
196+
break;
197+
case AVIF_RANGE_FULL:
198+
limitedRange = false;
199+
break;
200+
}
201+
switch (im->depth) {
202+
case 8:
203+
copyAlphaPixels<uint8_t>(env, im, limitedRange, rgbaList);
204+
break;
205+
case 10:
206+
case 12:
207+
copyAlphaPixels<uint16_t>(env, im, limitedRange, rgbaList);
208+
break;
209+
default:
210+
throwException(env, "unknown color depth");
175211
}
176212
}
177213

0 commit comments

Comments
 (0)