1 package nom.tam.image.compression.tile.mask;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 import java.nio.ByteBuffer;
35 import java.nio.DoubleBuffer;
36 import java.nio.FloatBuffer;
37 import java.nio.IntBuffer;
38 import java.nio.LongBuffer;
39 import java.nio.ShortBuffer;
40
41 import nom.tam.fits.compression.algorithm.api.ICompressorControl;
42 import nom.tam.image.tile.operation.buffer.TileBuffer;
43 import nom.tam.util.type.ElementType;
44
45
46
47
48
49
50
51
52 public class NullPixelMaskPreserver extends AbstractNullPixelMask {
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70 public NullPixelMaskPreserver(TileBuffer tileBuffer, int tileIndex, long nullValue, ICompressorControl compressorControl) {
71 super(tileBuffer, tileIndex, nullValue, compressorControl);
72 }
73
74
75
76
77
78 public void preserveNull() {
79 if (getTileBuffer().getBaseType().is(ElementType.DOUBLE)) {
80 preserveNullDoubles();
81 } else if (getTileBuffer().getBaseType().is(ElementType.FLOAT)) {
82 preserveNullFloats();
83 } else if (getTileBuffer().getBaseType().is(ElementType.LONG)) {
84 preserveNullLongs();
85 } else if (getTileBuffer().getBaseType().is(ElementType.INT)) {
86 preserveNullInts();
87 } else if (getTileBuffer().getBaseType().is(ElementType.SHORT)) {
88 preserveNullShorts();
89 } else if (getTileBuffer().getBaseType().is(ElementType.BYTE)) {
90 preserveNullBytes();
91 }
92 if (getMask() != null) {
93 ByteBuffer compressed = ByteBuffer.allocate(getTileBuffer().getPixelSize());
94 if (!getCompressorControl().compress(getMask(), compressed, getCompressorControl().option())) {
95 throw new IllegalStateException("could not compress the null pixel mask");
96 }
97 setMask(compressed);
98 }
99 }
100
101 private void preserveNullBytes() {
102 ByteBuffer buffer = (ByteBuffer) getTileBuffer().getBuffer();
103 byte nullValue = (byte) getNullValue();
104 int size = buffer.remaining();
105 for (int index = 0; index < size; index++) {
106 if (nullValue == buffer.get(index)) {
107 initializedMask(size).put(index, NULL_INDICATOR);
108 }
109 }
110 }
111
112 private void preserveNullDoubles() {
113 DoubleBuffer buffer = (DoubleBuffer) getTileBuffer().getBuffer();
114 int size = getTileBuffer().getPixelSize();
115 for (int index = 0; index < size; index++) {
116 if (Double.isNaN(buffer.get(index))) {
117 initializedMask(size).put(index, NULL_INDICATOR);
118 }
119 }
120 }
121
122 private void preserveNullFloats() {
123 FloatBuffer buffer = (FloatBuffer) getTileBuffer().getBuffer();
124 int size = getTileBuffer().getPixelSize();
125 for (int index = 0; index < size; index++) {
126 if (Float.isNaN(buffer.get(index))) {
127 initializedMask(size).put(index, NULL_INDICATOR);
128 }
129 }
130 }
131
132 private void preserveNullInts() {
133 IntBuffer buffer = (IntBuffer) getTileBuffer().getBuffer();
134 int nullValue = (int) getNullValue();
135 int size = getTileBuffer().getPixelSize();
136 for (int index = 0; index < size; index++) {
137 if (nullValue == buffer.get(index)) {
138 initializedMask(size).put(index, NULL_INDICATOR);
139 }
140 }
141 }
142
143 private void preserveNullLongs() {
144 LongBuffer buffer = (LongBuffer) getTileBuffer().getBuffer();
145 long nullValue = getNullValue();
146 int size = getTileBuffer().getPixelSize();
147 for (int index = 0; index < size; index++) {
148 if (nullValue == buffer.get(index)) {
149 initializedMask(size).put(index, NULL_INDICATOR);
150 }
151 }
152 }
153
154 private void preserveNullShorts() {
155 ShortBuffer buffer = (ShortBuffer) getTileBuffer().getBuffer();
156 short nullValue = (short) getNullValue();
157 int size = getTileBuffer().getPixelSize();
158 for (int index = 0; index < size; index++) {
159 if (nullValue == buffer.get(index)) {
160 initializedMask(size).put(index, NULL_INDICATOR);
161 }
162 }
163 }
164
165 }