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
#ifdef HAVE_X11
00047
00048
#include <string.h>
00049
#include <math.h>
00050
#include <stdio.h>
00051
#include <stdlib.h>
00052
#include "iderr.h"
00053
#include "idima.h"
00054
#include "idprint.h"
00055
00056
#include <X11/Xlib.h>
00057
#include <X11/Xutil.h>
00058
#include <X11/Xos.h>
00059
#include <X11/Xatom.h>
00060
00061
#define RGB24BITS_SW 4
00062
#define RGB24BITS_NW 5
00063
#define COLORS256_SW 2
00064
#define COLORS256_NW 3
00065
00066
static PPIMAGE_UCHAR eclate_24_8 (
PPIMAGE_RGB);
00067
00068
static Display *disp;
00069
static Visual *vis;
00070
static int screen_num;
00071
static Window win;
00072
00073
static XImage *xim=NULL;
00074
static GC gc;
00075
static XGCValues
val;
00076
static XColor xcol;
00077
static XEvent rep;
00078
static Colormap cm;
00079
static int lut[256];
00080
static char **imm;
00081
static char * imm1;
00082
static int fdp[2];
00083
static int fork_done=0;
00084
00085
static XVisualInfo vTemplate;
00086
static XVisualInfo *visualList;
00087
static int visualsMatched;
00088
static XSetWindowAttributes attributs;
00089
static unsigned long valuemask=0 ;
00090
static int num_visual;
00091
static PPIMAGE_UCHAR imUCHAR;
00092
static PPIMAGE_RGB imRGB;
00093
00094
00095
00096
00097
00098
00099
void _IdImaDisplayColorOld(PPIMAGE_UCHAR im,
00100
int display,
00101
00102
int x,
int y,
int nx,
int ny,
00103
int ox,
int oy,
PSIGNAL_RGB pal)
00104 {
00105
int i,j,k,kkk=0;
00106
int lig,v;
00107
int FlagSameWindow=0;
00108
int default24;
00109
int incr;
00110
00111
if (!im) {
00112
IdErrPrintf(
"Pointeur image NULL !!\n");
00113
return;
00114 }
00115
00116 FlagSameWindow=display&0x0001;
00117
00118
if(!FlagSameWindow) {
00119
00120
if(!fork_done) {
00121 pipe(fdp);
00122 fork_done=1;
00123 fcntl(fdp[0],F_SETFL,O_NDELAY);
00124
00125
if(fork())
return;
00126
00127 }
else {
00128
switch(
IdImaType(im)) {
00129
case IMA_UCHAR:
00130
for(i=0;i<
IdImaDimY(im);i++)
00131 write(fdp[1],im[i],
IdImaDimX(im));
00132
return;
00133
00134
case IMA_RGB:
00135
for(i=0;i<
IdImaDimY(im);i++)
00136 write(fdp[1],im[i],
IdImaDimX(im)*3);
00137
return;
00138 }
00139 }
00140
00141 }
else {
00142
00143
if (fork())
00144
return;
00145 }
00146
00147
if(!(disp=XOpenDisplay(0))) {
00148
IdPrintf(
"Pb de display (XOpenDisplay)\n");
00149
return;
00150 }
00151 screen_num=DefaultScreen(disp);
00152
00153
00154
switch(
IdImaType(im))
00155 {
00156
case IMA_UCHAR:
00157
00158
00159
00160
00161
00162
00163 default24=0;
00164
00165 vis=DefaultVisual(disp,screen_num);
00166
00167 vTemplate.screen=screen_num;
00168 vTemplate.depth=24;
00169 visualList=XGetVisualInfo(disp,VisualScreenMask | VisualDepthMask,
00170 &vTemplate,&visualsMatched);
00171
for(i=0;i< visualsMatched;i++) {
00172
if(visualList[num_visual].visual == vis ) {
00173 default24=1;
00174
if(display ==0) display=4;
00175
if(display ==1) display=5;
00176
break;
00177 }
00178
00179 }
00180
00181
if(display ==0 || display ==1 ) {
00182
00183 imUCHAR=(
PPIMAGE_UCHAR)im;
00184 vis=DefaultVisual(disp,screen_num);
00185
00186 win=XCreateSimpleWindow(disp,RootWindow(disp,screen_num),
00187 0,0,
IdImaDimX(im),
IdImaDimY(im),50,WhitePixel(disp,screen_num),
00188 BlackPixel(disp,screen_num));
00189 XClearWindow(disp,win);
00190 XStoreName(disp,win,
IdGetFileName(im));
00191
00192 xcol.flags=DoRed | DoGreen | DoBlue;
00193
if (!pal) {
00194
for(i=0;i<256;i+=2) {
00195
00196 xcol.red =i<<8;
00197 xcol.green=i<<8;
00198 xcol.blue =i<<8;
00199 XAllocColor(disp,DefaultColormap(disp,screen_num),&xcol);
00200
00201
if (xcol.pixel<=255) {
00202 lut[i] =xcol.pixel;
00203 lut[i+1]=xcol.pixel;
00204 }
00205 }
00206
00207 }
else {
00208
00209
if (
IdSigDimX(pal)>128)
00210
00211 incr=2;
00212
else
00213 incr=1;
00214
00215
for(i=0;i<
IdSigDimX(pal);i+=incr) {
00216 xcol.red =pal[i].
r<<8;
00217 xcol.green=pal[i].
g<<8;
00218 xcol.blue =pal[i].
b<<8;
00219 XAllocColor(disp,DefaultColormap(disp,screen_num),&xcol);
00220
00221
if( xcol.pixel<=255) {
00222 lut[i]=xcol.pixel;
00223 lut[i+1]=xcol.pixel;
00224 }
00225 }
00226 }
00227
00228 imm= (
char **)malloc(
IdImaDimY(im)*
sizeof(
char *));
00229 imm[0]=(
char *) malloc(
IdImaDimX(im)*
IdImaDimY(im)*
IdSizeOfType(im));
00230
00231
for(i=0;i<
IdImaDimY(im);i++)
00232 imm[i]=(
char *)imm[0] + i *
IdImaDimX(im) *
IdSizeOfType(im);
00233
00234
for(i=0;i<
IdImaDimY(im);i++)
for(j=0;j<
IdImaDimX(im);j++) {
00235 imm[i][j]=lut[imUCHAR[i][j]&0xff];
00236 }
00237
00238
if (default24)
00239 xim=XCreateImage(disp,vis,24,ZPixmap,0,imm[0],
00240
IdImaDimX(im),
IdImaDimY(im),8,
IdImaDimX(im));
00241
else
00242 xim=XCreateImage(disp,vis,8,ZPixmap,0,imm[0],
00243
IdImaDimX(im),
IdImaDimY(im),8,
IdImaDimX(im));
00244
00245 }
00246
00247
00248
00249
00250
00251
00252
if(display ==2 || display ==3 )
00253
00254 {
00255
00256 imUCHAR=(
PPIMAGE_UCHAR)im;
00257 vis=DefaultVisual(disp,screen_num);
00258 win=XCreateSimpleWindow(disp,RootWindow(disp,screen_num),
00259 0,0,
IdImaDimX(im),
IdImaDimY(im),50,WhitePixel(disp,screen_num),
00260 BlackPixel(disp,screen_num));
00261 XClearWindow(disp,win);
00262 XStoreName(disp,win,
IdGetFileName(im));
00263
00264 xcol.flags=DoRed | DoGreen | DoBlue;
00265
if (!pal)
00266 {
00267
for(i=0;i<256;i+=1) {
00268
00269 xcol.red =i<<8;
00270 xcol.green=i<<8;
00271 xcol.blue =i<<8;
00272 XAllocColor(disp,DefaultColormap(disp,screen_num),&xcol);
00273
if( xcol.pixel<=255) {
00274 lut[i] =xcol.pixel;
00275 }
00276 }
00277 }
else {
00278
for(i=0;i<
IdSigDimX(pal);i+=1)
00279 {
00280 xcol.red =pal[i].
r<<8;
00281 xcol.green=pal[i].
g<<8;
00282 xcol.blue =pal[i].
b<<8;
00283 XAllocColor(disp,DefaultColormap(disp,screen_num),&xcol);
00284
if( xcol.pixel<=255 )
00285 {
00286 lut[i]=xcol.pixel;
00287 }
00288 }
00289 }
00290 imm= (
char **)malloc(
IdImaDimY(im)*
sizeof(
char *));
00291 imm[0]=(
char *) malloc(
IdImaDimX(im)*
IdImaDimY(im)*
IdSizeOfType(im));
00292
for(i=0;i<
IdImaDimY(im);i++)
00293 imm[i]=(
char *)imm[0] + i *
IdImaDimX(im) *
IdSizeOfType(im);
00294
00295
for(i=0;i<
IdImaDimY(im);i++)
for(j=0;j<
IdImaDimX(im);j++)
00296 {
00297 imm[i][j]=lut[imUCHAR[i][j]&0xff];
00298 }
00299
00300 xim=XCreateImage(disp,vis,8,ZPixmap,0,imm[0],
00301
IdImaDimX(im),
IdImaDimY(im),8,
IdImaDimX(im));
00302
00303 }
00304
00305
00306
00307
00308
00309
00310
00311
if( display == 4 || display == 5 )
00312 {
00313 vTemplate.screen=screen_num;
00314 vTemplate.depth=8;
00315 visualList=XGetVisualInfo(disp,
00316 VisualScreenMask |
00317 VisualDepthMask |
00318 VisualRedMaskMask |
00319 VisualGreenMaskMask |
00320 VisualRedMaskMask,
00321 &vTemplate,&visualsMatched);
00322
00323
00324 num_visual=0;
00325
while ( visualList[num_visual].class != PseudoColor ){
00326 num_visual++;
00327
if( num_visual >= visualsMatched ) {
00328
IdErrPrintf(
"Erreur impossible d'afficher en pseudocolor");
00329
IdExit(1);}}
00330
00331 imUCHAR=(
PPIMAGE_UCHAR)im;
00332
00333 cm = XCreateColormap(disp,RootWindow(disp,screen_num),
00334 visualList[num_visual].visual,AllocAll);
00335
if(!cm)
IdErrPrintf(
"Erreur creation colormap \n");
00336 attributs.colormap = cm;
00337 attributs.event_mask= ButtonPressMask | KeyPressMask | ExposureMask;
00338 attributs.background_pixel=BlackPixel(disp,screen_num);
00339 attributs.border_pixel=WhitePixel(disp,screen_num);
00340 vis=visualList[num_visual].visual;
00341 valuemask |= CWColormap;
00342 valuemask |= CWEventMask;
00343 valuemask |= CWBackPixel;
00344 valuemask |= CWBorderPixel;
00345 win=XCreateWindow(disp,RootWindow(disp,screen_num),
00346 0,0,
IdImaDimX(imUCHAR),
IdImaDimY(imUCHAR),50,vTemplate.depth,
00347 InputOutput,vis,valuemask,&attributs);
00348
if(!win)
IdErrPrintf(
"Erreur creation fenetre \n");
00349 XSetWindowColormap(disp,win,cm);
00350 XClearWindow(disp,win);
00351 XStoreName(disp,win,
IdGetFileName(imUCHAR));
00352
00353 xcol.flags=DoRed | DoGreen | DoBlue;
00354
if (!pal) {
00355
for(i=0;i<256;i+=1) {
00356
00357 xcol.pixel=i;
00358 xcol.red =i<<8;
00359 xcol.green=i<<8;
00360 xcol.blue =i<<8;
00361 XStoreColor(disp,cm,&xcol);
00362 }
00363 }
else {
00364
00365
for(i=0;i<
IdSigDimX(pal);i+=1) {
00366 xcol.pixel=i;
00367 xcol.red =pal[i].
r<<8;
00368 xcol.green=pal[i].
g<<8;
00369 xcol.blue =pal[i].
b<<8;
00370 XStoreColor(disp,cm,&xcol);
00371 }
00372
00373 }
00374
00375 imm1=(
char *)malloc(
IdImaDimX(imUCHAR)*
IdImaDimY(imUCHAR)*
IdSizeOfType(imUCHAR));
00376
00377
for(i=0;i<
IdImaDimY(imUCHAR);i++)
00378 memcpy(imm1+(i*
IdImaDimX(imUCHAR)), imUCHAR[i],
IdImaDimX(imUCHAR));
00379
00380
00381 xim=XCreateImage(disp,vis,8,ZPixmap,0, imm1,
00382
IdImaDimX(imUCHAR),
IdImaDimY(imUCHAR),8,
IdImaDimX(imUCHAR));
00383 }
00384
break;
00385
00386
00387
case IMA_RGB:
00388
00389
00390
00391
00392
00393 vTemplate.depth=24;
00394 visualList=XGetVisualInfo(disp,VisualScreenMask | VisualDepthMask,
00395 &vTemplate,&visualsMatched);
00396
00397
if( visualsMatched == 0 ) {
00398 im=eclate_24_8((
PPIMAGE_RGB)im);
00399
break;
00400 }
else {
00401
while(visualList[num_visual].class != TrueColor ) {
00402 num_visual++;
00403
00404
if ( num_visual >= visualsMatched) {
00405
IdErrPrintf(
"Votre serveur ne permet pas d'afficher en TRUE_COLOR");
00406
IdExit(1);
00407 }
00408 }
00409 }
00410
00411 imRGB=(
PPIMAGE_RGB)im;
00412
00413 cm = XCreateColormap(disp,RootWindow(disp,screen_num),
00414 visualList[num_visual].visual,AllocNone);
00415 attributs.colormap = cm;
00416 attributs.event_mask= ButtonPressMask | KeyPressMask | ExposureMask;
00417 attributs.background_pixel=BlackPixel(disp,screen_num);
00418 attributs.border_pixel=WhitePixel(disp,screen_num);
00419 vis=visualList[num_visual].visual;
00420 valuemask |= CWColormap;
00421 valuemask |= CWEventMask;
00422 valuemask |= CWBackPixel;
00423 valuemask |= CWBorderPixel;
00424 win=XCreateWindow(disp,RootWindow(disp,screen_num),
00425 0,0,
IdImaDimX(imRGB),
IdImaDimY(imRGB),50,vTemplate.depth,
00426 InputOutput,visualList[num_visual].visual,valuemask,&attributs);
00427
if(!win)
IdErrPrintf(
"Erreur creation fenetre \n");
00428 XSetWindowColormap(disp,win,cm);
00429 XClearWindow(disp,win);
00430 XStoreName(disp,win,
IdGetFileName(imRGB));
00431 imm1=(
char *)malloc(
IdImaDimX(imRGB)*
IdImaDimY(imRGB)*4);
00432
00433
for(i=0,k=0;i<
IdImaDimY(imRGB);i++)
00434
for(j=0;j<
IdImaDimX(imRGB);j++,k+=4) {
00435 imm1[k] =0;
00436 imm1[k+1]=imRGB[i][j].
b;
00437 imm1[k+2]=imRGB[i][j].g;
00438 imm1[k+3]=imRGB[i][j].r;
00439 }
00440 xim=XCreateImage(disp,vis,24,ZPixmap,0,(
char *)imm1,
00441
IdImaDimX(imRGB),
IdImaDimY(imRGB),16,
IdImaDimX(imRGB)*4);
00442
if(!xim)
00443
IdErrPrintf(
"erreur creation image\n");
00444
00445
break;
00446
00447
default:
00448
00449
IdErrPrintf(
"type d'image (%d) non autorise a l'affichage\n",
00450
IdImaType(im));
00451
IdExit(1);
00452
00453
break;
00454 }
00455
00456
00457
00458
00459
00460 gc=XCreateGC(disp,win,(GCForeground|GCBackground),&val);
00461
00462 XMapWindow(disp,win);
00463 XSelectInput(disp,win,ButtonPressMask | KeyPressMask | ExposureMask);
00464 XPutImage(disp,win,gc,xim,0,0,0,0,
IdImaDimX(im),
IdImaDimY(im));
00465 lig=0;
00466
while(1)
00467 {
00468
if( XEventsQueued(disp,QueuedAfterFlush) || display)
00469 {
00470 XNextEvent(disp,&rep);
00471
switch(rep.type)
00472 {
00473
case ButtonPress:
00474
if( rep.xbutton.button == 1)
00475 {
00476 XPutImage(disp,win,gc,xim,0,0,0,
00477 0,
IdImaDimX(im),
IdImaDimY(im));
00478 XFreeGC(disp,gc);
00479 XCloseDisplay(disp);
00480
IdExit(0); }
00481
break;
00482
00483
case Expose:
00484 XPutImage(disp,win,gc,xim,0,0,
00485 0,0,
IdImaDimX(im),
IdImaDimY(im));
00486
break;
00487
00488
case KeyPress:
00489 XPutImage(disp,win,gc,xim,0,0,
00490 0,0,
IdImaDimX(im),
IdImaDimY(im));
00491
break;
00492 }
00493 }
00494
else
00495 {
00496
switch (
IdImaType(im))
00497 {
00498
case IMA_UCHAR:
00499
00500
if( (v=read(fdp[0],im[lig],
IdImaDimX(im))) != -1)
00501 {
00502
if(v)
00503 {
00504
for(j=0;j<
IdImaDimX(im);j++)
00505 {
00506 imm[lig][j]=lut[im[lig][j]&0xff];
00507 }
00508 lig++;
00509 }
00510
if(lig==
IdImaDimY(im))
00511 {
00512 lig=0;
00513 XPutImage(disp,win,gc,xim,0,0,0,0,
00514
IdImaDimX(im),
IdImaDimY(im));
00515 }
00516 }
00517
00518
break;
00519
00520
case IMA_RGB:
00521
00522
00523
if( (v=read(fdp[0],im[lig],
IdImaDimX(im)*3)) != -1)
00524 {
00525
if(v)
00526 {
00527
for(j=0;j<
IdImaDimX(im);j++,kkk+=4)
00528 {
00529
00530 imm1[kkk] =0;
00531 imm1[kkk+1]=imRGB[lig][j].
b;
00532 imm1[kkk+2]=imRGB[lig][j].g;
00533 imm1[kkk+3]=imRGB[lig][j].r;
00534 }
00535 lig++;
00536 }
00537
if(lig==
IdImaDimY(im))
00538 {
00539 lig=0;
00540 kkk=0;
00541
00542 XPutImage(disp,win,gc,xim,0,0,0,0,
00543
IdImaDimX(im),
IdImaDimY(im));
00544 }
00545 }
00546
00547
break;
00548
00549 }
00550
00551 }
00552 }
00553 }
00554
00555
00556
00557
static PPIMAGE_UCHAR eclate_24_8(
PPIMAGE_RGB imInput)
00558 {
00559
PPIMAGE_UCHAR imDest;
00560
int i,j;
00561
00562 imDest=(
PPIMAGE_UCHAR)
IdImaAlloc(
IdImaDimX(imInput)*3,
IdImaDimY(imInput),IMA_UCHAR);
00563
for(i=0;i<
IdImaDimY(imInput);i++)
for(j=0;j<
IdImaDimX(imInput);j++)
00564 {
00565 imDest[i][j]= imInput[i][j].
r;
00566 imDest[i][j+
IdImaDimX(imInput)]= imInput[i][j].g;
00567 imDest[i][j+2*
IdImaDimX(imInput)]= imInput[i][j].b;
00568 }
00569
00570
00571
00572 vis=DefaultVisual(disp,screen_num);
00573 win=XCreateSimpleWindow(disp,RootWindow(disp,screen_num),
00574 0,0,
IdImaDimX(imDest),
IdImaDimY(imDest),50,WhitePixel(disp,screen_num),
00575 BlackPixel(disp,screen_num));
00576 XClearWindow(disp,win);
00577 XStoreName(disp,win,
IdGetFileName(imDest));
00578
00579 xcol.flags=DoRed | DoGreen | DoBlue;
00580
00581
for(i=0;i<256;i+=2)
00582
00583 {
00584 xcol.red =i<<8;
00585 xcol.green=i<<8;
00586 xcol.blue =i<<8;
00587 XAllocColor(disp,DefaultColormap(disp,screen_num),&xcol);
00588
if( xcol.pixel<=255 )
00589 {
00590 lut[i] =xcol.pixel;
00591 lut[i+1]=xcol.pixel;
00592 }
00593 }
00594
00595 imm=(
char **)malloc(
IdImaDimY(imDest)*
sizeof(
char *));
00596 imm[0]=(
char *)malloc(
IdImaDimX(imDest)*
IdImaDimY(imDest)*
00597
IdSizeOfType(imDest));
00598
for(i=0;i<
IdImaDimY(imDest);i++)
00599 imm[i]=(
char *)imm[0] + i *
IdImaDimX(imDest) *
IdSizeOfType(imDest);
00600
00601
for(i=0;i<
IdImaDimY(imDest);i++)
for(j=0;j<
IdImaDimX(imDest);j++)
00602 {
00603 imm[i][j]=lut[imDest[i][j]&0xff];
00604 }
00605
00606 xim=XCreateImage(disp,vis,8,ZPixmap,0,imm[0],
00607
IdImaDimX(imDest),
IdImaDimY(imDest),8,
IdImaDimX(imDest));
00608
00609
return imDest;
00610 }
00611
#endif