#pragma once #include "s2t_api.h" class refer : public IRef { volatile long ref_; protected: refer(); virtual ~refer(); // IRef public: COM_API_OVERRIDE(long, add_ref(void)); COM_API_OVERRIDE(long, release(void)); }; class mapping_buf { unsigned long long bytes_; unsigned long long offset_; unsigned int page_size_; unsigned int map_unit_; unsigned int mapped_bytes_; HANDLE map_; bool is_mem_; unsigned char* buf_; std::string file_; bool rmv_file_; void init_map(const char* file, unsigned long long size); void close(void); void map(void); void set_buffer(unsigned char*& buf, unsigned long long off, unsigned int* bytes); public: mapping_buf(); ~mapping_buf(); public: unsigned char* allocate(const wchar_t* file, unsigned long long size = 0); unsigned char* buffer(unsigned long long off, unsigned int* bytes); bool save(const void* data, size_t* bytes, unsigned long long off); int read(void* buf, size_t* bytes, unsigned long long off); void unmap(); void set_remove_file_when_destroyed(bool rmv); const char* file(void); unsigned long long bytes(void); unsigned long long offset(void); unsigned int mapped_bytes(void); }; class scanned_img : public IScanImg, virtual public refer { SANE_Parameters head_; mapping_buf* data_; int dpi_; unsigned int header_size_; SANE_FinalImgFormat fmt_; std::string file_header(SANE_ImageType type, float resolution, twain_xfer xfer); public: scanned_img(SANE_Parameters head, SANE_Handle dev, int dpi, const wchar_t* tmp_file , twain_xfer xfer = TWAIN_XFER_Native, SANE_FinalImgFormat *fmt = NULL); protected: ~scanned_img(); // IRef public: COM_API_OVERRIDE(long, add_ref(void)); COM_API_OVERRIDE(long, release(void)); // IScanImg public: COM_API_OVERRIDE(int, width(void)); COM_API_OVERRIDE(int, line_bytes(void)); COM_API_OVERRIDE(int, height(void)); COM_API_OVERRIDE(int, depth(void)); COM_API_OVERRIDE(int, channel(void)); COM_API_OVERRIDE(SANE_Frame, type(void)); COM_API_OVERRIDE(unsigned int, bytes(void)); COM_API_OVERRIDE(unsigned int, header_size(void)); COM_API_OVERRIDE(unsigned char*, data(unsigned long long off, unsigned int* bytes)); COM_API_OVERRIDE(int, read(void* buf, size_t* bytes, unsigned long long off = 0)); COM_API_OVERRIDE(const char*, file(void)); COM_API_OVERRIDE(void, keep_file(bool keep)); COM_API_OVERRIDE(void, copy_header(SANE_Parameters* head)); }; namespace local_trans { std::string u2a(const wchar_t* unic, UINT cp = CP_ACP); std::wstring a2u(const char* asc, UINT cp = CP_ACP); }