#ifndef SIMPLEDS_HPP #define SIMPLEDS_HPP #include #include #include #include #include namespace std { template<> struct hash { size_t operator()(Twpp::CapType cap) const { return hash()(static_cast(cap)); } }; } typedef struct GScanCap GScanCap; class HuagaoDs : public Twpp::SourceFromThis { public: HuagaoDs(); virtual ~HuagaoDs(); static const Twpp::Identity& defaultIdentity() noexcept; // SourceFromThis interface protected: typedef Twpp::SourceFromThis Base; virtual Twpp::Result capabilityGet(const Twpp::Identity& origin, Twpp::Capability& data) override; virtual Twpp::Result capabilityGetCurrent(const Twpp::Identity& origin, Twpp::Capability& data) override; virtual Twpp::Result capabilityGetDefault(const Twpp::Identity& origin, Twpp::Capability& data) override; virtual Twpp::Result capabilityQuerySupport(const Twpp::Identity& origin, Twpp::Capability& data) override; virtual Twpp::Result capabilityReset(const Twpp::Identity& origin, Twpp::Capability& data) override; virtual Twpp::Result capabilityResetAll(const Twpp::Identity& origin) override; virtual Twpp::Result capabilitySet(const Twpp::Identity& origin, Twpp::Capability& data) override; virtual Twpp::Result eventProcess(const Twpp::Identity& origin, Twpp::Event& data) override; virtual Twpp::Result deviceEventGet(const Twpp::Identity& origin, Twpp::DeviceEvent& data) override; virtual Twpp::Result identityOpenDs(const Twpp::Identity& origin) override; virtual Twpp::Result identityCloseDs(const Twpp::Identity& origin) override; virtual Twpp::Result pendingXfersGet(const Twpp::Identity& origin, Twpp::PendingXfers& data) override; virtual Twpp::Result pendingXfersEnd(const Twpp::Identity& origin, Twpp::PendingXfers& data) override; virtual Twpp::Result pendingXfersReset(const Twpp::Identity& origin, Twpp::PendingXfers& data) override; virtual Twpp::Result setupMemXferGet(const Twpp::Identity& origin, Twpp::SetupMemXfer& data) override; virtual Twpp::Result userInterfaceDisable(const Twpp::Identity& origin, Twpp::UserInterface& data) override; virtual Twpp::Result userInterfaceEnable(const Twpp::Identity& origin, Twpp::UserInterface& data) override; virtual Twpp::Result userInterfaceEnableUiOnly(const Twpp::Identity& origin, Twpp::UserInterface& data) override; virtual Twpp::Result imageInfoGet(const Twpp::Identity& origin, Twpp::ImageInfo& data) override; virtual Twpp::Result imageLayoutGet(const Twpp::Identity& origin, Twpp::ImageLayout& data) override; virtual Twpp::Result imageLayoutGetDefault(const Twpp::Identity& origin, Twpp::ImageLayout& data) override; virtual Twpp::Result imageLayoutSet(const Twpp::Identity& origin, Twpp::ImageLayout& data) override; 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 imageFileXferGet(const Twpp::Identity& origin) 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; /// Get custom data TWAIN call. /// Always called in correct state. /// Default implementation does nothing. /// \param origin Identity of the caller. /// \param data Custom data. virtual Twpp::Result customDataGet(const Twpp::Identity& origin, Twpp::CustomData& data) override; /// Set custom data TWAIN call. /// Always called in correct state. /// Default implementation does nothing. /// \param origin Identity of the caller. /// \param data Custom data. virtual Twpp::Result customDataSet(const Twpp::Identity& origin, Twpp::CustomData& data) override; void SetResoluton(const char* path, int resolution); private://method Twpp::Result showTwainUI(Twpp::UserInterface& data, bool bUiOnly = false); static void DeviceEvent_callback(int eventID, void* usrdata); void HuagaoDs::onDeviceEvent(int eventID); Twpp::Result startScan(); void saveGscanCapSetting(); const BITMAPINFOHEADER* header() const noexcept; Twpp::UInt32 bytesPerLine() const noexcept; Twpp::UInt32 bmpSize() const noexcept; const char* bmpBegin() const noexcept; const char* bmpEnd() const noexcept; void updataGscanCap(); Twpp::Result capCommon(const Twpp::Identity& origin, Twpp::Msg msg, Twpp::Capability& data); private://field std::unordered_map> m_caps; std::unordered_map m_query; Twpp::SetupFileXfer m_fileXfer; Twpp::UInt32 m_memXferYOff = 0; Twpp::UInt16 m_pendingXfers = 0; Twpp::UInt16 m_autosize = 0; Twpp::Bool m_autoscan = true; Twpp::Bool m_autoboarderdetcet = false; 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; Twpp::Compression m_compression= Twpp::Compression::None; bool m_bIndicator = true; bool m_bCustomDsData = true; bool m_bFeederEnabled = true; bool m_bAutoFeed = true; UINT16 m_iBitdepth; Twpp::ImageFileFormat m_capImageFileFormat = Twpp::ImageFileFormat::Bmp; std::queue devEvent; std::vector bmpData; std::unique_ptr m_scanparam; HANDLE hMutex; }; #endif // SIMPLEDS_HPP