summaryrefslogtreecommitdiffstats
path: root/tqtinterface/qt4/tools/qembed/qembed.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tqtinterface/qt4/tools/qembed/qembed.cpp')
-rw-r--r--tqtinterface/qt4/tools/qembed/qembed.cpp338
1 files changed, 338 insertions, 0 deletions
diff --git a/tqtinterface/qt4/tools/qembed/qembed.cpp b/tqtinterface/qt4/tools/qembed/qembed.cpp
new file mode 100644
index 0000000..9c11bc2
--- /dev/null
+++ b/tqtinterface/qt4/tools/qembed/qembed.cpp
@@ -0,0 +1,338 @@
+/****************************************************************************
+**
+** Utility program for embedding binary data into a C/C++ source code.
+** It reads a binary file and generates a C array with the binary data.
+** The C code is written to standard output.
+**
+** Created : 951017
+**
+** Copyright (C) 1995-2008 Trolltech ASA. All rights reserved.
+**
+** Permission to use, copy, modify, and distribute this software and its
+** documentation for any purpose and without fee is hereby granted, provided
+** that this copyright notice appears in all copies.
+** No representations are made about the suitability of this software for any
+** purpose. It is provided "as is" without express or implied warranty.
+**
+*****************************************************************************/
+
+#include <tqstring.h>
+#include <tqfile.h>
+#include <tqfileinfo.h>
+#include <tqptrlist.h>
+#include <tqtextstream.h>
+#include <tqdatetime.h>
+#include <tqimage.h>
+#include <tqdict.h>
+#include <tqdir.h>
+#include <ctype.h>
+#include <stdlib.h>
+
+static void embedData( const TQByteArray &input, TQFile *output );
+static void embedData( const uchar* input, int size, TQFile *output );
+static void embedData( const TQRgb* input, int size, TQFile *output );
+static TQString convertFileNameToCIdentifier( const char * );
+
+static const char header[] = "/* Generated by qembed */\n";
+
+struct Embed {
+ uint size;
+ TQString name;
+ TQString cname;
+};
+
+struct EmbedImage {
+ int width;
+ int height;
+ int depth;
+ int numColors;
+ TQRgb* colorTable;
+ TQString name;
+ TQString cname;
+ bool alpha;
+};
+
+int main( int argc, char **argv )
+{
+ if ( argc < 2 ) {
+ qWarning( "Usage:\n\t%s [--images] files", argv[0] );
+ return 1;
+ }
+
+ TQFile output;
+ bool output_hdr = FALSE;
+ bool images = FALSE;
+ output.open( IO_WriteOnly, stdout );
+ TQTextStream out( &output );
+
+ TQPtrList<EmbedImage> list_image;
+ TQPtrList<Embed> list;
+ list.setAutoDelete( TRUE );
+ list_image.setAutoDelete( TRUE );
+
+ long l = rand();
+ out << "#ifndef _TQEMBED_" << l << endl;
+ out << "#define _TQEMBED_" << l << endl;
+
+ TQStringList args;
+ for ( int i = 1; i < argc; ++i ) {
+ TQString file( argv[i] );
+#ifdef TQ_WS_WIN
+ // Since wildcards are not expanded automatically for us on Windows, we need to do
+ // it ourselves
+ if ( file.tqcontains( '*' ) || file.tqcontains( '?' ) ) {
+ TQDir d;
+ const TQFileInfoList *fiList = d.entryInfoList( file, TQDir::Files );
+ TQFileInfoListIterator it(*fiList);
+ while ( it.current() ) {
+ args << (*it)->filePath();
+ ++it;
+ }
+ } else
+#endif
+ args << file;
+ }
+ for ( TQStringList::Iterator it = args.begin(); it != args.end(); ++it ) {
+ TQString arg = (*it);
+ if ( arg == "--images" ) {
+ if ( !images ) {
+ out << "#include <tqimage.h>\n";
+ out << "#include <tqdict.h>\n";
+ images = TRUE;
+ }
+ } else {
+ TQFile f( *it );
+ if ( !f.open(IO_ReadOnly) ) {
+ qWarning( "Cannot open file %s, ignoring it", (*it).latin1() );
+ continue;
+ }
+ TQByteArray a( f.size() );
+ if ( f.size() == 0
+ || f.readBlock(a.data(), f.size()) != (int)f.size() ) {
+ qWarning( "Cannot read file %s, ignoring it", (*it).latin1() );
+ continue;
+ }
+ if ( images ) {
+ TQImage img;
+ if ( !img.loadFromData(a) ) {
+ qWarning( "Cannot read image from file %s, ignoring it", (*it).latin1() );
+ continue;
+ }
+ EmbedImage *e = new EmbedImage;
+ e->width = img.width();
+ e->height = img.height();
+ e->depth = img.depth();
+ e->numColors = img.numColors();
+ e->colorTable = new TQRgb[e->numColors];
+ e->alpha = img.hasAlphaBuffer();
+ memcpy(e->colorTable, img.tqcolorTable(), e->numColors*sizeof(TQRgb));
+ TQFileInfo fi( (*it) );
+ e->name = fi.baseName();
+ e->cname = convertFileNameToCIdentifier( e->name.latin1() );
+ list_image.append( e );
+ TQString s;
+ if ( e->depth == 32 ) {
+ out << s.sprintf( "static const TQRgb %s_data[] = {",
+ (const char *)e->cname );
+ embedData( (TQRgb*)img.bits(), e->width*e->height, &output );
+ } else {
+ if ( e->depth == 1 )
+ img = img.convertBitOrder(TQImage::BigEndian);
+ out << s.sprintf( "static const unsigned char %s_data[] = {",
+ (const char *)e->cname );
+ embedData( img.bits(), img.numBytes(), &output );
+ }
+ out << "\n};\n\n";
+ if ( e->numColors ) {
+ out << s.sprintf( "static const TQRgb %s_ctable[] = {",
+ (const char *)e->cname );
+ embedData( e->colorTable, e->numColors, &output );
+ out << "\n};\n\n";
+ }
+ } else {
+ Embed *e = new Embed;
+ e->size = f.size();
+ e->name = (*it);
+ e->cname = convertFileNameToCIdentifier( (*it) );
+ list.append( e );
+ TQString s;
+ out << s.sprintf( "static const unsigned int %s_len = %d;\n",
+ (const char *)e->cname, e->size );
+ out << s.sprintf( "static const unsigned char %s_data[] = {",
+ (const char *)e->cname );
+ embedData( a, &output );
+ out << "\n};\n\n";
+ }
+ if ( !output_hdr ) {
+ output_hdr = TRUE;
+ out << header;
+ }
+ }
+ }
+
+ if ( list.count() > 0 ) {
+ out << "#include <tqcstring.h>\n";
+ if ( !images )
+ out << "#include <tqdict.h>\n";
+
+ out << "static struct Embed {\n"
+ " unsigned int size;\n"
+ " const unsigned char *data;\n"
+ " const char *name;\n"
+ "} embed_vec[] = {\n";
+ Embed *e = list.first();
+ while ( e ) {
+ out << " { " << e->size << ", " << e->cname << "_data, "
+ << "\"" << e->name << "\" },\n";
+ e = list.next();
+ }
+ out << " { 0, 0, 0 }\n};\n";
+
+ out << "\n"
+"static const TQByteArray& qembed_tqfindData( const char* name )\n"
+"{\n"
+" static TQDict<TQByteArray> dict;\n"
+" TQByteArray* ba = dict.tqfind( name );\n"
+" if ( !ba ) {\n"
+" for ( int i = 0; embed_vec[i].data; i++ ) {\n"
+" if ( strcmp(embed_vec[i].name, name) == 0 ) {\n"
+" ba = new TQByteArray;\n"
+" ba->setRawData( (char*)embed_vec[i].data,\n"
+" embed_vec[i].size );\n"
+" dict.insert( name, ba );\n"
+" break;\n"
+" }\n"
+" }\n"
+" if ( !ba ) {\n"
+" static TQByteArray dummy;\n"
+" return dummy;\n"
+" }\n"
+" }\n"
+" return *ba;\n"
+"}\n\n";
+ }
+
+ if ( list_image.count() > 0 ) {
+ out << "static struct EmbedImage {\n"
+ " int width, height, depth;\n"
+ " const unsigned char *data;\n"
+ " int numColors;\n"
+ " const TQRgb *colorTable;\n"
+ " bool alpha;\n"
+ " const char *name;\n"
+ "} embed_image_vec[] = {\n";
+ EmbedImage *e = list_image.first();
+ while ( e ) {
+ out << " { "
+ << e->width << ", "
+ << e->height << ", "
+ << e->depth << ", "
+ << "(const unsigned char*)" << e->cname << "_data, "
+ << e->numColors << ", ";
+ if ( e->numColors )
+ out << e->cname << "_ctable, ";
+ else
+ out << "0, ";
+ if ( e->alpha )
+ out << "TRUE, ";
+ else
+ out << "FALSE, ";
+ out << "\"" << e->name << "\" },\n";
+ e = list_image.next();
+ }
+ out << " { 0, 0, 0, 0, 0, 0, 0, 0 }\n};\n";
+
+ out << "\n"
+"static const TQImage& qembed_tqfindImage( const TQString& name )\n"
+"{\n"
+" static TQDict<TQImage> dict;\n"
+" TQImage* img = dict.tqfind( name );\n"
+" if ( !img ) {\n"
+" for ( int i = 0; embed_image_vec[i].data; i++ ) {\n"
+" if ( strcmp(embed_image_vec[i].name, name.latin1()) == 0 ) {\n"
+" img = new TQImage((uchar*)embed_image_vec[i].data,\n"
+" embed_image_vec[i].width,\n"
+" embed_image_vec[i].height,\n"
+" embed_image_vec[i].depth,\n"
+" (TQRgb*)embed_image_vec[i].colorTable,\n"
+" embed_image_vec[i].numColors,\n"
+" TQImage::BigEndian );\n"
+" if ( embed_image_vec[i].alpha )\n"
+" img->setAlphaBuffer( TRUE );\n"
+" dict.insert( name, img );\n"
+" break;\n"
+" }\n"
+" }\n"
+" if ( !img ) {\n"
+" static TQImage dummy;\n"
+" return dummy;\n"
+" }\n"
+" }\n"
+" return *img;\n"
+"}\n\n";
+ }
+
+ out << "#endif" << endl;
+
+ return 0;
+}
+
+
+TQString convertFileNameToCIdentifier( const char *s )
+{
+ TQString r = s;
+ int len = r.length();
+ if ( len > 0 && !isalpha( (char)r[0].latin1() ) )
+ r[0] = '_';
+ for ( int i = 1; i < len; i++ ) {
+ if ( !isalnum( (char)r[i].latin1() ) )
+ r[i] = '_';
+ }
+ return r;
+}
+
+
+void embedData( const TQByteArray &input, TQFile *output )
+{
+ embedData((uchar*)input.data(), input.size(), output);
+}
+
+void embedData( const uchar* input, int nbytes, TQFile *output )
+{
+ static const char hexdigits[] = "0123456789abcdef";
+ TQString s;
+ for ( int i=0; i<nbytes; i++ ) {
+ if ( (i%14) == 0 ) {
+ s += "\n ";
+ output->writeBlock( (const char*)s, s.length() );
+ s.truncate( 0 );
+ }
+ uint v = input[i];
+ s += "0x";
+ s += hexdigits[(v >> 4) & 15];
+ s += hexdigits[v & 15];
+ if ( i < nbytes-1 )
+ s += ',';
+ }
+ if ( s.length() )
+ output->writeBlock( (const char*)s, s.length() );
+}
+
+void embedData( const TQRgb* input, int n, TQFile *output )
+{
+ TQString s;
+ for ( int i = 0; i < n; i++ ) {
+ if ( (i % 14) == 0 ) {
+ s += "\n ";
+ output->writeBlock( (const char*)s, s.length() );
+ s.truncate( 0 );
+ }
+ TQRgb v = input[i];
+ s += "0x";
+ s += TQString::number( v, 16 );
+ if ( i < n-1 )
+ s += ',';
+ }
+ if ( s.length() )
+ output->writeBlock( (const char*)s, s.length() );
+}