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 protected TileCompressionOperation(TiledImageCompressionOperation operation, int tileIndex, TileArea area) {
60 super(operation, tileIndex, area);
61 }
62
63 @Override
64 public String toString() {
65 synchronized (this) {
66 return getClass().getSimpleName() + "(" + getTileIndex() + "," + compressionType + "," + compressedOffset + ")";
67 }
68 }
69
70 private ByteBuffer convertToBuffer(Object data) {
71 return ElementType.forClass(data.getClass().getComponentType()).convertToByteBuffer(data);
72 }
73
74
75
76
77
78
79
80 protected void forceNoLoss(boolean value) {
81 }
82
83 protected synchronized byte[] getCompressedData() {
84 byte[] data = new byte[compressedData.limit()];
85 compressedData.rewind();
86 ElementType.BYTE.getArray(compressedData, data);
87 return data;
88 }
89
90 protected ByteBuffer getCompressedWholeArea() {
91 return getTiledImageOperation().getCompressedWholeArea();
92 }
93
94 protected synchronized TileCompressionType getCompressionType() {
95 return compressionType;
96 }
97
98 protected ICompressorControl getCompressorControl() {
99 return getTiledImageOperation().getCompressorControl();
100 }
101
102 protected ICompressorControl getGzipCompressorControl() {
103 return getTiledImageOperation().getGzipCompressorControl();
104 }
105
106 protected synchronized TileCompressionOperation initTileOptions() {
107 tileOptions = getTiledImageOperation().compressOptions().copy()
108 .setTileWidth(getTileBuffer().getWidth())
109 .setTileHeight(getTileBuffer().getHeight());
110 return this;
111 }
112
113 protected synchronized TileCompressionOperation setCompressed(Object data, TileCompressionType type) {
114 if (data != null && Array.getLength(data) > 0) {
115 compressionType = type;
116 compressedData = convertToBuffer(data);
117 compressedOffset = 0;
118 }
119 return this;
120 }
121
122 protected synchronized TileCompressionOperation setCompressedOffset(int value) {
123 compressedOffset = value;
124 return this;
125 }
126
127 @Override
128 public TileCompressionOperation setDimensions(int dataOffset, int width, int height) {
129 super.setDimensions(dataOffset, width, height);
130 return this;
131 }
132
133
134
135
136
137
138
139
140
141 protected synchronized void setWholeImageCompressedBuffer(ByteBuffer compressed) {
142 compressed.position(compressedOffset * getBaseType().size());
143 compressedData = compressed.slice();
144 compressedOffset = 0;
145
146
147 }
148
149 protected abstract AbstractNullPixelMask createImageNullPixelMask(ImageNullPixelMask imageNullPixelMask);
150 }