1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.apache.commons.imaging.formats.jpeg.decoder;
17
18 final class YCbCrConverter {
19 private static final int[] REDS = new int[256 * 256];
20 private static final int[] BLUES = new int[256 * 256];
21 private static final int[] GREENS1 = new int[256 * 256];
22 private static final int[] GREENS2 = new int[256 * 512];
23
24 static {
25
26
27
28
29 for (int y = 0; y < 256; y++) {
30 for (int cr = 0; cr < 256; cr++) {
31 int r = y + fastRound(1.402f * (cr - 128));
32 if (r < 0) {
33 r = 0;
34 }
35 if (r > 255) {
36 r = 255;
37 }
38 REDS[cr << 8 | y] = r << 16;
39 }
40 }
41 for (int y = 0; y < 256; y++) {
42 for (int cb = 0; cb < 256; cb++) {
43 int b = y + fastRound(1.772f * (cb - 128));
44 if (b < 0) {
45 b = 0;
46 }
47 if (b > 255) {
48 b = 255;
49 }
50 BLUES[cb << 8 | y] = b;
51 }
52 }
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80 for (int cb = 0; cb < 256; cb++) {
81 for (int cr = 0; cr < 256; cr++) {
82 final int value = fastRound(0.34414f * (cb - 128) + 0.71414f * (cr - 128));
83 GREENS1[cb << 8 | cr] = value + 135;
84 }
85 }
86 for (int y = 0; y < 256; y++) {
87 for (int value = 0; value < 270; value++) {
88 int green = y - (value - 135);
89 if (green < 0) {
90 green = 0;
91 } else if (green > 255) {
92 green = 255;
93 }
94 GREENS2[value << 8 | y] = green << 8;
95 }
96 }
97 }
98
99 public static int convertYCbCrToRgb(final int y, final int cb, final int cr) {
100 final int r = REDS[cr << 8 | y];
101 final int g1 = GREENS1[cb << 8 | cr];
102 final int g = GREENS2[g1 << 8 | y];
103 final int b = BLUES[cb << 8 | y];
104 return r | g | b;
105 }
106
107 private static int fastRound(final float x) {
108
109 return (int) (x + 0.5f);
110 }
111
112 private YCbCrConverter() {
113 }
114 }