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