diff options
Diffstat (limited to 'libkscan/img_canvas.h')
-rw-r--r-- | libkscan/img_canvas.h | 221 |
1 files changed, 221 insertions, 0 deletions
diff --git a/libkscan/img_canvas.h b/libkscan/img_canvas.h new file mode 100644 index 00000000..5abf267c --- /dev/null +++ b/libkscan/img_canvas.h @@ -0,0 +1,221 @@ +/* This file is part of the KDE Project + Copyright (C) 1999 Klaas Freitag <[email protected]> + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifndef __IMG_CANVAS_H__ +#define __IMG_CANVAS_H__ + +#include <qwidget.h> +#include <qrect.h> +#include <stdlib.h> +#include <qsize.h> +#include <qwmatrix.h> +#include <qscrollview.h> +#include <qstrlist.h> + +#ifdef USE_KPIXMAPIO +#include <kpixmapio.h> +#endif + +class QPopupMenu; +class QPixmap; +class QImage; +class QPainter; + +enum preview_state { + MOVE_NONE, + MOVE_TOP_LEFT, + MOVE_TOP_RIGHT, + MOVE_BOTTOM_LEFT, + MOVE_BOTTOM_RIGHT, + MOVE_LEFT, + MOVE_RIGHT, + MOVE_TOP, + MOVE_BOTTOM, + MOVE_WHOLE +}; + +enum cursor_type { + CROSS, + VSIZE, + HSIZE, + BDIAG, + FDIAG, + ALL, + HREN +}; + +const int MIN_AREA_WIDTH = 3; +const int MIN_AREA_HEIGHT = 3; +const int delta = 3; +#ifdef __PREVIEW_CPP__ +int max_dpi = 600; +#else +extern int max_dpi; +#endif + + + +class ImageCanvas: public QScrollView +{ + Q_OBJECT + Q_ENUMS( PopupIDs ) + Q_PROPERTY( int brightness READ getBrightness WRITE setBrightness ) + Q_PROPERTY( int contrast READ getContrast WRITE setContrast ) + Q_PROPERTY( int gamma READ getGamma WRITE setGamma ) + Q_PROPERTY( int scale_factor READ getScaleFactor WRITE setScaleFactor ) + +public: + ImageCanvas( QWidget *parent = 0, + const QImage *start_image = 0, + const char *name = 0); + ~ImageCanvas( ); + + int getBrightness() const; + int getContrast() const; + int getGamma() const; + + int getScaleFactor() const; + + const QImage *rootImage(); + + bool hasImage( void ) { return acquired; } + QPopupMenu* contextMenu() { return m_contextMenu; } + QRect sel( void ); + + enum ScaleKinds { UNSPEC, DYNAMIC, FIT_ORIG, FIT_WIDTH, FIT_HEIGHT, ZOOM }; + + enum PopupIDs { ID_POP_ZOOM, ID_POP_CLOSE, ID_FIT_WIDTH, + ID_FIT_HEIGHT, ID_ORIG_SIZE }; + + bool selectedImage( QImage* ); + + ScaleKinds scaleKind(); + const QString scaleKindString(); + + ScaleKinds defaultScaleKind(); + + const QString imageInfoString( int w=0, int h=0, int d=0 ); + +public slots: + void setBrightness(int); + void setContrast(int ); + void setGamma(int ); + + void toggleAspect( int aspect_in_mind ) + { + maintain_aspect = aspect_in_mind; + repaint(); + } + virtual QSize sizeHint() const; + void newImage( QImage* ); + void newImageHoldZoom( QImage* ); + void deleteView( QImage *); + void newRectSlot(); + void newRectSlot( QRect newSel ); + void noRectSlot( void ); + void setScaleFactor( int i ); + void handle_popup(int item ); + void enableContextMenu( bool wantContextMenu ); + void setKeepZoom( bool k ); + void setScaleKind( ScaleKinds k ); + void setDefaultScaleKind( ScaleKinds k ); + + /** + * Highlight a rectangular area on the current image using the given brush + * and pen. + * The function returns a id that needs to be given to the remove method. + */ + int highlight( const QRect&, const QPen&, const QBrush&, bool ensureVis=false ); + + /** + * reverts the highlighted region back to normal view. + */ + void removeHighlight( int idx = -1 ); + + /** + * permit to do changes to the image that are saved back to the file + */ + void setReadOnly( bool ); + + bool readOnly(); + +signals: + void noRect( void ); + void newRect( void ); + void newRect( QRect ); + void scalingRequested(); + void closingRequested(); + void scalingChanged( const QString& ); + /** + * signal emitted if the permission of the currently displayed image changed, + * ie. if it goes from writeable to readable. + * @param shows if the image is now read only (true) or not. + */ + void imageReadOnly( bool isRO ); + +protected: + void drawContents( QPainter * p, int clipx, int clipy, int clipw, int cliph ); + + void timerEvent(QTimerEvent *); + void viewportMousePressEvent(QMouseEvent *); + void viewportMouseReleaseEvent(QMouseEvent *); + void viewportMouseMoveEvent(QMouseEvent *); + + void resizeEvent( QResizeEvent * event ); + +private: + QStrList urls; + + int scale_factor; + const QImage *image; + int brightness, contrast, gamma; + + +#ifdef USE_KPIXMAPIO + KPixmapIO pixIO; +#endif + + QWMatrix scale_matrix; + QWMatrix inv_scale_matrix; + QPixmap *pmScaled; + float used_yscaler; + float used_xscaler; + QPopupMenu *m_contextMenu; + bool maintain_aspect; + + int timer_id; + QRect *selected; + preview_state moving; + int cr1,cr2; + int lx,ly; + bool acquired; + + /* private functions for the running ant */ + void drawHAreaBorder(QPainter &p,int x1,int x2,int y,int r = FALSE); + void drawVAreaBorder(QPainter &p,int x,int y1,int y2,int r = FALSE); + void drawAreaBorder(QPainter *p,int r = FALSE); + void update_scaled_pixmap( void ); + + preview_state classifyPoint(int x,int y); + + class ImageCanvasPrivate; + ImageCanvasPrivate *d; +}; + +#endif |