29 #include "ksane_scan_thread.moc"
45 m_saneStatus(SANE_STATUS_GOOD),
46 m_readStatus(READ_READY),
47 m_invertColors(false),
48 m_saneStartDone(false)
53 m_invertColors = inverted;
73 if (m_dataSize == 0)
return 0;
77 if (m_frameSize < m_dataSize) {
78 bytesRead = m_frameRead + (m_frameSize * m_frame_t_count);
81 bytesRead = m_frameRead;
83 return (
int)(((float)bytesRead * 100.0)/m_dataSize);
95 m_saneStartDone =
false;
98 m_saneStatus = sane_start(m_saneHandle);
100 m_saneStartDone =
true;
106 if (m_saneStatus != SANE_STATUS_GOOD) {
107 kDebug() <<
"sane_start=" << sane_strstatus(m_saneStatus);
114 m_saneStatus = sane_get_parameters(m_saneHandle, &m_params);
115 if (m_saneStatus != SANE_STATUS_GOOD) {
116 kDebug() <<
"sane_get_parameters=" << sane_strstatus(m_saneStatus);
123 m_frameSize = m_params.lines * m_params.bytes_per_line;
124 if ((m_params.format == SANE_FRAME_RED) ||
125 (m_params.format == SANE_FRAME_GREEN) ||
126 (m_params.format == SANE_FRAME_BLUE))
128 m_dataSize = m_frameSize*3;
131 m_dataSize = m_frameSize;
135 if (m_dataSize > 0) {
147 void KSaneScanThread::readData()
149 SANE_Int readBytes = 0;
152 switch (m_saneStatus)
154 case SANE_STATUS_GOOD:
158 case SANE_STATUS_EOF:
159 if (m_frameRead < m_frameSize) {
160 kDebug() <<
"frameRead =" << m_frameRead <<
", frameSize =" << m_frameSize <<
"readBytes =" << readBytes;
161 if ((readBytes > 0) && ((m_frameRead + readBytes) <= m_frameSize)) {
162 kDebug() <<
"This is not a standard compliant backend";
163 copyToScanData(readBytes);
168 if (m_params.last_frame == SANE_TRUE) {
175 m_saneStatus = sane_start(m_saneHandle);
176 if (m_saneStatus != SANE_STATUS_GOOD) {
177 kDebug() <<
"sane_start =" << sane_strstatus(m_saneStatus);
181 m_saneStatus = sane_get_parameters(m_saneHandle, &m_params);
182 if (m_saneStatus != SANE_STATUS_GOOD) {
183 kDebug() <<
"sane_get_parameters =" << sane_strstatus(m_saneStatus);
185 sane_cancel(m_saneHandle);
194 kDebug() <<
"sane_read=" << m_saneStatus <<
"=" << sane_strstatus(m_saneStatus);
196 sane_cancel(m_saneHandle);
200 copyToScanData(readBytes);
203 #define index_red8_to_rgb8(i) (i*3)
204 #define index_red16_to_rgb16(i) ((i/2)*6 + i%2)
206 #define index_green8_to_rgb8(i) (i*3 + 1)
207 #define index_green16_to_rgb16(i) ((i/2)*6 + i%2 + 2)
209 #define index_blue8_to_rgb8(i) (i*3 + 2)
210 #define index_blue16_to_rgb16(i) ((i/2)*6 + i%2 + 4)
212 void KSaneScanThread::copyToScanData(
int readBytes)
214 if (m_invertColors) {
215 if (m_params.depth == 16) {
217 quint16 *u16ptr =
reinterpret_cast<quint16*
>(m_readData);
218 for(
int i=0; i<readBytes/2; i++) {
219 u16ptr[i] = 0xFFFF - u16ptr[i];
222 else if (m_params.depth == 8) {
223 for(
int i=0; i<readBytes; i++) {
224 m_readData[i] = 0xFF - m_readData[i];
227 else if (m_params.depth == 1) {
228 for(
int i=0; i<readBytes; i++) {
229 m_readData[i] = ~m_readData[i];
233 switch (m_params.format)
235 case SANE_FRAME_GRAY:
236 m_data->
append((
const char*)m_readData, readBytes);
237 m_frameRead += readBytes;
240 if (m_params.depth == 1) {
243 m_data->
append((
const char*)m_readData, readBytes);
244 m_frameRead += readBytes;
248 if (m_params.depth == 8) {
249 for (
int i=0; i<readBytes; i++) {
255 else if (m_params.depth == 16) {
256 for (
int i=0; i<readBytes; i++) {
264 case SANE_FRAME_GREEN:
265 if (m_params.depth == 8) {
266 for (
int i=0; i<readBytes; i++) {
272 else if (m_params.depth == 16) {
273 for (
int i=0; i<readBytes; i++) {
281 case SANE_FRAME_BLUE:
282 if (m_params.depth == 8) {
283 for (
int i=0; i<readBytes; i++) {
289 else if (m_params.depth == 16) {
290 for (
int i=0; i<readBytes; i++) {
299 kDebug() <<
"Format" << m_params.format
300 <<
"and depth" << m_params.format
301 <<
"is not yet suppoeted by libksane!";
308 return m_saneStartDone;
void setImageInverted(bool)
#define index_red16_to_rgb16(i)
#define index_red8_to_rgb8(i)
#define index_blue16_to_rgb16(i)
#define SCAN_READ_CHUNK_SIZE
#define index_blue8_to_rgb8(i)
QByteArray & append(char ch)
SANE_Parameters saneParameters()
#define index_green8_to_rgb8(i)
KSaneScanThread(SANE_Handle handle, QByteArray *data)
#define index_green16_to_rgb16(i)