summaryrefslogtreecommitdiffstats
path: root/doc/html/showimg-example.html
diff options
context:
space:
mode:
Diffstat (limited to 'doc/html/showimg-example.html')
-rw-r--r--doc/html/showimg-example.html883
1 files changed, 883 insertions, 0 deletions
diff --git a/doc/html/showimg-example.html b/doc/html/showimg-example.html
new file mode 100644
index 0000000..ae6fe8d
--- /dev/null
+++ b/doc/html/showimg-example.html
@@ -0,0 +1,883 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<!-- /home/espenr/tmp/qt-3.3.8-espenr-2499/qt-x11-free-3.3.8/examples/showimg/showimg.doc:4 -->
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>Show Image</title>
+<style type="text/css"><!--
+fn { margin-left: 1cm; text-indent: -1cm; }
+a:link { color: #004faf; text-decoration: none }
+a:visited { color: #672967; text-decoration: none }
+body { background: #ffffff; color: black; }
+--></style>
+</head>
+<body>
+
+<table border="0" cellpadding="0" cellspacing="0" width="100%">
+<tr bgcolor="#E5E5E5">
+<td valign=center>
+ <a href="index.html">
+<font color="#004faf">Home</font></a>
+ | <a href="classes.html">
+<font color="#004faf">All&nbsp;Classes</font></a>
+ | <a href="mainclasses.html">
+<font color="#004faf">Main&nbsp;Classes</font></a>
+ | <a href="annotated.html">
+<font color="#004faf">Annotated</font></a>
+ | <a href="groups.html">
+<font color="#004faf">Grouped&nbsp;Classes</font></a>
+ | <a href="functions.html">
+<font color="#004faf">Functions</font></a>
+</td>
+<td align="right" valign="center"><img src="logo32.png" align="right" width="64" height="32" border="0"></td></tr></table><h1 align=center>Show Image</h1>
+
+
+<p>
+This example reads and displays an image in any supported image
+format (GIF, BMP, PPM, XMP, etc.).
+<p> <hr>
+<p> Header file:
+<p> <pre>/****************************************************************************
+** $Id: qt/showimg.h 3.3.8 edited Jan 11 14:37 $
+**
+** Copyright (C) 1992-2007 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for Qt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#ifndef SHOWIMG_H
+#define SHOWIMG_H
+
+#include &lt;<a href="qwidget-h.html">qwidget.h</a>&gt;
+#include &lt;<a href="qimage-h.html">qimage.h</a>&gt;
+
+
+class QLabel;
+class QMenuBar;
+class QPopupMenu;
+
+class ImageViewer : public <a href="qwidget.html">QWidget</a>
+{
+ <a href="metaobjects.html#Q_OBJECT">Q_OBJECT</a>
+public:
+ ImageViewer( <a href="qwidget.html">QWidget</a> *parent=0, const char *name=0, int wFlags=0 );
+ ~ImageViewer();
+ bool loadImage( const <a href="qstring.html">QString</a>&amp; );
+protected:
+ void paintEvent( <a href="qpaintevent.html">QPaintEvent</a> * );
+ void resizeEvent( <a href="qresizeevent.html">QResizeEvent</a> * );
+ void mousePressEvent( <a href="qmouseevent.html">QMouseEvent</a> * );
+ void mouseReleaseEvent( <a href="qmouseevent.html">QMouseEvent</a> * );
+ void mouseMoveEvent( <a href="qmouseevent.html">QMouseEvent</a> * );
+
+private:
+ void scale();
+ int conversion_flags;
+ bool smooth() const;
+ bool useColorContext() const;
+ int alloc_context;
+ bool convertEvent( <a href="qmouseevent.html">QMouseEvent</a>* e, int&amp; x, int&amp; y );
+ <a href="qstring.html">QString</a> filename;
+ <a href="qimage.html">QImage</a> image; // the loaded image
+ <a href="qpixmap.html">QPixmap</a> pm; // the converted pixmap
+ <a href="qpixmap.html">QPixmap</a> pmScaled; // the scaled pixmap
+
+ <a href="qmenubar.html">QMenuBar</a> *menubar;
+ <a href="qpopupmenu.html">QPopupMenu</a> *file;
+ <a href="qpopupmenu.html">QPopupMenu</a> *saveimage;
+ <a href="qpopupmenu.html">QPopupMenu</a> *savepixmap;
+ <a href="qpopupmenu.html">QPopupMenu</a> *edit;
+ <a href="qpopupmenu.html">QPopupMenu</a> *options;
+
+ <a href="qwidget.html">QWidget</a> *helpmsg;
+ <a href="qlabel.html">QLabel</a> *status;
+ int si, sp, ac, co, mo, fd, bd, // Menu item ids
+ td, ta, ba, fa, au, ad, dd,
+ ss, cc, t1, t8, t32;
+ void updateStatus();
+ void setMenuItemFlags();
+ bool reconvertImage();
+ int pickx, picky;
+ int clickx, clicky;
+ bool may_be_other;
+ static ImageViewer* other;
+ void setImage(const <a href="qimage.html">QImage</a>&amp; newimage);
+
+private slots:
+ void to1Bit();
+ void to8Bit();
+ void to32Bit();
+ void toBitDepth(int);
+
+ void copy();
+ void paste();
+
+ void hFlip();
+ void vFlip();
+ void rot180();
+
+ void editText();
+
+ void newWindow();
+ void openFile();
+ void saveImage(int);
+ void savePixmap(int);
+ void giveHelp();
+ void doOption(int);
+ void copyFrom(ImageViewer*);
+};
+
+
+#endif // SHOWIMG_H
+</pre>
+
+<p> <hr>
+<p> Implementation:
+<p> <pre>/****************************************************************************
+** $Id: qt/showimg.cpp 3.3.8 edited Jan 11 14:37 $
+**
+** Copyright (C) 1992-2007 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for Qt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "showimg.h"
+#include "imagetexteditor.h"
+#include &lt;<a href="qmenubar-h.html">qmenubar.h</a>&gt;
+#include &lt;<a href="qfiledialog-h.html">qfiledialog.h</a>&gt;
+#include &lt;<a href="qmessagebox-h.html">qmessagebox.h</a>&gt;
+#include &lt;<a href="qpopupmenu-h.html">qpopupmenu.h</a>&gt;
+#include &lt;<a href="qlabel-h.html">qlabel.h</a>&gt;
+#include &lt;<a href="qpainter-h.html">qpainter.h</a>&gt;
+#include &lt;<a href="qapplication-h.html">qapplication.h</a>&gt;
+#include &lt;<a href="qclipboard-h.html">qclipboard.h</a>&gt;
+
+
+/*
+ In the constructor, we just pass the standard parameters on to
+ QWidget.
+
+ The menu uses a single slot to simplify the process of adding
+ more items to the options menu.
+*/
+<a name="f405"></a>ImageViewer::ImageViewer( <a href="qwidget.html">QWidget</a> *parent, const char *name, int wFlags )
+ : <a href="qwidget.html">QWidget</a>( parent, name, wFlags ),
+ conversion_flags( PreferDither ),
+ helpmsg( 0 )
+{
+ pickx = -1;
+ picky = -1;
+ clickx = -1;
+ clicky = -1;
+ alloc_context = 0;
+
+ menubar = new <a href="qmenubar.html">QMenuBar</a>(this);
+<a name="x1326"></a> menubar-&gt;<a href="qmenubar.html#setSeparator">setSeparator</a>( QMenuBar::InWindowsStyle );
+
+<a name="x1323"></a> <a href="qstrlist.html">QStrList</a> fmt = QImage::<a href="qimage.html#outputFormats">outputFormats</a>();
+ saveimage = new <a href="qpopupmenu.html">QPopupMenu</a>( menubar );
+ savepixmap = new <a href="qpopupmenu.html">QPopupMenu</a>( menubar );
+<a name="x1344"></a><a name="x1343"></a> for (const char* f = fmt.<a href="qptrlist.html#first">first</a>(); f; f = fmt.<a href="qptrlist.html#next">next</a>()) {
+<a name="x1327"></a> saveimage-&gt;<a href="qmenudata.html#insertItem">insertItem</a>( f );
+ savepixmap-&gt;<a href="qmenudata.html#insertItem">insertItem</a>( f );
+ }
+<a name="x1341"></a> <a href="qobject.html#connect">connect</a>( saveimage, SIGNAL(<a href="qpopupmenu.html#activated">activated</a>(int)), this, SLOT(saveImage(int)) );
+ <a href="qobject.html#connect">connect</a>( savepixmap, SIGNAL(<a href="qpopupmenu.html#activated">activated</a>(int)), this, SLOT(savePixmap(int)) );
+
+ file = new <a href="qpopupmenu.html">QPopupMenu</a>( menubar );
+ menubar-&gt;<a href="qmenudata.html#insertItem">insertItem</a>( "&amp;File", file );
+ file-&gt;<a href="qmenudata.html#insertItem">insertItem</a>( "&amp;New window", this, SLOT(newWindow()), CTRL+Key_N );
+ file-&gt;<a href="qmenudata.html#insertItem">insertItem</a>( "&amp;Open...", this, SLOT(openFile()), CTRL+Key_O );
+ si = file-&gt;<a href="qmenudata.html#insertItem">insertItem</a>( "Save image", saveimage );
+ sp = file-&gt;<a href="qmenudata.html#insertItem">insertItem</a>( "Save pixmap", savepixmap );
+<a name="x1328"></a> file-&gt;<a href="qmenudata.html#insertSeparator">insertSeparator</a>();
+ file-&gt;<a href="qmenudata.html#insertItem">insertItem</a>( "E&amp;xit", qApp, SLOT(<a href="qapplication.html#quit">quit</a>()), CTRL+Key_Q );
+
+ edit = new <a href="qpopupmenu.html">QPopupMenu</a>( menubar );
+ menubar-&gt;<a href="qmenudata.html#insertItem">insertItem</a>( "&amp;Edit", edit );
+ edit-&gt;<a href="qmenudata.html#insertItem">insertItem</a>("&amp;Copy", this, SLOT(copy()), CTRL+Key_C);
+ edit-&gt;<a href="qmenudata.html#insertItem">insertItem</a>("&amp;Paste", this, SLOT(paste()), CTRL+Key_V);
+ edit-&gt;<a href="qmenudata.html#insertSeparator">insertSeparator</a>();
+ edit-&gt;<a href="qmenudata.html#insertItem">insertItem</a>("&amp;Horizontal flip", this, SLOT(hFlip()), ALT+Key_H);
+ edit-&gt;<a href="qmenudata.html#insertItem">insertItem</a>("&amp;Vertical flip", this, SLOT(vFlip()), ALT+Key_V);
+ edit-&gt;<a href="qmenudata.html#insertItem">insertItem</a>("&amp;Rotate 180", this, SLOT(rot180()), ALT+Key_R);
+ edit-&gt;<a href="qmenudata.html#insertSeparator">insertSeparator</a>();
+ edit-&gt;<a href="qmenudata.html#insertItem">insertItem</a>("&amp;Text...", this, SLOT(editText()));
+ edit-&gt;<a href="qmenudata.html#insertSeparator">insertSeparator</a>();
+ t1 = edit-&gt;<a href="qmenudata.html#insertItem">insertItem</a>( "Convert to &amp;1 bit", this, SLOT(to1Bit()) );
+ t8 = edit-&gt;<a href="qmenudata.html#insertItem">insertItem</a>( "Convert to &amp;8 bit", this, SLOT(to8Bit()) );
+ t32 = edit-&gt;<a href="qmenudata.html#insertItem">insertItem</a>( "Convert to &amp;32 bit", this, SLOT(to32Bit()) );
+
+ options = new <a href="qpopupmenu.html">QPopupMenu</a>( menubar );
+ menubar-&gt;<a href="qmenudata.html#insertItem">insertItem</a>( "&amp;Options", options );
+ ac = options-&gt;<a href="qmenudata.html#insertItem">insertItem</a>( "AutoColor" );
+ co = options-&gt;<a href="qmenudata.html#insertItem">insertItem</a>( "ColorOnly" );
+ mo = options-&gt;<a href="qmenudata.html#insertItem">insertItem</a>( "MonoOnly" );
+ options-&gt;<a href="qmenudata.html#insertSeparator">insertSeparator</a>();
+ fd = options-&gt;<a href="qmenudata.html#insertItem">insertItem</a>( "DiffuseDither" );
+ bd = options-&gt;<a href="qmenudata.html#insertItem">insertItem</a>( "OrderedDither" );
+ td = options-&gt;<a href="qmenudata.html#insertItem">insertItem</a>( "ThresholdDither" );
+ options-&gt;<a href="qmenudata.html#insertSeparator">insertSeparator</a>();
+ ta = options-&gt;<a href="qmenudata.html#insertItem">insertItem</a>( "ThresholdAlphaDither" );
+ ba = options-&gt;<a href="qmenudata.html#insertItem">insertItem</a>( "OrderedAlphaDither" );
+ fa = options-&gt;<a href="qmenudata.html#insertItem">insertItem</a>( "DiffuseAlphaDither" );
+ options-&gt;<a href="qmenudata.html#insertSeparator">insertSeparator</a>();
+ ad = options-&gt;<a href="qmenudata.html#insertItem">insertItem</a>( "PreferDither" );
+ dd = options-&gt;<a href="qmenudata.html#insertItem">insertItem</a>( "AvoidDither" );
+ options-&gt;<a href="qmenudata.html#insertSeparator">insertSeparator</a>();
+ ss = options-&gt;<a href="qmenudata.html#insertItem">insertItem</a>( "Smooth scaling" );
+ cc = options-&gt;<a href="qmenudata.html#insertItem">insertItem</a>( "Use color context" );
+<a name="x1309"></a> if ( QApplication::<a href="qapplication.html#colorSpec">colorSpec</a>() == QApplication::ManyColor )
+<a name="x1331"></a> options-&gt;<a href="qmenudata.html#setItemEnabled">setItemEnabled</a>( cc, FALSE );
+<a name="x1342"></a> options-&gt;<a href="qpopupmenu.html#setCheckable">setCheckable</a>( TRUE );
+ setMenuItemFlags();
+
+ menubar-&gt;<a href="qmenudata.html#insertSeparator">insertSeparator</a>();
+
+ <a href="qpopupmenu.html">QPopupMenu</a>* help = new <a href="qpopupmenu.html">QPopupMenu</a>( menubar );
+ menubar-&gt;<a href="qmenudata.html#insertItem">insertItem</a>( "&amp;Help", help );
+ help-&gt;<a href="qmenudata.html#insertItem">insertItem</a>( "Help!", this, SLOT(giveHelp()), CTRL+Key_H );
+
+ <a href="qobject.html#connect">connect</a>( options, SIGNAL(<a href="qpopupmenu.html#activated">activated</a>(int)), this, SLOT(doOption(int)) );
+
+ status = new <a href="qlabel.html">QLabel</a>(this);
+ status-&gt;<a href="qframe.html#setFrameStyle">setFrameStyle</a>( QFrame::WinPanel | QFrame::Sunken );
+<a name="x1354"></a> status-&gt;<a href="qwidget.html#setFixedHeight">setFixedHeight</a>( <a href="qwidget.html#fontMetrics">fontMetrics</a>().height() + 4 );
+
+ <a href="qwidget.html#setMouseTracking">setMouseTracking</a>( TRUE );
+}
+
+ImageViewer::~ImageViewer()
+{
+ if ( alloc_context )
+<a name="x1313"></a> QColor::<a href="qcolor.html#destroyAllocContext">destroyAllocContext</a>( alloc_context );
+ if ( other == this )
+ other = 0;
+}
+
+/*
+ This function modifies the conversion_flags when an options menu item
+ is selected, then ensures all menu items are up to date, and reconverts
+ the image if possibly necessary.
+*/
+void <a name="f406"></a>ImageViewer::doOption(int item)
+{
+ if ( item == ss || item == cc ) {
+ // Toggle
+<a name="x1329"></a> bool newbool = !options-&gt;<a href="qmenudata.html#isItemChecked">isItemChecked</a>(item);
+<a name="x1330"></a> options-&gt;<a href="qmenudata.html#setItemChecked">setItemChecked</a>(item, newbool);
+ // And reconvert...
+ reconvertImage();
+ <a href="qwidget.html#repaint">repaint</a>(image.hasAlphaBuffer()); // show image in widget
+ return;
+ }
+
+ if ( options-&gt;<a href="qmenudata.html#isItemChecked">isItemChecked</a>( item ) ) return; // They are all radio buttons
+
+ int ocf = conversion_flags;
+
+ if ( item == ac ) {
+ conversion_flags = ( conversion_flags &amp; ~ColorMode_Mask ) | AutoColor;
+ } else if ( item == co ) {
+ conversion_flags = ( conversion_flags &amp; ~ColorMode_Mask ) | ColorOnly;
+ } else if ( item == mo ) {
+ conversion_flags = ( conversion_flags &amp; ~ColorMode_Mask ) | MonoOnly;
+ } else if ( item == fd ) {
+ conversion_flags = ( conversion_flags &amp; ~Dither_Mask ) | DiffuseDither;
+ } else if ( item == bd ) {
+ conversion_flags = ( conversion_flags &amp; ~Dither_Mask ) | OrderedDither;
+ } else if ( item == td ) {
+ conversion_flags = ( conversion_flags &amp; ~Dither_Mask ) | ThresholdDither;
+ } else if ( item == ta ) {
+ conversion_flags = ( conversion_flags &amp; ~AlphaDither_Mask ) | ThresholdAlphaDither;
+ } else if ( item == fa ) {
+ conversion_flags = ( conversion_flags &amp; ~AlphaDither_Mask ) | DiffuseAlphaDither;
+ } else if ( item == ba ) {
+ conversion_flags = ( conversion_flags &amp; ~AlphaDither_Mask ) | OrderedAlphaDither;
+ } else if ( item == ad ) {
+ conversion_flags = ( conversion_flags &amp; ~DitherMode_Mask ) | PreferDither;
+ } else if ( item == dd ) {
+ conversion_flags = ( conversion_flags &amp; ~DitherMode_Mask ) | AvoidDither;
+ }
+
+ if ( ocf != conversion_flags ) {
+ setMenuItemFlags();
+ // And reconvert...
+ reconvertImage();
+ <a href="qwidget.html#repaint">repaint</a>(image.hasAlphaBuffer()); // show image in widget
+ }
+}
+
+/*
+ Set the options menu to reflect the conversion_flags value.
+*/
+void <a name="f407"></a>ImageViewer::setMenuItemFlags()
+{
+ // File
+ bool valid_image = pm.size() != QSize( 0, 0 );
+ file-&gt;<a href="qmenudata.html#setItemEnabled">setItemEnabled</a>( si, valid_image );
+ file-&gt;<a href="qmenudata.html#setItemEnabled">setItemEnabled</a>( sp, valid_image );
+
+ // Edit
+ edit-&gt;<a href="qmenudata.html#setItemEnabled">setItemEnabled</a>( t1, image.depth() != 1 );
+ edit-&gt;<a href="qmenudata.html#setItemEnabled">setItemEnabled</a>( t8, image.depth() != 8 );
+ edit-&gt;<a href="qmenudata.html#setItemEnabled">setItemEnabled</a>( t32, image.depth() != 32 );
+
+ // Options
+ bool may_need_color_dithering =
+ !valid_image
+ || image.depth() == 32 &amp;&amp; QPixmap::<a href="qpixmap.html#defaultDepth">defaultDepth</a>() &lt; 24;
+ bool may_need_dithering = may_need_color_dithering
+ || image.depth() &gt; 1 &amp;&amp; options-&gt;<a href="qmenudata.html#isItemChecked">isItemChecked</a>(mo)
+ || image.depth() &gt; 1 &amp;&amp; QPixmap::<a href="qpixmap.html#defaultDepth">defaultDepth</a>() == 1;
+ bool has_alpha_mask = !valid_image || image.hasAlphaBuffer();
+
+ options-&gt;<a href="qmenudata.html#setItemEnabled">setItemEnabled</a>( fd, may_need_dithering );
+ options-&gt;<a href="qmenudata.html#setItemEnabled">setItemEnabled</a>( bd, may_need_dithering );
+ options-&gt;<a href="qmenudata.html#setItemEnabled">setItemEnabled</a>( td, may_need_dithering );
+
+ options-&gt;<a href="qmenudata.html#setItemEnabled">setItemEnabled</a>( ta, has_alpha_mask );
+ options-&gt;<a href="qmenudata.html#setItemEnabled">setItemEnabled</a>( fa, has_alpha_mask );
+ options-&gt;<a href="qmenudata.html#setItemEnabled">setItemEnabled</a>( ba, has_alpha_mask );
+
+ options-&gt;<a href="qmenudata.html#setItemEnabled">setItemEnabled</a>( ad, may_need_color_dithering );
+ options-&gt;<a href="qmenudata.html#setItemEnabled">setItemEnabled</a>( dd, may_need_color_dithering );
+
+ options-&gt;<a href="qmenudata.html#setItemChecked">setItemChecked</a>( ac, (conversion_flags &amp; ColorMode_Mask) == AutoColor );
+ options-&gt;<a href="qmenudata.html#setItemChecked">setItemChecked</a>( co, (conversion_flags &amp; ColorMode_Mask) == ColorOnly );
+ options-&gt;<a href="qmenudata.html#setItemChecked">setItemChecked</a>( mo, (conversion_flags &amp; ColorMode_Mask) == MonoOnly );
+ options-&gt;<a href="qmenudata.html#setItemChecked">setItemChecked</a>( fd, (conversion_flags &amp; Dither_Mask) == DiffuseDither );
+ options-&gt;<a href="qmenudata.html#setItemChecked">setItemChecked</a>( bd, (conversion_flags &amp; Dither_Mask) == OrderedDither );
+ options-&gt;<a href="qmenudata.html#setItemChecked">setItemChecked</a>( td, (conversion_flags &amp; Dither_Mask) == ThresholdDither );
+ options-&gt;<a href="qmenudata.html#setItemChecked">setItemChecked</a>( ta, (conversion_flags &amp; AlphaDither_Mask) == ThresholdAlphaDither );
+ options-&gt;<a href="qmenudata.html#setItemChecked">setItemChecked</a>( fa, (conversion_flags &amp; AlphaDither_Mask) == DiffuseAlphaDither );
+ options-&gt;<a href="qmenudata.html#setItemChecked">setItemChecked</a>( ba, (conversion_flags &amp; AlphaDither_Mask) == OrderedAlphaDither );
+ options-&gt;<a href="qmenudata.html#setItemChecked">setItemChecked</a>( ad, (conversion_flags &amp; DitherMode_Mask) == PreferDither );
+ options-&gt;<a href="qmenudata.html#setItemChecked">setItemChecked</a>( dd, (conversion_flags &amp; DitherMode_Mask) == AvoidDither );
+}
+
+void <a name="f408"></a>ImageViewer::updateStatus()
+{
+ if ( pm.size() == QSize( 0, 0 ) ) {
+ if ( !filename.isEmpty() )
+ status-&gt;<a href="qlabel.html#setText">setText</a>("Could not load image");
+ else
+ status-&gt;<a href="qlabel.html#setText">setText</a>("No image - select Open from File menu.");
+ } else {
+ <a href="qstring.html">QString</a> message, moremsg;
+ message.<a href="qstring.html#sprintf">sprintf</a>("%dx%d", image.width(), image.height());
+ if ( pm.size() != pmScaled.size() ) {
+ moremsg.sprintf(" [%dx%d]", pmScaled.width(),
+ pmScaled.height());
+ message += moremsg;
+ }
+ moremsg.sprintf(", %d bits ", image.depth());
+ message += moremsg;
+ if (image.valid(pickx,picky)) {
+ moremsg.sprintf("(%d,%d)=#%0*x ",
+ pickx, picky,
+ image.hasAlphaBuffer() ? 8 : 6,
+ image.pixel(pickx,picky));
+ message += moremsg;
+ }
+ if ( image.numColors() &gt; 0 ) {
+ if (image.valid(pickx,picky)) {
+ moremsg.sprintf(", %d/%d colors", image.pixelIndex(pickx,picky),
+ image.numColors());
+ } else {
+ moremsg.sprintf(", %d colors", image.numColors());
+ }
+ message += moremsg;
+ }
+ if ( image.hasAlphaBuffer() ) {
+ if ( image.depth() == 8 ) {
+ int i;
+ bool alpha[256];
+ int nalpha=0;
+
+ for (i=0; i&lt;256; i++)
+ alpha[i] = FALSE;
+
+ for (i=0; i&lt;image.numColors(); i++) {
+ int alevel = image.color(i) &gt;&gt; 24;
+ if (!alpha[alevel]) {
+ alpha[alevel] = TRUE;
+ nalpha++;
+ }
+ }
+ moremsg.sprintf(", %d alpha levels", nalpha);
+ } else {
+ // Too many pixels to bother counting.
+ moremsg = ", 8-bit alpha channel";
+ }
+ message += moremsg;
+ }
+ status-&gt;<a href="qlabel.html#setText">setText</a>(message);
+ }
+}
+
+/*
+ This function saves the image.
+*/
+void <a name="f409"></a>ImageViewer::saveImage( int item )
+{
+<a name="x1332"></a> const char* fmt = saveimage-&gt;<a href="qmenudata.html#text">text</a>(item);
+<a name="x1319"></a> <a href="qstring.html">QString</a> savefilename = QFileDialog::<a href="qfiledialog.html#getSaveFileName">getSaveFileName</a>(QString::null, <a href="qstring.html#QString-null">QString::null</a>,
+ this, filename);
+ if ( !savefilename.<a href="qstring.html#isEmpty">isEmpty</a>() )
+ if ( !image.save( savefilename, fmt ) )
+<a name="x1333"></a> QMessageBox::<a href="qmessagebox.html#warning">warning</a>( this, "Save failed", "Error saving file" );
+}
+
+/*
+ This function saves the converted image.
+*/
+void <a name="f410"></a>ImageViewer::savePixmap( int item )
+{
+ const char* fmt = savepixmap-&gt;<a href="qmenudata.html#text">text</a>(item);
+ <a href="qstring.html">QString</a> savefilename = QFileDialog::<a href="qfiledialog.html#getSaveFileName">getSaveFileName</a>(QString::null,
+ QString::null, this, filename);
+ if ( !savefilename.<a href="qstring.html#isEmpty">isEmpty</a>() )
+ if ( !pmScaled.save( savefilename, fmt ) )
+ QMessageBox::<a href="qmessagebox.html#warning">warning</a>( this, "Save failed", "Error saving file" );
+}
+
+
+void <a name="f411"></a>ImageViewer::newWindow()
+{
+ ImageViewer* that = new ImageViewer(0, "new window", WDestructiveClose);
+ that-&gt;options-&gt;<a href="qmenudata.html#setItemChecked">setItemChecked</a>( that-&gt;cc, useColorContext() );
+ that-&gt;<a href="qwidget.html#show">show</a>();
+}
+
+/*
+ This function is the slot for processing the Open menu item.
+*/
+void <a name="f412"></a>ImageViewer::openFile()
+{
+<a name="x1318"></a> <a href="qstring.html">QString</a> newfilename = QFileDialog::<a href="qfiledialog.html#getOpenFileName">getOpenFileName</a>( QString::null,
+ QString::null,
+ this );
+ if ( !newfilename.<a href="qstring.html#isEmpty">isEmpty</a>() ) {
+ loadImage( newfilename ) ;
+ <a href="qwidget.html#repaint">repaint</a>(); // show image in widget
+ }
+}
+
+/*
+ This function loads an image from a file and resizes the widget to
+ exactly fit the image size. If the file was not found or the image
+ format was unknown it will resize the widget to fit the errorText
+ message (see above) displayed in the current font.
+
+ Returns TRUE if the image was successfully loaded.
+*/
+
+bool <a name="f413"></a>ImageViewer::loadImage( const <a href="qstring.html">QString</a>&amp; fileName )
+{
+ filename = fileName;
+ bool ok = FALSE;
+ if ( !filename.isEmpty() ) {
+<a name="x1312"></a> QApplication::<a href="qapplication.html#setOverrideCursor">setOverrideCursor</a>( waitCursor ); // this might take time
+ ok = image.load(filename, 0);
+ pickx = -1;
+ clickx = -1;
+ if ( ok )
+ ok = reconvertImage();
+ if ( ok ) {
+ <a href="qwidget.html#setCaption">setCaption</a>( filename ); // set window caption
+ int w = pm.width();
+ int h = pm.height();
+
+ const int reasonable_width = 128;
+ if ( w &lt; reasonable_width ) {
+ // Integer scale up to something reasonable
+ int multiply = ( reasonable_width + w - 1 ) / w;
+ w *= multiply;
+ h *= multiply;
+ }
+
+<a name="x1347"></a><a name="x1325"></a> h += menubar-&gt;<a href="qmenubar.html#heightForWidth">heightForWidth</a>(w) + status-&gt;<a href="qwidget.html#height">height</a>();
+ <a href="qwidget.html#resize">resize</a>( w, h ); // we resize to fit image
+ } else {
+ pm.resize(0,0); // couldn't load image
+ <a href="qwidget.html#update">update</a>();
+ }
+<a name="x1311"></a> QApplication::<a href="qapplication.html#restoreOverrideCursor">restoreOverrideCursor</a>(); // restore original cursor
+ }
+ updateStatus();
+ setMenuItemFlags();
+ return ok;
+}
+
+bool <a name="f414"></a>ImageViewer::reconvertImage()
+{
+ bool success = FALSE;
+
+ if ( image.isNull() ) return FALSE;
+
+ if ( alloc_context ) {
+ QColor::<a href="qcolor.html#destroyAllocContext">destroyAllocContext</a>( alloc_context );
+ alloc_context = 0;
+ }
+ if ( useColorContext() ) {
+<a name="x1314"></a> alloc_context = QColor::<a href="qcolor.html#enterAllocContext">enterAllocContext</a>();
+ // Clear the image to hide flickering palette
+ <a href="qpainter.html">QPainter</a> painter(this);
+<a name="x1338"></a> painter.<a href="qpainter.html#eraseRect">eraseRect</a>(0, menubar-&gt;<a href="qmenubar.html#heightForWidth">heightForWidth</a>( <a href="qwidget.html#width">width</a>() ), width(), height());
+ }
+
+ QApplication::<a href="qapplication.html#setOverrideCursor">setOverrideCursor</a>( waitCursor ); // this might take time
+ if ( pm.convertFromImage(image, conversion_flags) )
+ {
+ pmScaled = QPixmap();
+ scale();
+ <a href="qwidget.html#resize">resize</a>( <a href="qwidget.html#width">width</a>(), height() );
+ success = TRUE; // load successful
+ } else {
+ pm.resize(0,0); // couldn't load image
+ }
+ updateStatus();
+ setMenuItemFlags();
+ QApplication::<a href="qapplication.html#restoreOverrideCursor">restoreOverrideCursor</a>(); // restore original cursor
+
+ if ( useColorContext() )
+<a name="x1315"></a> QColor::<a href="qcolor.html#leaveAllocContext">leaveAllocContext</a>();
+
+ return success; // TRUE if loaded OK
+}
+
+bool <a name="f415"></a>ImageViewer::smooth() const
+{
+ return options-&gt;<a href="qmenudata.html#isItemChecked">isItemChecked</a>(ss);
+}
+
+bool <a name="f416"></a>ImageViewer::useColorContext() const
+{
+ return options-&gt;<a href="qmenudata.html#isItemChecked">isItemChecked</a>(cc);
+}
+
+/*
+ This functions scales the pixmap in the member variable "pm" to fit the
+ widget size and puts the resulting pixmap in the member variable "pmScaled".
+*/
+
+void <a name="f417"></a>ImageViewer::scale()
+{
+ int h = <a href="qwidget.html#height">height</a>() - menubar-&gt;<a href="qmenubar.html#heightForWidth">heightForWidth</a>( <a href="qwidget.html#width">width</a>() ) - status-&gt;<a href="qwidget.html#height">height</a>();
+
+ if ( image.isNull() ) return;
+
+ QApplication::<a href="qapplication.html#setOverrideCursor">setOverrideCursor</a>( waitCursor ); // this might take time
+ if ( <a href="qwidget.html#width">width</a>() == pm.width() &amp;&amp; h == pm.height() )
+ { // no need to scale if widget
+ pmScaled = pm; // size equals pixmap size
+ } else {
+ if (smooth()) {
+ pmScaled.convertFromImage(image.smoothScale(<a href="qwidget.html#width">width</a>(), h),
+ conversion_flags);
+ } else {
+ <a href="qwmatrix.html">QWMatrix</a> m; // <a href="qwmatrix.html#TransformationMode">transformation matrix</a>
+<a name="x1357"></a> m.<a href="qwmatrix.html#scale">scale</a>(((double)<a href="qwidget.html#width">width</a>())/pm.width(),// define scale factors
+ ((double)h)/pm.height());
+ pmScaled = pm.xForm( m ); // create scaled pixmap
+ }
+ }
+ QApplication::<a href="qapplication.html#restoreOverrideCursor">restoreOverrideCursor</a>(); // restore original cursor
+}
+
+/*
+ The resize event handler, if a valid pixmap was loaded it will call
+ scale() to fit the pixmap to the new widget size.
+*/
+
+<a name="x1353"></a>void ImageViewer::<a href="qwidget.html#resizeEvent">resizeEvent</a>( <a href="qresizeevent.html">QResizeEvent</a> * )
+{
+<a name="x1355"></a> status-&gt;<a href="qwidget.html#setGeometry">setGeometry</a>(0, height() - status-&gt;<a href="qwidget.html#height">height</a>(),
+ <a href="qwidget.html#width">width</a>(), status-&gt;<a href="qwidget.html#height">height</a>());
+
+ if ( pm.size() == QSize( 0, 0 ) ) // we couldn't load the image
+ return;
+
+ int h = <a href="qwidget.html#height">height</a>() - menubar-&gt;<a href="qmenubar.html#heightForWidth">heightForWidth</a>( <a href="qwidget.html#width">width</a>() ) - status-&gt;<a href="qwidget.html#height">height</a>();
+ if ( <a href="qwidget.html#width">width</a>() != pmScaled.width() || h != pmScaled.height())
+ { // if new size,
+ scale(); // scale pmScaled to window
+ updateStatus();
+ }
+ if ( image.hasAlphaBuffer() )
+ <a href="qwidget.html#erase">erase</a>();
+}
+
+bool <a name="f418"></a>ImageViewer::convertEvent( <a href="qmouseevent.html">QMouseEvent</a>* e, int&amp; x, int&amp; y)
+{
+ if ( pm.size() != QSize( 0, 0 ) ) {
+ int h = <a href="qwidget.html#height">height</a>() - menubar-&gt;<a href="qmenubar.html#heightForWidth">heightForWidth</a>( <a href="qwidget.html#width">width</a>() ) - status-&gt;<a href="qwidget.html#height">height</a>();
+<a name="x1335"></a> int nx = e-&gt;<a href="qmouseevent.html#x">x</a>() * image.width() / width();
+<a name="x1336"></a> int ny = (e-&gt;<a href="qmouseevent.html#y">y</a>()-menubar-&gt;<a href="qmenubar.html#heightForWidth">heightForWidth</a>( <a href="qwidget.html#width">width</a>() )) * image.height() / h;
+ if (nx != x || ny != y ) {
+ x = nx;
+ y = ny;
+ updateStatus();
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+void ImageViewer::<a href="qwidget.html#mousePressEvent">mousePressEvent</a>( <a href="qmouseevent.html">QMouseEvent</a> *e )
+{
+ may_be_other = convertEvent(e, clickx, clicky);
+}
+
+<a name="x1350"></a>void ImageViewer::<a href="qwidget.html#mouseReleaseEvent">mouseReleaseEvent</a>( <a href="qmouseevent.html">QMouseEvent</a> * )
+{
+ if ( may_be_other )
+ other = this;
+}
+
+/*
+ Record the pixel position of interest.
+*/
+void ImageViewer::<a href="qwidget.html#mouseMoveEvent">mouseMoveEvent</a>( <a href="qmouseevent.html">QMouseEvent</a> *e )
+{
+ if (convertEvent(e,pickx,picky)) {
+ updateStatus();
+<a name="x1334"></a> if ((e-&gt;<a href="qmouseevent.html#state">state</a>()&amp;LeftButton)) {
+ may_be_other = FALSE;
+ if ( clickx &gt;= 0 &amp;&amp; other) {
+ copyFrom(other);
+ }
+ }
+ }
+}
+
+/*
+ Draws the portion of the scaled pixmap that needs to be updated or prints
+ an error message if no legal pixmap has been loaded.
+*/
+
+void ImageViewer::<a href="qwidget.html#paintEvent">paintEvent</a>( <a href="qpaintevent.html">QPaintEvent</a> *e )
+{
+ if ( pm.size() != QSize( 0, 0 ) ) { // is an image loaded?
+ <a href="qpainter.html">QPainter</a> painter(this);
+<a name="x1340"></a><a name="x1339"></a> painter.<a href="qpainter.html#setClipRect">setClipRect</a>(e-&gt;<a href="qpaintevent.html#rect">rect</a>());
+<a name="x1337"></a> painter.<a href="qpainter.html#drawPixmap">drawPixmap</a>(0, menubar-&gt;<a href="qmenubar.html#heightForWidth">heightForWidth</a>( <a href="qwidget.html#width">width</a>() ), pmScaled);
+ }
+}
+
+
+/*
+ Explain anything that might be confusing.
+*/
+void <a name="f419"></a>ImageViewer::giveHelp()
+{
+ if (!helpmsg) {
+ <a href="qstring.html">QString</a> helptext =
+ "&lt;b&gt;Usage:&lt;/b&gt; &lt;tt&gt;showimg [-m] &lt;i&gt;filename ...&lt;/i&gt;&lt;/tt&gt;"
+ "&lt;blockquote&gt;"
+ "&lt;tt&gt;-m&lt;/tt&gt; - use &lt;i&gt;ManyColor&lt;/i&gt; color spec"
+ "&lt;/blockquote&gt;"
+ "&lt;p&gt;Supported input formats:"
+ "&lt;blockquote&gt;";
+<a name="x1321"></a> helptext += QImage::<a href="qimage.html#inputFormatList">inputFormatList</a>().join(", ");
+ helptext += "&lt;/blockquote&gt;";
+
+ helpmsg = new <a href="qmessagebox.html">QMessageBox</a>( "Help", helptext,
+ QMessageBox::Information, QMessageBox::Ok, 0, 0, 0, 0, FALSE );
+ }
+<a name="x1317"></a> helpmsg-&gt;<a href="qdialog.html#show">show</a>();
+<a name="x1352"></a> helpmsg-&gt;<a href="qwidget.html#raise">raise</a>();
+}
+
+void <a name="f420"></a>ImageViewer::copyFrom(ImageViewer* s)
+{
+ if ( clickx &gt;= 0 ) {
+ int dx = clickx;
+ int dy = clicky;
+ int sx = s-&gt;clickx;
+ int sy = s-&gt;clicky;
+ int sw = QABS(clickx - pickx)+1;
+ int sh = QABS(clicky - picky)+1;
+ if ( clickx &gt; pickx ) {
+ dx = pickx;
+ sx -= sw-1;
+ }
+ if ( clicky &gt; picky ) {
+ dy = picky;
+ sy -= sh-1;
+ }
+ <a href="qimage.html#bitBlt">bitBlt</a>( &amp;image, dx, dy, &amp;s-&gt;image, sx, sy, sw, sh );
+ reconvertImage();
+ <a href="qwidget.html#repaint">repaint</a>( image.hasAlphaBuffer() );
+ }
+}
+ImageViewer* ImageViewer::other = 0;
+
+void <a name="f421"></a>ImageViewer::hFlip()
+{
+ setImage(image.mirror(TRUE,FALSE));
+}
+
+void <a name="f422"></a>ImageViewer::vFlip()
+{
+ setImage(image.mirror(FALSE,TRUE));
+}
+
+void <a name="f423"></a>ImageViewer::rot180()
+{
+ setImage(image.mirror(TRUE,TRUE));
+}
+
+void <a name="f424"></a>ImageViewer::copy()
+{
+#ifndef QT_NO_MIMECLIPBOARD
+<a name="x1308"></a> QApplication::<a href="qapplication.html#clipboard">clipboard</a>()-&gt;setImage(image); // Less information loss
+#endif
+}
+
+void <a name="f425"></a>ImageViewer::paste()
+{
+#ifndef QT_NO_MIMECLIPBOARD
+ <a href="qimage.html">QImage</a> p = QApplication::<a href="qapplication.html#clipboard">clipboard</a>()-&gt;image();
+<a name="x1322"></a> if ( !p.<a href="qimage.html#isNull">isNull</a>() ) {
+ filename = "pasted";
+ setImage(p);
+ }
+#endif
+}
+
+void <a name="f426"></a>ImageViewer::setImage(const <a href="qimage.html">QImage</a>&amp; newimage)
+{
+ image = newimage;
+
+ pickx = -1;
+ clickx = -1;
+ <a href="qwidget.html#setCaption">setCaption</a>( filename ); // set window caption
+ int w = image.width();
+ int h = image.height();
+ if ( !w )
+ return;
+
+ const int reasonable_width = 128;
+ if ( w &lt; reasonable_width ) {
+ // Integer scale up to something reasonable
+ int multiply = ( reasonable_width + w - 1 ) / w;
+ w *= multiply;
+ h *= multiply;
+ }
+
+ h += menubar-&gt;<a href="qmenubar.html#heightForWidth">heightForWidth</a>(w) + status-&gt;<a href="qwidget.html#height">height</a>();
+ <a href="qwidget.html#resize">resize</a>( w, h ); // we resize to fit image
+
+ reconvertImage();
+ <a href="qwidget.html#repaint">repaint</a>( image.hasAlphaBuffer() );
+
+ updateStatus();
+ setMenuItemFlags();
+}
+
+void <a name="f427"></a>ImageViewer::editText()
+{
+ ImageTextEditor editor(image,this);
+ editor.<a href="qdialog.html#exec">exec</a>();
+}
+
+void <a name="f428"></a>ImageViewer::to1Bit()
+{
+ toBitDepth(1);
+}
+
+void <a name="f429"></a>ImageViewer::to8Bit()
+{
+ toBitDepth(8);
+}
+
+void <a name="f430"></a>ImageViewer::to32Bit()
+{
+ toBitDepth(32);
+}
+
+void <a name="f431"></a>ImageViewer::toBitDepth(int d)
+{
+ image = image.convertDepth(d);
+ reconvertImage();
+ <a href="qwidget.html#repaint">repaint</a>( image.hasAlphaBuffer() );
+}
+</pre>
+
+<p> <hr>
+<p> Main:
+<p> <pre>/****************************************************************************
+** $Id: qt/main.cpp 3.3.8 edited Jan 11 14:37 $
+**
+** Copyright (C) 1992-2007 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for Qt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "showimg.h"
+#include "imagefip.h"
+#include &lt;<a href="qapplication-h.html">qapplication.h</a>&gt;
+#include &lt;<a href="qimage-h.html">qimage.h</a>&gt;
+
+int main( int argc, char **argv )
+{
+ if ( argc &gt; 1 &amp;&amp; QString(argv[1]) == "-m" ) {
+<a name="x1361"></a> QApplication::<a href="qapplication.html#setColorSpec">setColorSpec</a>( QApplication::ManyColor );
+ argc--;
+ argv++;
+ }
+ else if ( argc &gt; 1 &amp;&amp; QString(argv[1]) == "-n" ) {
+ QApplication::<a href="qapplication.html#setColorSpec">setColorSpec</a>( QApplication::NormalColor );
+ argc--;
+ argv++;
+ }
+ else {
+ QApplication::<a href="qapplication.html#setColorSpec">setColorSpec</a>( QApplication::CustomColor );
+ }
+
+ <a href="qapplication.html">QApplication</a> a( argc, argv );
+
+ ImageIconProvider iip;
+<a name="x1362"></a> QFileDialog::<a href="qfiledialog.html#setIconProvider">setIconProvider</a>( &amp;iip );
+
+ if ( argc &lt;= 1 ) {
+ // Create a window which looks after its own existence.
+ ImageViewer *w =
+ new ImageViewer(0, "new window", Qt::WDestructiveClose | Qt::WResizeNoErase );
+<a name="x1364"></a> w-&gt;<a href="qwidget.html#setCaption">setCaption</a>("Qt Example - Image Viewer");
+ w-&gt;<a href="qwidget.html#show">show</a>();
+ } else {
+ for ( int i=1; i&lt;argc; i++ ) {
+ // Create a window which looks after its own existence.
+ ImageViewer *w =
+ new ImageViewer(0, argv[i], Qt::WDestructiveClose | Qt::WResizeNoErase );
+ w-&gt;<a href="qwidget.html#setCaption">setCaption</a>("Qt Example - Image Viewer");
+ w-&gt;loadImage( argv[i] );
+ w-&gt;<a href="qwidget.html#show">show</a>();
+ }
+ }
+
+ QObject::<a href="qobject.html#connect">connect</a>(qApp, SIGNAL(<a href="qapplication.html#lastWindowClosed">lastWindowClosed</a>()), qApp, SLOT(<a href="qapplication.html#quit">quit</a>()));
+
+ return a.<a href="qapplication.html#exec">exec</a>();
+}
+</pre>
+
+<p>See also <a href="examples.html">Examples</a>.
+
+<!-- eof -->
+<p><address><hr><div align=center>
+<table width=100% cellspacing=0 border=0><tr>
+<td>Copyright &copy; 2007
+<a href="troll.html">Trolltech</a><td align=center><a href="trademarks.html">Trademarks</a>
+<td align=right><div align=right>Qt 3.3.8</div>
+</table></div></address></body>
+</html>