1 
2 #include "global.h"
3 
4 #include <stdio.h>
5 #include <stdlib.h>
6 #include <X11/Xlib.h>
7 #include <X11/Xutil.h>
8 #include <X11/Xmd.h>
9 
10 #include "gifx_image.H"
11 #include "color_mapper.H"
12 
GifXImage(class Port * port,const char * filename,int autocrop)13 GifXImage::GifXImage(class Port *port,const char *filename,int autocrop)
14 : p(port), GifImage(filename,autocrop) {
15 	xwidth  = Width();
16 	xheight = Height();
17 	dpy=p->GetDisplay();
18 	scr=DefaultScreen(dpy);
19 	ximage = 0;
20 	gif_cols=0;
21 	SetupMapper();
22 #ifndef RANGE_CHECK
23 	offset_rows=(int)(sqrt((double)xwidth*(double)xwidth+(double)xheight*(double)xheight)/2.0)+1;
24 #else
25 	offset_rows=0;
26 #endif
27 }
28 
~GifXImage()29 GifXImage::~GifXImage() {
30 	DropData();
31 	if (gif_cols)		delete [] gif_cols;
32 }
33 
SetupMapper()34 void GifXImage::SetupMapper() {
35 	if (gif_cols)		delete [] gif_cols;
36 	SetupTrueMapper();
37 }
38 
SetupTrueMapper()39 void GifXImage::SetupTrueMapper() {
40 	gif_cols=new unsigned long[GetNCols()];
41 	for (int i=0;i<GetNCols();i++) {
42 		XColor	def;
43 		GetColor(i,&def.red,&def.green,&def.blue);
44 		gif_cols[i]=p->GetMapper()->alloc_color(&def);
45 	}
46 }
47 
TraceMapper()48 void GifXImage::TraceMapper() {
49 	for (int i=0;i<GetNCols();i++) {
50 		XColor   def;
51 		GetColor(i,&def.red,&def.green,&def.blue);
52 		printf( "%3d: %02x %02x %02x - %ld\n", i, def.red>>8, def.green>>8, def.blue>>8, gif_cols[i] );
53 	}
54 }
55 
CreateData(int w,int h)56 void GifXImage::CreateData( int w, int h ) {
57 	xwidth  = w;
58 	xheight = h;
59 #ifndef RANGE_CHECK
60 	offset_rows=(int)(sqrt((double)w*(double)w+(double)h*(double)h)/2.0)+1;
61 #else
62 	offset_rows=0;
63 #endif
64 	DropData();
65 
66 	extern int pixmap_depth;
67 
68 	switch(pixmap_depth) {
69 	case 8:		Reset8();		break;
70 	case 16:	Reset16();		break;
71 	case 24:	Reset24();		break;
72 	case 32:	Reset32();		break;
73 	default:	fprintf( stderr, "depth not supported\n" );
74 			exit(0);
75 	}
76 }
77 
DropData()78 void GifXImage::DropData() {
79 	if (ximage) {
80 		delete [] (ximage->data-offset_bytes);
81 		ximage->data = 0L;
82 		XDestroyImage(ximage);
83 		ximage=0;
84 	}
85 }
86 
GetPixel(int x,int y)87 unsigned long GifXImage::GetPixel(int x, int y) {
88 	if (x<0||x>=xwidth||y<0||y>=xheight) {
89 		return 0;
90 	}
91 	else {
92 		return XGetPixel(ximage,x,y);
93 	}
94 }
95 
96 /*----------------------------------------------------------------------------*/
97 
98 #define CARD24 long
99 
100 #define	DATA_TYPE	CARD24
101 #define	DATA_BYTES	3
Reset24()102 void GifXImage::Reset24() {
103 #	include "reset_image.H"
104 }
105 #undef DATA_TYPE
106 #undef DATA_BYTES
107 /*----------------------------------------------------------------------------*/
108 #define	DATA_TYPE	CARD32
109 #define	DATA_BYTES	4
Reset32()110 void GifXImage::Reset32() {
111 #	include "reset_image.H"
112 }
113 #undef DATA_TYPE
114 #undef DATA_BYTES
115 /*----------------------------------------------------------------------------*/
116 #define	DATA_TYPE	CARD16
117 #define	DATA_BYTES	2
Reset16()118 void GifXImage::Reset16() {
119 #	include "reset_image.H"
120 }
121 #undef DATA_TYPE
122 #undef DATA_BYTES
123 /*----------------------------------------------------------------------------*/
124 #define	DATA_TYPE	CARD8
125 #define	DATA_BYTES	1
Reset8()126 void GifXImage::Reset8() {
127 #	include "reset_image.H"
128 }
129 #undef DATA_TYPE
130 #undef DATA_BYTES
131 
132 // ========================================================================
133 
GifPixmap(Port * port,const char * filename,int autocrop)134 GifPixmap::GifPixmap( Port *port, const char *filename, int autocrop )
135 : GifXImage(port,filename,autocrop) {
136 int w, h;
137 
138 	pixmap=0;
139 
140 	const char	*ext=GetExtensionData( SUBSIZE_EXTENSION );
141 
142 	if (ext&&sscanf( ext, "%dx%d", &w, &h)==2) {
143 		xmult=GifXImage::Width()/w;
144 		ymult=GifXImage::Height()/h;
145 	}
146 	else {
147 		xmult=1;
148 		ymult=1;
149 	}
150 }
151 
~GifPixmap()152 GifPixmap::~GifPixmap() {
153 	if (pixmap)		XFreePixmap(dpy,pixmap);
154 }
155 
GetPixmap()156 Pixmap GifPixmap::GetPixmap() {
157 	if (!pixmap) {
158 		pixmap=XCreatePixmap(dpy,RootWindow(dpy,scr),xwidth,xheight,DefaultDepth(dpy,scr));
159 		XPutImage(dpy,pixmap,DefaultGC(dpy,scr),GetImage(),0,0,0,0,xwidth,xheight);
160 	}
161 	return pixmap;
162 }
163 
CreateData(int w,int h)164 void GifPixmap::CreateData(int w,int h) {
165 	w*=xmult;
166 	h*=ymult;
167 	if (pixmap)		{ XFreePixmap(dpy,pixmap); pixmap=0; }
168 	GifXImage::CreateData(w,h);
169 }
170