00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048 #define DEBUG 0
00049
00050
#ifdef HAVE_X11
00051
00052
#include <string.h>
00053
#include <math.h>
00054
#include <stdio.h>
00055
#include <stdlib.h>
00056
#include "iderr.h"
00057
#include "idima.h"
00058
#include "idprint.h"
00059
00060
#include <X11/Xlib.h>
00061
#include <X11/Xutil.h>
00062
#include <X11/Xos.h>
00063
#include <X11/Xatom.h>
00064
00065
#define RGB24BITS_SW 4
00066
#define RGB24BITS_NW 5
00067
#define COLORS256_SW 2
00068
#define COLORS256_NW 3
00069
00070
00071
static Display *disp;
00072
static Visual *vis;
00073
static int screen_num;
00074
static Window win;
00075
00076
static XImage *xim=NULL;
00077
static GC gc;
00078
static XGCValues
val;
00079
00080
static XEvent rep;
00081
static Colormap cm;
00082
00083
00084
static char * imm1;
00085
static int fdp[2];
00086
static int fork_done=0;
00087
00088
static XVisualInfo vTemplate;
00089
static XVisualInfo *visualList;
00090
static int visualsMatched;
00091
static XSetWindowAttributes attributs;
00092
static unsigned long valuemask=0 ;
00093
static int num_visual;
00094
static PPIMAGE_UCHAR imUCHAR;
00095
static PPIMAGE_RGB imRGB;
00096
00097
00098
00099
00100
00101
00102
void _IdImaDisplayColor(PPIMAGE_UCHAR im,
00103
int display,
00104
00105
int x,
int y,
int nx,
int ny,
00106
int ox,
int oy,
PSIGNAL_RGB pal)
00107 {
00108
int i,j,k,kkk=0;
00109
int lig,v;
00110
int FlagSameWindow=0;
00111
00112
if (!im) {
00113
IdErrPrintf(
"Pointeur image NULL !!\n");
00114
return;
00115 }
00116
00117 FlagSameWindow=display&0x0001;
00118
00119
if(!FlagSameWindow) {
00120
00121
if(!fork_done) {
00122 pipe(fdp);
00123 fork_done=1;
00124 fcntl(fdp[0],F_SETFL,O_NDELAY);
00125
00126
if(fork())
return;
00127
00128 }
else {
00129
switch(
IdImaType(im)) {
00130
00131
case IMA_UCHAR:
00132
for(i=0;i<
IdImaDimY(im);i++)
00133 write(fdp[1],im[i],
IdImaDimX(im));
00134
return;
00135
00136
case IMA_RGB:
00137
for(i=0;i<
IdImaDimY(im);i++)
00138 write(fdp[1],im[i],
IdImaDimX(im)*3);
00139
return;
00140 }
00141 }
00142
00143 }
else {
00144
00145
if (fork())
00146
return;
00147 }
00148
00149
if(!(disp=XOpenDisplay(0))) {
00150
IdPrintf(
"Pb de display (XOpenDisplay)\n");
00151
return;
00152 }
00153 screen_num=DefaultScreen(disp);
00154
00155
00156
00157
00158
00159
00160 vTemplate.depth=24;
00161 visualList=XGetVisualInfo(disp,VisualScreenMask | VisualDepthMask,
00162 &vTemplate,&visualsMatched);
00163
00164
if( visualsMatched == 0 ) {
00165
00166
00167
_IdImaDisplayColorOld( im,
00168 display,
00169
x, y, nx, ny,
00170 ox, oy, pal);
00171
return;
00172 }
else {
00173
while(visualList[num_visual].class != TrueColor ) {
00174 num_visual++;
00175
00176
if ( num_visual >= visualsMatched) {
00177
IdErrPrintf(
"Votre serveur ne permet pas d'afficher en TRUE_COLOR");
00178
IdExit(1);
00179 }
00180 }
00181 }
00182
00183 cm = XCreateColormap(disp,RootWindow(disp,screen_num),
00184 visualList[num_visual].visual,AllocNone);
00185 attributs.colormap = cm;
00186 attributs.event_mask= ButtonPressMask | KeyPressMask | ExposureMask;
00187 attributs.background_pixel=BlackPixel(disp,screen_num);
00188 attributs.border_pixel=WhitePixel(disp,screen_num);
00189 vis=visualList[num_visual].visual;
00190 valuemask |= CWColormap;
00191 valuemask |= CWEventMask;
00192 valuemask |= CWBackPixel;
00193 valuemask |= CWBorderPixel;
00194 win=XCreateWindow(disp,RootWindow(disp,screen_num),
00195 0,0,
IdImaDimX(im),
IdImaDimY(im),50,vTemplate.depth,
00196 InputOutput,visualList[num_visual].visual,valuemask,&attributs);
00197
if(!win)
IdErrPrintf(
"Erreur creation fenetre \n");
00198 XSetWindowColormap(disp,win,cm);
00199 XClearWindow(disp,win);
00200 XStoreName(disp,win,
IdGetFileName(im));
00201 imm1=(
char *)malloc(
IdImaDimX(im)*
IdImaDimY(im)*4);
00202
00203
00204
switch(
IdImaType(im)) {
00205
00206
case IMA_RGB:
00207 imRGB=(
PPIMAGE_RGB)im;
00208
00209
for(i=0,k=0;i<
IdImaDimY(im);i++)
00210
for(j=0;j<
IdImaDimX(im);j++,k+=4) {
00211
00212
00213
00214
00215
00216
00217 imm1[k] =imRGB[i][j].
b;
00218 imm1[k+1]=imRGB[i][j].g;
00219 imm1[k+2]=imRGB[i][j].r;
00220 imm1[k+3]=0;
00221 }
00222
00223
break;
00224
00225
case IMA_UCHAR:
00226
00227 imUCHAR=(
PPIMAGE_UCHAR)im;
00228
if (!pal)
00229
for(i=0,k=0;i<
IdImaDimY(im);i++)
00230
for(j=0;j<
IdImaDimX(im);j++,k+=4) {
00231 imm1[k] = imm1[k+1] = imm1[k+2] = imUCHAR[i][j];
00232 imm1[k+3]=0;
00233 }
00234
else
00235
for(i=0,k=0;i<
IdImaDimY(im);i++)
00236
for(j=0;j<
IdImaDimX(im);j++,k+=4) {
00237
00238 imm1[k] =pal[imUCHAR[i][j]].
b;
00239 imm1[k+1]=pal[imUCHAR[i][j]].g;
00240 imm1[k+2]=pal[imUCHAR[i][j]].r;
00241 imm1[k+3]=0;
00242 }
00243
00244
break;
00245
00246
default:
00247
00248
IdErrPrintf(
"type d'image (%04x) non autorise a l'affichage\n",
00249
IdImaType(im));
00250
IdExit(1);
00251
00252
break;
00253 }
00254
00255
00256 xim=XCreateImage(disp,vis,24,ZPixmap,0,(
char *)imm1,
00257
IdImaDimX(im),
IdImaDimY(im),16,
IdImaDimX(im)*4);
00258
if(!xim)
00259
IdErrPrintf(
"erreur creation image\n");
00260
00261
00262
00263
00264
00265
00266 gc=XCreateGC(disp,win,(GCForeground|GCBackground),&
val);
00267
00268 XMapWindow(disp,win);
00269 XSelectInput(disp,win,ButtonPressMask | KeyPressMask | ExposureMask);
00270 XPutImage(disp,win,gc,xim,0,0,0,0,
IdImaDimX(im),
IdImaDimY(im));
00271 lig=0;
00272
while(1)
00273 {
00274
if( XEventsQueued(disp,QueuedAfterFlush) || display) {
00275
00276 XNextEvent(disp,&rep);
00277
switch(rep.type) {
00278
case ButtonPress:
00279
if( rep.xbutton.button == 1) {
00280 XPutImage(disp,win,gc,xim,0,0,0,
00281 0,
IdImaDimX(im),
IdImaDimY(im));
00282 XFreeGC(disp,gc);
00283 XCloseDisplay(disp);
00284
IdExit(0);
00285 }
00286
break;
00287
00288
case Expose:
00289 XPutImage(disp,win,gc,xim,0,0,
00290 0,0,
IdImaDimX(im),
IdImaDimY(im));
00291
break;
00292
00293
case KeyPress:
00294 XPutImage(disp,win,gc,xim,0,0,
00295 0,0,
IdImaDimX(im),
IdImaDimY(im));
00296
break;
00297 }
00298 }
else {
00299
switch (
IdImaType(im)) {
00300
00301
00302
case IMA_UCHAR :
00303
00304
00305
if( (v=read(fdp[0],im[lig],
IdImaDimX(im))) != -1) {
00306
00307
if(v) {
00308
00309
for(j=0;j<
IdImaDimX(im);j++,kkk+=4) {
00310
00311 imm1[kkk] = imm1[kkk+1] = imm1[kkk+2] = imUCHAR[lig][j];
00312 imm1[kkk+3]=0;
00313 }
00314 lig++;
00315 }
00316
if(lig==
IdImaDimY(im)) {
00317
00318 lig=0;
00319 kkk=0;
00320 XPutImage(disp,win,gc,xim,0,0,0,0,
00321
IdImaDimX(im),
IdImaDimY(im));
00322 }
00323 }
00324
00325
break;
00326
00327
00328
case IMA_RGB:
00329
00330
00331
if( (v=read(fdp[0],im[lig],
IdImaDimX(im)*3)) != -1) {
00332
00333
if(v) {
00334
00335
for(j=0;j<
IdImaDimX(im);j++,kkk+=4) {
00336
00337
00338
00339
00340
00341
00342
00343
00344 imm1[kkk] =imRGB[lig][j].
b;
00345 imm1[kkk+1]=imRGB[lig][j].g;
00346 imm1[kkk+2]=imRGB[lig][j].r;
00347 imm1[kkk+3]=0;
00348 }
00349 lig++;
00350 }
00351
if(lig==
IdImaDimY(im)) {
00352
00353 lig=0;
00354 kkk=0;
00355
00356 XPutImage(disp,win,gc,xim,0,0,0,0,
00357
IdImaDimX(im),
IdImaDimY(im));
00358 }
00359 }
00360
00361
break;
00362
00363 }
00364
00365 }
00366 }
00367 }
00368
00369
#else
00370
#include "idima.h"
00371
00372
00373
00374 void _IdImaDisplayColor(PPIMAGE_UCHAR im,
00375
int display,
00376
int x,
int y,
int nx,
int ny,
00377
int ox,
int oy,
PSIGNAL_RGB pal)
00378 {}
00379
#endif