1 package nom.tam.image.compression.tile;
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.lang.reflect.Array;
35 import java.nio.ByteBuffer;
36
37 import nom.tam.fits.compression.algorithm.api.ICompressOption;
38 import nom.tam.fits.compression.algorithm.api.ICompressorControl;
39 import nom.tam.image.compression.tile.mask.AbstractNullPixelMask;
40 import nom.tam.image.compression.tile.mask.ImageNullPixelMask;
41 import nom.tam.image.tile.operation.AbstractTileOperation;
42 import nom.tam.image.tile.operation.ITileOperation;
43 import nom.tam.image.tile.operation.TileArea;
44 import nom.tam.util.type.ElementType;
45
46
47
48
49 abstract class TileCompressionOperation extends AbstractTileOperation implements ITileOperation {
50
51 protected ByteBuffer compressedData;
52
53 protected int compressedOffset;
54
55 protected TileCompressionType compressionType;
56
57 protected ICompressOption tileOptions;
58
59
60 protected Object lock = new Object();
61
62 protected TileCompressionOperation(TiledImageCompressionOperation operation, int tileIndex, TileArea area) {
63 super(operation, tileIndex, area);
64 }
65
66 @Override
67 public String toString() {
68 synchronized (lock) {
69 return getClass().getSimpleName() + "(" + getTileIndex() + "," + compressionType + "," + compressedOffset + ")";
70 }
71 }
72
73 private ByteBuffer convertToBuffer(Object data) {
74 return ElementType.forClass(data.getClass().getComponentType()).convertToByteBuffer(data);
75 }
76
77
78
79
80
81
82
83 protected void forceNoLoss(boolean value) {
84 }
85
86 protected byte[] getCompressedData() {
87 synchronized (lock) {
88 byte[] data = new byte[compressedData.limit()];
89 compressedData.rewind();
90 ElementType.BYTE.getArray(compressedData, data);
91 return data;
92 }
93 }
94
95 protected ByteBuffer getCompressedWholeArea() {
96 return getTiledImageOperation().getCompressedWholeArea();
97 }
98
99 protected TileCompressionType getCompressionType() {
100 synchronized (lock) {
101 return compressionType;
102 }
103 }
104
105 protected ICompressorControl getCompressorControl() {
106 return getTiledImageOperation().getCompressorControl();
107 }
108
109 protected ICompressorControl getGzipCompressorControl() {
110 return getTiledImageOperation().getGzipCompressorControl();
111 }
112
113 protected TileCompressionOperation initTileOptions() {
114 synchronized (lock) {
115 tileOptions = getTiledImageOperation().compressOptions().copy()
116 .setTileWidth(getTileBuffer().getWidth())
117 .setTileHeight(getTileBuffer().getHeight());
118 }
119 return this;
120 }
121
122 protected TileCompressionOperation setCompressed(Object data, TileCompressionType type) {
123 if (data != null && Array.getLength(data) > 0) {
124 synchronized (lock) {
125 compressionType = type;
126 compressedData = convertToBuffer(data);
127 compressedOffset = 0;
128 }
129 }
130 return this;
131 }
132
133 protected TileCompressionOperation setCompressedOffset(int value) {
134 synchronized (lock) {
135 compressedOffset = value;
136 }
137 return this;
138 }
139
140 @Override
141 public TileCompressionOperation setDimensions(int dataOffset, int width, int height) {
142 super.setDimensions(dataOffset, width, height);
143 return this;
144 }
145
146
147
148
149
150
151
152
153
154 protected void setWholeImageCompressedBuffer(ByteBuffer compressed) {
155 synchronized (lock) {
156 compressed.position(compressedOffset * getBaseType().size());
157 compressedData = compressed.slice();
158 compressedOffset = 0;
159
160
161 }
162 }
163
164 protected abstract AbstractNullPixelMask createImageNullPixelMask(ImageNullPixelMask imageNullPixelMask);
165 }