diff -r 000000000000 -r 1918ee327afb tests/arthur/lance/main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/arthur/lance/main.cpp Mon Jan 11 14:00:40 2010 +0000 @@ -0,0 +1,678 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include "interactivewidget.h" +#include "widgets.h" +#include "paintcommands.h" + +#include +#include +#include +#include + +#include + +#ifdef USE_CUSTOM_DEVICE +#include "customdevice.h" +#endif + +#ifndef QT_NO_OPENGL +#include +#include +#endif + +// #define DO_QWS_DEBUGGING + +#ifdef DO_QWS_DEBUGGING +extern bool qt_show_painter_debug_output = false; +#endif + +//#define CONSOLE_APPLICATION + +static const struct { + const char *name; + QImage::Format format; +} imageFormats[] = { + { "mono", QImage::Format_Mono }, + { "monolsb", QImage::Format_MonoLSB }, + { "indexed8", QImage::Format_Indexed8 }, + { "rgb32", QImage::Format_RGB32 }, + { "argb32", QImage::Format_ARGB32 }, + { "argb32_premultiplied", QImage::Format_ARGB32_Premultiplied }, + { "rgb16", QImage::Format_RGB16 }, + { "argb8565_premultiplied", QImage::Format_ARGB8565_Premultiplied }, + { "rgb666", QImage::Format_RGB666 }, + { "argb6666_premultiplied", QImage::Format_ARGB6666_Premultiplied }, + { "rgb555", QImage::Format_RGB555 }, + { "argb8555_premultiplied", QImage::Format_ARGB8555_Premultiplied }, + { "rgb888", QImage::Format_RGB888 }, + { "rgb444", QImage::Format_RGB444 }, + { "argb4444_premultiplied", QImage::Format_ARGB4444_Premultiplied } +}; + +static void printHelp() +{ + printf("\nUsage:\n\n" + " paintcmd [options] files\n" + "\n" + " Options:\n" + " -widget Paints the files to a widget on screen\n" + " -pixmap Paints the files to a pixmap\n" + " -bitmap Paints the files to a bitmap\n" + " -image Paints the files to an image\n" + " -imageformat Set the format of the image when painting to an image\n" + " -imagemono Paints the files to a monochrome image\n" + " -imagewidget same as image, but with interacion...\n" +#ifndef QT_NO_OPENGL + " -opengl Paints the files to an OpenGL on screen\n" +#endif +#ifdef USE_CUSTOM_DEVICE + " -customdevice Paints the files to the custom paint device\n" + " -customwidget Paints the files to a custom widget on screen\n" +#endif + " -pdf Paints to a pdf\n" + " -ps Paints to a ps\n" + " -picture Prints into a picture, then shows the result in a label\n" + " -printer Prints the commands to a file called output.ps|pdf\n" + " -highres Prints in highres mode\n" + " -printdialog Opens a print dialog, then prints to the selected printer\n" + " -grab Paints the files to an image called filename_qps.png\n" + " -i Interactive mode.\n" + " -v Verbose.\n" + " -bg-white No checkers background\n" + " -commands Displays all available commands\n"); +} + +static void displayCommands() +{ + printf("Drawing operations:\n" + " drawArc x y width height angle sweep\n" + " drawChord x y width height angle sweep\n" + " drawEllipse x y width height\n" + " drawLine x1 y1 x2 y2\n" + " drawPath pathname\n" + " drawPie x y width height angle sweep\n" + " drawPixmap pixmapfile x y width height sx sy sw sh\n" + " drawPolygon [ x1 y1 x2 y2 ... ] winding|oddeven\n" + " drawPolyline [ x1 y1 x2 y2 ... ]\n" + " drawRect x y width height\n" + " drawRoundRect x y width height xfactor yfactor\n" + " drawText x y \"text\"\n" + " drawTiledPixmap pixmapfile x y width height sx sy\n" + "\n" + "Compat functions for Qt 3:\n" + " qt3_drawArc x y width height angle sweep\n" + " qt3_drawChord x y width height angle sweep\n" + " qt3_drawEllipse x y width height\n" + " qt3_drawPie x y width height angle sweep\n" + " qt3_drawRect x y width height\n" + " qt3_drawRoundRect x y width height xfactor yfactor\n" + "\n" + "Path commands:\n" + " path_addEllipse pathname x y width height\n" + " path_addPolygon pathname [ x1 y1 x2 y2 ... ] winding?\n" + " path_addRect pathname x y width height\n" + " path_addText pathname x y \"text\" Uses current font\n" + " path_arcTo pathname x y width hegiht\n" + " path_closeSubpath pathname\n" + " path_createOutline pathname newoutlinename Uses current pen\n" + " path_cubicTo pathname c1x c1y c2x c2y endx endy\n" + " path_lineTo pathname x y\n" + " path_moveTo pathname x y\n" + " path_setFillRule pathname winding?\n" + "\n" + "Painter configuration:\n" + " resetMatrix\n" + " restore\n" + " save\n" + " rotate degrees\n" + " translate dx dy\n" + " scale sx sy\n" + " mapQuadToQuad x0 y0 x1 y1 x2 y2 x3 y3 x4 y4 x5 y5 x6 y6 x7 y7" + " setMatrix m11 m12 m13 m21 m22 m23 m31 m32 m33" + " setBackground color pattern?\n" + " setBackgroundMode TransparentMode|OpaqueMode\n" + " setBrush pixmapfile\n" + " setBrush nobrush\n" + " setBrush color pattern\n" + " setBrush x1 y1 color1 x2 y2 color2 gradient brush\n" + " setBrushOrigin x y\n" + " setFont \"fontname\" pointsize bold? italic?\n" + " setPen style color\n" + " setPen color width style capstyle joinstyle\n" + " setRenderHint LineAntialiasing\n" + " gradient_clearStops\n" + " gradient_appendStop pos color" + " gradient_setSpread [PadSpread|ReflectSpread|RepeatSpread]\n" + " gradient_setLinear x1 y1 x2 y2\n" + " gradient_setRadial center_x center_y radius focal_x focal_y\n" + " gradient_setConical center_x center_y angle\n" + "\n" + "Clipping commands:\n" + " region_addRect regionname x y width height\n" + " region_getClipRegion regionname\n" + " setClipRect x y width height\n" + " setClipRegion regionname\n" + " setClipping true|false\n" + " setClipPath pathname\n" + "\n" + "Various commands:\n" + " surface_begin x y width height\n" + " surface_end\n" + " pixmap_load filename name_in_script\n" + " image_load filename name_in_script\n"); +} +static InteractiveWidget *interactive_widget = 0; + +static void runInteractive() +{ + interactive_widget = new InteractiveWidget; + interactive_widget->show(); +} + +static QLabel* createLabel() +{ + QLabel *label = new QLabel; + QPalette palette = label->palette(); + palette.setBrush(QPalette::Window, QBrush(Qt::white)); + label->setPalette(palette); + return label; +} + +int main(int argc, char **argv) +{ +#ifdef CONSOLE_APPLICATION + QApplication app(argc, argv, QApplication::Tty); +#else + QApplication app(argc, argv); +#endif +#ifdef DO_QWS_DEBUGGING + qt_show_painter_debug_output = false; +#endif + + DeviceType type = WidgetType; + bool checkers_background = true; + + QImage::Format imageFormat = QImage::Format_ARGB32_Premultiplied; + + QLocale::setDefault(QLocale::c()); + + QStringList files; + + bool interactive = false; + bool printdlg = false; + bool highres = false; + bool show_cmp = false; + int width = 800, height = 800; + bool verboseMode = false; + +#ifndef QT_NO_OPENGL + QGLFormat f = QGLFormat::defaultFormat(); + f.setSampleBuffers(true); + f.setStencil(true); + f.setAlpha(true); + f.setAlphaBufferSize(8); + QGLFormat::setDefaultFormat(f); +#endif + + char *arg; + for (int i=1; i= 0) { + QFileInfo info(input); + QDir dir = info.dir(); + QFileInfoList infos = dir.entryInfoList(QStringList(info.fileName())); + for (int ii=0; iiload(files.at(0)); + } else if (files.isEmpty()) { + printHelp(); + return 0; + } else { + for (int j=0; jsetWindowTitle("VERIFY: " + pmFile); + label->setPixmap(pixmap); + label->show(); + } + } + + switch (type) { + + case WidgetType: + { + OnScreenWidget *qWidget = + new OnScreenWidget(files.at(j)); + qWidget->setVerboseMode(verboseMode); + qWidget->setType(type); + qWidget->setCheckersBackground(checkers_background); + qWidget->m_commands = content; + qWidget->resize(width, height); + qWidget->show(); + activeWidget = qWidget; + break; + } + + case ImageWidgetType: + { + OnScreenWidget *qWidget = new OnScreenWidget(files.at(j)); + qWidget->setVerboseMode(verboseMode); + qWidget->setType(type); + qWidget->setCheckersBackground(checkers_background); + qWidget->m_commands = content; + qWidget->resize(width, height); + qWidget->show(); + activeWidget = qWidget; + break; + + } +#ifndef QT_NO_OPENGL + case OpenGLPBufferType: + { + QGLPixelBuffer pbuffer(QSize(width, height)); + QPainter pt(&pbuffer); + pcmd.setPainter(&pt); + pcmd.setFilePath(fileinfo.absolutePath()); + pcmd.runCommands(); + pt.end(); + + QImage image = pbuffer.toImage(); + + QLabel *label = createLabel(); + label->setPixmap(QPixmap::fromImage(image)); + label->resize(label->sizeHint()); + label->show(); + activeWidget = label; + break; + } + case OpenGLType: + { + OnScreenWidget *qGLWidget = new OnScreenWidget(files.at(j)); + qGLWidget->setVerboseMode(verboseMode); + qGLWidget->setType(type); + qGLWidget->setCheckersBackground(checkers_background); + qGLWidget->m_commands = content; + qGLWidget->resize(width, height); + qGLWidget->show(); + activeWidget = qGLWidget; + break; + } +#else + case OpenGLType: + printf("OpenGL type not supported in this Qt build\n"); + break; +#endif +#ifdef USE_CUSTOM_DEVICE + case CustomDeviceType: + { + CustomPaintDevice custom(width, height); + QPainter pt; + pt.begin(&custom); + pcmd.setPainter(&pt); + pcmd.setFilePath(fileinfo.absolutePath()); + pcmd.runCommands(); + pt.end(); + QImage *img = custom.image(); + if (img) { + QLabel *label = createLabel(); + label->setPixmap(QPixmap::fromImage(*img)); + label->resize(label->sizeHint()); + label->show(); + activeWidget = label; + img->save("custom_output_pixmap.png", "PNG"); + } else { + custom.save("custom_output_pixmap.png", "PNG"); + } + break; + } + case CustomWidgetType: + { + OnScreenWidget *cWidget = new OnScreenWidget; + cWidget->setVerboseMode(verboseMode); + cWidget->setType(type); + cWidget->setCheckersBackground(checkers_background); + cWidget->m_filename = files.at(j); + cWidget->setWindowTitle(fileinfo.filePath()); + cWidget->m_commands = content; + cWidget->resize(width, height); + cWidget->show(); + activeWidget = cWidget; + break; + } +#endif + case PixmapType: + { + QPixmap pixmap(width, height); + pixmap.fill(Qt::white); + QPainter pt(&pixmap); + pcmd.setPainter(&pt); + pcmd.setFilePath(fileinfo.absolutePath()); + pcmd.runCommands(); + pt.end(); + pixmap.save("output_pixmap.png", "PNG"); + break; + } + + case BitmapType: + { + QBitmap bitmap(width, height); + QPainter pt(&bitmap); + pcmd.setPainter(&pt); + pcmd.setFilePath(fileinfo.absolutePath()); + pcmd.runCommands(); + pt.end(); + bitmap.save("output_bitmap.png", "PNG"); + + QLabel *label = createLabel(); + label->setPixmap(bitmap); + label->resize(label->sizeHint()); + label->show(); + activeWidget = label; + break; + } + + case ImageMonoType: + case ImageType: + { + qDebug() << "Creating image"; + QImage image(width, height, type == ImageMonoType + ? QImage::Format_MonoLSB + : imageFormat); + image.fill(0); + QPainter pt(&image); + pcmd.setPainter(&pt); + pcmd.setFilePath(fileinfo.absolutePath()); + pcmd.runCommands(); + pt.end(); + image.convertToFormat(QImage::Format_ARGB32).save("output_image.png", "PNG"); +#ifndef CONSOLE_APPLICATION + QLabel *label = createLabel(); + label->setPixmap(QPixmap::fromImage(image)); + label->resize(label->sizeHint()); + label->show(); + activeWidget = label; +#endif + break; + } + + case PictureType: + { + QPicture pic; + QPainter pt(&pic); + pcmd.setPainter(&pt); + pcmd.setFilePath(fileinfo.absolutePath()); + pcmd.runCommands(); + pt.end(); + + QImage image(width, height, QImage::Format_ARGB32_Premultiplied); + image.fill(0); + pt.begin(&image); + pt.drawPicture(0, 0, pic); + pt.end(); + QLabel *label = createLabel(); + label->setWindowTitle(fileinfo.absolutePath()); + label->setPixmap(QPixmap::fromImage(image)); + label->resize(label->sizeHint()); + label->show(); + activeWidget = label; + break; + } + + case PrinterType: + { +#ifndef QT_NO_PRINTER + PaintCommands pcmd(QStringList(), 800, 800); + pcmd.setVerboseMode(verboseMode); + pcmd.setType(type); + pcmd.setCheckersBackground(checkers_background); + pcmd.setContents(content); + QString file = QString(files.at(j)).replace(".", "_") + ".ps"; + + QPrinter p(highres ? QPrinter::HighResolution : QPrinter::ScreenResolution); + if (printdlg) { + QPrintDialog printDialog(&p, 0); + if (printDialog.exec() != QDialog::Accepted) + break; + } else { + p.setOutputFileName(file); + } + + QPainter pt(&p); + pcmd.setPainter(&pt); + pcmd.setFilePath(fileinfo.absolutePath()); + pcmd.runCommands(); + pt.end(); + + if (!printdlg) { + printf("wrote file: %s\n", qPrintable(file)); + } + + Q_ASSERT(!p.paintingActive()); +#endif + break; + } + case PsType: + case PdfType: + { +#ifndef QT_NO_PRINTER + PaintCommands pcmd(QStringList(), 800, 800); + pcmd.setVerboseMode(verboseMode); + pcmd.setType(type); + pcmd.setCheckersBackground(checkers_background); + pcmd.setContents(content); + bool ps = type == PsType; + QPrinter p(highres ? QPrinter::HighResolution : QPrinter::ScreenResolution); + QFileInfo input(files.at(j)); + QString file = QString("%1_%2.%3") + .arg(input.baseName()) + .arg(input.suffix()) + .arg(ps ? "ps" : "pdf"); + p.setOutputFormat(ps ? QPrinter::PdfFormat : QPrinter::PostScriptFormat); + p.setOutputFileName(file); + p.setPageSize(QPrinter::A4); + QPainter pt(&p); + pcmd.setPainter(&pt); + pcmd.setFilePath(fileinfo.absolutePath()); + pcmd.runCommands(); + pt.end(); + + printf("write file: %s\n", qPrintable(file)); +#endif + break; + } + case GrabType: + { + QImage image(width, height, QImage::Format_ARGB32_Premultiplied); + image.fill(QColor(Qt::white).rgb()); + QPainter pt(&image); + pcmd.setPainter(&pt); + pcmd.setFilePath(fileinfo.absolutePath()); + pcmd.runCommands(); + pt.end(); + QImage image1(width, height, QImage::Format_RGB32); + image1.fill(QColor(Qt::white).rgb()); + QPainter pt1(&image1); + pt1.drawImage(QPointF(0, 0), image); + pt1.end(); + + QString filename = QString(files.at(j)).replace(".qps", "_qps") + ".png"; + image1.save(filename, "PNG"); + printf("%s grabbed to %s\n", qPrintable(files.at(j)), qPrintable(filename)); + break; + } + default: + break; + } + } + } +#ifndef CONSOLE_APPLICATION + if (activeWidget || interactive) { + QObject::connect(&app, SIGNAL(lastWindowClosed()), &app, SLOT(quit())); + app.exec(); + } + delete activeWidget; +#endif + delete interactive_widget; + return 0; +} +