Isis 3 Programmer Reference
CubeTileHandler.cpp
1
6/* SPDX-License-Identifier: CC0-1.0 */
7
8#include "CubeTileHandler.h"
9
10#include <QFile>
11
12#include "IException.h"
13#include "Pvl.h"
14#include "PvlObject.h"
15#include "PvlKeyword.h"
16#include "RawCubeChunk.h"
17
18using namespace std;
19
20namespace Isis {
33 const QList<int> *virtualBandList, const Pvl &labels, bool alreadyOnDisk)
34 : CubeIoHandler(dataFile, virtualBandList, labels, alreadyOnDisk) {
35
36 const PvlObject &core = labels.findObject("IsisCube").findObject("Core");
37
38 if(core.hasKeyword("Format")) {
39 setChunkSizes(core["TileSamples"], core["TileLines"], 1);
40 }
41 else {
42 // up to 1MB chunks
43 int sampleChunkSize =
45 int lineChunkSize =
46 findGoodSize(512 * 4 / SizeOf(pixelType()), lineCount());
47
48 setChunkSizes(sampleChunkSize, lineChunkSize, 1);
49 }
50 }
51
52
59
60
67 PvlObject &core = labels.findObject("IsisCube").findObject("Core");
68 core.addKeyword(PvlKeyword("Format", "Tile"),
69 PvlContainer::Replace);
70 core.addKeyword(PvlKeyword("TileSamples", toString(getSampleCountInChunk())),
71 PvlContainer::Replace);
72 core.addKeyword(PvlKeyword("TileLines", toString(getLineCountInChunk())),
73 PvlContainer::Replace);
74 }
75
76
78 BigInt startByte = getTileStartByte(chunkToFill);
79
80 bool success = false;
81
82 QFile * dataFile = getDataFile();
83 if(dataFile->seek(startByte)) {
84 QByteArray binaryData = dataFile->read(chunkToFill.getByteCount());
85
86 if(binaryData.size() == chunkToFill.getByteCount()) {
87 chunkToFill.setRawData(binaryData);
88 success = true;
89 }
90 }
91
92 if(!success) {
93 IString msg = "Reading from the file [" + dataFile->fileName() + "] "
94 "failed with reading [" +
95 QString::number(chunkToFill.getByteCount()) +
96 "] bytes at position [" + QString::number(startByte) + "]";
97 throw IException(IException::Io, msg, _FILEINFO_);
98 }
99 }
100
101
102 void CubeTileHandler::writeRaw(const RawCubeChunk &chunkToWrite) {
103 BigInt startByte = getTileStartByte(chunkToWrite);
104 bool success = false;
105
106 QFile * dataFile = getDataFile();
107 if(dataFile->seek(startByte)) {
108 BigInt dataWritten = dataFile->write(chunkToWrite.getRawData());
109
110 if(dataWritten == chunkToWrite.getByteCount()) {
111 success = true;
112 }
113 }
114
115 if(!success) {
116 IString msg = "Writing to the file [" + dataFile->fileName() + "] "
117 "failed with writing [" +
118 QString::number(chunkToWrite.getByteCount()) +
119 "] bytes at position [" + QString::number(startByte) + "]";
120 throw IException(IException::Io, msg, _FILEINFO_);
121 }
122 }
123
124
135 int CubeTileHandler::findGoodSize(int maxSize, int dimensionSize) const {
136 int ideal = 128;
137
138 if(dimensionSize <= maxSize) {
139 ideal = dimensionSize;
140 }
141 else {
142 int greatestDividend = maxSize;
143
144 while(greatestDividend > ideal) {
145 if(dimensionSize % greatestDividend == 0) {
146 ideal = greatestDividend;
147 }
148
149 greatestDividend --;
150 }
151 }
152
153 return ideal;
154 }
155
156
166}
Handles converting buffers to and from disk.
void clearCache(bool blockForWriteCache=true) const
Free all cube chunks (cached cube data) from memory and write them to disk.
PixelType pixelType() const
void setChunkSizes(int numSamples, int numLines, int numBands)
This should be called once from the child constructor.
int getLineCountInChunk() const
BigInt getBytesPerChunk() const
BigInt getDataStartByte() const
int getSampleCountInChunk() const
int getChunkIndex(const RawCubeChunk &) const
Given a chunk, what's its index in the file.
void updateLabels(Pvl &label)
Update the cube labels so that this cube indicates what tile size it used.
BigInt getTileStartByte(const RawCubeChunk &chunk) const
This is a helper method that goes from chunk to file position.
int findGoodSize(int maxSize, int dimensionSize) const
This is a helper method that tries to compute a good tile size for one of the cube's dimensions (samp...
virtual void writeRaw(const RawCubeChunk &chunkToWrite)
This needs to write the chunkToWrite directly to disk with no modifications to the data itself.
virtual void readRaw(RawCubeChunk &chunkToFill)
This needs to populate the chunkToFill with unswapped raw bytes from the disk.
CubeTileHandler(QFile *dataFile, const QList< int > *virtualBandList, const Pvl &label, bool alreadyOnDisk)
Construct a tile handler.
~CubeTileHandler()
Writes all data from memory to disk.
Isis exception class.
Definition IException.h:91
@ Io
A type of error that occurred when performing an actual I/O operation.
Definition IException.h:155
Adds specific functionality to C++ strings.
Definition IString.h:165
Container for cube-like labels.
Definition Pvl.h:119
A single keyword-value pair.
Definition PvlKeyword.h:87
Contains Pvl Groups and Pvl Objects.
Definition PvlObject.h:61
PvlObjectIterator findObject(const QString &name, PvlObjectIterator beg, PvlObjectIterator end)
Find the index of object with a specified name, between two indexes.
Definition PvlObject.h:276
A section of raw data on the disk.
This is free and unencumbered software released into the public domain.
Definition Apollo.h:16
int SizeOf(Isis::PixelType pixelType)
Returns the number of bytes of the specified PixelType.
Definition PixelType.h:46
QString toString(bool boolToConvert)
Global function to convert a boolean to a string.
Definition IString.cpp:211
long long int BigInt
Big int.
Definition Constants.h:49
Namespace for the standard library.