package com.almalence.plugins.export.ExifDriver.Values;
import com.almalence.plugins.export.ExifDriver.ExifDriver;
/**
* Base class for rationals. Implements writting method, which is basically the
* same for signed and unsigned variant.
*/
public class ValueRationals extends ExifValue {
private final int NUMBER_WIDTH = 4;
private int[][] values;
public ValueRationals(int _dataType) {
super(_dataType);
}
@Override
public int[][] getRationals(){
return values;
}
@Override
public void setRationals(int[][] _values){
values=_values;
}
/**
* Read pairs of signed values from source byte array.
*
* @param _data
* Byte array to read from
* @param _offset
* Offset where to start
* @param _count
* Count of rationals values
* @param _align
* Endian
* @return Array of two-values arrays represeting rationals
*/
public void readValueFromData(byte[] _data, int _offset, int _count, int _align) {
values = new int[_count][2];
for (int v = 0; v < _count; v++) {
int iOffs = _offset + getComponentSize() * v;
if (dataType == ExifDriver.FORMAT_SIGNED_RATIONAL) {
values[v][0] = ExifDriver.readSInt(_data, iOffs, NUMBER_WIDTH, _align);
values[v][1] = ExifDriver.readSInt(_data, iOffs + NUMBER_WIDTH,
NUMBER_WIDTH, _align);
} else if (dataType == ExifDriver.FORMAT_UNSIGNED_RATIONAL) {
values[v][0] = ExifDriver.readUInt(_data, iOffs, NUMBER_WIDTH, _align);
values[v][1] = ExifDriver.readUInt(_data, iOffs + NUMBER_WIDTH,
NUMBER_WIDTH, _align);
}
}
}
@Override
protected void writeValues(byte[] _data, int _offset) {
for (int i = 0; i < values.length; i++) {
int iOffs = _offset + i * getComponentSize();
ExifDriver.writeNumber(_data, iOffs, values[i][0], NUMBER_WIDTH);
ExifDriver.writeNumber(_data, iOffs + NUMBER_WIDTH, values[i][1],
NUMBER_WIDTH);
}
}
@Override
public int getNbfComponents() {
if (values != null) {
return values.length;
}
return 0;
}
}