Memory+Group4, to be complement...
This commit is contained in:
parent
d8e82950ab
commit
23cb82b7ce
|
@ -152,7 +152,7 @@ __declspec(novtable) struct ISaneInvoker : public IRef
|
||||||
COM_API_DECLARE(bool, wait_image(DWORD milliseconds = -1));
|
COM_API_DECLARE(bool, wait_image(DWORD milliseconds = -1));
|
||||||
COM_API_DECLARE(int, get_scanned_images(DWORD milliseconds = 0));
|
COM_API_DECLARE(int, get_scanned_images(DWORD milliseconds = 0));
|
||||||
COM_API_DECLARE(IScanImg*, take_first_image(twain_xfer xfer = TWAIN_XFER_Native)); // call 'release' on returned value, plz
|
COM_API_DECLARE(IScanImg*, take_first_image(twain_xfer xfer = TWAIN_XFER_Native)); // call 'release' on returned value, plz
|
||||||
COM_API_DECLARE(bool, get_first_image_header(SANE_Parameters* header));
|
COM_API_DECLARE(bool, get_first_image_header(SANE_Parameters* header, size_t* bytes = NULL));
|
||||||
COM_API_DECLARE(bool, is_online(void));
|
COM_API_DECLARE(bool, is_online(void));
|
||||||
COM_API_DECLARE(bool, is_paper_on(void));
|
COM_API_DECLARE(bool, is_paper_on(void));
|
||||||
|
|
||||||
|
@ -170,6 +170,7 @@ __declspec(novtable) struct ISaneInvoker : public IRef
|
||||||
COM_API_DECLARE(bool, get_value(int sn, set_opt_value, void* param));
|
COM_API_DECLARE(bool, get_value(int sn, set_opt_value, void* param));
|
||||||
COM_API_DECLARE(int, set_value(int sn, void* val));
|
COM_API_DECLARE(int, set_value(int sn, void* val));
|
||||||
COM_API_DECLARE(int, convert_image(SANE_ImageFormatConvert* conv));
|
COM_API_DECLARE(int, convert_image(SANE_ImageFormatConvert* conv));
|
||||||
|
COM_API_DECLARE(void, free_buffer(void* buf, int len));
|
||||||
|
|
||||||
// SANE options ID ...
|
// SANE options ID ...
|
||||||
SANE_OPTION_ID_API(is_multiout); // 多流输出
|
SANE_OPTION_ID_API(is_multiout); // 多流输出
|
||||||
|
@ -264,6 +265,7 @@ __declspec(novtable) struct ISaneInvoker : public IRef
|
||||||
|
|
||||||
// twain
|
// twain
|
||||||
COM_API_DECLARE(void, twain_set_transfer(twain_xfer xfer));
|
COM_API_DECLARE(void, twain_set_transfer(twain_xfer xfer));
|
||||||
|
COM_API_DECLARE(void, twain_set_compression(SANE_CompressionType compression, void* detail = NULL));
|
||||||
};
|
};
|
||||||
|
|
||||||
struct delete_scanner
|
struct delete_scanner
|
||||||
|
|
|
@ -188,12 +188,12 @@ void mapping_buf::set_buffer(unsigned char*& buf, unsigned long long off, unsign
|
||||||
*bytes = mapped_bytes_ - (off - offset_);
|
*bytes = mapped_bytes_ - (off - offset_);
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned char* mapping_buf::allocate(const wchar_t* file, unsigned long long size)
|
unsigned char* mapping_buf::allocate(const wchar_t* file, unsigned long long size, bool force_file)
|
||||||
{
|
{
|
||||||
close();
|
close();
|
||||||
|
|
||||||
std::string ansi(local_trans::u2a(file));
|
std::string ansi(local_trans::u2a(file));
|
||||||
if (size >= 100 * 1024 * 1024 || PathFileExistsW(file))
|
if (force_file || size >= 100 * 1024 * 1024 || PathFileExistsW(file))
|
||||||
{
|
{
|
||||||
init_map(ansi.c_str(), size);
|
init_map(ansi.c_str(), size);
|
||||||
}
|
}
|
||||||
|
@ -270,6 +270,27 @@ bool mapping_buf::save(const void* data, size_t* bytes, unsigned long long off)
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
bool mapping_buf::save(unsigned long long off, mapping_buf* mbuf, unsigned long long src_off)
|
||||||
|
{
|
||||||
|
unsigned int len = mbuf->bytes() - src_off;
|
||||||
|
unsigned char* buf = mbuf->buffer(src_off, &len);
|
||||||
|
bool ret = false;
|
||||||
|
|
||||||
|
while (buf && save(buf, &len, off))
|
||||||
|
{
|
||||||
|
off += len;
|
||||||
|
src_off += len;
|
||||||
|
if (src_off >= mbuf->bytes())
|
||||||
|
{
|
||||||
|
ret = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
len = mbuf->bytes() - src_off;
|
||||||
|
buf = mbuf->buffer(src_off, &len);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
int mapping_buf::read(void* buf, size_t* bytes, unsigned long long off)
|
int mapping_buf::read(void* buf, size_t* bytes, unsigned long long off)
|
||||||
{
|
{
|
||||||
if (!bytes)
|
if (!bytes)
|
||||||
|
@ -334,9 +355,10 @@ unsigned int mapping_buf::mapped_bytes(void)
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// class scanned_img
|
// class scanned_img
|
||||||
scanned_img::scanned_img(SANE_Parameters head, SANE_Handle dev, int dpi
|
scanned_img::scanned_img(SANE_Handle dev, SANE_Parameters head, int dpi
|
||||||
, const wchar_t* tmp_file, twain_xfer xfer
|
, const wchar_t* tmp_file, twain_xfer xfer
|
||||||
, SANE_FinalImgFormat *fmt) : head_(head), dpi_(dpi), header_size_(0)
|
, SANE_FinalImgFormat *fmt) : head_(head), dpi_(dpi), header_size_(0), file_(tmp_file ? tmp_file : L"")
|
||||||
|
, dev_(dev)
|
||||||
{
|
{
|
||||||
if (fmt)
|
if (fmt)
|
||||||
fmt_ = *fmt;
|
fmt_ = *fmt;
|
||||||
|
@ -400,8 +422,9 @@ scanned_img::scanned_img(SANE_Parameters head, SANE_Handle dev, int dpi
|
||||||
}
|
}
|
||||||
do_result(ok, xfer);
|
do_result(ok, xfer);
|
||||||
}
|
}
|
||||||
scanned_img::scanned_img(SANE_Parameters head, void* data, unsigned int len, int dpi, const wchar_t* tmp_file
|
scanned_img::scanned_img(SANE_Handle dev, SANE_Parameters head, void* data, unsigned int len, int dpi, const wchar_t* tmp_file
|
||||||
, twain_xfer xfer, SANE_FinalImgFormat* fmt) : head_(head), dpi_(dpi), header_size_(0)
|
, twain_xfer xfer, SANE_FinalImgFormat* fmt) : head_(head), dpi_(dpi), header_size_(0)
|
||||||
|
, file_(tmp_file ? tmp_file : L""), dev_(dev)
|
||||||
{
|
{
|
||||||
if (fmt)
|
if (fmt)
|
||||||
fmt_ = *fmt;
|
fmt_ = *fmt;
|
||||||
|
@ -504,7 +527,56 @@ void scanned_img::do_result(bool ok, twain_xfer xfer)
|
||||||
{
|
{
|
||||||
if (ok)
|
if (ok)
|
||||||
{
|
{
|
||||||
if (fmt_.img_format == SANE_IMAGE_TYPE_BMP
|
if (fmt_.img_format == SANE_IMAGE_TYPE_BMP &&
|
||||||
|
fmt_.compress.compression == SANE_COMPRESSION_GROUP4 &&
|
||||||
|
xfer == TWAIN_XFER_Memory)
|
||||||
|
{
|
||||||
|
// convert to black-white ...
|
||||||
|
std::string head(file_header(SANE_IMAGE_TYPE_BMP, dpi_, TWAIN_XFER_File));
|
||||||
|
size_t size = head.length();
|
||||||
|
mapping_buf* buf = new mapping_buf();
|
||||||
|
std::wstring file(file_ + L".tmp");
|
||||||
|
unsigned long long off = 0;
|
||||||
|
|
||||||
|
if (buf->allocate(file.c_str(), size + data_->bytes(), true) &&
|
||||||
|
buf->save(head.c_str(), &size, off))
|
||||||
|
{
|
||||||
|
if (buf->save(size, data_))
|
||||||
|
{
|
||||||
|
SANE_ImageFormatConvert conv;
|
||||||
|
std::string sf(local_trans::u2a(file.c_str()));
|
||||||
|
|
||||||
|
buf->unmap();
|
||||||
|
conv.src.data = sf.c_str();
|
||||||
|
conv.src.data_len = sf.length();
|
||||||
|
conv.src.fmt.img_format = SANE_IMAGE_TYPE_BMP;
|
||||||
|
conv.src.fmt.compress.compression = SANE_COMPRESSION_NONE;
|
||||||
|
conv.src.is_file = SANE_TRUE;
|
||||||
|
|
||||||
|
conv.dst.data = NULL;
|
||||||
|
conv.dst.data_len = 0;
|
||||||
|
conv.dst.fmt.img_format = SANE_IMAGE_TYPE_BMP;
|
||||||
|
conv.dst.fmt.compress.compression = SANE_COMPRESSION_GROUP4;
|
||||||
|
conv.dst.fmt.compress.detail = NULL;
|
||||||
|
conv.dst.is_file = false;
|
||||||
|
if (hg_sane_middleware::instance()->io_control(dev_, IO_CTRL_CODE_CONVERT_IMAGE_FORMAT, &conv, NULL) == SANE_STATUS_GOOD)
|
||||||
|
{
|
||||||
|
delete data_;
|
||||||
|
data_ = new mapping_buf();
|
||||||
|
size = conv.dst.data_len;
|
||||||
|
data_->allocate(file_.c_str(), conv.dst.data_len);
|
||||||
|
data_->save(conv.dst.data, &size, 0);
|
||||||
|
hg_sane_middleware::instance()->io_control(dev_, IO_CTRL_CODE_FREE_MEMORY, (void*)conv.dst.data, &conv.dst.data_len);
|
||||||
|
head_.format = SANE_FRAME_GRAY;
|
||||||
|
head_.depth = 1;
|
||||||
|
head_.bytes_per_line = (head_.pixels_per_line + 7) / 8;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (buf)
|
||||||
|
delete buf;
|
||||||
|
}
|
||||||
|
else if (fmt_.img_format == SANE_IMAGE_TYPE_BMP
|
||||||
&& channel() == 3
|
&& channel() == 3
|
||||||
&& xfer != TWAIN_XFER_Memory)
|
&& xfer != TWAIN_XFER_Memory)
|
||||||
{
|
{
|
||||||
|
@ -571,7 +643,7 @@ COM_API_IMPLEMENT(scanned_img, int, width(void))
|
||||||
}
|
}
|
||||||
COM_API_IMPLEMENT(scanned_img, int, line_bytes(void))
|
COM_API_IMPLEMENT(scanned_img, int, line_bytes(void))
|
||||||
{
|
{
|
||||||
if (fmt_.img_format == SANE_IMAGE_TYPE_BMP)
|
if (fmt_.img_format == SANE_IMAGE_TYPE_BMP && head_.depth >= 8)
|
||||||
return (head_.bytes_per_line + 3) / 4 * 4;
|
return (head_.bytes_per_line + 3) / 4 * 4;
|
||||||
else
|
else
|
||||||
return head_.bytes_per_line;
|
return head_.bytes_per_line;
|
||||||
|
@ -661,14 +733,19 @@ bool safe_img_queue::save(scanned_img* img)
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
bool safe_img_queue::get_header(SANE_Parameters* header)
|
bool safe_img_queue::get_header(SANE_Parameters* header, size_t* bytes)
|
||||||
{
|
{
|
||||||
std::lock_guard<std::mutex> lock(que_lock_);
|
std::lock_guard<std::mutex> lock(que_lock_);
|
||||||
bool ok = false;
|
bool ok = false;
|
||||||
|
|
||||||
|
if (bytes)
|
||||||
|
*bytes = 0;
|
||||||
if (queue_.size())
|
if (queue_.size())
|
||||||
{
|
{
|
||||||
queue_[0]->copy_header(header);
|
if(header)
|
||||||
|
queue_[0]->copy_header(header);
|
||||||
|
if(bytes)
|
||||||
|
*bytes = queue_[0]->bytes();
|
||||||
ok = true;
|
ok = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -40,9 +40,10 @@ public:
|
||||||
~mapping_buf();
|
~mapping_buf();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
unsigned char* allocate(const wchar_t* file, unsigned long long size = 0);
|
unsigned char* allocate(const wchar_t* file, unsigned long long size = 0, bool force_file = false);
|
||||||
unsigned char* buffer(unsigned long long off, unsigned int* bytes);
|
unsigned char* buffer(unsigned long long off, unsigned int* bytes);
|
||||||
bool save(const void* data, size_t* bytes, unsigned long long off);
|
bool save(const void* data, size_t* bytes, unsigned long long off);
|
||||||
|
bool save(unsigned long long off, mapping_buf* mbuf, unsigned long long src_off = 0);
|
||||||
int read(void* buf, size_t* bytes, unsigned long long off);
|
int read(void* buf, size_t* bytes, unsigned long long off);
|
||||||
void unmap();
|
void unmap();
|
||||||
void set_remove_file_when_destroyed(bool rmv);
|
void set_remove_file_when_destroyed(bool rmv);
|
||||||
|
@ -56,6 +57,8 @@ class scanned_img : public IScanImg, virtual public refer
|
||||||
SANE_Parameters head_;
|
SANE_Parameters head_;
|
||||||
mapping_buf* data_;
|
mapping_buf* data_;
|
||||||
int dpi_;
|
int dpi_;
|
||||||
|
SANE_Handle dev_;
|
||||||
|
std::wstring file_;
|
||||||
unsigned int header_size_;
|
unsigned int header_size_;
|
||||||
SANE_FinalImgFormat fmt_;
|
SANE_FinalImgFormat fmt_;
|
||||||
|
|
||||||
|
@ -64,9 +67,9 @@ class scanned_img : public IScanImg, virtual public refer
|
||||||
void swap_rgb(void);
|
void swap_rgb(void);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
scanned_img(SANE_Parameters head, SANE_Handle dev, int dpi, const wchar_t* tmp_file
|
scanned_img(SANE_Handle dev, SANE_Parameters head, int dpi, const wchar_t* tmp_file
|
||||||
, twain_xfer xfer = TWAIN_XFER_Native, SANE_FinalImgFormat *fmt = NULL);
|
, twain_xfer xfer = TWAIN_XFER_Native, SANE_FinalImgFormat *fmt = NULL);
|
||||||
scanned_img(SANE_Parameters head, void* data, unsigned int len, int dpi, const wchar_t* tmp_file
|
scanned_img(SANE_Handle dev, SANE_Parameters head, void* data, unsigned int len, int dpi, const wchar_t* tmp_file
|
||||||
, twain_xfer xfer = TWAIN_XFER_Native, SANE_FinalImgFormat *fmt = NULL);
|
, twain_xfer xfer = TWAIN_XFER_Native, SANE_FinalImgFormat *fmt = NULL);
|
||||||
|
|
||||||
|
|
||||||
|
@ -107,7 +110,7 @@ public:
|
||||||
public:
|
public:
|
||||||
size_t count(void);
|
size_t count(void);
|
||||||
bool save(scanned_img* img);
|
bool save(scanned_img* img);
|
||||||
bool get_header(SANE_Parameters* header);
|
bool get_header(SANE_Parameters* header, size_t* bytes = NULL);
|
||||||
scanned_img* take(void);
|
scanned_img* take(void);
|
||||||
void clear();
|
void clear();
|
||||||
};
|
};
|
||||||
|
|
|
@ -116,6 +116,7 @@ scanner::scanner(SCANNERID id) : handle_(NULL), id_(id), ex_id_(EXTENSION_ID_BAS
|
||||||
CreateDirectoryW(tmp_path_.c_str(), NULL);
|
CreateDirectoryW(tmp_path_.c_str(), NULL);
|
||||||
tmp_path_ += L"\\";
|
tmp_path_ += L"\\";
|
||||||
img_fmt_.img_format = SANE_IMAGE_TYPE_BMP;
|
img_fmt_.img_format = SANE_IMAGE_TYPE_BMP;
|
||||||
|
img_fmt_.compress.compression = SANE_COMPRESSION_NONE;
|
||||||
|
|
||||||
err_ = open();
|
err_ = open();
|
||||||
}
|
}
|
||||||
|
@ -1510,8 +1511,10 @@ COM_API_IMPLEMENT(scanner, int, start(void))
|
||||||
if (ret == SANE_STATUS_GOOD)
|
if (ret == SANE_STATUS_GOOD)
|
||||||
{
|
{
|
||||||
unsigned int l = sizeof(img_fmt_);
|
unsigned int l = sizeof(img_fmt_);
|
||||||
|
SANE_CompressionType cmprsn = img_fmt_.compress.compression;
|
||||||
if (hg_sane_middleware::instance()->io_control(handle_, IO_CTRL_CODE_GET_FINAL_IMAGE_FORMAT, &img_fmt_, &l))
|
if (hg_sane_middleware::instance()->io_control(handle_, IO_CTRL_CODE_GET_FINAL_IMAGE_FORMAT, &img_fmt_, &l))
|
||||||
img_fmt_.img_format = SANE_IMAGE_TYPE_BMP;
|
img_fmt_.img_format = SANE_IMAGE_TYPE_BMP;
|
||||||
|
img_fmt_.compress.compression = cmprsn;
|
||||||
working_ = true;
|
working_ = true;
|
||||||
}
|
}
|
||||||
prev_start_result_ = ret;
|
prev_start_result_ = ret;
|
||||||
|
@ -1576,9 +1579,9 @@ COM_API_IMPLEMENT(scanner, IScanImg*, take_first_image(twain_xfer xfer))
|
||||||
|
|
||||||
return dynamic_cast<IScanImg*>(img);
|
return dynamic_cast<IScanImg*>(img);
|
||||||
}
|
}
|
||||||
COM_API_IMPLEMENT(scanner, bool, get_first_image_header(SANE_Parameters* header))
|
COM_API_IMPLEMENT(scanner, bool, get_first_image_header(SANE_Parameters* header, size_t* bytes))
|
||||||
{
|
{
|
||||||
return images_.get_header(header);
|
return images_.get_header(header, bytes);
|
||||||
}
|
}
|
||||||
COM_API_IMPLEMENT(scanner, bool, is_online(void))
|
COM_API_IMPLEMENT(scanner, bool, is_online(void))
|
||||||
{
|
{
|
||||||
|
@ -1779,7 +1782,10 @@ COM_API_IMPLEMENT(scanner, int, convert_image(SANE_ImageFormatConvert* conv))
|
||||||
{
|
{
|
||||||
return hg_sane_middleware::instance()->io_control(handle_, IO_CTRL_CODE_CONVERT_IMAGE_FORMAT, conv, NULL);
|
return hg_sane_middleware::instance()->io_control(handle_, IO_CTRL_CODE_CONVERT_IMAGE_FORMAT, conv, NULL);
|
||||||
}
|
}
|
||||||
|
COM_API_IMPLEMENT(scanner, void, free_buffer(void* buf, int len))
|
||||||
|
{
|
||||||
|
hg_sane_middleware::instance()->io_control(handle_, IO_CTRL_CODE_FREE_MEMORY, buf, (unsigned int*)&len);
|
||||||
|
}
|
||||||
|
|
||||||
// SANE options ID ...
|
// SANE options ID ...
|
||||||
SANE_OPTION_ID_IMPLEMENT(is_multiout)
|
SANE_OPTION_ID_IMPLEMENT(is_multiout)
|
||||||
|
@ -1868,6 +1874,12 @@ COM_API_IMPLEMENT(scanner, void, twain_set_transfer(twain_xfer xfer))
|
||||||
{
|
{
|
||||||
xfer_ = xfer;
|
xfer_ = xfer;
|
||||||
}
|
}
|
||||||
|
COM_API_IMPLEMENT(scanner, void, twain_set_compression(SANE_CompressionType compression, void* detail))
|
||||||
|
{
|
||||||
|
img_fmt_.compress.compression = compression;
|
||||||
|
img_fmt_.compress.detail = detail;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// ui ...
|
// ui ...
|
||||||
COM_API_IMPLEMENT(scanner, bool, ui_show_main(HWND parent))
|
COM_API_IMPLEMENT(scanner, bool, ui_show_main(HWND parent))
|
||||||
|
@ -1939,8 +1951,8 @@ int scanner::handle_event(int ev_code, void* data, unsigned int* len)
|
||||||
wchar_t name[40] = { 0 };
|
wchar_t name[40] = { 0 };
|
||||||
|
|
||||||
swprintf_s(name, _countof(name) - 1, L"img_%05u.bmp", ++img_ind_);
|
swprintf_s(name, _countof(name) - 1, L"img_%05u.bmp", ++img_ind_);
|
||||||
img = new scanned_img(simg->header, simg->data, simg->bytes, dpi_, (tmp_path_ + name).c_str(), xfer_, &img_fmt_);
|
img = new scanned_img(handle_, simg->header, simg->data, simg->bytes, dpi_, (tmp_path_ + name).c_str(), xfer_, &img_fmt_);
|
||||||
if (img->bytes() >= simg->bytes)
|
if (img->bytes() /*>= simg->bytes*/)
|
||||||
{
|
{
|
||||||
images_.save(img);
|
images_.save(img);
|
||||||
}
|
}
|
||||||
|
|
|
@ -191,13 +191,14 @@ public:
|
||||||
COM_API_OVERRIDE(bool, wait_image(DWORD milliseconds = -1));
|
COM_API_OVERRIDE(bool, wait_image(DWORD milliseconds = -1));
|
||||||
COM_API_OVERRIDE(int, get_scanned_images(DWORD milliseconds = 0));
|
COM_API_OVERRIDE(int, get_scanned_images(DWORD milliseconds = 0));
|
||||||
COM_API_OVERRIDE(IScanImg*, take_first_image(twain_xfer xfer = TWAIN_XFER_Native)); // call 'release' on returned value, plz
|
COM_API_OVERRIDE(IScanImg*, take_first_image(twain_xfer xfer = TWAIN_XFER_Native)); // call 'release' on returned value, plz
|
||||||
COM_API_OVERRIDE(bool, get_first_image_header(SANE_Parameters* header));
|
COM_API_OVERRIDE(bool, get_first_image_header(SANE_Parameters* header, size_t* bytes = NULL));
|
||||||
COM_API_OVERRIDE(bool, is_online(void));
|
COM_API_OVERRIDE(bool, is_online(void));
|
||||||
COM_API_OVERRIDE(bool, is_paper_on(void));
|
COM_API_OVERRIDE(bool, is_paper_on(void));
|
||||||
COM_API_OVERRIDE(bool, get_option_info(int sn, value_type* type, value_limit* limit, int* bytes));
|
COM_API_OVERRIDE(bool, get_option_info(int sn, value_type* type, value_limit* limit, int* bytes));
|
||||||
COM_API_OVERRIDE(bool, get_value(int sn, set_opt_value, void* param));
|
COM_API_OVERRIDE(bool, get_value(int sn, set_opt_value, void* param));
|
||||||
COM_API_OVERRIDE(int, set_value(int sn, void* val));
|
COM_API_OVERRIDE(int, set_value(int sn, void* val));
|
||||||
COM_API_OVERRIDE(int, convert_image(SANE_ImageFormatConvert* conv));
|
COM_API_OVERRIDE(int, convert_image(SANE_ImageFormatConvert* conv));
|
||||||
|
COM_API_OVERRIDE(void, free_buffer(void* buf, int len));
|
||||||
|
|
||||||
// SANE options ID ...
|
// SANE options ID ...
|
||||||
SANE_OPTION_ID(is_multiout);
|
SANE_OPTION_ID(is_multiout);
|
||||||
|
@ -291,6 +292,7 @@ public:
|
||||||
|
|
||||||
// twain
|
// twain
|
||||||
COM_API_OVERRIDE(void, twain_set_transfer(twain_xfer xfer));
|
COM_API_OVERRIDE(void, twain_set_transfer(twain_xfer xfer));
|
||||||
|
COM_API_OVERRIDE(void, twain_set_compression(SANE_CompressionType compression, void* detail = NULL));
|
||||||
|
|
||||||
// methods:
|
// methods:
|
||||||
public:
|
public:
|
||||||
|
|
|
@ -0,0 +1,48 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
// Definitions for all versions ...
|
||||||
|
//
|
||||||
|
//
|
||||||
|
|
||||||
|
// #define OEM_HANWANG
|
||||||
|
#define VERSION_MAIN 4
|
||||||
|
#define VERSION_SUB 1007
|
||||||
|
#define VERSION_BUILD 2022
|
||||||
|
#define VERSION_PATCH 6271
|
||||||
|
|
||||||
|
#define TO_STR(a) #a
|
||||||
|
#define TO_VER_STR(vs) TO_STR(v##vs)
|
||||||
|
#define VERSION_STR(a, b, c, d) TO_VER_STR(a.b.c.d)
|
||||||
|
|
||||||
|
#define PRODUCT_ID 100
|
||||||
|
#define MAKE_PID(pid) 0x##pid
|
||||||
|
#define PASTE_DEF(a, b) a##b
|
||||||
|
#define FINAL_STR(a, b, c) TO_STR(a##b##c)
|
||||||
|
#define MAKE_NAME(pid) FULL_NAME(PASTE_DEF(G, pid))
|
||||||
|
#define FULL_FAMILY(a) FINAL_STR(a, \x20, Series)
|
||||||
|
#define MAKE_FAMILY(pid) FULL_FAMILY(PASTE_DEF(G, pid))
|
||||||
|
|
||||||
|
#ifdef OEM_HANWANG
|
||||||
|
|
||||||
|
#define FULL_NAME(a) FINAL_STR(HANVONSCAN\x20, a, \x20TWAIN)
|
||||||
|
#define PRODUCT_VID 0x2903
|
||||||
|
#define PRODUCT_VENDOR "Hanvon"
|
||||||
|
|
||||||
|
#elif defined(OEM_LISICHENG)
|
||||||
|
|
||||||
|
#define FULL_NAME(a) FINAL_STR(LANXUMSCAN\x20, a, \x20TWAIN)
|
||||||
|
#define PRODUCT_VID 0x31c9
|
||||||
|
#define PRODUCT_VENDOR "Lanxum"
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#define FULL_NAME(a) FINAL_STR(HUAGOSCAN\x20, a, \x20TWAIN)
|
||||||
|
#define PRODUCT_VID 0x3072
|
||||||
|
#define PRODUCT_VENDOR "HUAGO"
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#define PRODUCT_PID MAKE_PID(PRODUCT_ID)
|
||||||
|
#define PRODUCT_FAMILY MAKE_FAMILY(PRODUCT_ID)
|
||||||
|
#define PRODUCT_NAME MAKE_NAME(PRODUCT_ID)
|
|
@ -760,6 +760,7 @@ Result huagao_ds::identityOpenDs(const Identity& id)
|
||||||
// ui_.reset(new twain_ui(local_utility::reg_get_app_installing_path().c_str()));
|
// ui_.reset(new twain_ui(local_utility::reg_get_app_installing_path().c_str()));
|
||||||
scanner_->set_event_callback(&huagao_ds::scan_event, this);
|
scanner_->set_event_callback(&huagao_ds::scan_event, this);
|
||||||
init_support_caps();
|
init_support_caps();
|
||||||
|
m_fileXfer.setFormat(ImageFileFormat::Bmp);
|
||||||
|
|
||||||
return success();
|
return success();
|
||||||
}
|
}
|
||||||
|
@ -801,16 +802,26 @@ Result huagao_ds::pendingXfersReset(const Identity&, PendingXfers& data)
|
||||||
Result huagao_ds::setupMemXferGet(const Identity&, SetupMemXfer& data)
|
Result huagao_ds::setupMemXferGet(const Identity&, SetupMemXfer& data)
|
||||||
{
|
{
|
||||||
SANE_Parameters head;
|
SANE_Parameters head;
|
||||||
|
size_t total = 0;
|
||||||
|
|
||||||
if (!scanner_.get() || scanner_->get_scanned_images() == 0)
|
if (!scanner_.get() || scanner_->get_scanned_images() == 0)
|
||||||
return seqError();
|
return seqError();
|
||||||
|
|
||||||
if (scanner_->get_first_image_header(&head))
|
if (scanner_->get_first_image_header(&head, &total))
|
||||||
{
|
{
|
||||||
int line_bytes = (head.bytes_per_line + 3) / 4 * 4;
|
if (m_compression == Compression::None)
|
||||||
data.setMinSize(head.bytes_per_line);
|
{
|
||||||
data.setPreferredSize(line_bytes);
|
int line_bytes = (head.bytes_per_line + 3) / 4 * 4;
|
||||||
data.setMaxSize(line_bytes * head.lines);
|
data.setMinSize(head.bytes_per_line);
|
||||||
|
data.setPreferredSize(line_bytes);
|
||||||
|
data.setMaxSize(line_bytes * head.lines);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
data.setMinSize(total);
|
||||||
|
data.setPreferredSize(total);
|
||||||
|
data.setMaxSize(total);
|
||||||
|
}
|
||||||
|
|
||||||
return success();
|
return success();
|
||||||
}
|
}
|
||||||
|
@ -929,10 +940,20 @@ Result huagao_ds::imageMemXferGet(const Identity& origin, ImageMemXfer& data)
|
||||||
}
|
}
|
||||||
data.setBytesPerRow(line_l);
|
data.setBytesPerRow(line_l);
|
||||||
data.setColumns(img->width());
|
data.setColumns(img->width());
|
||||||
|
data.setRows(rows);
|
||||||
data.setXOffset(0);
|
data.setXOffset(0);
|
||||||
data.setYOffset(off / line_l);
|
data.setYOffset(off / line_l);
|
||||||
data.setCompression(Compression::None);
|
data.setCompression(m_compression);
|
||||||
if (img->read(dst, &want_read, off) == SCANNER_ERR_OK)
|
if (m_compression != Compression::None)
|
||||||
|
{
|
||||||
|
want_read = img->bytes();
|
||||||
|
off = 0;
|
||||||
|
img->read(dst, &want_read, off);
|
||||||
|
data.setRows(1);
|
||||||
|
data.setColumns(want_read);
|
||||||
|
data.setBytesWritten(want_read);
|
||||||
|
}
|
||||||
|
else if (img->read(dst, &want_read, off) == SCANNER_ERR_OK)
|
||||||
{
|
{
|
||||||
want_read /= line_l;
|
want_read /= line_l;
|
||||||
data.setRows(want_read);
|
data.setRows(want_read);
|
||||||
|
@ -1233,6 +1254,7 @@ void huagao_ds::init_support_caps(void)
|
||||||
auto mech = data.currentItem<CapType::ICompression>();
|
auto mech = data.currentItem<CapType::ICompression>();
|
||||||
if (Compression::None == mech || mech == Compression::Group4) {
|
if (Compression::None == mech || mech == Compression::Group4) {
|
||||||
m_compression = mech;
|
m_compression = mech;
|
||||||
|
scanner_->twain_set_compression((SANE_CompressionType)m_compression);
|
||||||
return success();
|
return success();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -1446,6 +1468,7 @@ void huagao_ds::init_support_caps(void)
|
||||||
auto mech = data.currentItem<CapType::IXferMech>();
|
auto mech = data.currentItem<CapType::IXferMech>();
|
||||||
if (mech == XferMech::Native || mech == XferMech::Memory || mech == XferMech::File) {
|
if (mech == XferMech::Native || mech == XferMech::Memory || mech == XferMech::File) {
|
||||||
m_capXferMech = mech;
|
m_capXferMech = mech;
|
||||||
|
scanner_->twain_set_transfer((twain_xfer)m_capXferMech);
|
||||||
return success();
|
return success();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -1662,7 +1685,8 @@ void huagao_ds::init_support_caps(void)
|
||||||
//SET_SANE_OPT(ret, scanner_, ex_final_format, &init);
|
//SET_SANE_OPT(ret, scanner_, ex_final_format, &init);
|
||||||
//return ret == SCANNER_ERR_OK ? success() : badValue();
|
//return ret == SCANNER_ERR_OK ? success() : badValue();
|
||||||
}
|
}
|
||||||
ImageFileFormat Now = m_fileXfer.format(), Init = (ImageFileFormat)(int)init.img_format;
|
// ImageFileFormat Now = (ImageFileFormat)(int)now.img_format, Init = (ImageFileFormat)(int)init.img_format;
|
||||||
|
ImageFileFormat Now = m_fileXfer.format() , Init = Twpp::ImageFileFormat::Bmp;
|
||||||
std::list<ImageFileFormat> vals;
|
std::list<ImageFileFormat> vals;
|
||||||
UInt32 i = 0, n = 0;
|
UInt32 i = 0, n = 0;
|
||||||
for (const auto& v : all)
|
for (const auto& v : all)
|
||||||
|
|
Loading…
Reference in New Issue