⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xview.cpp

📁 PIXIL is a small footprint operating environment, complete with PDA PIM applications, a browser and
💻 CPP
字号:
#include <stdio.h>#include <string.h>#include <qiodevice.h>#include <qcolor.h>#include <qfile.h>#include <qwmatrix.h>#include "xview.h"// #include "config-kfm.h"void read_xv_file( QImageIO *_imageio ){          int x=-1;    int y=-1;    int maxval=-1;      char str[ 1024 ];    // magic number must be "P7 332"    _imageio->ioDevice()->readLine( str, 1024 );    if (strncmp(str,"P7 332",6)) return;    // next line #XVVERSION    _imageio->ioDevice()->readLine( str, 1024 );    if (strncmp(str, "#XVVERSION", 10))       return;    // now it gets interesting, #BUILTIN means we are out.    // if IMGINFO comes, we are happy!    _imageio->ioDevice()->readLine( str, 1024 );    if (strncmp(str, "#IMGINFO:", 9))      return;        // after this an #END_OF_COMMENTS signals everything to be ok!    _imageio->ioDevice()->readLine( str, 1024 );    if (strncmp(str, "#END_OF", 7))      return;    // now a last line with width, height, maxval which is supposed to be 255    _imageio->ioDevice()->readLine( str, 1024 );    sscanf(str, "%d %d %d", &x, &y, &maxval);    if (maxval != 255) return;    // now follows a binary block of x*y bytes.     // debugT("Loading XView file %d %d %d\n",x,y,maxval);        char *block = new char[x*y];    if (_imageio->ioDevice()->readBlock(block, x*y) != x*y)     {	// debugT("kpixmap::readXVPICS could not read datablock of %d bytes\n", x*y);	return;    }    // debugT("Loaded data\n");        // Create the image    QImage image( x, y, 8, maxval + 1, QImage::BigEndian );        // debugT("Created image\n");        // how do the color handling? they are absolute 24bpp    // or at least can be calculated as such.    int r,g,b;    // char *p;    for ( int j = 0; j < 256; j++ )    {      r =  ((int) ((j >> 5) & 0x07)) << 5;            g =  ((int) ((j >> 2) & 0x07)) << 5;         b =  ((int) ((j >> 0) & 0x03)) << 6;      image.setColor( j, qRgb( r, g, b ) );    }    // debugT("Created colors\n");        for ( int py = 0; py < y; py++ )    {	uchar *data = image.scanLine( py );		memcpy( data, block + py * x, x );    }        _imageio->setImage( image );    _imageio->setStatus( 0 );    // debugT("Loaded image\n");    delete [] block;    return;}void write_xv_file( const char *_filename, QPixmap &_pixmap ){    // debugT("Saving to '%s'\n",_filename);        QFile f( _filename );    if ( !f.open( IO_WriteOnly ) )	return;     if ( _pixmap.isNull() )    {	f.close();	return;    }        int w, h;        if ( _pixmap.width() > _pixmap.height() )    {	if ( _pixmap.width() < 80 )	    w = _pixmap.width();	else	    w = 80;	h = (int)( (float)_pixmap.height() * ( (float)w / (float)_pixmap.width() ) );    }    else    {	if ( _pixmap.height() < 60 )	    h = _pixmap.height();	else	    h = 60;	w = (int)( (float)_pixmap.width() * ( (float)h / (float)_pixmap.height() ) );    }        QWMatrix matrix;    matrix.scale( (float)w/_pixmap.width(), (float)h/_pixmap.height() );    QPixmap tp = _pixmap.xForm( matrix );             char str[ 1024 ];    // magic number must be "P7 332"    f.writeBlock( "P7 332\n", 7 );    // next line #XVVERSION    f.writeBlock( "#XVVERSION:\n", 12 );    // now it gets interesting, #BUILTIN means we are out.    // if IMGINFO comes, we are happy!    f.writeBlock( "#IMGINFO:\n", 10 );        // after this an #END_OF_COMMENTS signals everything to be ok!    f.writeBlock( "#END_OF_COMMENTS:\n", 18 );    // now a last line with width, height, maxval which is supposed to be 255    sprintf( str, "%i %i 255\n", w, h );    f.writeBlock( str, strlen( str ) );    QImage image = tp.convertToImage();    if ( image.depth() == 1 )    {	// debugT("Converted image\n");	image = image.convertDepth( 8 );    }        uchar buffer[ 128 ];    // debugT("Image of depth %i\n",image.depth());        for ( int py = 0; py < h; py++ )    {	uchar *data = image.scanLine( py );	for ( int px = 0; px < w; px++ )	{	    int r, g, b;	    if ( image.depth() == 32 )	    {		QRgb *data32 = (QRgb*) data;		r = qRed( *data32 ) >> 5;		g = qGreen( *data32 ) >> 5;				b = qBlue( *data32 ) >> 6;		data += sizeof( QRgb );	    }	    else 	    {		QRgb color = image.color( *data );		r = qRed( color ) >> 5;		g = qGreen( color ) >> 5;				b = qBlue( color ) >> 6;		data++;	    }	    buffer[ px ] = ( r << 5 ) | ( g << 2 ) | b;	}	f.writeBlock( (const char*)buffer, w );    }        f.close();}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -