HGSaneUser增加扫描事件

This commit is contained in:
luoliangyi 2023-05-23 14:37:34 +08:00
parent 3ce2281139
commit 8350e95a20
10 changed files with 104 additions and 60 deletions

View File

@ -27,5 +27,5 @@ HGSane_GetDeviceLogPath
HGSane_ClearDeviceLog
HGSane_StartDevice
HGSane_StopDevice
HGSane_StartDeviceWithUI
HGSane_StartDevice
HGSane_StartDeviceWithSingleScan

View File

@ -53,8 +53,8 @@ win32 {
}
# DEF_FILE = HGSaneUser.def
LIBS += -lgdi32 -lgdiplus -ldbghelp
LIBS += -L$$PWD/../../build/$${MY_OS}/$${OEM_NAME}/$${MY_ARCH}/$${MY_CONFIGURE} -l$${OEM_PREFIX}Base -l$${OEM_PREFIX}SaneUI
# LIBS += -lgdi32 -lgdiplus -ldbghelp
# LIBS += -L$$PWD/../../build/$${MY_OS}/$${OEM_NAME}/$${MY_ARCH}/$${MY_CONFIGURE} -l$${OEM_PREFIX}Base -l$${OEM_PREFIX}SaneUI
}
unix {

View File

@ -301,7 +301,8 @@ HGResult HGAPI HGSane_ClearDeviceLog(HGSaneDevice dev)
return saneDeviceImpl->ClearDeviceLog();
}
HGResult HGAPI HGSane_StartDeviceWithUI(HGSaneDevice dev, HGWindow parent, HGSane_DeviceImageFunc imageFunc, HGPointer imageParam)
HGResult HGAPI HGSane_StartDevice(HGSaneDevice dev, HGWindow parent, HGDSEventFunc eventFunc, HGPointer eventParam,
HGDSImageFunc imageFunc, HGPointer imageParam)
{
if (NULL == dev)
{
@ -309,10 +310,11 @@ HGResult HGAPI HGSane_StartDeviceWithUI(HGSaneDevice dev, HGWindow parent, HGSan
}
HGSaneDeviceImpl* saneDeviceImpl = (HGSaneDeviceImpl*)dev;
return saneDeviceImpl->StartWithUI(parent, imageFunc, imageParam);
return saneDeviceImpl->Start(parent, eventFunc, eventParam, imageFunc, imageParam);
}
HGResult HGAPI HGSane_StartDeviceWithSingleScan(HGSaneDevice dev, HGWindow parent, HGSane_DeviceImageFunc imageFunc, HGPointer imageParam)
HGResult HGAPI HGSane_StartDeviceWithSingleScan(HGSaneDevice dev, HGWindow parent, HGDSEventFunc eventFunc, HGPointer eventParam,
HGDSImageFunc imageFunc, HGPointer imageParam)
{
if (NULL == dev)
{
@ -320,5 +322,5 @@ HGResult HGAPI HGSane_StartDeviceWithSingleScan(HGSaneDevice dev, HGWindow paren
}
HGSaneDeviceImpl* saneDeviceImpl = (HGSaneDeviceImpl*)dev;
return saneDeviceImpl->StartWithSingleScan(parent, imageFunc, imageParam);
return saneDeviceImpl->StartWithSingleScan(parent, eventFunc, eventParam, imageFunc, imageParam);
}

View File

@ -90,8 +90,10 @@ HGEXPORT HGResult HGAPI HGSane_GetDeviceLog(HGSaneDevice dev, const HGChar *file
HGEXPORT HGResult HGAPI HGSane_ClearDeviceLog(HGSaneDevice dev);
HGEXPORT HGResult HGAPI HGSane_StartDeviceWithUI(HGSaneDevice dev, HGWindow parent, HGSane_DeviceImageFunc imageFunc, HGPointer imageParam);
HGEXPORT HGResult HGAPI HGSane_StartDevice(HGSaneDevice dev, HGWindow parent, HGDSEventFunc eventFunc, HGPointer eventParam,
HGDSImageFunc imageFunc, HGPointer imageParam);
HGEXPORT HGResult HGAPI HGSane_StartDeviceWithSingleScan(HGSaneDevice dev, HGWindow parent, HGSane_DeviceImageFunc imageFunc, HGPointer imageParam);
HGEXPORT HGResult HGAPI HGSane_StartDeviceWithSingleScan(HGSaneDevice dev, HGWindow parent, HGDSEventFunc eventFunc, HGPointer eventParam,
HGDSImageFunc imageFunc, HGPointer imageParam);
#endif /* __HGSANE_H__ */

View File

@ -724,7 +724,8 @@ HGResult HGSaneDeviceImpl::ShowSettingDlg(HGWindow parent)
return HGBASE_ERR_OK;
}
HGResult HGSaneDeviceImpl::StartWithUI(HGWindow parent, HGSane_DeviceImageFunc imageFunc, HGPointer imageParam)
HGResult HGSaneDeviceImpl::Start(HGWindow parent, HGDSEventFunc eventFunc, HGPointer eventParam,
HGDSImageFunc imageFunc, HGPointer imageParam)
{
HGResult ret = GetValueInt32(0x8818, &m_dpi);
if (HGBASE_ERR_OK != ret)
@ -732,10 +733,13 @@ HGResult HGSaneDeviceImpl::StartWithUI(HGWindow parent, HGSane_DeviceImageFunc i
return ret;
}
m_eventFunc = eventFunc;
m_eventParam = eventParam;
m_imageFunc = imageFunc;
m_imageParam = imageParam;
if (-2 == show_scan_ui(&m_sourceImpl->m_saneApi, m_devHandle, m_devName.c_str(), parent, ShowScanImageCallback, this))
if (-2 == show_scan_ui(&m_sourceImpl->m_saneApi, m_devHandle, m_devName.c_str(), parent,
show_scan_ui_event_func, this, show_scan_ui_image_func, this))
{
m_dpi = 0;
return HGBASE_ERR_NOTSUPPORT;
@ -744,7 +748,8 @@ HGResult HGSaneDeviceImpl::StartWithUI(HGWindow parent, HGSane_DeviceImageFunc i
return HGBASE_ERR_OK;
}
HGResult HGSaneDeviceImpl::StartWithSingleScan(HGWindow parent, HGSane_DeviceImageFunc imageFunc, HGPointer imageParam)
HGResult HGSaneDeviceImpl::StartWithSingleScan(HGWindow parent, HGDSEventFunc eventFunc, HGPointer eventParam,
HGDSImageFunc imageFunc, HGPointer imageParam)
{
HGChar scanMode[256] = {0};
HGResult ret = GetValueStr256(0x882E, scanMode, 256);
@ -771,10 +776,13 @@ HGResult HGSaneDeviceImpl::StartWithSingleScan(HGWindow parent, HGSane_DeviceIma
SetValueStr256(0x882E, newScanMode);
SetValueInt32(0x882F, 1);
m_eventFunc = eventFunc;
m_eventParam = eventParam;
m_imageFunc = imageFunc;
m_imageParam = imageParam;
if (-2 == show_scan_ui(&m_sourceImpl->m_saneApi, m_devHandle, m_devName.c_str(), parent, ShowScanImageCallback, this))
if (-2 == show_scan_ui(&m_sourceImpl->m_saneApi, m_devHandle, m_devName.c_str(), parent,
show_scan_ui_event_func, this, show_scan_ui_image_func, this))
{
SetValueStr256(0x882E, scanMode);
SetValueInt32(0x882F, scanCount);
@ -842,34 +850,21 @@ HGResult HGSaneDeviceImpl::GetValueStr256(HGUInt optionId, HGChar *value, HGUInt
return HGBASE_ERR_OK;
}
void HGSaneDeviceImpl::ShowScanImageCallback(const SANE_Parameters* imageFormat, const SANE_Byte* imageData, void* callbackParam)
void HGSaneDeviceImpl::show_scan_ui_event_func(HGUInt event, HGPointer param)
{
HGSaneDeviceImpl* p = (HGSaneDeviceImpl*)callbackParam;
HGSaneDeviceImpl* p = (HGSaneDeviceImpl*)param;
if (NULL != p->m_eventFunc)
{
p->m_eventFunc((HGSaneDevice)p, event, p->m_eventParam);
}
}
void HGSaneDeviceImpl::show_scan_ui_image_func(HGImage image, HGPointer param)
{
HGSaneDeviceImpl* p = (HGSaneDeviceImpl*)param;
if (NULL != p->m_imageFunc)
{
HGUInt imgType = 0;
if (imageFormat->format == SANE_FRAME_GRAY)
{
if (1 == imageFormat->depth)
imgType = HGBASE_IMGTYPE_BINARY;
else if (8 == imageFormat->depth)
imgType = HGBASE_IMGTYPE_GRAY;
}
else if (imageFormat->format == SANE_FRAME_RGB)
{
imgType = HGBASE_IMGTYPE_RGB;
}
HGImageInfo imgInfo = { (HGUInt)imageFormat->pixels_per_line, (HGUInt)imageFormat->lines,
imgType, (HGUInt)imageFormat->bytes_per_line, HGBASE_IMGORIGIN_TOP };
HGImage img = NULL;
HGBase_CreateImageWithData((HGByte*)imageData, &imgInfo, &img);
if (NULL != img)
{
HGBase_SetImageDpi(img, p->m_dpi, p->m_dpi);
p->m_imageFunc((HGSaneDevice)p, img, p->m_imageParam);
HGBase_DestroyImage(img);
}
HGBase_SetImageDpi(image, p->m_dpi, p->m_dpi);
p->m_imageFunc((HGSaneDevice)p, image, p->m_imageParam);
}
}

View File

@ -82,15 +82,18 @@ public:
HGResult ClearDriverLog();
HGResult GetDeviceLog(const HGChar *fileName);
HGResult ClearDeviceLog();
HGResult StartWithUI(HGWindow parent, HGSane_DeviceImageFunc imageFunc, HGPointer imageParam);
HGResult StartWithSingleScan(HGWindow parent, HGSane_DeviceImageFunc imageFunc, HGPointer imageParam);
HGResult Start(HGWindow parent, HGDSEventFunc eventFunc, HGPointer eventParam,
HGDSImageFunc imageFunc, HGPointer imageParam);
HGResult StartWithSingleScan(HGWindow parent, HGDSEventFunc eventFunc, HGPointer eventParam,
HGDSImageFunc imageFunc, HGPointer imageParam);
private:
HGResult SetValueInt32(HGUInt optionId, HGInt value);
HGResult GetValueInt32(HGUInt optionId, HGInt *value);
HGResult SetValueStr256(HGUInt optionId, const HGChar *value);
HGResult GetValueStr256(HGUInt optionId, HGChar *value, HGUInt maxLen);
static void ShowScanImageCallback(const SANE_Parameters* imageFormat, const SANE_Byte* imageData, void* callbackParam);
static void show_scan_ui_event_func(HGUInt event, HGPointer param);
static void show_scan_ui_image_func(HGImage image, HGPointer param);
private:
HGSaneSourceImpl* m_sourceImpl;

View File

@ -154,7 +154,8 @@ int show_setting_ui(const SANEAPI* saneApi, SANE_Handle handle, const char *devN
}
int show_scan_ui(const SANEAPI* saneApi, SANE_Handle handle, const char *devName, HGWindow parent,
show_scan_ui_image_callback callback, void *callbackParam)
show_scan_ui_event_callback eventCallback, void *eventParam,
show_scan_ui_image_callback imageCallback, void *imageParam)
{
if (nullptr == saneApi || nullptr == handle)
return -1;

View File

@ -3,9 +3,14 @@
#include "../base/HGDef.h"
#include "../base/HGDll.h"
#include "../base/HGImage.h"
#include "sane/sane_ex.h"
typedef void (*show_scan_ui_image_callback)(const SANE_Parameters *imageFormat, const SANE_Byte *imageData, void * callbackParam);
#define SHOW_SCAN_UI_EVENT_WORKING 1L
#define SHOW_SCAN_UI_EVENT_SCANFINISHED 2L
typedef void (*show_scan_ui_event_callback)(HGUInt event, void *eventParam);
typedef void (*show_scan_ui_image_callback)(HGImage image, void *imageParam);
HGEXPORT int show_srclist_ui(const char **manuNames, const char **sanePaths, HGWindow parent, HGDll *dll,
SANEAPI* saneApi, char *manuName, unsigned int maxLen);
@ -13,7 +18,8 @@ HGEXPORT int show_devlist_ui(const SANEAPI* saneApi, const char **devNames, HGWi
SANE_Handle *handle, char *devName, unsigned int maxLen);
HGEXPORT int show_setting_ui(const SANEAPI* saneApi, SANE_Handle handle, const char *devName, HGWindow parent);
HGEXPORT int show_scan_ui(const SANEAPI* saneApi, SANE_Handle handle, const char *devName, HGWindow parent,
show_scan_ui_image_callback callback, void *callbackParam);
show_scan_ui_event_callback eventCallback, void *eventParam,
show_scan_ui_image_callback imageCallback, void *imageParam);
HGEXPORT int show_msgbox_info(const char *title, const char *text, HGWindow parent);
HGEXPORT int show_msgbox_warning(const char *title, const char *text, HGWindow parent);

View File

@ -5,7 +5,8 @@
#include <QCloseEvent>
Dialog_Device_Scan::Dialog_Device_Scan(const SANEAPI* saneApi, SANE_Handle dev, const char *devName,
show_scan_ui_image_callback callback, void *callbackParam, QWidget *parent) :
show_scan_ui_event_callback eventCallback, void *eventParam,
show_scan_ui_image_callback imageCallback, void *imageParam, QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog_Device_Scan)
{
@ -13,8 +14,10 @@ Dialog_Device_Scan::Dialog_Device_Scan(const SANEAPI* saneApi, SANE_Handle dev,
memcpy(&m_saneAPI, saneApi, sizeof(SANEAPI));
m_saneDev = dev;
m_callback = callback;
m_callbackParam = callbackParam;
m_eventCallback = eventCallback;
m_eventParam = eventParam;
m_imageCallback = imageCallback;
m_imageParam = imageParam;
m_buffer = NULL;
m_bufferSize = 0;
m_stopThread = HGFALSE;
@ -23,10 +26,6 @@ Dialog_Device_Scan::Dialog_Device_Scan(const SANEAPI* saneApi, SANE_Handle dev,
setWindowTitle(QString::fromStdString(devName));
setWindowFlags(Qt::Dialog | Qt::WindowCloseButtonHint);
qRegisterMetaType<SANE_Parameters>("SANE_Parameters");
qRegisterMetaType<SANE_Byte *>("SANE_Byte *");
connect(this, &Dialog_Device_Scan::eventFunc, this, &Dialog_Device_Scan::on_eventFunc, Qt::QueuedConnection);
ui->pushButton_Continue->setEnabled(true);
ui->pushButton_Cancel->setEnabled(false);
ui->pushButton_Complete->setEnabled(true);
@ -116,6 +115,11 @@ void HGAPI Dialog_Device_Scan::ThreadFunc(HGThread thread, HGPointer param)
return;
}
if (nullptr != p->m_eventCallback)
{
p->m_eventCallback(SHOW_SCAN_UI_EVENT_WORKING, p->m_eventParam);
}
while (!p->m_stopThread)
{
SANE_Parameters params;
@ -164,7 +168,35 @@ void HGAPI Dialog_Device_Scan::ThreadFunc(HGThread thread, HGPointer param)
break;
}
if (nullptr != p->m_callback)
p->m_callback(&params, p->m_buffer, p->m_callbackParam);
if (nullptr != p->m_imageCallback)
{
HGUInt imgType = 0;
if (params.format == SANE_FRAME_GRAY)
{
if (1 == params.depth)
imgType = HGBASE_IMGTYPE_BINARY;
else if (8 == params.depth)
imgType = HGBASE_IMGTYPE_GRAY;
}
else if (params.format == SANE_FRAME_RGB)
{
imgType = HGBASE_IMGTYPE_RGB;
}
HGImageInfo imgInfo = { (HGUInt)params.pixels_per_line, (HGUInt)params.lines,
imgType, (HGUInt)params.bytes_per_line, HGBASE_IMGORIGIN_TOP };
HGImage img = NULL;
HGBase_CreateImageWithData((HGByte*)p->m_buffer, &imgInfo, &img);
if (NULL != img)
{
p->m_imageCallback(img, p->m_imageParam);
HGBase_DestroyImage(img);
}
}
}
if (nullptr != p->m_eventCallback)
{
p->m_eventCallback(SHOW_SCAN_UI_EVENT_SCANFINISHED, p->m_eventParam);
}
}

View File

@ -16,7 +16,8 @@ class Dialog_Device_Scan : public QDialog
public:
Dialog_Device_Scan(const SANEAPI* saneApi, SANE_Handle dev, const char *devName,
show_scan_ui_image_callback callback, void *callbackParam, QWidget *parent = nullptr);
show_scan_ui_event_callback eventCallback, void *eventParam,
show_scan_ui_image_callback imageCallback, void *imageParam, QWidget *parent = nullptr);
~Dialog_Device_Scan();
signals:
@ -38,8 +39,10 @@ private:
Ui::Dialog_Device_Scan *ui;
SANEAPI m_saneAPI;
SANE_Handle m_saneDev;
show_scan_ui_image_callback m_callback;
void *m_callbackParam;
show_scan_ui_event_callback m_eventCallback;
void *m_eventParam;
show_scan_ui_image_callback m_imageCallback;
void *m_imageParam;
HGByte* m_buffer;
HGInt m_bufferSize;
volatile HGBool m_stopThread;