diff options
Diffstat (limited to 'lib/basic-imgstream.hh')
-rw-r--r-- | lib/basic-imgstream.hh | 144 |
1 files changed, 144 insertions, 0 deletions
diff --git a/lib/basic-imgstream.hh b/lib/basic-imgstream.hh new file mode 100644 index 0000000..f55bc60 --- /dev/null +++ b/lib/basic-imgstream.hh @@ -0,0 +1,144 @@ +// basic-imgstream.hh -- the mother of all image streams +// Copyright (C) 2008, 2009 SEIKO EPSON CORPORATION +// +// This file is part of the 'iscan' program. +// +// The 'iscan' program is free-ish software. +// You can redistribute it and/or modify it under the terms of the GNU +// General Public License as published by the Free Software Foundation; +// either version 2 of the License or at your option any later version. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of FITNESS +// FOR A PARTICULAR PURPOSE or MERCHANTABILITY. +// See the GNU General Public License for more details. +// +// You should have received a verbatim copy of the GNU General Public +// License along with this program; if not, write to: +// +// Free Software Foundation, Inc. +// 59 Temple Place, Suite 330 +// Boston, MA 02111-1307 USA +// +// As a special exception, the copyright holders give permission +// to link the code of this program with the esmod library and +// distribute linked combinations including the two. You must obey +// the GNU General Public License in all respects for all of the +// code used other then esmod. + + +#ifndef iscan_basic_imgstream_hh_included +#define iscan_basic_imgstream_hh_included + +#ifndef __cplusplus +#error "This is a C++ header file; use a C++ compiler to compile it." +#endif + +#ifdef HAVE_CONFIG_H +#include "config.h" + +#ifndef LT_MODULE_EXT +#define LT_MODULE_EXT LTDL_SHLIB_EXT +#endif + +#ifndef LT_MODULE_PATH_VAR +#define LT_MODULE_PATH_VAR LTDL_SHLIBPATH_VAR +#endif + +#ifndef LT_DLSEARCH_PATH +#define LT_DLSEARCH_PATH LTDL_SYSSEARCHPATH +#endif + +#endif + +#include <dirent.h> +#include <ltdl.h> +#include <stdexcept> + +namespace iscan +{ + using std::runtime_error; + + enum colour_space + { + NONE, + + monochrome, + mono = monochrome, + + grayscale, + greyscale = grayscale, + gray = grayscale, + grey = grayscale, + + RGB, + RGB_alpha + }; + + class basic_imgstream + { + public: + typedef char byte_type; + typedef size_t size_type; + + virtual ~basic_imgstream (void); + + virtual basic_imgstream& write (const byte_type *line, size_type n) = 0; + virtual basic_imgstream& flush (void); + + virtual basic_imgstream& size (size_type h_sz, size_type v_sz); + virtual basic_imgstream& resolution (size_type hres, size_type vres); + virtual basic_imgstream& depth (size_type bits); + virtual basic_imgstream& colour (colour_space space); + virtual void rotate_180 (bool yes) {}; + + protected: + basic_imgstream (void); + + size_type _h_sz; + size_type _v_sz; + size_type _hres; + size_type _vres; + + size_type _bits; + colour_space _cspc; + + private: // undefined to prevent copying + basic_imgstream (const basic_imgstream&); + basic_imgstream& operator= (const basic_imgstream&); + + + // API to deal with external image format libraries + + protected: + typedef lt_dlhandle dl_handle; + typedef lt_ptr dl_ptr; + + static dl_handle dlopen (const char *libname, + bool (*validate) (dl_handle) = NULL); + static dl_ptr dlsym (dl_handle lib, const char *funcname); + static int dlclose (dl_handle lib); + + private: + static dl_handle find_dlopen (const char *libname, + bool (*validate) (dl_handle)); + static const char *_libname; + + friend int selector (const dirent *); + +#ifdef __GNUC__ +#define fundecl(returntype,funcname,arglist...) \ + typedef returntype (*funcname##_f) (arglist); \ + funcname##_f funcname; +#else +#error "Your compiler is not known to support macros with a variable" +#error "number of arguments. In case it does, please report this to" +#error "the library maintainers and include a suitable preprocessor" +#error "check for them to add. A patch will be most appreciated." +#endif + + }; + +} // namespace iscan + +#endif /* !defined (iscan_basic_imgstream_hh_included) */ |