From 562491e08d30d71c9b60ce3af61bb727eff28927 Mon Sep 17 00:00:00 2001 From: lovelyyoung <1002639516@qq.com> Date: Sat, 16 May 2020 09:59:44 +0800 Subject: [PATCH] =?UTF-8?q?1.=E4=BF=AE=E5=A4=8DTWAINUI=20=E7=82=B9?= =?UTF-8?q?=E5=87=BB=C3=97=20=E5=85=B3=E9=97=AD=E7=AA=97=E4=BD=93=E6=98=AF?= =?UTF-8?q?=E5=BC=82=E5=B8=B8=E9=97=AE=E9=A2=98=EF=BC=9B=202.=E9=92=88?= =?UTF-8?q?=E5=AF=B9=E9=95=BF=E6=96=87=E7=A8=BF300DPI=E5=AF=B9=E6=8A=98?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=EF=BC=8C=E5=81=9A=E4=BA=86=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=E5=8F=AF=E7=94=A8=E6=80=A7=E9=99=90=E5=88=B6=EF=BC=9B=203.?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=AF=B9=E6=8E=A5=E7=A7=91=E5=A4=A7=E8=AE=AF?= =?UTF-8?q?=E9=A3=9E=E8=BD=AF=E4=BB=B6=E6=97=B6=EF=BC=8C=E6=97=A0=E6=B3=95?= =?UTF-8?q?=E8=B0=83=E7=94=A8=E9=A9=B1=E5=8A=A8=E9=97=AE=E9=A2=98=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- huagao/CBasicPage.cpp | 24 +- huagao/CBasicPage.h | 2 +- huagao/CTiffWriter.cpp | 288 ------ huagao/CTiffWriter.h | 240 ----- huagao/CTwainUI.cpp | 32 +- huagao/CTwainUI.h | 2 + huagao/Device/PublicFunc.h | 25 + huagao/Device/UsbScanEx.cpp | 6 +- huagao/Device/UsbScanEx.h | 2 +- huagao/Device/scn_config.cpp | 8 +- huagao/Device/scn_config.h | 3 + huagao/ImageProcess/ImageApplyAutoCrop.cpp | 5 +- huagao/huagaods.cpp | 1057 +++++++++++--------- huagao/huagaods.hpp | 30 +- huagao/huagaotwds.pro | 5 + huagao/stdafx.h | Bin 4732 -> 4788 bytes 16 files changed, 709 insertions(+), 1020 deletions(-) delete mode 100644 huagao/CTiffWriter.cpp delete mode 100644 huagao/CTiffWriter.h diff --git a/huagao/CBasicPage.cpp b/huagao/CBasicPage.cpp index 96544c97..a1bf77d4 100644 --- a/huagao/CBasicPage.cpp +++ b/huagao/CBasicPage.cpp @@ -136,6 +136,7 @@ void CBasicPage::OnBnClickedBtnabout() void CBasicPage::OnCbnSelchangeCmbcolortype() { // TODO: 在此添加控件通知处理程序代码 + updateCmbDuplex(TRUE); m_dataChange(); } @@ -148,7 +149,7 @@ void CBasicPage::OnCbnSelchangeCmbss() { sleIndex = 0; } - + updateCmbDuplex(TRUE); m_dataChange(); } @@ -156,6 +157,7 @@ void CBasicPage::OnCbnSelchangeCmbss() void CBasicPage::OnCbnSelchangeCmbreslution() { // TODO: 在此添加控件通知处理程序代码 + updateCmbDuplex(TRUE); } @@ -168,6 +170,7 @@ void CBasicPage::OnCbnSelchangeCmbduplex() //DevnMax = index == 2 ? 200 : 300; m_dataChange(); //} + updateCmbDuplex(TRUE); } //跳过空白页设置页面 @@ -188,3 +191,22 @@ void CBasicPage::SetScannerInfo(std::string hdVersion, std::string serialNum) m_hdVersion = hdVersion; m_serialNum = serialNum; } + +void CBasicPage::updateCmbDuplex(BOOL insert) +{ + //m_cmBoxDuplex->GetCurSel(); + int tmp_colorindex=m_cmBoxColorMode->GetCurSel(); + int tmp_paperindex = m_cmBoxSS->GetCurSel(); + int tmp_duplexindex = m_cmBoxDuplex->GetCurSel(); + int tmp_resindex = m_cmBoxResultion->GetCurSel(); + int totalcount = m_cmBoxDuplex->GetCount(); + if (tmp_colorindex == 0 && tmp_paperindex >= 18 && tmp_resindex == 4) { + m_cmBoxDuplex->DeleteString(4); + m_cmBoxDuplex->SetCurSel(1); + } + else { + if (totalcount != 5) { + m_cmBoxDuplex->InsertString(4, TEXT("对折")); + } + } +} diff --git a/huagao/CBasicPage.h b/huagao/CBasicPage.h index 936f7f40..db4fa755 100644 --- a/huagao/CBasicPage.h +++ b/huagao/CBasicPage.h @@ -23,7 +23,7 @@ public: afx_msg void OnCbnSelchangeCmbss(); afx_msg void OnCbnSelchangeCmbreslution(); afx_msg void OnCbnSelchangeCmbduplex(); - + void updateCmbDuplex(BOOL insert); public: int AreaNum; int DevnMax; diff --git a/huagao/CTiffWriter.cpp b/huagao/CTiffWriter.cpp deleted file mode 100644 index cb7689bc..00000000 --- a/huagao/CTiffWriter.cpp +++ /dev/null @@ -1,288 +0,0 @@ -/*************************************************************************** -* Copyright ?2007 TWAIN Working Group: -* Adobe Systems Incorporated, AnyDoc Software Inc., Eastman Kodak Company, -* Fujitsu Computer Products of America, JFL Peripheral Solutions Inc., -* Ricoh Corporation, and Xerox Corporation. -* All rights reserved. -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions are met: -* * Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* * Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in the -* documentation and/or other materials provided with the distribution. -* * Neither the name of the TWAIN Working Group nor the -* names of its contributors may be used to endorse or promote products -* derived from this software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY TWAIN Working Group ``AS IS'' AND ANY -* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -* DISCLAIMED. IN NO EVENT SHALL TWAIN Working Group BE LIABLE FOR ANY -* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -* -***************************************************************************/ - -/** - * @file CTiffWriter.cpp - * Write an image to disk as a tiff file. - * @author JFL Peripheral Solutions Inc. - * @date October 2007 - */ - -#include "stdafx.h" -#include "CTiffWriter.h" -#include - -CTiffWriter::CTiffWriter(const string& _filename, - const long int _width, - const long int _height, - const int _bitsPerPixel, - const unsigned long int _bytesPerRow) -{ - m_pImageStream = 0; - m_nOffset = 0; - m_filename = _filename; - - m_ImageWidth.TagID = kTIFF_TAG_IMGWIDTH; - m_ImageWidth.DataType = kTIFF_TY_LONG; - m_ImageWidth.DataCount = 1; - m_ImageWidth.DataOffset = _width; - - m_ImageLength.TagID = kTIFF_TAG_IMGLENGTH; - m_ImageLength.DataType = kTIFF_TY_LONG; - m_ImageLength.DataCount = 1; - m_ImageLength.DataOffset = _height; - - m_BitsPerSample.TagID = kTIFF_TAG_BITSPERSAMPLE; - m_BitsPerSample.DataType = kTIFF_TY_SHORT; - m_BitsPerSample.DataCount = 1; - - if(24 == _bitsPerPixel) - { - m_BitsPerSample.DataOffset = 8; - } - else - { - m_BitsPerSample.DataOffset = _bitsPerPixel; - } - - - m_Compression.TagID = kTIFF_TAG_COMPRESSION; - m_Compression.DataType = kTIFF_TY_SHORT; - m_Compression.DataCount = 1; - m_Compression.DataOffset = 1; - - m_PhotometricInterp.TagID = kTIFF_TAG_PHOTOMETRICINT; - m_PhotometricInterp.DataType = kTIFF_TY_SHORT; - m_PhotometricInterp.DataCount = 1; - - if(24 == _bitsPerPixel) - { - m_PhotometricInterp.DataOffset = 2; - } - else - { - m_PhotometricInterp.DataOffset = 1; - } - - // -there is only one strip that contains all the row data, and it starts right after the header. - // -There are always 12 tags being written for each tiff. - m_StripOffsets.TagID = kTIFF_TAG_STRIPOFFSETS; - m_StripOffsets.DataType = kTIFF_TY_SHORT; - m_StripOffsets.DataCount = 1; - m_StripOffsets.DataOffset = getSizeofHeader(); - - m_SamplesPerPixel.TagID = kTIFF_TAG_SAMPLESPERPIXEL; - m_SamplesPerPixel.DataType = kTIFF_TY_SHORT; - - if(24 == _bitsPerPixel) - { - m_SamplesPerPixel.DataCount = 1; - m_SamplesPerPixel.DataOffset = 3; - } - else - { - m_SamplesPerPixel.DataCount = 1; - m_SamplesPerPixel.DataOffset = 1; - } - - m_RowsPerStrip.TagID = kTIFF_TAG_ROWSPERSTRIP; - m_RowsPerStrip.DataType = kTIFF_TY_LONG; - m_RowsPerStrip.DataCount = 1; - m_RowsPerStrip.DataOffset = _height; - - m_StripByteCounts.TagID = kTIFF_TAG_STRIPBYTECOUNTS; - m_StripByteCounts.DataType = kTIFF_TY_LONG; - m_StripByteCounts.DataCount = 1; - m_StripByteCounts.DataOffset = _bytesPerRow * _height; - - m_XResolution.TagID = kTIFF_TAG_XRESOLUTION; - m_XResolution.DataType = kTIFF_TY_RATIONAL; - m_XResolution.DataCount = 1; - m_XResolution.DataOffset = m_StripOffsets.DataOffset - sizeof(DWORD)*4; // fixed offset from the end of the header - setXResolution(100, 1); - - m_YResolution.TagID = kTIFF_TAG_YRESOLUTION; - m_YResolution.DataType = kTIFF_TY_RATIONAL; - m_YResolution.DataCount = 1; - m_YResolution.DataOffset = m_StripOffsets.DataOffset - sizeof(DWORD)*2; // fixed offset from the end of the header - setYResolution(100, 1); - - m_ResolutionUnit.TagID = kTIFF_TAG_RESOLUTIONUNIT; - m_ResolutionUnit.DataType = kTIFF_TY_SHORT; - m_ResolutionUnit.DataCount = 1; - m_ResolutionUnit.DataOffset = 2; -} - -CTiffWriter::~CTiffWriter() -{ - if(0 != m_pImageStream) - { - if(m_pImageStream->is_open()) - { - m_pImageStream->close(); - } - delete m_pImageStream; - } -} - -void CTiffWriter::setImageWidth(const long int _v) -{ - m_ImageWidth.DataOffset = _v; -} - -void CTiffWriter::setImageHeight(const long int _v) -{ - m_ImageLength.DataOffset = _v; -} - -void CTiffWriter::setBitsPerSample(const int _v) -{ - m_BitsPerSample.DataOffset = _v; -} - -void CTiffWriter::setCompression(const int _v) -{ - m_Compression.DataOffset = _v; -} - -void CTiffWriter::setPhotometricInterp(const int _v) -{ - m_PhotometricInterp.DataOffset = _v; -} - -void CTiffWriter::setSamplesPerPixel(const int _v) -{ - m_SamplesPerPixel.DataOffset = _v; -} - -void CTiffWriter::setXResolution(const int _numerator, const int _denominator) -{ - m_xres[0] = _numerator; - m_xres[1] = _denominator; -} - -void CTiffWriter::setYResolution(const int _numerator, const int _denominator) -{ - m_yres[0] = _numerator; - m_yres[1] = _denominator; -} - -void CTiffWriter::setBytesPerRow(const int _v) -{ - m_StripByteCounts.DataOffset = _v * m_ImageLength.DataOffset; -} - -void CTiffWriter::GetImageHeader(stringstream &Header) -{ - // write the header - TIFFIFH hdr = {0x4949, 0x002a, sizeof(TIFFIFH)}; - Header.write(reinterpret_cast(&hdr), sizeof(TIFFIFH)); - - // write the Tags immediately after the header - WORD numTags = 12; - Header.write(reinterpret_cast(&numTags), sizeof(numTags)); - - const int nsize = sizeof(TIFFTag); - - Header.write(reinterpret_cast(&m_ImageWidth), nsize); - Header.write(reinterpret_cast(&m_ImageLength), nsize); - Header.write(reinterpret_cast(&m_BitsPerSample), nsize); - Header.write(reinterpret_cast(&m_Compression), nsize); - Header.write(reinterpret_cast(&m_PhotometricInterp), nsize); - Header.write(reinterpret_cast(&m_StripOffsets), nsize); - Header.write(reinterpret_cast(&m_SamplesPerPixel), nsize); - Header.write(reinterpret_cast(&m_RowsPerStrip), nsize); - Header.write(reinterpret_cast(&m_StripByteCounts), nsize); - Header.write(reinterpret_cast(&m_XResolution), nsize); - Header.write(reinterpret_cast(&m_YResolution), nsize); - Header.write(reinterpret_cast(&m_ResolutionUnit), nsize); - - // end the header by setting the next image offset to null - DWORD end = 0; - Header.write(reinterpret_cast(&end), sizeof(end)); - - // write the X and Y resolutions - Header.write(reinterpret_cast(&m_xres), sizeof(DWORD)*2); - - Header.write(reinterpret_cast(&m_yres), sizeof(DWORD)*2); -} - -bool CTiffWriter::writeImageHeader() -{ - // create the out stream if not done so already - if(0 == m_pImageStream) - { - m_pImageStream = new ofstream(); - } - - // open the stream. If already open, reset it - if(m_pImageStream->is_open()) - { - m_pImageStream->seekp(0); - } - else - { - m_pImageStream->open(m_filename.c_str(), ios_base::out|ios_base::binary|ios_base::trunc); - } - stringstream Header; - GetImageHeader(Header); - Header.seekp(0, ios_base::end); - m_nOffset =(int) Header.tellp(); - Header.seekg(0, ios_base::beg); - char *pData = new char[m_nOffset]; - Header.read(pData,m_nOffset); - m_pImageStream->write(pData,m_nOffset); - delete []pData; - return true; -} - -bool CTiffWriter::WriteTIFFData(char *_pData, DWORD _nCount) -{ - bool bret = false; - - if(0 != m_pImageStream && - m_pImageStream->good()) - { - m_pImageStream->seekp(m_nOffset); - m_pImageStream->write(_pData, _nCount); - m_nOffset += _nCount; - bret = true; - } - - return bret; -} - -unsigned int CTiffWriter::getSizeofHeader() -{ - // Header is as follows: - // TIFFIFH + Num. of Tags + each tag + Xres Data (2 dwords) + Yres Data (2 dwords) + Next Image offset (1 dword) - return sizeof(TIFFIFH)+sizeof(WORD)+sizeof(TIFFTag)*12+sizeof(DWORD)*5; -} diff --git a/huagao/CTiffWriter.h b/huagao/CTiffWriter.h deleted file mode 100644 index 9f73f148..00000000 --- a/huagao/CTiffWriter.h +++ /dev/null @@ -1,240 +0,0 @@ -/*************************************************************************** -* Copyright ?2007 TWAIN Working Group: -* Adobe Systems Incorporated, AnyDoc Software Inc., Eastman Kodak Company, -* Fujitsu Computer Products of America, JFL Peripheral Solutions Inc., -* Ricoh Corporation, and Xerox Corporation. -* All rights reserved. -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions are met: -* * Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* * Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in the -* documentation and/or other materials provided with the distribution. -* * Neither the name of the TWAIN Working Group nor the -* names of its contributors may be used to endorse or promote products -* derived from this software without specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY TWAIN Working Group ``AS IS'' AND ANY -* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -* DISCLAIMED. IN NO EVENT SHALL TWAIN Working Group BE LIABLE FOR ANY -* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -* -***************************************************************************/ - -/** -* @file CTiffWriter.h -* Write an image to disk as a tiff file. -* @author TWAIN Working Group -* @date October 2007 -*/ - -#ifndef __TIFFWRITER_H__ -#define __TIFFWRITER_H__ - -#include -#include - -using namespace std; - -#ifdef _MSC_VER - #include -#else - typedef uint16_t WORD; - typedef uint32_t DWORD; -#endif // _MSC_VER - -#define TIFF_UNCOMPRESSED 1 /**< TIFF compression types */ -#define TIFF_CCITTGROUP3 3 -#define TIFF_CCITTGROUP4 4 - -// TIFF types -#define kTIFF_TY_BYTE 1 /**< 8-bit unsigned int */ -#define kTIFF_TY_ASCII 2 /**< 8-bit byte that contains a 7-bit ASCII code; last byte must be binary 0 (NULL) */ -#define kTIFF_TY_SHORT 3 /**< 16-bit (2-byte) unsigned int */ -#define kTIFF_TY_LONG 4 /**< 32-bit (4-byte) unsigned int */ -#define kTIFF_TY_RATIONAL 5 /**< two LONGs; the first is the numerator of a fraction; the second, the denominator */ - -// these field types where introduced in TIFF 6.0 -#define kTIFF_TY_SBYTE 6 /**< 8-bit signed int */ -#define kTIFF_TY_UNDEFINED 7 /**< 8-bit byte that may contain anything, depending on the definition of the field */ -#define kTIFF_TY_SSHORT 8 /**< 16-bit (2-byte) signed int */ -#define kTIFF_TY_SLONG 9 /**< 32-bit (4-byte) signed int */ -#define kTIFF_TY_SRATIONAL 10 /**< two SLONG's; first is numerator of fraction, second is denominator */ -#define kTIFF_TY_FLOAT 11 /**< single precision (4-byte) IEEE format */ -#define kTIFF_TY_DOUBLE 12 /**< double precision (8-byte) IEEE format */ - -// TIFF Tags -#define kTIFF_TAG_IMGWIDTH 0x0100 /**< Image width, short or long */ -#define kTIFF_TAG_IMGLENGTH 0x0101 /**< Image length, short or long */ -#define kTIFF_TAG_BITSPERSAMPLE 0x0102 /**< BitsPerSample, short */ -#define kTIFF_TAG_COMPRESSION 0x0103 /**< Compression, short */ -#define kTIFF_TAG_PHOTOMETRICINT 0x0106 /**< PhotometricInterpretation, short */ -#define kTIFF_TAG_STRIPOFFSETS 0x0111 /**< StripOffsets, short or long */ -#define kTIFF_TAG_SAMPLESPERPIXEL 0x0115 /**< Samples per pixel, short */ -#define kTIFF_TAG_ROWSPERSTRIP 0x0116 /**< RowsPerStrip, short or long */ -#define kTIFF_TAG_STRIPBYTECOUNTS 0x0117 /**< StripByteCounts, short or long */ -#define kTIFF_TAG_XRESOLUTION 0x011A /**< X Resolution, rational */ -#define kTIFF_TAG_YRESOLUTION 0x011B /**< Y Resolution, rational */ -#define kTIFF_TAG_RESOLUTIONUNIT 0x0128 /**< Resolution unit, short */ -#define kTIFF_TAG_COLORMAP 0x0140 /**< ColorMap, short, RGB order, black = 0,0,0, TWAIN supports max 256 entry pallette */ - -/** -* TIFF Image File Header -*/ -struct TIFFIFH -{ - WORD Identifier; - WORD Version; - DWORD IFDOffset; -}; - -/** -* A TIFF Tag -* If the actual value of the tag is less then a DWORD, then offset will contain -* it, else offset is truly an offset to the value. -*/ -struct TIFFTag -{ - WORD TagID; - WORD DataType; - DWORD DataCount; - DWORD DataOffset; -}; - -/** -* This is a class that will progressively write a TIFF image to a file. -*/ -class CTiffWriter -{ -public: -/** -* Constructor for CTiffWriter. This is a class that will progressively -* write a TIFF image to a file. -* @param[in] _filename name of file to write to. -* @param[in] _width image width. -* @param[in] _height image height. -* @param[in] _bitsPerPixel number of bits per each pixel. -* @param[in] _bytesPerRow number of bytes per row of data. -*/ - CTiffWriter(const string& _filename, - const long int _width, - const long int _height, - const int _bitsPerPixel, - const unsigned long int _bytesPerRow); - -/** -* Deconstructor for CTiffWriter. -*/ - virtual ~CTiffWriter(); - -/** -* Set the width of the image. -* @param[in] _v the new image width -*/ - void setImageWidth(const long int _v); - -/** -* Set the height of the image. -* @param[in] _v the new image height -*/ - void setImageHeight(const long int _v); - -/** -* Set the bits per sample of the image. -* @param[in] _v the new bits per sample -*/ - void setBitsPerSample(const int _v); - -/** -* Set the compression method to use. -* @param[in] _v the new compression method -*/ - void setCompression(const int _v); - -/** -* Set the Photometric Interpretation. -* @param[in] _v the new Photometric Interpretation -*/ - void setPhotometricInterp(const int _v); - -/** -* Set the number of samples per pixel of the image. -* @param[in] _v the new samples per pixel -*/ - void setSamplesPerPixel(const int _v); - -/** -* Set the x resolution of the image. Using type kTIFF_TY_RATIONAL (fraction) -* @param[in] _numerator the numerator part of the fraction -* @param[in] _denominator the denominator part of the fraction -*/ - void setXResolution(const int _numerator, const int _denominator); - -/** -* Set the y resolution of the image. Using type kTIFF_TY_RATIONAL (fraction) -* @param[in] _numerator the numerator part of the fraction -* @param[in] _denominator the denominator part of the fraction -*/ - void setYResolution(const int _numerator, const int _denominator); - -/** -* Set the Bytes per row of the image. -* @param[in] _v the new bytes per row -*/ - void setBytesPerRow(const int _v); - - -/** -* Write the prepaired image header to the file. -* @return true for succes -*/ - bool writeImageHeader(); - -/** -* Write the data for the image to the file. -* @param[in] _pData pointer to the image data -* @param[in] _nCount number of bytes to write -* @return true for success -*/ - bool WriteTIFFData(char *_pData, DWORD _nCount); - -/** -* Return the size of the TIFF header for the image file. -* @return the size of the header -*/ - unsigned int getSizeofHeader(); - - void GetImageHeader(stringstream &Header); - -protected: - string m_filename; /**< Name and or path of file */ - int m_nOffset; /**< Current offset into file */ - - DWORD m_xres[2]; /**< The X resolution of the image */ - DWORD m_yres[2]; /**< The Y resolution of the image */ - - TIFFTag m_ImageWidth; /**< The image width in pixels */ - TIFFTag m_ImageLength; /**< The image height in pixels */ - TIFFTag m_BitsPerSample; /**< The number of Bits per sample */ - TIFFTag m_Compression; /**< The compression method to use */ - TIFFTag m_PhotometricInterp; /**< The Photometric Interpretation to use */ - TIFFTag m_StripOffsets; /**< The strip offset, where image data starts */ - TIFFTag m_SamplesPerPixel; /**< The number of channels (RGB, G, )*/ - TIFFTag m_RowsPerStrip; /**< The number of rows that make up each strip */ - TIFFTag m_StripByteCounts; /**< The size of each strip of image data */ - TIFFTag m_XResolution; /**< The offset to the X resolution */ - TIFFTag m_YResolution; /**< The offset to the Y resolution */ - TIFFTag m_ResolutionUnit; /**< The units of the Resolution */ - - ofstream* m_pImageStream; /**< The output stream to write the file to */ -}; - -#endif // __TIFFWRITER_H__ diff --git a/huagao/CTwainUI.cpp b/huagao/CTwainUI.cpp index 164792c6..f6c4867a 100644 --- a/huagao/CTwainUI.cpp +++ b/huagao/CTwainUI.cpp @@ -86,6 +86,7 @@ BEGIN_MESSAGE_MAP(CTwainUI, CDialogEx) ON_BN_CLICKED(IDC_BTNDELETCONFIG, &CTwainUI::OnBnClickedBtndeletconfig) ON_BN_CLICKED(IDC_BTNRECOVERYCONFIG, &CTwainUI::OnBnClickedBtnrecoveryconfig) ON_LBN_SELCHANGE(IDC_LSTCONFIG, &CTwainUI::OnLbnSelchangeLstconfig) + ON_WM_CLOSE() END_MESSAGE_MAP() @@ -117,14 +118,8 @@ void CTwainUI::OnBnClickedConfirm() vc.push_back(configItem); std::string savepath = TCHAR2STRING1(szIniFile); js.WriteJsonArrayToFile(vc, savepath); - if (str_caption.Compare(_T("扫描")) == 0)//内容为扫描时 - { - m_glue.m_scan(*settings); - } - else - { - m_glue.m_cancel(); - } + + m_glue.m_scan(*settings); } @@ -207,20 +202,13 @@ void CTwainUI::UpdateUI(CONFIGPARAMS configParams) m_pageFeedPaper->GetDlgItem(IDC_EDSCANNUM)->EnableWindow(TRUE); m_pageFeedPaper->m_radioGroupScanMode = 1; int tempcount = configParams.ScanCount; - //if (configParams.Duplex == 0) - //{ - // tempcount = configParams.ScanCount; - //} - //else - //{ - // tempcount = configParams.ScanCount / 2; - //} CString csCount; csCount.Format(_T("%d"), tempcount); m_pageFeedPaper->GetDlgItem(IDC_EDSCANNUM)->SetWindowText(csCount); } m_pageFeedPaper->UpdateData(FALSE); + m_pageBasic->updateCmbDuplex(TRUE); } int CTwainUI::getResolutionIndex(int resolution) @@ -469,8 +457,9 @@ void CTwainUI::UpdateUi() if (enableback) { ((CButton*)(m_pageFeedPaper->GetDlgItem(IDC_CKBACKROTATION)))->SetCheck(!enableback); - if (dupindex == 4) - ((CButton*)m_pageImageProc->GetDlgItem(IDC_CKAUTODESKREW))->SetCheck(dupindex == 4?TRUE:FALSE); + if (dupindex == 4) { + ((CButton*)m_pageImageProc->GetDlgItem(IDC_CKAUTODESKREW))->SetCheck(dupindex == 4 ? TRUE : FALSE); + } } ((CButton*)m_pageImageProc->GetDlgItem(IDC_CKAUTODESKREW))->EnableWindow(!(dupindex == 4)); m_pageFeedPaper->GetDlgItem(IDC_CKBACKROTATION)->EnableWindow(!enableback); @@ -600,3 +589,10 @@ void CTwainUI::OnLbnSelchangeLstconfig() } } } + + +void CTwainUI::OnClose() +{ + // TODO: 在此添加消息处理程序代码和/或调用默认值 + m_glue.m_cancel(); +} diff --git a/huagao/CTwainUI.h b/huagao/CTwainUI.h index e16eb8ac..46fcb09c 100644 --- a/huagao/CTwainUI.h +++ b/huagao/CTwainUI.h @@ -165,4 +165,6 @@ protected: std::vector getConfigFiles(); std::unique_ptr settings; std::string m_confirmtitle; +public: + afx_msg void OnClose(); }; diff --git a/huagao/Device/PublicFunc.h b/huagao/Device/PublicFunc.h index 4dbc590c..c3fa84ee 100644 --- a/huagao/Device/PublicFunc.h +++ b/huagao/Device/PublicFunc.h @@ -199,6 +199,31 @@ typedef struct Paper_Status { } }PaperStatus; +enum G400_PaperSize { + G400_A3 = 0, + G400_A4, + G400_A4R, + G400_A5, + G400_A5R, + G400_A6, + G400_A6R, + G400_B4, + G400_B5, + G400_B5R, + G400_B6, + G400_B6R, + G400_DOUBLELETTER, + G400_LEGAL, + G400_LETTER, + G400_LETTERR, + G400_LONGLETTER +}; + +enum G400_DPI { + G400_D300 = 0, + G400_D200, + G400_D600 +}; #define CAPTION_LEN 256 #define TWAIN_IMAGE_FILE_LIST_NAME TEXT(".dat") diff --git a/huagao/Device/UsbScanEx.cpp b/huagao/Device/UsbScanEx.cpp index 2d60f2a1..83572de4 100644 --- a/huagao/Device/UsbScanEx.cpp +++ b/huagao/Device/UsbScanEx.cpp @@ -152,7 +152,7 @@ int UsbScanEx::read_bulk(void* data, int len) if (m_h_dev != NULL) { b_ret = ReadFile(h_pipe, data, len, &pdw_ret, lp_overlap); - + if (b_ret) { return pdw_ret; } @@ -172,7 +172,7 @@ int UsbScanEx::read_bulk(void* data, int len) } break; default: - int a = 0; + //writelog("Usb read_bulk error code ID: " + std::to_string(error_code)); break; } } @@ -212,7 +212,7 @@ int UsbScanEx::write_bulk(void* data, int len) } break; default: - int a = 0; + //writelog("Usb write_bulk error code ID: " + std::to_string(errorcode)); break; } } diff --git a/huagao/Device/UsbScanEx.h b/huagao/Device/UsbScanEx.h index 47020e02..0c53f0d5 100644 --- a/huagao/Device/UsbScanEx.h +++ b/huagao/Device/UsbScanEx.h @@ -7,7 +7,7 @@ #include #include #include "IUsb.h" - +#include "PublicFunc.h" #pragma pack(1) struct tag_usb_pipe diff --git a/huagao/Device/scn_config.cpp b/huagao/Device/scn_config.cpp index b9af00ee..a8debe53 100644 --- a/huagao/Device/scn_config.cpp +++ b/huagao/Device/scn_config.cpp @@ -4,6 +4,7 @@ hgConfigClass::hgConfigClass(GScanCap param) { + m_param = { 0 }; PaperStatus ps = { param.papertype,param.paperAlign }; m_param.paper = ContainspaperTypesKey(ps) ? SupPaperTyps[ps] : 0; m_param.color = ContainsPixTypeKey(param.hardwarecaps.capturepixtype) ? SupPixelTypes[param.hardwarecaps.capturepixtype] : 2; @@ -46,4 +47,9 @@ bool hgConfigClass::ContainsResolutionKey(float key) return true; } return false; -} \ No newline at end of file +} + +unsigned int hgConfigClass::GetData() +{ + return m_param.value; +} diff --git a/huagao/Device/scn_config.h b/huagao/Device/scn_config.h index bc8cdc5a..7e8e6b93 100644 --- a/huagao/Device/scn_config.h +++ b/huagao/Device/scn_config.h @@ -13,7 +13,10 @@ class hgConfigClass:public IConfig { public: hgConfigClass(GScanCap param); + // ͨ IConfig ̳ + virtual unsigned int GetData() override; private: + ConfigParam m_param; enum Config_Scanner { cfStaple, diff --git a/huagao/ImageProcess/ImageApplyAutoCrop.cpp b/huagao/ImageProcess/ImageApplyAutoCrop.cpp index c26d1426..c5bc0ad9 100644 --- a/huagao/ImageProcess/ImageApplyAutoCrop.cpp +++ b/huagao/ImageProcess/ImageApplyAutoCrop.cpp @@ -50,11 +50,13 @@ void CImageApplyAutoCrop::apply(cv::Mat& pDib, int side) cv::Mat scale_mat; cv::Mat thre(src_resize.size(), CV_8UC1); hg::threshold_Mat(src_resize, thre, m_threshold); + src_resize.release(); if (m_noise > RE) { cv::Mat element = getStructuringElement(cv::MORPH_RECT, cv::Size(m_noise / RE, m_noise / RE)); cv::morphologyEx(thre, thre, cv::MORPH_OPEN, element); + element.release(); } std::vector hierarchy; std::vector> contours; @@ -106,8 +108,9 @@ void CImageApplyAutoCrop::apply(cv::Mat& pDib, int side) hierarchy.clear(); contours.clear(); maxContour.clear(); - hg::findContours(thre_dst, contours, hierarchy, cv::RETR_EXTERNAL); + thre_dst.release(); + maxContour = hg::getMaxContour(contours, hierarchy); if (m_isConvexHull) hg::convexHull(maxContour, maxContour); diff --git a/huagao/huagaods.cpp b/huagao/huagaods.cpp index 19a84d18..6689aa31 100644 --- a/huagao/huagaods.cpp +++ b/huagao/huagaods.cpp @@ -21,6 +21,7 @@ #include #include #include "Device/JsonConfig.h" +#include "opencv2/opencv.hpp" //custom define caps enum @@ -36,9 +37,9 @@ enum class CapTypeEx : unsigned short { TwEx_HardwareVersion = 0x8025, TwEx_ScrewDetectEnable = 0x8006, TwEx_ScrewLevel = 0x8021, - TwEx_Sharpen = 0x8022, - TwEx_DBAreaNum =0x8027, - TwEx_DBDevnMax = 0x8028, + TwEx_Sharpen = 0x8022, + TwEx_DBAreaNum = 0x8027, + TwEx_DBDevnMax = 0x8028, TwEx_StableDetectEnable = 0x8090 }; @@ -60,17 +61,17 @@ using namespace std::placeholders; TWPP_ENTRY_MFC(HuagaoDs) static constexpr const Identity srcIdent( - Version(3, 3, Language::English, Country::CzechRepublic, "v3.3.1.6"), - DataGroup::Image, - "ϢƼ޹˾", - "G200 Series", - "HUAGOSCAN TWAIN" + Version(3, 3, Language::English, Country::China, "v3.3.2.1"), + DataGroup::Image, + "HUAGOSCAN TWAIN", + "G300 Series", + "HUAGOSCAN TWAIN" #if defined(_MSC_VER) - "" + "" #elif defined(__GNUC__) - " GCC" + " GCC" #elif defined(__clang__) - " CLang" + " CLang" #endif ); @@ -86,7 +87,7 @@ static list paperSizeList = { (UInt16)PaperSize::A3,(UInt16)PaperSize::A (UInt16)PaperSize::UsLetter,(UInt16)PaperSize::UsLegal,(UInt16)PaperSize::UsLedger, (UInt16)PaperSize::MaxSize,(UInt16)PaperSize::None,(UInt16)PaperSize::UsStatement }; -static list imageRotateList = {0.0,90.0,180.0,270.0}; +static list imageRotateList = { 0.0,90.0,180.0,270.0 }; static map noticeMsgMap = { {OPEN_COVER,_T("ɨǿ")}, {NO_FEED,_T("ֽ")}, @@ -98,8 +99,8 @@ static map noticeMsgMap = { {OPEN_COVER,_T("ɨ {COUNT_MODE,_T("ģʽ˳ģʽ")}, {HARDWARE_ERROR,_T("Ӳ")}, {FPGA_ERROR,_T("FPGA 쳣")}, - {USB_DISCONNECTED,_T("USB쳣")} - }; + {USB_DISCONNECTED,_T("USB쳣")} +}; static void DeleteWnd(CDialog* pWnd) { if (pWnd && pWnd->GetSafeHwnd()) { @@ -123,15 +124,15 @@ static std::unique_ptr scanner(new GScanVirtual()); HuagaoDs::HuagaoDs() - : m_scanparam(new GScanCap) + : m_scanparam(new GScanCap) { - /*string ss1= getOSInfo(); - string ss2=getManufactureID(); - string ss3=getCpuType(); - string ss4= getMemoryInfo(); - DWORD dwNum; - CString aas[10]; - GetDiskInfo(dwNum,aas);*/ + /*string ss1= getOSInfo(); + string ss2=getManufactureID(); + string ss3=getCpuType(); + string ss4= getMemoryInfo(); + DWORD dwNum; + CString aas[10]; + GetDiskInfo(dwNum,aas);*/ initGScanCap(); } @@ -139,32 +140,33 @@ HuagaoDs::~HuagaoDs() { } -const Identity& HuagaoDs::defaultIdentity() noexcept{ +const Identity& HuagaoDs::defaultIdentity() noexcept { // remember, we return a reference, therefore the identity must not be placed on the stack of this method return srcIdent; } -Result HuagaoDs::call(const Identity& origin, DataGroup dg, Dat dat, Msg msg, void* data){ +Result HuagaoDs::call(const Identity& origin, DataGroup dg, Dat dat, Msg msg, void* data) { try { // we can override almost anything from SourceFromThis, even the top-most source instance call return Base::call(origin, dg, dat, msg, data); - } catch (const CapabilityException&){ + } + catch (const CapabilityException&) { return badValue(); } } // some helper functions to handle capability stuff template -static Result oneValGet(Msg msg, Capability& data, const T& value){ - switch (msg){ - case Msg::Get: - case Msg::GetCurrent: - case Msg::GetDefault: - data = Capability::createOneValue(data.type(), value); - return {}; +static Result oneValGet(Msg msg, Capability& data, const T& value) { + switch (msg) { + case Msg::Get: + case Msg::GetCurrent: + case Msg::GetDefault: + data = Capability::createOneValue(data.type(), value); + return {}; - default: - return {ReturnCode::Failure, ConditionCode::CapBadOperation}; + default: + return { ReturnCode::Failure, ConditionCode::CapBadOperation }; } } @@ -175,83 +177,83 @@ static Result oneValGetString(Msg msg, Capability& data, std::string value) { } template -static Result enmGet(Msg msg, Capability& data, const T& value){ - switch (msg){ - case Msg::Get: - data = Capability::createEnumeration(data.type(), {value}); - return {}; - case Msg::GetCurrent: - case Msg::GetDefault: - data = Capability::createOneValue(data.type(), value); - return {}; +static Result enmGet(Msg msg, Capability& data, const T& value) { + switch (msg) { + case Msg::Get: + data = Capability::createEnumeration(data.type(), { value }); + return {}; + case Msg::GetCurrent: + case Msg::GetDefault: + data = Capability::createOneValue(data.type(), value); + return {}; - default: - return {ReturnCode::Failure, ConditionCode::CapBadOperation}; + default: + return { ReturnCode::Failure, ConditionCode::CapBadOperation }; } } template -static Result oneValGetSet(Msg msg, Capability& data, T& value, const T& def){ - switch (msg){ - case Msg::Reset: - value = def; - // fallthrough - case Msg::Get: - case Msg::GetCurrent: - data = Capability::createOneValue(data.type(), value); - return {}; +static Result oneValGetSet(Msg msg, Capability& data, T& value, const T& def) { + switch (msg) { + case Msg::Reset: + value = def; + // fallthrough + case Msg::Get: + case Msg::GetCurrent: + data = Capability::createOneValue(data.type(), value); + return {}; - case Msg::GetDefault: - data = Capability::createOneValue(data.type(), def); - return {}; + case Msg::GetDefault: + data = Capability::createOneValue(data.type(), def); + return {}; - case Msg::Set: - value = data.currentItem(); - return {}; + case Msg::Set: + value = data.currentItem(); + return {}; - default: - return {ReturnCode::Failure, ConditionCode::CapBadOperation}; + default: + return { ReturnCode::Failure, ConditionCode::CapBadOperation }; } } template -static Result oneValGetSetConst(Msg msg, Capability& data, const T& def){ - switch (msg){ - case Msg::Get: - case Msg::GetCurrent: - case Msg::GetDefault: - case Msg::Reset: - data = Capability::createOneValue(data.type(), def); - return {}; +static Result oneValGetSetConst(Msg msg, Capability& data, const T& def) { + switch (msg) { + case Msg::Get: + case Msg::GetCurrent: + case Msg::GetDefault: + case Msg::Reset: + data = Capability::createOneValue(data.type(), def); + return {}; - case Msg::Set: - return data.currentItem() == def ? - Result() : Result(ReturnCode::Failure, ConditionCode::BadValue); + case Msg::Set: + return data.currentItem() == def ? + Result() : Result(ReturnCode::Failure, ConditionCode::BadValue); - default: - return {ReturnCode::Failure, ConditionCode::CapBadOperation}; + default: + return { ReturnCode::Failure, ConditionCode::CapBadOperation }; } } template -static Result enmGetSetConst(Msg msg, Capability& data, const T& def){ - switch (msg){ - case Msg::Get: - data = Capability::createEnumeration(data.type(), {def}); - return {}; +static Result enmGetSetConst(Msg msg, Capability& data, const T& def) { + switch (msg) { + case Msg::Get: + data = Capability::createEnumeration(data.type(), { def }); + return {}; - case Msg::GetCurrent: - case Msg::GetDefault: - case Msg::Reset: - data = Capability::createOneValue(data.type(), def); - return {}; + case Msg::GetCurrent: + case Msg::GetDefault: + case Msg::Reset: + data = Capability::createOneValue(data.type(), def); + return {}; - case Msg::Set: - return data.currentItem() == def ? - Result() : Result(ReturnCode::Failure, ConditionCode::BadValue); + case Msg::Set: + return data.currentItem() == def ? + Result() : Result(ReturnCode::Failure, ConditionCode::BadValue); - default: - return {ReturnCode::Failure, ConditionCode::CapBadOperation}; + default: + return { ReturnCode::Failure, ConditionCode::CapBadOperation }; } } @@ -265,41 +267,41 @@ static constexpr Result checkDeviceOnline() noexcept { // //} -Result HuagaoDs::capCommon(const Identity&, Msg msg, Capability& data){ +Result HuagaoDs::capCommon(const Identity&, Msg msg, Capability& data) { auto it = m_caps.find(data.type()); - if (it != m_caps.end()){ + if (it != m_caps.end()) { return (it->second)(msg, data); } return capUnsupported(); } -Result HuagaoDs::capabilityGet(const Identity& origin, Capability& data){ +Result HuagaoDs::capabilityGet(const Identity& origin, Capability& data) { return capCommon(origin, Msg::Get, data); } -Result HuagaoDs::capabilityGetCurrent(const Identity& origin, Capability& data){ +Result HuagaoDs::capabilityGetCurrent(const Identity& origin, Capability& data) { return capCommon(origin, Msg::GetCurrent, data); } -Result HuagaoDs::capabilityGetDefault(const Identity& origin, Capability& data){ +Result HuagaoDs::capabilityGetDefault(const Identity& origin, Capability& data) { return capCommon(origin, Msg::GetDefault, data); } -Result HuagaoDs::capabilityQuerySupport(const Identity&, Capability& data){ +Result HuagaoDs::capabilityQuerySupport(const Identity&, Capability& data) { auto it = m_query.find(data.type()); MsgSupport sup = it != m_query.end() ? it->second : msgSupportEmpty; data = Capability::createOneValue(data.type(), sup); return success(); } -Result HuagaoDs::capabilityReset(const Identity& origin, Capability& data){ +Result HuagaoDs::capabilityReset(const Identity& origin, Capability& data) { return capCommon(origin, Msg::Reset, data); } -Result HuagaoDs::capabilityResetAll(const Identity& origin){ - for (auto& pair : m_query){ - if ((pair.second & MsgSupport::Reset) != msgSupportEmpty){ +Result HuagaoDs::capabilityResetAll(const Identity& origin) { + for (auto& pair : m_query) { + if ((pair.second & MsgSupport::Reset) != msgSupportEmpty) { Capability dummyCap(pair.first); capCommon(origin, Msg::Reset, dummyCap); } @@ -308,23 +310,50 @@ Result HuagaoDs::capabilityResetAll(const Identity& origin){ return success(); } -Result HuagaoDs::capabilitySet(const Identity& origin, Capability& data){ +Result HuagaoDs::capabilitySet(const Identity& origin, Capability& data) { return capCommon(origin, Msg::Set, data); } -Result HuagaoDs::eventProcess(const Identity&, Event& event){ +Result HuagaoDs::eventProcess(const Identity&, Event& event) { // Qt needs to process its events, otherwise the GUI will appear frozen // this is Windows-only method, Linux and macOS behave differently - if (guiTwain) { - // // QApplication::processEvents(); - TODO: needs more investigation; results in freeze when attempting to scan using old DSM - // QApplication::sendPostedEvents(); - guiTwain->SendMessage((UINT)(event.message())); - } + if (guiTwain) { + // // QApplication::processEvents(); - TODO: needs more investigation; results in freeze when attempting to scan using old DSM + // QApplication::sendPostedEvents(); + guiTwain->SendMessage((UINT)(event.message())); + } event.setMessage(Msg::Null); - return {ReturnCode::NotDsEvent, ConditionCode::Success}; + + return { ReturnCode::NotDsEvent, ConditionCode::Success }; +} +//add------------------jpgͼdpi--------------------------- +void HuagaoDs::SetResoluton(const char* path, int resolution) +{ + FILE* file = fopen(path, "rb+"); + if (!file) + return; + //ȡļС + int len = _filelength(_fileno(file)); + char* buf = new char[len]; + fread(buf, sizeof(char), len, file); + char* pResolution = (char*)&resolution; + //ʹͼƬܶȵλ + buf[0x0D] = 1; + //ˮƽܶȣˮƽֱ + buf[0x0E] = pResolution[1]; + buf[0x0F] = pResolution[0]; + //ֱܶȣֱֱ + buf[0x10] = pResolution[1]; + buf[0x11] = pResolution[0]; + + fseek(file, 0, SEEK_SET); + //дļԭʼݣ޸Ч + fwrite(buf, sizeof(char), len, file); + fclose(file); } -Result HuagaoDs::identityOpenDs(const Identity&){ +Result HuagaoDs::identityOpenDs(const Identity&) { + //writelog("identityOpenDs"); bmpData.resize(sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)); BITMAPINFOHEADER& bmInfo = *((BITMAPINFOHEADER*)header()); bmInfo.biHeight = 2000; @@ -336,30 +365,36 @@ Result HuagaoDs::identityOpenDs(const Identity&){ MessageBox(NULL, _T("δҵɨ!ԴUSBǷͨ!"), _T("ʾ"), MB_SYSTEMMODAL | MB_OK | MB_ICONINFORMATION); return checkDeviceOnline(); } + hMutex = CreateMutex(NULL, FALSE, _T("LookitApp")); + if (GetLastError() == ERROR_ALREADY_EXISTS) { //ѾͬMutexõ. + CloseHandle(hMutex); + MessageBox(NULL, _T("豸ѱռãرռó֮ԣ"), _T(" "), MB_OK); + return seqError(); + } // init caps // there are caps a minimal source must support // query -> says which operations a cap supports // caps -> has handler for each specific cap m_query[CapType::SupportedCaps] = msgSupportGetAll; - m_caps[CapType::SupportedCaps] = [this](Msg msg, Capability& data){ - switch (msg){ - case Msg::Get: - case Msg::GetCurrent: - case Msg::GetDefault: { - data = Capability::createArray(m_caps.size()); - auto arr = data.array(); - UInt32 i = 0; - for (const auto& kv : m_caps){ - arr[i] = kv.first; - i++; - } - - return success(); + m_caps[CapType::SupportedCaps] = [this](Msg msg, Capability& data) { + switch (msg) { + case Msg::Get: + case Msg::GetCurrent: + case Msg::GetDefault: { + data = Capability::createArray(m_caps.size()); + auto arr = data.array(); + UInt32 i = 0; + for (const auto& kv : m_caps) { + arr[i] = kv.first; + i++; } - default: - return capBadOperation(); + return success(); + } + + default: + return capBadOperation(); } }; @@ -367,13 +402,13 @@ Result HuagaoDs::identityOpenDs(const Identity&){ m_caps[CapType::UiControllable] = std::bind(enmGet, _1, _2, Bool(true)); m_query[CapType::DeviceOnline] = msgSupportGetAll; - m_caps[CapType::DeviceOnline] = std::bind(enmGet, _1, _2, Bool(scanner->IsConnected())); + m_caps[CapType::DeviceOnline] = std::bind(enmGet, _1, _2, Bool(scanner->IsConnected())); m_query[CapType::XferCount] = msgSupportGetAllSetReset; - m_caps[CapType::XferCount] = [this](Msg msg, Capability& data) -> Result{ - if (msg == Msg::Set){ + m_caps[CapType::XferCount] = [this](Msg msg, Capability& data) -> Result { + if (msg == Msg::Set) { auto item = data.currentItem(); - if (item > 65535 || item < -1){ + if (item > 65535 || item < -1) { return badValue(); } m_capXferCount = item; @@ -381,10 +416,10 @@ Result HuagaoDs::identityOpenDs(const Identity&){ } auto ret = oneValGetSet(msg, data, m_capXferCount, -1); - if (Twpp::success(ret) && m_capXferCount == 0){ + if (Twpp::success(ret) && m_capXferCount == 0) { m_capXferCount = -1; m_scanparam->scannum = m_capXferCount; - return {ReturnCode::CheckStatus, ConditionCode::BadValue}; + return { ReturnCode::CheckStatus, ConditionCode::BadValue }; } return ret; @@ -393,6 +428,7 @@ Result HuagaoDs::identityOpenDs(const Identity&){ m_query[CapType::ICompression] = msgSupportGetAllSetReset; m_caps[CapType::ICompression] = std::bind(enmGetSetConst, _1, _2, Compression::None); + m_query[CapType::IBitDepth] = msgSupportGetAllSetReset; m_caps[CapType::IBitDepth] = std::bind(enmGetSetConst, _1, _2, UInt16(header()->biBitCount)); @@ -416,7 +452,7 @@ Result HuagaoDs::identityOpenDs(const Identity&){ switch (msg) { case Msg::Get: data = Capability::createEnumeration( - { PixelType::BlackWhite, PixelType::Gray, PixelType::Rgb}, (int)(m_scanparam->pixtype), (int)PixelType::Gray); + { PixelType::BlackWhite, PixelType::Gray, PixelType::Rgb }, (int)(m_scanparam->pixtype), (int)PixelType::Gray); return success(); case Msg::Reset: @@ -429,97 +465,125 @@ Result HuagaoDs::identityOpenDs(const Identity&){ data = Capability::createOneValue(PixelType::Gray); return success(); - case Msg::Set: { - auto mech = data.currentItem(); + case Msg::Set: { + auto mech = data.currentItem(); m_scanparam->pixtype = (int)mech; - return success(); - } + return success(); + } default: return capBadOperation(); } }; + //add------------------jpegȼ--------------------- + m_query[CapType::IJpegQuality] = msgSupportGetAllSetReset; + m_caps[CapType::IJpegQuality] = [this](Msg msg, Capability& data)->Result { + switch (msg) { + case Msg::Get: + case Msg::GetCurrent: + data = Capability::createOneValue(CapType::IJpegQuality, (UInt16)m_jpegQuality); + return success(); + + case Msg::Reset: + m_jpegQuality = 80; + return success(); + case Msg::GetDefault: + data = Capability::createOneValue(CapType::IJpegQuality, 80); + return success(); + + case Msg::Set: { + auto mech = data.currentItem(); + if ((int)mech < 0 || (int)mech > 100) + return capBadOperation(); + m_jpegQuality = (int)mech; + return success(); + } + default: + return capBadOperation(); + } + }; m_query[CapType::IUnits] = msgSupportGetAllSetReset; m_caps[CapType::IUnits] = std::bind(enmGetSetConst, _1, _2, Unit::Inches); m_query[CapType::IXferMech] = msgSupportGetAllSetReset; - m_caps[CapType::IXferMech] = [this](Msg msg, Capability& data) -> Result{ - switch (msg){ - case Msg::Get: - data = Capability::createEnumeration( - {XferMech::Native, XferMech::Memory}, m_capXferMech == XferMech::Native ? 0 : 1, 0); - return success(); + m_caps[CapType::IXferMech] = [this](Msg msg, Capability& data) -> Result { + switch (msg) { + case Msg::Get: + data = Capability::createEnumeration( + { XferMech::Native, XferMech::Memory, XferMech::File}, m_capXferMech == XferMech::Native ? 0 : (m_capXferMech == XferMech::Memory ? 1 : 2), 0); + return success(); - case Msg::Reset: - m_capXferMech = XferMech::Native; - // fallthrough - case Msg::GetCurrent: - data = Capability::createOneValue(m_capXferMech); - return success(); + case Msg::Reset: + m_capXferMech = XferMech::Native; + // fallthrough + case Msg::GetCurrent: + data = Capability::createOneValue(m_capXferMech); + return success(); - case Msg::GetDefault: - data = Capability::createOneValue(XferMech::Native); - return success(); + case Msg::GetDefault: + data = Capability::createOneValue(XferMech::Native); + return success(); - case Msg::Set: { - auto mech = data.currentItem(); - if (mech == XferMech::Native || mech == XferMech::Memory){ - m_capXferMech = mech; - return success(); - } else { - return badValue(); - } + case Msg::Set: { + auto mech = data.currentItem(); + if (mech == XferMech::Native || mech == XferMech::Memory|| mech == XferMech::File) { + m_capXferMech = mech; + return success(); } + else { + return badValue(); + } + } - default: - return capBadOperation(); + default: + return capBadOperation(); } }; m_query[CapType::IXResolution] = msgSupportGetAllSetReset; - m_caps[CapType::IXResolution] = [this](Msg msg, Capability& data){ - switch (msg){ + m_caps[CapType::IXResolution] = [this](Msg msg, Capability& data) { + switch (msg) { case Msg::Get: { int index = -1; std::list::iterator it = resList.begin(); int i = 0; - for (it,i; it != resList.end(); ++it, i++) { + for (it, i; it != resList.end(); ++it, i++) { if (*it == m_scanparam->resolution_dst) { index = i; - break; + break; } } - data = Capability::createEnumeration(data.type(), { Fix32(100.0),Fix32(150.0),Fix32(200.0),Fix32(240.0),Fix32(300.0) }, index==-1?2:index, 2); + data = Capability::createEnumeration(data.type(), { Fix32(100.0),Fix32(150.0),Fix32(200.0),Fix32(240.0),Fix32(300.0) }, index == -1 ? 2 : index, 2); return success(); } case Msg::GetCurrent: { data = Capability::createOneValue(data.type(), Fix32(m_scanparam->resolution_dst)); return success(); } - case Msg::GetDefault: - case Msg::Reset:{ - data = Capability::createOneValue(data.type(), Fix32(200.0)); - return success(); - } - case Msg::Set:{ - auto res = data.currentItem(); - std::list::iterator resIter= resList.begin(); - bool contains = false; - for (resIter; resIter != resList.end(); resIter++) { - if (*resIter == res) { - contains = true; - break; - } + case Msg::GetDefault: + case Msg::Reset: { + data = Capability::createOneValue(data.type(), Fix32(200.0)); + return success(); + } + case Msg::Set: { + auto res = data.currentItem(); + std::list::iterator resIter = resList.begin(); + bool contains = false; + for (resIter; resIter != resList.end(); resIter++) { + if (*resIter == res) { + contains = true; + break; } - if (contains) { - m_scanparam->resolution_dst = (float)res; - return success(); - } - return badValue(); } - default: - return capBadOperation(); + if (contains) { + m_scanparam->resolution_dst = (float)res; + return success(); + } + return badValue(); + } + default: + return capBadOperation(); } }; @@ -551,9 +615,9 @@ Result HuagaoDs::identityOpenDs(const Identity&){ data = Capability::createEnumeration(data.type(), { PaperSize::A3,PaperSize::A4,PaperSize::A5, PaperSize::A6,PaperSize::IsoB4,PaperSize::IsoB5, PaperSize::IsoB6,PaperSize::UsLetter,PaperSize::UsLegal, - PaperSize::UsLedger,PaperSize::MaxSize,PaperSize::None}, - index == -1 ? 0 : index, - 0); + PaperSize::UsLedger,PaperSize::MaxSize,PaperSize::None }, + index == -1 ? 0 : index, + 0); return success(); } case Msg::GetCurrent: @@ -590,7 +654,7 @@ Result HuagaoDs::identityOpenDs(const Identity&){ switch (msg) { case Msg::Get: data = Capability::createEnumeration( - { Orientation::Portrait, Orientation::Landscape,Orientation::AutoText}, m_scanparam->paperAlign,0); + { Orientation::Portrait, Orientation::Landscape,Orientation::AutoText }, m_scanparam->paperAlign, 0); return success(); case Msg::Reset: @@ -605,8 +669,8 @@ Result HuagaoDs::identityOpenDs(const Identity&){ case Msg::Set: { auto mech = data.currentItem(); - if(mech== Orientation::Landscape|| mech == Orientation::Portrait|| mech== Orientation::AutoText){ - m_scanparam->paperAlign =(PaperAlign)mech; + if (mech == Orientation::Landscape || mech == Orientation::Portrait || mech == Orientation::AutoText) { + m_scanparam->paperAlign = (PaperAlign)mech; return success(); } return badValue(); @@ -620,7 +684,7 @@ Result HuagaoDs::identityOpenDs(const Identity&){ m_query[CapType::IRotation] = msgSupportGetAllSetReset; m_caps[CapType::IRotation] = [this](Msg msg, Capability& data) -> Result { switch (msg) { - case Msg::Get:{ + case Msg::Get: { int index = -1; std::list::iterator it = imageRotateList.begin(); int i = 0; @@ -631,8 +695,8 @@ Result HuagaoDs::identityOpenDs(const Identity&){ } } data = Capability::createEnumeration( - {Fix32(0.0),Fix32(90.0),Fix32(180.0),Fix32(270.0)}, - index==-1?0:index, + { Fix32(0.0),Fix32(90.0),Fix32(180.0),Fix32(270.0) }, + index == -1 ? 0 : index, 0); return success(); } @@ -668,8 +732,8 @@ Result HuagaoDs::identityOpenDs(const Identity&){ } }; - m_query[CapType::SerialNumber] = msgSupportGetAll; - m_caps[CapType::SerialNumber] = std::bind(oneValGetString,_1,_2,scanner->GetSerialNum()); + m_query[CapType::SerialNumber] = msgSupportGetAll; + m_caps[CapType::SerialNumber] = std::bind(oneValGetString, _1, _2, scanner->GetSerialNum()); m_query[(CapType)(CapTypeEx::TwEx_HardwareVersion)] = msgSupportGetAll; m_caps[(CapType)(CapTypeEx::TwEx_HardwareVersion)] = std::bind(oneValGetString, _1, _2, scanner->GetFWVersion()); @@ -679,7 +743,7 @@ Result HuagaoDs::identityOpenDs(const Identity&){ switch (msg) { case Msg::Get: data = Capability::createEnumeration( - { Bool(), Bool(true)}, Bool(m_bIndicator)); + { Bool(), Bool(true) }, Bool(m_bIndicator)); return success(); case Msg::Reset: @@ -710,28 +774,12 @@ Result HuagaoDs::identityOpenDs(const Identity&){ m_query[CapType::PaperDetectable] = msgSupportGetAll; m_caps[CapType::PaperDetectable] = std::bind(enmGet, _1, _2, Bool(true)); - m_query[CapType::FeederEnabled] = msgSupportGetAllSetReset; + m_query[CapType::FeederEnabled] = msgSupportGetAll; m_caps[CapType::FeederEnabled] = [this](Msg msg, Capability& data) -> Result { switch (msg) { case Msg::Get: - data = Capability::createEnumeration( - { Bool(), Bool(true) }, Bool(m_bFeederEnabled)); - return success(); - case Msg::GetCurrent: - data = Capability::createOneValue(m_bFeederEnabled); - return success(); - case Msg::Reset: - case Msg::GetDefault: data = Capability::createOneValue(true); - m_bFeederEnabled = true; return success(); - - case Msg::Set: { - auto feederen = data.currentItem(); - m_bFeederEnabled = feederen; - return success(); - } - default: return capBadOperation(); } @@ -760,7 +808,7 @@ Result HuagaoDs::identityOpenDs(const Identity&){ case Msg::Set: { auto mech = data.currentItem(); - m_scanparam->is_duplex=mech; + m_scanparam->is_duplex = mech; return success(); } @@ -802,13 +850,16 @@ Result HuagaoDs::identityOpenDs(const Identity&){ m_query[CapType::IImageFileFormat] = msgSupportGetAllSetReset; m_caps[CapType::IImageFileFormat] = [this](Msg msg, Capability& data) -> Result { switch (msg) { - case Msg::Get: + case Msg::Get: { + UInt32 capindex = 0; + if (m_capImageFileFormat == ImageFileFormat::Tiff) capindex = 1; + if (m_capImageFileFormat == ImageFileFormat::Jfif) capindex = 2; data = Capability::createEnumeration( - { ImageFileFormat::Bmp, ImageFileFormat::Tiff}, m_capImageFileFormat == ImageFileFormat::Bmp? 0 : 1, 0); + { ImageFileFormat::Bmp, ImageFileFormat::Tiff,ImageFileFormat::Jfif}, capindex, 0); return success(); - + } case Msg::Reset: - m_capImageFileFormat =ImageFileFormat::Bmp; + m_capImageFileFormat = ImageFileFormat::Bmp; // fallthrough case Msg::GetCurrent: data = Capability::createOneValue(m_capImageFileFormat); @@ -820,15 +871,16 @@ Result HuagaoDs::identityOpenDs(const Identity&){ case Msg::Set: { auto mech = data.currentItem(); - if (mech == ImageFileFormat::Bmp || mech == ImageFileFormat::Tiff) { - m_capImageFileFormat =mech; + if (mech == ImageFileFormat::Bmp || + mech == ImageFileFormat::Tiff || + mech == ImageFileFormat::Jfif) { + m_capImageFileFormat = mech; return success(); } else { return badValue(); } } - default: return capBadOperation(); } @@ -840,7 +892,7 @@ Result HuagaoDs::identityOpenDs(const Identity&){ switch (msg) { case Msg::Get: data = Capability::createEnumeration( - { Bool(), Bool(true) }, Bool(m_scanparam->autodescrew)); + { Bool(), Bool(true) }, Bool(m_scanparam->autodescrew == 0 ? false : true)); return success(); case Msg::Reset: m_scanparam->autodescrew = true; @@ -919,50 +971,50 @@ Result HuagaoDs::identityOpenDs(const Identity&){ } }; - m_query[CapType::IImageMerge] = msgSupportGetAllSetReset; - m_caps[CapType::IImageMerge] = [this](Msg msg, Capability& data)->Result { - switch (msg) { - case Msg::Get: - data = Capability::createOneValue(CapType::IImageMerge,(UInt16)m_scanparam->en_fold); - return success(); - case Msg::Reset: - m_scanparam->en_fold = 0;//Ĭϲ - // fallthrough - case Msg::GetCurrent: - data = Capability::createOneValue(CapType::IImageMerge, (UInt16)m_scanparam->en_fold); - return success(); + m_query[CapType::IImageMerge] = msgSupportGetAllSetReset; + m_caps[CapType::IImageMerge] = [this](Msg msg, Capability& data)->Result { + switch (msg) { + case Msg::Get: + data = Capability::createOneValue(CapType::IImageMerge, (UInt16)m_scanparam->en_fold); + return success(); + case Msg::Reset: + m_scanparam->en_fold = 0;//Ĭϲ + // fallthrough + case Msg::GetCurrent: + data = Capability::createOneValue(CapType::IImageMerge, (UInt16)m_scanparam->en_fold); + return success(); - case Msg::GetDefault: - data = Capability::createOneValue(CapType::IImageMerge,0); - return success(); + case Msg::GetDefault: + data = Capability::createOneValue(CapType::IImageMerge, 0); + return success(); - case Msg::Set: { - auto autocrop = data.currentItem(); - m_scanparam->en_fold = (byte)autocrop; - return success(); - } - default: - return capBadOperation(); - } - }; + case Msg::Set: { + auto autocrop = data.currentItem(); + m_scanparam->en_fold = (byte)autocrop; + return success(); + } + default: + return capBadOperation(); + } + }; m_query[CapType::IAutoDiscardBlankPages] = msgSupportGetAllSetReset; m_caps[CapType::IAutoDiscardBlankPages] = [this](Msg msg, Capability& data)->Result { switch (msg) { case Msg::Get: - data = Capability::createEnumeration({ DiscardBlankPages::Disabled,DiscardBlankPages::Auto}, - m_scanparam->is_autodiscradblank_normal?1:0, + data = Capability::createEnumeration({ DiscardBlankPages::Disabled,DiscardBlankPages::Auto }, + m_scanparam->is_autodiscradblank_normal ? 1 : 0, 0); return success(); case Msg::Reset: m_scanparam->is_autodiscradblank_normal = false; case Msg::GetCurrent: - data = Capability::createOneValue(m_scanparam->is_autodiscradblank_normal? DiscardBlankPages::Auto: DiscardBlankPages::Disabled); + data = Capability::createOneValue(m_scanparam->is_autodiscradblank_normal ? DiscardBlankPages::Auto : DiscardBlankPages::Disabled); return success(); case Msg::GetDefault: data = Capability::createOneValue(DiscardBlankPages::Disabled); return success(); - case Msg::Set:{ + case Msg::Set: { auto mech = data.currentItem(); m_scanparam->is_autodiscradblank_normal = mech == DiscardBlankPages::Auto; return success(); @@ -1089,8 +1141,8 @@ Result HuagaoDs::identityOpenDs(const Identity&){ case Msg::Set: { auto mech = data.currentItem(); if (mech > 0 && mech < 50) { - m_scanparam->fillhole.fillholeratio = (float)mech; - return success(); + m_scanparam->fillhole.fillholeratio = (float)mech; + return success(); } return badValue(); } @@ -1123,12 +1175,12 @@ Result HuagaoDs::identityOpenDs(const Identity&){ return capBadOperation(); } }; - + m_query[CapType::IFilter] = msgSupportGetAllSetReset; m_caps[CapType::IFilter] = [this](Msg msg, Capability& data)->Result { switch (msg) { case Msg::Get: - data = Capability::createEnumeration({Filter::Red,Filter::Green,Filter::Blue,Filter::None }, + data = Capability::createEnumeration({ Filter::Red,Filter::Green,Filter::Blue,Filter::None }, m_scanparam->filter, 0); return success(); @@ -1142,11 +1194,11 @@ Result HuagaoDs::identityOpenDs(const Identity&){ return success(); case Msg::Set: { auto mech = data.currentItem(); - if(mech == Filter::None|| mech == Filter::Red||mech == Filter::Green ||mech ==Filter::Blue){ - m_scanparam->filter =(byte) mech; - return success(); + if (mech == Filter::None || mech == Filter::Red || mech == Filter::Green || mech == Filter::Blue) { + m_scanparam->filter = (byte)mech; + return success(); } - return badValue(); + return badValue(); } default: return capBadOperation(); @@ -1158,7 +1210,7 @@ Result HuagaoDs::identityOpenDs(const Identity&){ m_caps[(CapType)(CapTypeEx::TwEx_IEnhanceColor)] = [this](Msg msg, Capability& data)->Result { switch (msg) { case Msg::Get: - data = Capability::createEnumeration((CapType)(CapTypeEx::TwEx_IEnhanceColor), { Enchace_Color::Enhance_None,Enchace_Color::Enhance_Red,Enchace_Color::Enhance_Green,Enchace_Color::Enhance_Blue},m_scanparam->enhance_color,0); + data = Capability::createEnumeration((CapType)(CapTypeEx::TwEx_IEnhanceColor), { Enchace_Color::Enhance_None,Enchace_Color::Enhance_Red,Enchace_Color::Enhance_Green,Enchace_Color::Enhance_Blue }, m_scanparam->enhance_color, 0); return success(); case Msg::Reset: m_scanparam->enhance_color = Enchace_Color::Enhance_None; @@ -1170,7 +1222,7 @@ Result HuagaoDs::identityOpenDs(const Identity&){ return success(); case Msg::Set: { auto mech = data.currentItem(); - m_scanparam->enhance_color =(byte)mech; + m_scanparam->enhance_color = (byte)mech; return success(); } default: @@ -1178,39 +1230,39 @@ Result HuagaoDs::identityOpenDs(const Identity&){ } }; - m_query[(CapType)(CapTypeEx::TwEx_Sharpen)] = msgSupportGetAllSetReset; - m_caps[(CapType)(CapTypeEx::TwEx_Sharpen)] = [this](Msg msg, Capability& data)->Result { - switch (msg) { - case Msg::Get: - data = Capability::createEnumeration((CapType)(CapTypeEx::TwEx_IEnhanceColor), { SharpenBlur::Sharpen_None,SharpenBlur::Sharpen_Normal,SharpenBlur::Sharpen_More,SharpenBlur::Sharpen_Blur,SharpenBlur::Sharpen_Blur_More }, m_scanparam->sharpen, 0); - return success(); - case Msg::Reset: - m_scanparam->sharpen = SharpenBlur::Sharpen_None; - case Msg::GetCurrent: - data = Capability::createOneValue((CapType)(CapTypeEx::TwEx_Sharpen), (SharpenBlur)(m_scanparam->sharpen)); - return success(); - case Msg::GetDefault: - data = Capability::createOneValue((CapType)(CapTypeEx::TwEx_Sharpen), SharpenBlur::Sharpen_None); - return success(); - case Msg::Set: { - auto mech = data.currentItem(); - m_scanparam->sharpen = (byte)mech; - return success(); - } - default: - return capBadOperation(); - } - }; + m_query[(CapType)(CapTypeEx::TwEx_Sharpen)] = msgSupportGetAllSetReset; + m_caps[(CapType)(CapTypeEx::TwEx_Sharpen)] = [this](Msg msg, Capability& data)->Result { + switch (msg) { + case Msg::Get: + data = Capability::createEnumeration((CapType)(CapTypeEx::TwEx_IEnhanceColor), { SharpenBlur::Sharpen_None,SharpenBlur::Sharpen_Normal,SharpenBlur::Sharpen_More,SharpenBlur::Sharpen_Blur,SharpenBlur::Sharpen_Blur_More }, m_scanparam->sharpen, 0); + return success(); + case Msg::Reset: + m_scanparam->sharpen = SharpenBlur::Sharpen_None; + case Msg::GetCurrent: + data = Capability::createOneValue((CapType)(CapTypeEx::TwEx_Sharpen), (SharpenBlur)(m_scanparam->sharpen)); + return success(); + case Msg::GetDefault: + data = Capability::createOneValue((CapType)(CapTypeEx::TwEx_Sharpen), SharpenBlur::Sharpen_None); + return success(); + case Msg::Set: { + auto mech = data.currentItem(); + m_scanparam->sharpen = (byte)mech; + return success(); + } + default: + return capBadOperation(); + } + }; /* Աȶ gamma range Range */ m_query[CapType::IBrightness] = msgSupportGetAllSetReset; m_caps[CapType::IBrightness] = [this](Msg msg, Capability& data)->Result { switch (msg) { case Msg::Get: - data=Capability::createRange(Fix32(-1000.0f), Fix32(1000.0f), Fix32(333.3f), Fix32(m_scanparam->brightness), Fix32(0.0)); + data = Capability::createRange(Fix32(-1000.0f), Fix32(1000.0f), Fix32(333.3f), Fix32(m_scanparam->brightness), Fix32(0.0)); return success(); case Msg::Reset: - m_scanparam->brightness =0.0f; + m_scanparam->brightness = 0.0f; case Msg::GetCurrent: data = Capability::createOneValue(Fix32(m_scanparam->brightness)); return success(); @@ -1282,59 +1334,59 @@ Result HuagaoDs::identityOpenDs(const Identity&){ }; - //m_query[(CapType)(CapTypeEx::TwEx_DBAreaNum)] = msgSupportGetAllSetReset; - //m_caps[(CapType)(CapTypeEx::TwEx_DBAreaNum)] = [this](Msg msg, Capability& data)->Result { - // switch (msg) { - // case Msg::Get: - // data = Capability::createOneValue((CapType)(CapTypeEx::TwEx_DBAreaNum), m_scanparam->areanum); - // return success(); - // case Msg::Reset: - // m_scanparam->areanum = 8; - // case Msg::GetCurrent: - // data = Capability::createOneValue((CapType)(CapTypeEx::TwEx_DBAreaNum), m_scanparam->areanum); - // return success(); - // case Msg::GetDefault: - // data = Capability::createOneValue((CapType)(CapTypeEx::TwEx_DBAreaNum), UInt16(8)); - // return success(); - // case Msg::Set: { - // auto mech = data.currentItem(); - // if (mech >= 5 && mech <= 40) { - // m_scanparam->areanum = mech; - // return success(); - // } - // return badValue(); - // } - // default: - // return capBadOperation(); - // } - //}; + //m_query[(CapType)(CapTypeEx::TwEx_DBAreaNum)] = msgSupportGetAllSetReset; + //m_caps[(CapType)(CapTypeEx::TwEx_DBAreaNum)] = [this](Msg msg, Capability& data)->Result { + // switch (msg) { + // case Msg::Get: + // data = Capability::createOneValue((CapType)(CapTypeEx::TwEx_DBAreaNum), m_scanparam->areanum); + // return success(); + // case Msg::Reset: + // m_scanparam->areanum = 8; + // case Msg::GetCurrent: + // data = Capability::createOneValue((CapType)(CapTypeEx::TwEx_DBAreaNum), m_scanparam->areanum); + // return success(); + // case Msg::GetDefault: + // data = Capability::createOneValue((CapType)(CapTypeEx::TwEx_DBAreaNum), UInt16(8)); + // return success(); + // case Msg::Set: { + // auto mech = data.currentItem(); + // if (mech >= 5 && mech <= 40) { + // m_scanparam->areanum = mech; + // return success(); + // } + // return badValue(); + // } + // default: + // return capBadOperation(); + // } + //}; - //m_query[(CapType)(CapTypeEx::TwEx_DBDevnMax)] = msgSupportGetAllSetReset; - //m_caps[(CapType)(CapTypeEx::TwEx_DBDevnMax)] = [this](Msg msg, Capability& data)->Result { - // switch (msg) { - // case Msg::Get: - // data = Capability::createOneValue((CapType)(CapTypeEx::TwEx_DBDevnMax), m_scanparam->devnmax); - // return success(); - // case Msg::Reset: - // m_scanparam->devnmax = 200; - // case Msg::GetCurrent: - // data = Capability::createOneValue((CapType)(CapTypeEx::TwEx_DBDevnMax), m_scanparam->devnmax); - // return success(); - // case Msg::GetDefault: - // data = Capability::createOneValue((CapType)(CapTypeEx::TwEx_DBDevnMax), UInt16(200)); - // return success(); - // case Msg::Set: { - // auto mech = data.currentItem(); - // if (mech >= 150 && mech <= 400) { - // m_scanparam->devnmax = mech; - // return success(); - // } - // return badValue(); - // } - // default: - // return capBadOperation(); - // } - //}; + //m_query[(CapType)(CapTypeEx::TwEx_DBDevnMax)] = msgSupportGetAllSetReset; + //m_caps[(CapType)(CapTypeEx::TwEx_DBDevnMax)] = [this](Msg msg, Capability& data)->Result { + // switch (msg) { + // case Msg::Get: + // data = Capability::createOneValue((CapType)(CapTypeEx::TwEx_DBDevnMax), m_scanparam->devnmax); + // return success(); + // case Msg::Reset: + // m_scanparam->devnmax = 200; + // case Msg::GetCurrent: + // data = Capability::createOneValue((CapType)(CapTypeEx::TwEx_DBDevnMax), m_scanparam->devnmax); + // return success(); + // case Msg::GetDefault: + // data = Capability::createOneValue((CapType)(CapTypeEx::TwEx_DBDevnMax), UInt16(200)); + // return success(); + // case Msg::Set: { + // auto mech = data.currentItem(); + // if (mech >= 150 && mech <= 400) { + // m_scanparam->devnmax = mech; + // return success(); + // } + // return badValue(); + // } + // default: + // return capBadOperation(); + // } + //}; /*ΪӲЭ*/ m_query[(CapType)(CapTypeEx::TwEx_ScrewDetectEnable)] = msgSupportGetAllSetReset; @@ -1440,9 +1492,16 @@ Result HuagaoDs::identityOpenDs(const Identity&){ return success(); } -Result HuagaoDs::identityCloseDs(const Identity&){ +Result HuagaoDs::identityCloseDs(const Identity&) { // no need to explicitly release any resources if using RAII // TWPP will free the whole source on its own after this method + //writelog("identityCloseDs"); + if (hMutex) + { + ReleaseMutex(hMutex); + CloseHandle(hMutex); + } + guiIndicator.reset(); guiTwain.reset(); guiBridge.reset(); @@ -1450,25 +1509,26 @@ Result HuagaoDs::identityCloseDs(const Identity&){ return success(); } -Result HuagaoDs::pendingXfersGet(const Identity&, PendingXfers& data){ +Result HuagaoDs::pendingXfersGet(const Identity&, PendingXfers& data) { data.setCount(m_pendingXfers); return success(); } -Result HuagaoDs::pendingXfersEnd(const Identity&, PendingXfers& data){ +Result HuagaoDs::pendingXfersEnd(const Identity&, PendingXfers& data) { //!< end xfer if set count 0 - int ret= scanner->aquire_bmpdata(bmpData); - if (ret !=0) { + if (bmpData.size() > 0) + bmpData.clear(); + int ret = scanner->aquire_bmpdata(bmpData); + if (ret != 0) { scanner->Set_ErrorCode(0); guiIndicator.reset(); if (ret != -1) { - MessageBox(guiTwain ? guiTwain->m_hWnd : NULL, noticeMsgMap[ret], _T("ʾ"), MB_SYSTEMMODAL | MB_OK | MB_ICONINFORMATION); + MessageBox(guiTwain ? guiTwain->m_hWnd : NULL, noticeMsgMap[ret], _T("ʾ"), MB_SYSTEMMODAL | MB_OK | MB_ICONINFORMATION); } m_pendingXfers = 0; if (guiTwain.get()) { ((CTwainUI*)(guiTwain.get()))->EnableID_OKorID_Cancel(true); } - } else { m_pendingXfers = 1; @@ -1481,12 +1541,12 @@ Result HuagaoDs::pendingXfersEnd(const Identity&, PendingXfers& data){ return success(); } -Result HuagaoDs::pendingXfersReset(const Identity&, PendingXfers& data){ +Result HuagaoDs::pendingXfersReset(const Identity&, PendingXfers& data) { data.setCount(0); return success(); } -Result HuagaoDs::setupMemXferGet(const Identity&, SetupMemXfer& data){ +Result HuagaoDs::setupMemXferGet(const Identity&, SetupMemXfer& data) { auto bpl = bytesPerLine(); auto max = bpl * static_cast(header()->biHeight); @@ -1496,7 +1556,7 @@ Result HuagaoDs::setupMemXferGet(const Identity&, SetupMemXfer& data){ return success(); } -Result HuagaoDs::userInterfaceDisable(const Identity&, UserInterface& ui){ +Result HuagaoDs::userInterfaceDisable(const Identity&, UserInterface& ui) { guiTwain.reset(); #if TWPP_DETAIL_OS_WIN @@ -1504,36 +1564,36 @@ Result HuagaoDs::userInterfaceDisable(const Identity&, UserInterface& ui){ #endif return success(); } -Result HuagaoDs::userInterfaceEnable(const Identity&, UserInterface& ui){ +Result HuagaoDs::userInterfaceEnable(const Identity&, UserInterface& ui) { m_pendingXfers = 1; m_memXferYOff = 0; - - if (!ui.showUi()){ + //writelog("userInterfaceEnable"); + if (!ui.showUi()) { // this is an exception when we want to set state explicitly, notifyXferReady can be called only in enabled state // with hidden UI, the usual workflow DsState::Enabled -> notifyXferReady() -> DsState::XferReady is a single step updataGscanCap(); setState(DsState::Enabled); - if(startScan() == success()){ - m_pendingXfers = 1; - auto notified = notifyXferReady(); - return success(); - } - else { - m_pendingXfers = 0; - setState(DsState::Open); - return seqError(); - } + if (startScan() == success()) { + m_pendingXfers = 1; + auto notified = notifyXferReady(); + return success(); + } + else { + m_pendingXfers = 0; + setState(DsState::Open); + return seqError(); + } } return showTwainUI(ui); } -Result HuagaoDs::userInterfaceEnableUiOnly(const Identity&, UserInterface& ui){ +Result HuagaoDs::userInterfaceEnableUiOnly(const Identity&, UserInterface& ui) { // as a minimal source, we do not support GUI that just saves settings return showTwainUI(ui, true); } -Result HuagaoDs::imageInfoGet(const Identity&, ImageInfo& data){ +Result HuagaoDs::imageInfoGet(const Identity&, ImageInfo& data) { // our image does not change auto dib = header(); data.setBitsPerPixel(static_cast(dib->biBitCount)); @@ -1563,7 +1623,7 @@ Result HuagaoDs::imageInfoGet(const Identity&, ImageInfo& data){ return success(); } -Result HuagaoDs::imageLayoutGet(const Identity&, ImageLayout& data){ +Result HuagaoDs::imageLayoutGet(const Identity&, ImageLayout& data) { // our image does not change auto dib = header(); @@ -1574,11 +1634,11 @@ Result HuagaoDs::imageLayoutGet(const Identity&, ImageLayout& data){ return success(); } -Result HuagaoDs::imageLayoutGetDefault(const Identity& origin, ImageLayout& data){ +Result HuagaoDs::imageLayoutGetDefault(const Identity& origin, ImageLayout& data) { return imageLayoutGet(origin, data); } -Result HuagaoDs::imageLayoutSet(const Identity& origin, ImageLayout& lay){ +Result HuagaoDs::imageLayoutSet(const Identity& origin, ImageLayout& lay) { // we dont support setting image frame ImageLayout def; @@ -1587,12 +1647,12 @@ Result HuagaoDs::imageLayoutSet(const Identity& origin, ImageLayout& lay){ return lay.frame() == def.frame() ? success() : badValue(); } -Result HuagaoDs::imageLayoutReset(const Identity& origin, ImageLayout& data){ +Result HuagaoDs::imageLayoutReset(const Identity& origin, ImageLayout& data) { return imageLayoutGet(origin, data); } -Result HuagaoDs::imageMemXferGet(const Identity& origin, ImageMemXfer& data){ - if (!m_pendingXfers){ +Result HuagaoDs::imageMemXferGet(const Identity& origin, ImageMemXfer& data) { + if (!m_pendingXfers) { return seqError(); } @@ -1604,13 +1664,13 @@ Result HuagaoDs::imageMemXferGet(const Identity& origin, ImageMemXfer& data){ auto dib = header(); auto bpl = bytesPerLine(); auto memSize = data.memory().size(); - if (memSize > setup.maxSize() || memSize < setup.minSize()){ + if (memSize > setup.maxSize() || memSize < setup.minSize()) { return badValue(); } auto maxRows = memSize / bpl; auto rows = std::min(maxRows, static_cast(dib->biHeight) - m_memXferYOff); - if (rows == 0){ + if (rows == 0) { return seqError(); // image already transfered in this session } @@ -1627,7 +1687,7 @@ Result HuagaoDs::imageMemXferGet(const Identity& origin, ImageMemXfer& data){ // bottom-up BMP -> top-down memory transfer auto begin = bmpEnd() - (bpl * (m_memXferYOff + 1)); - for (UInt32 i = 0; i < rows; i++){ + for (UInt32 i = 0; i < rows; i++) { // copy bytes std::copy(begin, begin + bpl, out); @@ -1636,16 +1696,17 @@ Result HuagaoDs::imageMemXferGet(const Identity& origin, ImageMemXfer& data){ begin -= bpl; // BGR BMP -> RGB memory transfer - for ( ; line + 3 < out; line += 3){ + for (; line + 3 < out; line += 3) { std::swap(line[0], line[2]); } } m_memXferYOff += rows; - if (m_memXferYOff >= static_cast(std::abs(dib->biHeight))){ + if (m_memXferYOff >= static_cast(std::abs(dib->biHeight))) { m_pendingXfers = 0; - return {ReturnCode::XferDone, ConditionCode::Success}; + m_memXferYOff = 0; + return { ReturnCode::XferDone, ConditionCode::Success }; } return success(); @@ -1654,105 +1715,185 @@ Result HuagaoDs::imageMemXferGet(const Identity& origin, ImageMemXfer& data){ static int xtfer = 0; #endif -Result HuagaoDs::imageNativeXferGet(const Identity&, ImageNativeXfer& data){ - if (!m_pendingXfers){ +Result HuagaoDs::imageNativeXferGet(const Identity& id, ImageNativeXfer& data) { + if (!m_pendingXfers) { return seqError(); } - if (data) + if (data) data.release(); // it does not get easier than that if we already have BMP data = ImageNativeXfer(bmpSize()); std::copy(bmpBegin(), bmpEnd(), data.data().data()); #ifdef LOG_NORMAL - FileTools::write_log("out.txt", "imageNativeXferGet "+ std::to_string(++xtfer)); + FileTools::write_log("out.txt", "imageNativeXferGet " + std::to_string(++xtfer)); #endif // LOG - return {ReturnCode::XferDone, ConditionCode::Success}; + return { ReturnCode::XferDone, ConditionCode::Success }; } Twpp::Result HuagaoDs::pendingXfersStopFeeder(const Identity& origin, PendingXfers& data) { - if (!scanner.get()) - return seqError(); - if (scanner->IsConnected()) { - scanner->Stop_scan(); - } - data.setCount(scanner->Get_IsImageQueueEmpty() ? 0 : 1); - return success(); + if (!scanner.get()) + return seqError(); + if (scanner->IsConnected()) { + scanner->Stop_scan(); + } + data.setCount(scanner->Get_IsImageQueueEmpty() ? 0 : 1); + return success(); +} + +Twpp::Result HuagaoDs::setupFileXferGet(const Twpp::Identity& origin, Twpp::SetupFileXfer& data) +{ + data.setFilePath(m_fileXfer.filePath()); + data.setFormat(m_fileXfer.format()); + return success(); +} + +Twpp::Result HuagaoDs::setupFileXferGetDefault(const Twpp::Identity& origin, Twpp::SetupFileXfer& data) +{ + Str255 str("HGTwain.bmp"); + data.setFilePath(str); + data.setFormat(ImageFileFormat::Bmp); + return success(); +} + +Twpp::Result HuagaoDs::setupFileXferSet(const Twpp::Identity& origin, Twpp::SetupFileXfer& data) +{ + m_fileXfer.setFilePath(data.filePath()); + m_fileXfer.setFormat(data.format()); + return success(); +} + +Twpp::Result HuagaoDs::setupFileXferReset(const Twpp::Identity& origin, Twpp::SetupFileXfer& data) +{ + m_fileXfer.setFormat(Twpp::ImageFileFormat::Bmp); + std::string templateName = "HG"; + char* tempPath = mktemp((char*)templateName.c_str()); + if (tempPath) { + Str255 str; + str.setData(tempPath, strlen(tempPath)); + m_fileXfer.setFilePath(str); + return success(); + } + return badProtocol(); +} + +Twpp::Result HuagaoDs::imageFileXferGet(const Twpp::Identity& origin) +{ + if (!m_pendingXfers) + return seqError(); + string filename = m_fileXfer.filePath().string(); + switch (m_fileXfer.format()) + { + case ImageFileFormat::Bmp: { + + FILE* pfile = fopen(filename.c_str(), "wb"); + if (pfile) { + if (bmpData.size() > 0) { + fwrite(bmpData.data(), 1, bmpData.size(), pfile); + fclose(pfile); + return success(); + } + } + return Result(ReturnCode::Failure, ConditionCode::BadValue); + } + break; + case ImageFileFormat::Tiff: + case ImageFileFormat::Jfif: { + BITMAPINFOHEADER& bmpinfo = *((BITMAPINFOHEADER*)header()); + int decodetype; + if (bmpinfo.biBitCount == 24) + decodetype = cv::IMREAD_COLOR; + else + decodetype = cv::IMREAD_GRAYSCALE; + + cv::Mat ims = cv::imdecode(bmpData, decodetype); + std::vector compression_params; + compression_params.push_back(CV_IMWRITE_JPEG_QUALITY); + compression_params.push_back(m_jpegQuality); + + cv::imwrite(filename, ims, compression_params); + return success(); + } + break; + default: + break; + } + return badProtocol(); } Twpp::Result HuagaoDs::showTwainUI(Twpp::UserInterface& ui, bool bUiOnly) { - // as a minimal source, we do not support GUI that just saves settings - if (ui.parent()) { - guiBridge.reset(new CDialog()); - HWND appWindow = static_cast(ui.parent().raw()); - guiBridge->Create(IDD_BACK, CWnd::FromHandle(appWindow)); - HWND bridgeWindow = guiBridge->GetSafeHwnd(); - long bridgeFlags = GetWindowLong(bridgeWindow, GWL_STYLE); - SetWindowLong(bridgeWindow, GWL_STYLE, bridgeFlags | WS_CHILD); - SetParent(bridgeWindow, appWindow); + // as a minimal source, we do not support GUI that just saves settings + if (ui.parent()) { + guiBridge.reset(new CDialog()); + HWND appWindow = static_cast(ui.parent().raw()); + guiBridge->Create(IDD_BACK, CWnd::FromHandle(appWindow)); + HWND bridgeWindow = guiBridge->GetSafeHwnd(); + long bridgeFlags = GetWindowLong(bridgeWindow, GWL_STYLE); + SetWindowLong(bridgeWindow, GWL_STYLE, bridgeFlags | WS_CHILD); + SetParent(bridgeWindow, appWindow); - //if (ui.modalUi()) { - // long appFlags = GetWindowLong(appWindow, GWL_STYLE); - // SetWindowLong(appWindow, GWL_STYLE, appFlags | WS_DISABLED); - //} - } + //if (ui.modalUi()) { + // long appFlags = GetWindowLong(appWindow, GWL_STYLE); + // SetWindowLong(appWindow, GWL_STYLE, appFlags | WS_DISABLED); + //} + } //!< show ui to scan button push - auto scanFunction = [this](const GScanCap& caps) { - m_pendingXfers = 1; + auto scanFunction = [this](const GScanCap& caps) { + m_pendingXfers = 1; m_scanparam.reset(new GScanCap(caps)); //scanner->config_params(*m_scanparam); if (startScan() == success()) { notifyXferReady(); } else { - m_pendingXfers = 0; + m_pendingXfers = 0; } - }; + }; //!< ui only to confirm button push auto confirmFunction = [this](const GScanCap& caps) { - m_scanparam.reset(new GScanCap(caps)); + m_scanparam.reset(new GScanCap(caps)); notifyCloseOk(); }; //!< cancel button push - auto cancelFunction = [this]() { - notifyCloseCancel(); - }; + auto cancelFunction = [this]() { + notifyCloseCancel(); + }; - CWnd* parent = guiBridge.get(); - - TwGlue glue = {scanFunction, cancelFunction }; - TwGlue glueUiOnly = {confirmFunction, cancelFunction }; + CWnd* parent = guiBridge.get(); + + TwGlue glue = { scanFunction, cancelFunction }; + TwGlue glueUiOnly = { confirmFunction, cancelFunction }; std::string serialnum = scanner->GetSerialNum(); std::string hardwareversion = scanner->GetFWVersion(); - guiTwain.reset(new CTwainUI(bUiOnly ? glueUiOnly : glue, bUiOnly?"ȷ":"ɨ", hardwareversion, serialnum)); + guiTwain.reset(new CTwainUI(bUiOnly ? glueUiOnly : glue, bUiOnly ? "ȷ" : "ɨ", hardwareversion, serialnum)); guiTwain->Create(IDD_TWAINUI, parent); guiTwain->ShowWindow(SW_SHOWNORMAL); - return success(); + return success(); } -const BITMAPINFOHEADER* HuagaoDs::header() const noexcept{ +const BITMAPINFOHEADER* HuagaoDs::header() const noexcept { return reinterpret_cast(bmpData.data() + sizeof(BITMAPFILEHEADER)); } -UInt32 HuagaoDs::bytesPerLine() const noexcept{ +UInt32 HuagaoDs::bytesPerLine() const noexcept { auto dib = header(); return static_cast(dib->biWidth * dib->biBitCount + 31) / 32 * 4; } -UInt32 HuagaoDs::bmpSize() const noexcept{ +UInt32 HuagaoDs::bmpSize() const noexcept { return static_cast(bmpData.size()) - sizeof(BITMAPFILEHEADER); } -const char* HuagaoDs::bmpBegin() const noexcept{ +const char* HuagaoDs::bmpBegin() const noexcept { return (const char*)bmpData.cbegin()._Ptr + sizeof(BITMAPFILEHEADER); } -const char* HuagaoDs::bmpEnd() const noexcept{ +const char* HuagaoDs::bmpEnd() const noexcept { return (const char*)bmpData.cend()._Ptr; } @@ -1765,9 +1906,9 @@ void HuagaoDs::initGScanCap() m_scanparam->fillhole.is_fillhole = 1; m_scanparam->fillhole.fillholeratio = 0.1f; m_scanparam->filter = (byte)Filter::None; - m_scanparam->sharpen = (byte)SharpenBlur::Sharpen_None; + m_scanparam->sharpen = (byte)SharpenBlur::Sharpen_None; m_scanparam->gamma = 1.0; - m_scanparam->en_fold = 0; + m_scanparam->en_fold = 0; m_scanparam->hardwarecaps.capturepixtype = (int)(PixelType::Gray); m_scanparam->hardwarecaps.en_doublefeed = 1; m_scanparam->hardwarecaps.en_skrewdetect = 0; @@ -1777,8 +1918,8 @@ void HuagaoDs::initGScanCap() m_scanparam->is_autocrop = 0; m_scanparam->is_autodiscradblank_normal = 0; m_scanparam->is_autodiscradblank_vince = 0; - //m_scanparam->areanum = 8; - //m_scanparam->devnmax = 200; + //m_scanparam->areanum = 8; + //m_scanparam->devnmax = 200; m_scanparam->is_backrotate180 = 0; m_scanparam->is_duplex = 1; m_scanparam->multi_output_red = 0; @@ -1789,7 +1930,7 @@ void HuagaoDs::initGScanCap() m_scanparam->scannum = -1; m_scanparam->is_autotext = 0; m_scanparam->enhance_color = 0; - m_scanparam->pixtype= (int)(PixelType::Gray); + m_scanparam->pixtype = (int)(PixelType::Gray); ScanRect rect = { 0 };//to be define m_scanparam->scanrect = rect; m_scanparam->threshold = 128.0f; @@ -1798,16 +1939,16 @@ void HuagaoDs::initGScanCap() void HuagaoDs::updataGscanCap() { JsonConfig js; - CONFIGPARAMS cfs=js.ReadDefaultConfig(); - m_scanparam->autodescrew = cfs.EnAutoDescrew?1:0; + CONFIGPARAMS cfs = js.ReadDefaultConfig(); + m_scanparam->autodescrew = cfs.EnAutoDescrew ? 1 : 0; m_scanparam->brightness = cfs.Brightness; m_scanparam->contrast = cfs.Contrast; - m_scanparam->fillbackground = cfs.EnFillBlack?1:0; - m_scanparam->fillhole.is_fillhole = cfs.EnOutHole?1:0; + m_scanparam->fillbackground = cfs.EnFillBlack ? 1 : 0; + m_scanparam->fillhole.is_fillhole = cfs.EnOutHole ? 1 : 0; m_scanparam->fillhole.fillholeratio = cfs.OutHoleRatio; - m_scanparam->sharpen = (SharpenBlur)cfs.Sharpen; + m_scanparam->sharpen = (SharpenBlur)cfs.Sharpen; if (cfs.Filter) { - if (cfs.Filter <= 3) { + if (cfs.Filter <= 3) { m_scanparam->filter = filterMaps[cfs.Filter]; m_scanparam->enhance_color = 0;//ɫǿ none } @@ -1821,22 +1962,22 @@ void HuagaoDs::updataGscanCap() m_scanparam->enhance_color = EnchaceColor::Enhance_None; } - m_scanparam->gamma =cfs.Gamma; - m_scanparam->hardwarecaps.en_doublefeed = cfs.EnUltrasonicDetect?1:0; - m_scanparam->hardwarecaps.en_skrewdetect = cfs.EnScrewDetect?1:0; - m_scanparam->hardwarecaps.en_stapledetect = cfs.EnBindingDetect?1:0; + m_scanparam->gamma = cfs.Gamma; + m_scanparam->hardwarecaps.en_doublefeed = cfs.EnUltrasonicDetect ? 1 : 0; + m_scanparam->hardwarecaps.en_skrewdetect = cfs.EnScrewDetect ? 1 : 0; + m_scanparam->hardwarecaps.en_stapledetect = cfs.EnBindingDetect ? 1 : 0; m_scanparam->hardwarecaps.skrewdetectlevel = cfs.ScrewDetectLevel; - m_scanparam->is_autocontrast = cfs.EnAutoContrast?1:0; - m_scanparam->is_autocrop = cfs.EnAutoCrop?1:0; - m_scanparam->is_autodiscradblank_normal = cfs.EnDiscardBlank?1:0; - m_scanparam->is_autodiscradblank_vince = cfs.EnDiscardBlankVince?1:0; - m_scanparam->is_backrotate180 = cfs.EnBackRotate180?1:0; - m_scanparam->is_duplex = cfs.Duplex>=1?1:0; - m_scanparam->en_fold = cfs.EnFlod?1:0; - m_scanparam->multi_output_red = cfs.EnMultiOutPutR?1:0; + m_scanparam->is_autocontrast = cfs.EnAutoContrast ? 1 : 0; + m_scanparam->is_autocrop = cfs.EnAutoCrop ? 1 : 0; + m_scanparam->is_autodiscradblank_normal = cfs.EnDiscardBlank ? 1 : 0; + m_scanparam->is_autodiscradblank_vince = cfs.EnDiscardBlankVince ? 1 : 0; + m_scanparam->is_backrotate180 = cfs.EnBackRotate180 ? 1 : 0; + m_scanparam->is_duplex = cfs.Duplex >= 1 ? 1 : 0; + m_scanparam->en_fold = cfs.EnFlod ? 1 : 0; + m_scanparam->multi_output_red = cfs.EnMultiOutPutR ? 1 : 0; PaperStatus ps = paperStatusMap[cfs.PaperSize]; m_scanparam->papertype = ps.Paper;//A3 - m_scanparam->paperAlign =(PaperAlign)ps.Orentate; + m_scanparam->paperAlign = (PaperAlign)ps.Orentate; m_scanparam->resolution_dst = resolutions[cfs.Resolution]; #ifdef REAL300DPI m_scanparam->resolution_native = m_scanparam->resolution_dst > 240.0f ? 300.0f : 200.0f; @@ -1845,7 +1986,7 @@ void HuagaoDs::updataGscanCap() #endif m_scanparam->scannum = cfs.ScanCount; - m_scanparam->is_autotext = cfs.Orentation==4?1:0; + m_scanparam->is_autotext = cfs.Orentation == 4 ? 1 : 0; if (cfs.Orentation != 4) { m_scanparam->imageRotateDegree = rotateDegrees[cfs.Orentation]; } @@ -1867,6 +2008,10 @@ Twpp::Result HuagaoDs::startScan() return checkDeviceOnline(); scanner->ResetScanner(); +#ifndef G200 + scanner->clear_hwerror(); +#endif // + scanner->config_params(*m_scanparam); if (m_bIndicator) { //!< cancel button push @@ -1879,27 +2024,27 @@ Twpp::Result HuagaoDs::startScan() guiIndicator->ShowWindow(SW_SHOWNORMAL); } scanner->Scanner_StartScan(m_scanparam->scannum); - if (bmpData.size() > 0) + if (bmpData.size() > 0) bmpData.clear(); - if(guiTwain.get()){ + if (guiTwain.get()) { ((CTwainUI*)(guiTwain.get()))->EnableID_OKorID_Cancel(false); } int retCode = scanner->aquire_bmpdata(bmpData); - if (retCode!=0) { + if (retCode != 0) { scanner->Set_ErrorCode(0); guiIndicator.reset(); - if(retCode!=-1) - MessageBox(guiTwain? guiTwain->m_hWnd:NULL, noticeMsgMap[retCode], _T("ʾ"), MB_SYSTEMMODAL | MB_OK | MB_ICONINFORMATION); - - if (guiTwain.get()) { + if (retCode != -1) + MessageBox(guiTwain ? guiTwain->m_hWnd : NULL, noticeMsgMap[retCode], _T("ʾ"), MB_SYSTEMMODAL | MB_OK | MB_ICONINFORMATION); + + if (guiTwain.get()) { ((CTwainUI*)(guiTwain.get()))->EnableID_OKorID_Cancel(true); } return seqError(); } - if (bmpData.size()>0) { + if (bmpData.size() > 0) { return success(); } else { @@ -1909,4 +2054,4 @@ Twpp::Result HuagaoDs::startScan() } return seqError(); } -} +} \ No newline at end of file diff --git a/huagao/huagaods.hpp b/huagao/huagaods.hpp index 04c54057..0ac3a66c 100644 --- a/huagao/huagaods.hpp +++ b/huagao/huagaods.hpp @@ -8,12 +8,12 @@ namespace std { -template<> -struct hash { - size_t operator()(Twpp::CapType cap) const{ - return hash()(static_cast(cap)); - } -}; + template<> + struct hash { + size_t operator()(Twpp::CapType cap) const { + return hash()(static_cast(cap)); + } + }; } @@ -23,7 +23,7 @@ class HuagaoDs : public Twpp::SourceFromThis { public: HuagaoDs(); - virtual ~HuagaoDs(); + virtual ~HuagaoDs(); static const Twpp::Identity& defaultIdentity() noexcept; // SourceFromThis interface @@ -54,9 +54,16 @@ protected: virtual Twpp::Result imageLayoutReset(const Twpp::Identity& origin, Twpp::ImageLayout& data) override; virtual Twpp::Result imageMemXferGet(const Twpp::Identity& origin, Twpp::ImageMemXfer& data) override; virtual Twpp::Result imageNativeXferGet(const Twpp::Identity& origin, Twpp::ImageNativeXfer& data) override; - virtual Twpp::Result pendingXfersStopFeeder(const Twpp::Identity& origin, Twpp::PendingXfers& data) override; - virtual Twpp::Result call(const Twpp::Identity& origin, Twpp::DataGroup dg, Twpp::Dat dat, Twpp::Msg msg, void* data) override; + virtual Twpp::Result pendingXfersStopFeeder(const Twpp::Identity& origin, Twpp::PendingXfers& data) override; + virtual Twpp::Result imageFileXferGet(const Twpp::Identity& origin) override; + //virtual Twpp::Result pendingXfersStopFeeder(const Twpp::Identity& origin, Twpp::PendingXfers& data) override; + virtual Twpp::Result setupFileXferGet(const Twpp::Identity& origin, Twpp::SetupFileXfer& data) override; + virtual Twpp::Result setupFileXferGetDefault(const Twpp::Identity& origin, Twpp::SetupFileXfer& data) override; + virtual Twpp::Result setupFileXferSet(const Twpp::Identity& origin, Twpp::SetupFileXfer& data) override; + virtual Twpp::Result setupFileXferReset(const Twpp::Identity& origin, Twpp::SetupFileXfer& data) override; + virtual Twpp::Result call(const Twpp::Identity& origin, Twpp::DataGroup dg, Twpp::Dat dat, Twpp::Msg msg, void* data) override; + static void SetResoluton(const char* path, int resolution); private: Twpp::Result showTwainUI(Twpp::UserInterface& data, bool bUiOnly = false); Twpp::Result startScan(); @@ -72,6 +79,7 @@ private: std::unordered_map> m_caps; std::unordered_map m_query; + Twpp::SetupFileXfer m_fileXfer; Twpp::UInt32 m_memXferYOff = 0; Twpp::UInt16 m_pendingXfers = 0; @@ -79,6 +87,8 @@ private: Twpp::Fix32 m_brightness = 0.0f; Twpp::XferMech m_capXferMech = Twpp::XferMech::Native; Twpp::PixelType m_capPixelType = Twpp::PixelType::Rgb; + unsigned short m_jpegQuality = 80; + bool m_bIndicator = true; bool m_bFeederEnabled = true; bool m_bAutoFeed = true; @@ -86,7 +96,7 @@ private: std::vector bmpData; std::unique_ptr m_scanparam; - + HANDLE hMutex; }; diff --git a/huagao/huagaotwds.pro b/huagao/huagaotwds.pro index 8fd97b7a..b8989ac8 100644 --- a/huagao/huagaotwds.pro +++ b/huagao/huagaotwds.pro @@ -64,6 +64,8 @@ SOURCES += huagaods.cpp \ Device/cJSON.cpp \ Device/CJsonObject.cpp \ Device/JsonConfig.cpp \ + Device/GetMemoryUsage.cpp \ + Device/G400ScanConfig.cpp \ ImageProcess/ImageApply.cpp \ ImageProcess/ImageApplyAdjustColors.cpp \ ImageProcess/ImageApplyAutoCrop.cpp \ @@ -77,6 +79,7 @@ SOURCES += huagaods.cpp \ ImageProcess/ImageApplySharpen.cpp \ ImageProcess/ImageProcess_Public.cpp \ ImageProcess/ImageApplyConcatenation.cpp \ + G400ScanConfig.cpp \ Sliders.cpp \ SmartEdit.cpp \ TabCtrlSSL.cpp \ @@ -109,12 +112,14 @@ HEADERS += huagaods.hpp \ Device/UsbScanEx.h \ Device/config_new.h \ Device/device_common.h \ + Device/GetMemoryUsage.h \ Device/GScan.h \ Device/scn_config.h \ Device/filetools.h \ Device/cJSON.h \ Device/JsonConfig.h \ Device/CJsonObject.hpp \ + Device/G400ScanConfig.h \ ImageProcess/ImageApply.h \ ImageProcess/ImageApplyAdjustColors.h \ ImageProcess/ImageApplyAutoCrop.h \ diff --git a/huagao/stdafx.h b/huagao/stdafx.h index 0bae122630bdde5ac74f4469be99cbf1bd96dcf4..fcf85a7ce92bef2f8e13d29073111997508a607e 100644 GIT binary patch delta 92 zcmeyPvPE?RAE&fFgFb^YLkdGGLmERSLmrS;U~p$JVlZGZn9RxfSu~hIm%#$aGX!D< lh5&{j27d;n$p<+_C(Cgi5Htj<1gmB+1*$RHe4lGBI{;5C5#;~? delta 40 wcmdm@`bT90ALnE}&Uf6I47v=43