diff options
author | Timothy Pearson <kb9vqf@pearsoncomputing.net> | 2011-07-10 15:24:15 -0500 |
---|---|---|
committer | Timothy Pearson <kb9vqf@pearsoncomputing.net> | 2011-07-10 15:24:15 -0500 |
commit | bd0f3345a938b35ce6a12f6150373b0955b8dd12 (patch) | |
tree | 7a520322212d48ebcb9fbe1087e7fca28b76185c /examples/canvas/makeimg.cpp | |
download | qt3-bd0f3345a938b35ce6a12f6150373b0955b8dd12.tar.gz qt3-bd0f3345a938b35ce6a12f6150373b0955b8dd12.zip |
Add Qt3 development HEAD version
Diffstat (limited to 'examples/canvas/makeimg.cpp')
-rw-r--r-- | examples/canvas/makeimg.cpp | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/examples/canvas/makeimg.cpp b/examples/canvas/makeimg.cpp new file mode 100644 index 0000000..c90ce8c --- /dev/null +++ b/examples/canvas/makeimg.cpp @@ -0,0 +1,92 @@ +#include <qimage.h> +#include <qcolor.h> + +static inline int blendComponent( int v, int av, int s, int as ) +{ + //shadow gets a color inversely proportional to the + //alpha value + s = (s*(255-as))/255; + //then do standard blending + return as*s + av*v -(av*as*s)/255; +} + +static inline QRgb blendShade( QRgb v, QRgb s ) +{ + //pick a number: shadow is 1/3 of object + int as = qAlpha(s)/3; + int av = qAlpha(v); + if ( as == 0 || av == 255 ) + return v; + + int a = as + av -(as*av)/255; + + + int r = blendComponent( qRed(v),av, qRed(s), as)/a; + int g = blendComponent( qGreen(v),av, qGreen(s), as)/a; + int b = blendComponent( qBlue(v),av, qBlue(s), as)/a; + + return qRgba(r,g,b,a); +} + +int main( int*, char**) +{ + QImage *img; + + img = new QImage( "in.png" ); + int w,h; + int y; + img->setAlphaBuffer( TRUE ); + *img = img->convertDepth( 32 ); + w = img->width(); + h = img->height(); +#if 0 + for ( y = 0; y < h; y ++ ) { + uint *line = (uint*)img->scanLine( y ); + for ( int x = 0; x < w; x++ ) { + uint pixel = line[x]; + int r = qRed(pixel); + int g = qGreen(pixel); + int b = qBlue(pixel); + int min = QMIN( r, QMIN( g, b ) ); + int max = QMAX( r, QMAX( g, b ) ); + r -= min; + g -= min; + b -= min; + if ( max !=min ) { + r = (r*255)/(max-min); + g = (g*255)/(max-min); + b = (b*255)/(max-min); + } + int a = 255-min; + a -= (max-min)/3; //hack more transparency for colors. + line[x] = qRgba( r, g, b, a ); + } + } +#endif + *img = img->smoothScale( w/2, h/2 ); + + qDebug( "saving out.png"); + img->save( "out.png", "PNG" ); + + w = img->width(); + h = img->height(); + + QImage *img2 = new QImage( w, h, 32 ); + img2->setAlphaBuffer( TRUE ); + for ( y = 0; y < h; y++ ) { + for ( int x = 0; x < w; x++ ) { + QRgb shader = img->pixel( x, y ); + + int as = qAlpha(shader)/3; + + int r = (qRed(shader)*(255-as))/255; + int g = (qGreen(shader)*(255-as))/255; + int b = (qBlue(shader)*(255-as))/255; + + img2->setPixel( x, y, qRgba(r,g,b,as) ); + } + } + + img2->save( "outshade.png", "PNG" ); + +} |