From 8350e95a20b9d0e5b14257ff4283d5b4bc46f6c9 Mon Sep 17 00:00:00 2001 From: luoliangyi <87842688@qq.com> Date: Tue, 23 May 2023 14:37:34 +0800 Subject: [PATCH] =?UTF-8?q?HGSaneUser=E5=A2=9E=E5=8A=A0=E6=89=AB=E6=8F=8F?= =?UTF-8?q?=E4=BA=8B=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build2/qt/HGSaneUser/HGSaneUser.def | 2 +- build2/qt/HGSaneUser/HGSaneUser.pro | 4 +- modules/sane_user/HGSane.cpp | 10 +++-- modules/sane_user/HGSane.h | 6 ++- modules/sane_user/HGSaneImpl.cpp | 61 ++++++++++++--------------- modules/sane_user/HGSaneImpl.hpp | 9 ++-- modules/saneui/HGSaneUI.cpp | 3 +- modules/saneui/HGSaneUI.h | 10 ++++- modules/saneui/dialog_device_scan.cpp | 50 ++++++++++++++++++---- modules/saneui/dialog_device_scan.h | 9 ++-- 10 files changed, 104 insertions(+), 60 deletions(-) diff --git a/build2/qt/HGSaneUser/HGSaneUser.def b/build2/qt/HGSaneUser/HGSaneUser.def index dc0b54b3..7f259fdb 100644 --- a/build2/qt/HGSaneUser/HGSaneUser.def +++ b/build2/qt/HGSaneUser/HGSaneUser.def @@ -27,5 +27,5 @@ HGSane_GetDeviceLogPath HGSane_ClearDeviceLog HGSane_StartDevice HGSane_StopDevice -HGSane_StartDeviceWithUI +HGSane_StartDevice HGSane_StartDeviceWithSingleScan diff --git a/build2/qt/HGSaneUser/HGSaneUser.pro b/build2/qt/HGSaneUser/HGSaneUser.pro index a6f185ba..39c6f3d2 100644 --- a/build2/qt/HGSaneUser/HGSaneUser.pro +++ b/build2/qt/HGSaneUser/HGSaneUser.pro @@ -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 { diff --git a/modules/sane_user/HGSane.cpp b/modules/sane_user/HGSane.cpp index 3d508bc9..9761625b 100644 --- a/modules/sane_user/HGSane.cpp +++ b/modules/sane_user/HGSane.cpp @@ -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); } diff --git a/modules/sane_user/HGSane.h b/modules/sane_user/HGSane.h index 09ce9213..138741ef 100644 --- a/modules/sane_user/HGSane.h +++ b/modules/sane_user/HGSane.h @@ -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__ */ diff --git a/modules/sane_user/HGSaneImpl.cpp b/modules/sane_user/HGSaneImpl.cpp index fa9033b4..22872b20 100644 --- a/modules/sane_user/HGSaneImpl.cpp +++ b/modules/sane_user/HGSaneImpl.cpp @@ -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; - - 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); - } - } + 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) + { + HGBase_SetImageDpi(image, p->m_dpi, p->m_dpi); + p->m_imageFunc((HGSaneDevice)p, image, p->m_imageParam); + } } diff --git a/modules/sane_user/HGSaneImpl.hpp b/modules/sane_user/HGSaneImpl.hpp index 017a09be..375ef54a 100644 --- a/modules/sane_user/HGSaneImpl.hpp +++ b/modules/sane_user/HGSaneImpl.hpp @@ -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; diff --git a/modules/saneui/HGSaneUI.cpp b/modules/saneui/HGSaneUI.cpp index fdca6ece..f8af5892 100644 --- a/modules/saneui/HGSaneUI.cpp +++ b/modules/saneui/HGSaneUI.cpp @@ -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; diff --git a/modules/saneui/HGSaneUI.h b/modules/saneui/HGSaneUI.h index 90659566..8e3c3c89 100644 --- a/modules/saneui/HGSaneUI.h +++ b/modules/saneui/HGSaneUI.h @@ -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); diff --git a/modules/saneui/dialog_device_scan.cpp b/modules/saneui/dialog_device_scan.cpp index eb6c8ba9..98b9c524 100644 --- a/modules/saneui/dialog_device_scan.cpp +++ b/modules/saneui/dialog_device_scan.cpp @@ -5,7 +5,8 @@ #include 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"); - qRegisterMetaType("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(¶ms, 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); } } diff --git a/modules/saneui/dialog_device_scan.h b/modules/saneui/dialog_device_scan.h index e38c0aa8..aaa08e25 100644 --- a/modules/saneui/dialog_device_scan.h +++ b/modules/saneui/dialog_device_scan.h @@ -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;