Began incorporating hqXx filter. Removed old, unused Win32 code.
This commit is contained in:
parent
dba2ecf3b3
commit
a6427c94ee
12 changed files with 9247 additions and 335 deletions
40
Makefile
40
Makefile
|
|
@ -6,7 +6,7 @@
|
||||||
# bill@newbreedsoftware.com
|
# bill@newbreedsoftware.com
|
||||||
# http://www.newbreedsoftware.com/tuxpaint/
|
# http://www.newbreedsoftware.com/tuxpaint/
|
||||||
|
|
||||||
# June 14, 2002 - December 19, 2003
|
# June 14, 2002 - December 20, 2003
|
||||||
|
|
||||||
|
|
||||||
# Where to install things:
|
# Where to install things:
|
||||||
|
|
@ -541,11 +541,12 @@ install-man:
|
||||||
|
|
||||||
# Build the program!
|
# Build the program!
|
||||||
|
|
||||||
tuxpaint: obj/tuxpaint.o $(ARCH_LIBS)
|
tuxpaint: obj/tuxpaint.o obj/hqxx.o obj/hq3x.o obj/hq4x.o $(ARCH_LIBS)
|
||||||
@echo
|
@echo
|
||||||
@echo "...Linking Tux Paint..."
|
@echo "...Linking Tux Paint..."
|
||||||
@$(CC) $(CFLAGS) $(SDL_CFLAGS) $(DEFS) \
|
@$(CC) $(CFLAGS) $(SDL_CFLAGS) $(DEFS) \
|
||||||
-o tuxpaint obj/tuxpaint.o $(ARCH_LIBS) $(SDL_LIBS) \
|
-o tuxpaint obj/tuxpaint.o obj/hqxx.o obj/hq3x.o obj/hq4x.o \
|
||||||
|
$(ARCH_LIBS) $(SDL_LIBS) \
|
||||||
-lm $(ARCH_LINKS)
|
-lm $(ARCH_LINKS)
|
||||||
@$(RSRC_CMD)
|
@$(RSRC_CMD)
|
||||||
@$(MIMESET_CMD)
|
@$(MIMESET_CMD)
|
||||||
|
|
@ -553,9 +554,10 @@ tuxpaint: obj/tuxpaint.o $(ARCH_LIBS)
|
||||||
|
|
||||||
# Build the object for the program!
|
# Build the object for the program!
|
||||||
|
|
||||||
obj/tuxpaint.o: src/tuxpaint.c obj \
|
obj/tuxpaint.o: src/tuxpaint.c \
|
||||||
src/tools.h src/titles.h src/colors.h src/shapes.h \
|
src/tools.h src/titles.h src/colors.h src/shapes.h \
|
||||||
src/magic.h src/sounds.h src/tip_tux.h src/great.h \
|
src/magic.h src/sounds.h src/tip_tux.h src/great.h \
|
||||||
|
src/hqxx.h src/hq3x.h src/hq4x.h \
|
||||||
src/mouse/arrow.xbm src/mouse/arrow-mask.xbm \
|
src/mouse/arrow.xbm src/mouse/arrow-mask.xbm \
|
||||||
src/mouse/hand.xbm src/mouse/hand-mask.xbm \
|
src/mouse/hand.xbm src/mouse/hand-mask.xbm \
|
||||||
src/mouse/insertion.xbm src/mouse/insertion-mask.xbm \
|
src/mouse/insertion.xbm src/mouse/insertion-mask.xbm \
|
||||||
|
|
@ -581,6 +583,26 @@ obj/BeOS_Print.o: src/BeOS_Print.cpp obj src/BeOS_print.h
|
||||||
-c src/BeOS_print.cpp -o obj/BeOS_print.o
|
-c src/BeOS_print.cpp -o obj/BeOS_print.o
|
||||||
|
|
||||||
|
|
||||||
|
obj/hq3x.o: src/hq3x.c src/hq3x.h src/hqxx.h
|
||||||
|
@echo
|
||||||
|
@echo "...Compiling high quality 3x scale filter..."
|
||||||
|
@$(CC) $(CFLAGS) \
|
||||||
|
-c src/hq3x.c -o obj/hq3x.o
|
||||||
|
|
||||||
|
|
||||||
|
obj/hq4x.o: src/hq4x.c src/hq4x.h src/hqxx.h
|
||||||
|
@echo
|
||||||
|
@echo "...Compiling high quality 4x scale filter..."
|
||||||
|
@$(CC) $(CFLAGS) \
|
||||||
|
-c src/hq4x.c -o obj/hq4x.o
|
||||||
|
|
||||||
|
obj/hqxx.o: src/hqxx.c src/hqxx.h
|
||||||
|
@echo
|
||||||
|
@echo "...Compiling high quality scale filter helpers..."
|
||||||
|
@$(CC) $(CFLAGS) \
|
||||||
|
-c src/hqxx.c -o obj/hqxx.o
|
||||||
|
|
||||||
|
|
||||||
# Build the translation files for gettext
|
# Build the translation files for gettext
|
||||||
|
|
||||||
translations: trans \
|
translations: trans \
|
||||||
|
|
@ -654,11 +676,11 @@ trans/es.mo: src/messages/es.po
|
||||||
trans/eu.mo: src/messages/eu.po
|
trans/eu.mo: src/messages/eu.po
|
||||||
@echo " eu_ES ...Basque..."
|
@echo " eu_ES ...Basque..."
|
||||||
@msgfmt src/messages/eu.po -o trans/eu.mo
|
@msgfmt src/messages/eu.po -o trans/eu.mo
|
||||||
|
|
||||||
trans/fi.mo: src/messages/fi.po
|
trans/fi.mo: src/messages/fi.po
|
||||||
@echo " fi_FI ...Finnish..."
|
@echo " fi_FI ...Finnish..."
|
||||||
@msgfmt src/messages/fi.po -o trans/fi.mo
|
@msgfmt src/messages/fi.po -o trans/fi.mo
|
||||||
|
|
||||||
trans/fr.mo: src/messages/fr.po
|
trans/fr.mo: src/messages/fr.po
|
||||||
@echo " fr_FR ...French..."
|
@echo " fr_FR ...French..."
|
||||||
@msgfmt src/messages/fr.po -o trans/fr.mo
|
@msgfmt src/messages/fr.po -o trans/fr.mo
|
||||||
|
|
@ -681,8 +703,8 @@ trans/is.mo: src/messages/is.po
|
||||||
|
|
||||||
trans/it.mo: src/messages/it.po
|
trans/it.mo: src/messages/it.po
|
||||||
@echo " it_IT ...Italian..."
|
@echo " it_IT ...Italian..."
|
||||||
@msgfmt src/messages/it.po -o trans/it.mo
|
@msgfmt src/messages/it.po -o trans/it.m
|
||||||
|
|
||||||
trans/ja.mo: src/messages/ja.po
|
trans/ja.mo: src/messages/ja.po
|
||||||
@echo " ja_JP ...Japanese..."
|
@echo " ja_JP ...Japanese..."
|
||||||
@msgfmt src/messages/ja.po -o trans/ja.mo
|
@msgfmt src/messages/ja.po -o trans/ja.mo
|
||||||
|
|
@ -706,7 +728,7 @@ trans/nl.mo: src/messages/nl.po
|
||||||
trans/nb.mo: src/messages/nb.po
|
trans/nb.mo: src/messages/nb.po
|
||||||
@echo " nb_NO ...Norwegian Bokmal..."
|
@echo " nb_NO ...Norwegian Bokmal..."
|
||||||
@msgfmt src/messages/nb.po -o trans/nb.mo
|
@msgfmt src/messages/nb.po -o trans/nb.mo
|
||||||
|
|
||||||
trans/nn.mo: src/messages/nn.po
|
trans/nn.mo: src/messages/nn.po
|
||||||
@echo " nn_NO ...Norwegian Nynorsk..."
|
@echo " nn_NO ...Norwegian Nynorsk..."
|
||||||
@msgfmt src/messages/nn.po -o trans/nn.mo
|
@msgfmt src/messages/nn.po -o trans/nn.mo
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@ bill@newbreedsoftware.com
|
||||||
http://www.newbreedsoftware.com/tuxpaint/
|
http://www.newbreedsoftware.com/tuxpaint/
|
||||||
|
|
||||||
|
|
||||||
June 17, 2002 - December 18, 2003
|
June 17, 2002 - December 20, 2003
|
||||||
|
|
||||||
|
|
||||||
* Design and Coding:
|
* Design and Coding:
|
||||||
|
|
@ -26,7 +26,11 @@ June 17, 2002 - December 18, 2003
|
||||||
by Damian Yerrick - http://www.wikipedia.org/wiki/Damian_Yerrick
|
by Damian Yerrick - http://www.wikipedia.org/wiki/Damian_Yerrick
|
||||||
|
|
||||||
800x600 resolution support patch by:
|
800x600 resolution support patch by:
|
||||||
TOYAMA Shin-ichi <kyone@tky2.3web.ne.jp>
|
TOYAMA Shin-ichi <shin1@wmail.plala.or.jp>
|
||||||
|
|
||||||
|
High quality stamp scaler from "hq2x", "hq3x" and "hq4x" demos
|
||||||
|
http://www.hiend3d.com/hq3x.html
|
||||||
|
by Maxim Stepin <maxim@hiend3d.com>
|
||||||
|
|
||||||
|
|
||||||
* Graphics
|
* Graphics
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@ bill@newbreedsoftware.com
|
||||||
http://www.newbreedsoftware.com/tuxpaint/
|
http://www.newbreedsoftware.com/tuxpaint/
|
||||||
|
|
||||||
|
|
||||||
2003.Dec.19 (0.9.13)
|
2003.Dec.20 (0.9.13)
|
||||||
* Translated into Basque (eu_ES)
|
* Translated into Basque (eu_ES)
|
||||||
Juan Irigoien <juanirigoien@irakasle.net>
|
Juan Irigoien <juanirigoien@irakasle.net>
|
||||||
|
|
||||||
|
|
@ -25,7 +25,11 @@ http://www.newbreedsoftware.com/tuxpaint/
|
||||||
(Place "noflip" and/or "nomirror" in the stamps' ".dat"
|
(Place "noflip" and/or "nomirror" in the stamps' ".dat"
|
||||||
option files.) Stamps can have alternative mirror-images (e.g., to
|
option files.) Stamps can have alternative mirror-images (e.g., to
|
||||||
show a shape the opposite direction, but not have backwards text on it).
|
show a shape the opposite direction, but not have backwards text on it).
|
||||||
Create "filename_mirror.png" image files. [PENDING]
|
Create "filename_mirror.png" image files.
|
||||||
|
|
||||||
|
* Incorproated high quality filtering code from HiEnd3D,
|
||||||
|
http://www.hiend3d.com/hq3x.html
|
||||||
|
by Maxim Stepin <maxim@hiend3d.com>
|
||||||
|
|
||||||
* Added "--nostampcontrols", "--mirrorstamps" and their opposite options,
|
* Added "--nostampcontrols", "--mirrorstamps" and their opposite options,
|
||||||
to disable stamp controls, and default to mirrored stamp shapes,
|
to disable stamp controls, and default to mirrored stamp shapes,
|
||||||
|
|
|
||||||
3797
src/hq3x.c
Normal file
3797
src/hq3x.c
Normal file
File diff suppressed because it is too large
Load diff
1
src/hq3x.h
Normal file
1
src/hq3x.h
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
void hq3x_32( unsigned char * pIn, unsigned char * pOut, int Xres, int Yres, int BpL, int LUT16to32[65536], int RGBtoYUV[65536] );
|
||||||
5230
src/hq4x.c
Normal file
5230
src/hq4x.c
Normal file
File diff suppressed because it is too large
Load diff
1
src/hq4x.h
Normal file
1
src/hq4x.h
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
void hq4x_32( unsigned char * pIn, unsigned char * pOut, int Xres, int Yres, int BpL, int LUT16to32[65536], int RGBtoYUV[65536] );
|
||||||
122
src/hqxx.c
Normal file
122
src/hqxx.c
Normal file
|
|
@ -0,0 +1,122 @@
|
||||||
|
/*
|
||||||
|
hqNx filter look-up table init
|
||||||
|
|
||||||
|
Copyright (C) 2003 MaxSt ( maxst@hiend3d.com )
|
||||||
|
Library-ified by Bill Kendrick <bill@newbreedsoftware.com>
|
||||||
|
Based on "hq3x_src_c.zip" dated August 5, 2003
|
||||||
|
from: http://www.hiend3d.com/hq3x.html
|
||||||
|
|
||||||
|
December 20, 2003 - December 20, 2003
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2.1 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "hqxx.h"
|
||||||
|
|
||||||
|
|
||||||
|
const int Ymask = 0x00FF0000;
|
||||||
|
const int Umask = 0x0000FF00;
|
||||||
|
const int Vmask = 0x000000FF;
|
||||||
|
const int trY = 0x00300000;
|
||||||
|
const int trU = 0x00000700;
|
||||||
|
const int trV = 0x00000006;
|
||||||
|
|
||||||
|
|
||||||
|
void InitLUTs(int * LUT16to32, int * RGBtoYUV)
|
||||||
|
{
|
||||||
|
int i, j, k, r, g, b, Y, u, v;
|
||||||
|
|
||||||
|
for (i=0; i<65536; i++)
|
||||||
|
LUT16to32[i] = ((i & 0xF800) << 8) + ((i & 0x07E0) << 5) + ((i & 0x001F) << 3);
|
||||||
|
|
||||||
|
for (i=0; i<32; i++)
|
||||||
|
for (j=0; j<64; j++)
|
||||||
|
for (k=0; k<32; k++)
|
||||||
|
{
|
||||||
|
r = i << 3;
|
||||||
|
g = j << 2;
|
||||||
|
b = k << 3;
|
||||||
|
Y = (r + g + b) >> 2;
|
||||||
|
u = 128 + ((r - b) >> 2);
|
||||||
|
v = 128 + ((-r + 2*g -b)>>3);
|
||||||
|
RGBtoYUV[ (i << 11) + (j << 5) + k ] = (Y<<16) + (u<<8) + v;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void Interp1(unsigned char * pc, int c1, int c2)
|
||||||
|
{
|
||||||
|
*((int*)pc) = (c1*3+c2) >> 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void Interp2(unsigned char * pc, int c1, int c2, int c3)
|
||||||
|
{
|
||||||
|
*((int*)pc) = (c1*2+c2+c3) >> 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void Interp3(unsigned char * pc, int c1, int c2)
|
||||||
|
{
|
||||||
|
//*((int*)pc) = (c1*7+c2)/8;
|
||||||
|
|
||||||
|
*((int*)pc) = ((((c1 & 0x00FF00)*7 + (c2 & 0x00FF00) ) & 0x0007F800) +
|
||||||
|
(((c1 & 0xFF00FF)*7 + (c2 & 0xFF00FF) ) & 0x07F807F8)) >> 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void Interp4(unsigned char * pc, int c1, int c2, int c3)
|
||||||
|
{
|
||||||
|
//*((int*)pc) = (c1*2+(c2+c3)*7)/16;
|
||||||
|
|
||||||
|
*((int*)pc) = ((((c1 & 0x00FF00)*2 + ((c2 & 0x00FF00) + (c3 & 0x00FF00))*7 ) & 0x000FF000) +
|
||||||
|
(((c1 & 0xFF00FF)*2 + ((c2 & 0xFF00FF) + (c3 & 0xFF00FF))*7 ) & 0x0FF00FF0)) >> 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void Interp5(unsigned char * pc, int c1, int c2)
|
||||||
|
{
|
||||||
|
*((int*)pc) = (c1+c2) >> 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void Interp6(unsigned char * pc, int c1, int c2, int c3)
|
||||||
|
{
|
||||||
|
//*((int*)pc) = (c1*5+c2*2+c3)/8;
|
||||||
|
|
||||||
|
*((int*)pc) = ((((c1 & 0x00FF00)*5 + (c2 & 0x00FF00)*2 + (c3 & 0x00FF00) ) & 0x0007F800) +
|
||||||
|
(((c1 & 0xFF00FF)*5 + (c2 & 0xFF00FF)*2 + (c3 & 0xFF00FF) ) & 0x07F807F8)) >> 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void Interp7(unsigned char * pc, int c1, int c2, int c3)
|
||||||
|
{
|
||||||
|
//*((int*)pc) = (c1*6+c2+c3)/8;
|
||||||
|
|
||||||
|
*((int*)pc) = ((((c1 & 0x00FF00)*6 + (c2 & 0x00FF00) + (c3 & 0x00FF00) ) & 0x0007F800) +
|
||||||
|
(((c1 & 0xFF00FF)*6 + (c2 & 0xFF00FF) + (c3 & 0xFF00FF) ) & 0x07F807F8)) >> 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void Interp8(unsigned char * pc, int c1, int c2)
|
||||||
|
{
|
||||||
|
//*((int*)pc) = (c1*5+c2*3)/8;
|
||||||
|
|
||||||
|
*((int*)pc) = ((((c1 & 0x00FF00)*5 + (c2 & 0x00FF00)*3 ) & 0x0007F800) +
|
||||||
|
(((c1 & 0xFF00FF)*5 + (c2 & 0xFF00FF)*3 ) & 0x07F807F8)) >> 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline int Diff(unsigned int w1, unsigned int w2)
|
||||||
|
{
|
||||||
|
YUV1 = w1; /* RGBtoYUV[w1]; */
|
||||||
|
YUV2 = w2; /* RGBtoYUV[w2]; */
|
||||||
|
return ( ( abs((YUV1 & Ymask) - (YUV2 & Ymask)) > trY ) ||
|
||||||
|
( abs((YUV1 & Umask) - (YUV2 & Umask)) > trU ) ||
|
||||||
|
( abs((YUV1 & Vmask) - (YUV2 & Vmask)) > trV ) );
|
||||||
|
}
|
||||||
48
src/hqxx.h
Normal file
48
src/hqxx.h
Normal file
|
|
@ -0,0 +1,48 @@
|
||||||
|
/*
|
||||||
|
hqNx filter look-up table init
|
||||||
|
|
||||||
|
Copyright (C) 2003 MaxSt ( maxst@hiend3d.com )
|
||||||
|
Library-ified by Bill Kendrick <bill@newbreedsoftware.com>
|
||||||
|
Based on "hq3x_src_c.zip" dated August 5, 2003
|
||||||
|
from: http://www.hiend3d.com/hq3x.html
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2.1 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef HQINIT_H
|
||||||
|
#define HQINIT_H
|
||||||
|
|
||||||
|
static int YUV1, YUV2;
|
||||||
|
extern const int Ymask;
|
||||||
|
extern const int Umask;
|
||||||
|
extern const int Vmask;
|
||||||
|
extern const int trY;
|
||||||
|
extern const int trU;
|
||||||
|
extern const int trV;
|
||||||
|
|
||||||
|
void InitLUTs(int * LUT16to32, int * RGBtoYUV);
|
||||||
|
inline void Interp1(unsigned char * pc, int c1, int c2);
|
||||||
|
inline void Interp2(unsigned char * pc, int c1, int c2, int c3);
|
||||||
|
inline void Interp3(unsigned char * pc, int c1, int c2);
|
||||||
|
inline void Interp4(unsigned char * pc, int c1, int c2, int c3);
|
||||||
|
inline void Interp5(unsigned char * pc, int c1, int c2);
|
||||||
|
inline void Interp6(unsigned char * pc, int c1, int c2, int c3);
|
||||||
|
inline void Interp7(unsigned char * pc, int c1, int c2, int c3);
|
||||||
|
inline void Interp8(unsigned char * pc, int c1, int c2);
|
||||||
|
inline int Diff(unsigned int w1, unsigned int w2);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
@ -7,12 +7,12 @@
|
||||||
bill@newbreedsoftware.com
|
bill@newbreedsoftware.com
|
||||||
http://www.newbreedsoftware.com/tuxpaint/
|
http://www.newbreedsoftware.com/tuxpaint/
|
||||||
|
|
||||||
June 14, 2002 - December 19, 2003
|
June 14, 2002 - December 20, 2003
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#define VER_VERSION "0.9.13"
|
#define VER_VERSION "0.9.13"
|
||||||
#define VER_DATE "2003.12.19"
|
#define VER_DATE "2003.12.20"
|
||||||
|
|
||||||
|
|
||||||
/* #define DEBUG */
|
/* #define DEBUG */
|
||||||
|
|
@ -49,6 +49,9 @@
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
#include "hqxx.h"
|
||||||
|
#include "hq3x.h"
|
||||||
|
#include "hq4x.h"
|
||||||
|
|
||||||
#include <locale.h>
|
#include <locale.h>
|
||||||
#include <iconv.h>
|
#include <iconv.h>
|
||||||
|
|
|
||||||
|
|
@ -1,301 +0,0 @@
|
||||||
/* win32_print.c */
|
|
||||||
|
|
||||||
/* printing support for Tux Paint */
|
|
||||||
/* John Popplewell <john@johnnypops.demon.co.uk> */
|
|
||||||
|
|
||||||
/* Sept. 30, 2002 - Oct. 17, 2002 */
|
|
||||||
|
|
||||||
|
|
||||||
#include "SDL_syswm.h"
|
|
||||||
#include "win32_print.h"
|
|
||||||
#include "resource.h"
|
|
||||||
|
|
||||||
|
|
||||||
#define NOREF(x) ((x)=(x))
|
|
||||||
#define GETHINST(hWnd) ((HINSTANCE)GetWindowLong( hWnd, GWL_HINSTANCE ))
|
|
||||||
#define MIR( id ) (MAKEINTRESOURCE( id ))
|
|
||||||
|
|
||||||
|
|
||||||
static int bPrint;
|
|
||||||
static HWND hDlgCancel;
|
|
||||||
|
|
||||||
|
|
||||||
static int GetPrinterContext( HWND hWnd, PRINTDLG *pd )
|
|
||||||
{
|
|
||||||
pd->hwndOwner = hWnd;
|
|
||||||
pd->Flags = PD_RETURNDC;
|
|
||||||
pd->nFromPage = 0xFFFF;
|
|
||||||
pd->nToPage = 0xFFFF;
|
|
||||||
pd->nMinPage = 0xFFFF;
|
|
||||||
pd->nMaxPage = 0xFFFF;
|
|
||||||
pd->nCopies = 1;
|
|
||||||
|
|
||||||
return PrintDlg( pd );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
BOOL CALLBACK AbortProc( HDC hDC, int nCode )
|
|
||||||
{
|
|
||||||
MSG msg;
|
|
||||||
|
|
||||||
NOREF(nCode);
|
|
||||||
NOREF(hDC);
|
|
||||||
while ( PeekMessage( (LPMSG)&msg, (HWND)NULL, 0, 0, PM_REMOVE) )
|
|
||||||
{
|
|
||||||
if ( !IsDialogMessage( hDlgCancel, (LPMSG)&msg ) )
|
|
||||||
{
|
|
||||||
TranslateMessage( (LPMSG)&msg );
|
|
||||||
DispatchMessage( (LPMSG)&msg );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return bPrint;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
LRESULT CALLBACK AbortPrintJob( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam )
|
|
||||||
{
|
|
||||||
NOREF(hDlg);
|
|
||||||
NOREF(lParam);
|
|
||||||
NOREF(wParam);
|
|
||||||
NOREF(message);
|
|
||||||
switch ( message )
|
|
||||||
{
|
|
||||||
case WM_INITDIALOG :
|
|
||||||
return TRUE;
|
|
||||||
case WM_COMMAND :
|
|
||||||
bPrint = FALSE;
|
|
||||||
return TRUE;
|
|
||||||
default :
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static SDL_Surface *make32bitDIB( SDL_Surface *surf )
|
|
||||||
{
|
|
||||||
SDL_PixelFormat pixfmt;
|
|
||||||
SDL_Surface *surf32;
|
|
||||||
SDL_Surface *surfDIB;
|
|
||||||
Uint8 *src,*dst;
|
|
||||||
Uint32 linesize;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
memset( &pixfmt, 0, sizeof(pixfmt) );
|
|
||||||
pixfmt.palette = NULL;
|
|
||||||
pixfmt.BitsPerPixel = 32;
|
|
||||||
pixfmt.BytesPerPixel= 4;
|
|
||||||
pixfmt.Rmask = 0x00FF0000;
|
|
||||||
pixfmt.Gmask = 0x0000FF00;
|
|
||||||
pixfmt.Bmask = 0x000000FF;
|
|
||||||
pixfmt.Amask = 0xFF000000;
|
|
||||||
pixfmt.Rshift = 16;
|
|
||||||
pixfmt.Gshift = 8;
|
|
||||||
pixfmt.Bshift = 0;
|
|
||||||
pixfmt.Ashift = 24;
|
|
||||||
pixfmt.Rloss = 0;
|
|
||||||
pixfmt.Gloss = 0;
|
|
||||||
pixfmt.Bloss = 0;
|
|
||||||
pixfmt.Aloss = 0;
|
|
||||||
pixfmt.colorkey = 0;
|
|
||||||
pixfmt.alpha = 0;
|
|
||||||
|
|
||||||
surf32 = SDL_ConvertSurface( surf, &pixfmt, SDL_SWSURFACE );
|
|
||||||
surfDIB = SDL_CreateRGBSurface( SDL_SWSURFACE, surf32->w, surf32->h, 32,
|
|
||||||
pixfmt.Rmask, pixfmt.Gmask, pixfmt.Bmask, pixfmt.Amask );
|
|
||||||
|
|
||||||
linesize = surf32->w*sizeof(Uint32); /* Flip top2bottom */
|
|
||||||
dst = surfDIB->pixels;
|
|
||||||
src = ((Uint8*)surf32->pixels)+((surf32->h-1)*surf32->pitch);
|
|
||||||
for ( i = 0; i < surf32->h; ++i )
|
|
||||||
{
|
|
||||||
memcpy( dst, src, linesize );
|
|
||||||
src -= surf32->pitch;
|
|
||||||
dst += surfDIB->pitch;
|
|
||||||
}
|
|
||||||
|
|
||||||
SDL_FreeSurface( surf32 ); /* Free temp surface */
|
|
||||||
|
|
||||||
return surfDIB;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int IsPrinterAvailable( void )
|
|
||||||
{
|
|
||||||
char *section = "windows";
|
|
||||||
char *key = "device";
|
|
||||||
char *def = "NODEFAULTPRINTER";
|
|
||||||
char buff[256];
|
|
||||||
|
|
||||||
if ( !GetProfileString( section, key, def, buff, sizeof(buff) ) )
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
return (strcmp( buff, def ) != 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int SurfacePrint( SDL_Surface *surf )
|
|
||||||
{
|
|
||||||
int res = 0;
|
|
||||||
HWND hWnd;
|
|
||||||
PRINTDLG pd;
|
|
||||||
DOCINFO di;
|
|
||||||
int nError;
|
|
||||||
SDL_SysWMinfo wminfo;
|
|
||||||
HDC hDC;
|
|
||||||
BITMAPINFOHEADER bmih;
|
|
||||||
SDL_Surface *surf32 = NULL;
|
|
||||||
RECT rc;
|
|
||||||
float fLogPelsX1, fLogPelsY1, fLogPelsX2, fLogPelsY2;
|
|
||||||
float fScaleX, fScaleY;
|
|
||||||
int cWidthPels, xLeft, yTop;
|
|
||||||
float subscaler,subscalerx,subscalery;
|
|
||||||
int hDCCaps;
|
|
||||||
HANDLE hOldObject = NULL;
|
|
||||||
HBITMAP hbm = NULL;
|
|
||||||
HDC hdcMem = NULL;
|
|
||||||
|
|
||||||
SDL_VERSION(&wminfo.version);
|
|
||||||
if ( !SDL_GetWMInfo( &wminfo ) )
|
|
||||||
return -1;
|
|
||||||
hWnd = wminfo.window;
|
|
||||||
|
|
||||||
memset( &pd, 0, sizeof(PRINTDLG) );
|
|
||||||
pd.lStructSize = sizeof(PRINTDLG);
|
|
||||||
if ( !GetPrinterContext( hWnd, &pd ) || (pd.hDC == NULL) )
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
bPrint = TRUE;
|
|
||||||
SetAbortProc( pd.hDC, AbortProc );
|
|
||||||
hDlgCancel = CreateDialog( GETHINST(hWnd), MIR(IDD_ABORTDLG), hWnd, (DLGPROC)AbortPrintJob );
|
|
||||||
EnableWindow( hWnd, FALSE );
|
|
||||||
|
|
||||||
di.cbSize = sizeof(DOCINFO);
|
|
||||||
di.lpszDocName = "Tux Paint";
|
|
||||||
di.lpszOutput = (LPTSTR)NULL;
|
|
||||||
di.lpszDatatype = (LPTSTR)NULL;
|
|
||||||
di.fwType = 0;
|
|
||||||
|
|
||||||
nError = StartDoc( pd.hDC, &di );
|
|
||||||
if ( nError == SP_ERROR )
|
|
||||||
{
|
|
||||||
res = -2;
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
|
|
||||||
nError = StartPage(pd.hDC);
|
|
||||||
if (nError <= 0)
|
|
||||||
{
|
|
||||||
res = -3;
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
surf32 = make32bitDIB( surf );
|
|
||||||
if ( !surf32 )
|
|
||||||
{
|
|
||||||
res = -4;
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
|
|
||||||
memset( &bmih,0, sizeof(bmih) );
|
|
||||||
bmih.biSize = sizeof(bmih);
|
|
||||||
bmih.biPlanes = 1;
|
|
||||||
bmih.biCompression = BI_RGB;
|
|
||||||
bmih.biBitCount = 32;
|
|
||||||
bmih.biWidth = surf32->w;
|
|
||||||
bmih.biHeight = surf32->h;
|
|
||||||
|
|
||||||
GetClientRect( hWnd, &rc );
|
|
||||||
subscalerx = (float)rc.right/surf32->w;
|
|
||||||
subscalery = (float)rc.bottom/surf32->h;
|
|
||||||
subscaler = subscalery;
|
|
||||||
if ( subscalerx < subscalery )
|
|
||||||
subscaler = subscalerx;
|
|
||||||
|
|
||||||
hDC = GetDC( hWnd );
|
|
||||||
fLogPelsX1 = (float)GetDeviceCaps(hDC, LOGPIXELSX);
|
|
||||||
fLogPelsY1 = (float)GetDeviceCaps(hDC, LOGPIXELSY);
|
|
||||||
ReleaseDC( hWnd, hDC );
|
|
||||||
fLogPelsX2 = (float)GetDeviceCaps(pd.hDC, LOGPIXELSX);
|
|
||||||
fLogPelsY2 = (float)GetDeviceCaps(pd.hDC, LOGPIXELSY);
|
|
||||||
|
|
||||||
if (fLogPelsX1 > fLogPelsX2)
|
|
||||||
fScaleX = (fLogPelsX1/fLogPelsX2);
|
|
||||||
else
|
|
||||||
fScaleX = (fLogPelsX2/fLogPelsX1);
|
|
||||||
|
|
||||||
if (fLogPelsY1 > fLogPelsY2)
|
|
||||||
fScaleY = (fLogPelsY1/fLogPelsY2);
|
|
||||||
else
|
|
||||||
fScaleY = (fLogPelsY2/fLogPelsY1);
|
|
||||||
|
|
||||||
fScaleX *= subscaler;
|
|
||||||
fScaleY *= subscaler;
|
|
||||||
|
|
||||||
yTop = 0;
|
|
||||||
cWidthPels = GetDeviceCaps(pd.hDC, PHYSICALWIDTH);
|
|
||||||
xLeft = ((cWidthPels - ((int)(fScaleX*bmih.biWidth)))/2)-
|
|
||||||
GetDeviceCaps(pd.hDC, PHYSICALOFFSETX);
|
|
||||||
|
|
||||||
hDCCaps = GetDeviceCaps(pd.hDC, RASTERCAPS);
|
|
||||||
|
|
||||||
if ( hDCCaps & RC_STRETCHDIB )
|
|
||||||
{
|
|
||||||
StretchDIBits(pd.hDC, xLeft, yTop,
|
|
||||||
(int)(fScaleX*bmih.biWidth),
|
|
||||||
(int)(fScaleY*bmih.biHeight),
|
|
||||||
0, 0, bmih.biWidth, bmih.biHeight,
|
|
||||||
surf32->pixels, (BITMAPINFO*)&bmih,
|
|
||||||
DIB_RGB_COLORS, SRCCOPY);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
if ( hDCCaps & RC_STRETCHBLT )
|
|
||||||
{
|
|
||||||
hbm = CreateDIBitmap(pd.hDC, &bmih, CBM_INIT,
|
|
||||||
surf32->pixels, (const BITMAPINFO*)&bmih, 0);
|
|
||||||
if ( hbm )
|
|
||||||
{
|
|
||||||
hdcMem = CreateCompatibleDC( pd.hDC );
|
|
||||||
if ( hdcMem )
|
|
||||||
{
|
|
||||||
hOldObject = SelectObject(hdcMem, hbm);
|
|
||||||
if ( hOldObject )
|
|
||||||
{
|
|
||||||
StretchBlt(pd.hDC, xLeft, yTop,
|
|
||||||
(int)(fScaleX*bmih.biWidth),
|
|
||||||
(int)(fScaleY*bmih.biHeight),
|
|
||||||
hdcMem, 0, 0, bmih.biWidth, bmih.biHeight, SRCCOPY);
|
|
||||||
SelectObject(hdcMem, hOldObject);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
res = -10;
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
nError = EndPage( pd.hDC );
|
|
||||||
if ( nError <= 0 )
|
|
||||||
{
|
|
||||||
res = -9;
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
|
|
||||||
EndDoc( pd.hDC );
|
|
||||||
|
|
||||||
error:
|
|
||||||
if ( hdcMem ) DeleteDC( hdcMem );
|
|
||||||
if ( hbm ) DeleteObject( hbm );
|
|
||||||
if ( surf32 ) SDL_FreeSurface( surf32 );
|
|
||||||
|
|
||||||
EnableWindow( hWnd, TRUE );
|
|
||||||
DestroyWindow( hDlgCancel );
|
|
||||||
DeleteDC( pd.hDC );
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
@ -1,19 +0,0 @@
|
||||||
/* win32_print.h */
|
|
||||||
|
|
||||||
/* printing support for Tux Paint */
|
|
||||||
/* John Popplewell <john@johnnypops.demon.co.uk> */
|
|
||||||
|
|
||||||
/* Sept. 30, 2002 - Oct. 1, 2002 */
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef __WIN32_PRINT_H__
|
|
||||||
#define __WIN32_PRINT_H__
|
|
||||||
|
|
||||||
#ifndef _SDL_H
|
|
||||||
#include "SDL.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
extern int SurfacePrint( SDL_Surface *surf );
|
|
||||||
extern int IsPrinterAvailable( void );
|
|
||||||
|
|
||||||
#endif
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue