src/video/cybergfx/SDL_cgximage.c

/* [<][>]
[^][v][top][bottom][index][help] */

FUNCTIONS

This source file includes following functions.
  1. WLUT
  2. CGX_SetupImage
  3. CGX_DestroyImage
  4. CGX_ResizeImage
  5. CGX_AllocHWSurface
  6. CGX_FreeHWSurface
  7. CGX_LockHWSurface
  8. CGX_UnlockHWSurface
  9. CGX_FlipHWSurface
  10. CGX_SwapAllPixels
  11. CGX_SwapPixels
  12. USE_WPA
  13. CGX_FakeUpdate
  14. CGX_NormalUpdate
  15. CGX_RefreshDisplay

   1 /*
   2     SDL - Simple DirectMedia Layer
   3     Copyright (C) 1997, 1998, 1999, 2000, 2001  Sam Lantinga
   4 
   5     This library is free software; you can redistribute it and/or
   6     modify it under the terms of the GNU Library General Public
   7     License as published by the Free Software Foundation; either
   8     version 2 of the License, or (at your option) any later version.
   9 
  10     This library is distributed in the hope that it will be useful,
  11     but WITHOUT ANY WARRANTY; without even the implied warranty of
  12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  13     Library General Public License for more details.
  14 
  15     You should have received a copy of the GNU Library General Public
  16     License along with this library; if not, write to the Free
  17     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  18 
  19     Sam Lantinga
  20     slouken@devolution.com
  21 */
  22 
  23 #ifdef SAVE_RCSID
  24 static char rcsid =
  25  "@(#) $Id: SDL_cgximage.c,v 1.1.2.2 2001/02/10 07:20:06 hercules Exp $";
  26 #endif
  27 
  28 #include <stdlib.h>
  29 
  30 #include "SDL_error.h"
  31 #include "SDL_endian.h"
  32 #include "SDL_cgximage_c.h"
  33 
  34 #ifdef HAVE_KSTAT
  35 #include <kstat.h>
  36 #endif
  37 
  38 #ifdef USE_CGX_WRITELUTPIXEL
  39 #if defined(__SASC) || defined(__PPC__)
  40         #define WLUT WriteLUTPixelArray
  41 #else
  42 void WLUT(APTR a,UWORD b,UWORD c,UWORD d,struct RastPort *e,APTR f,UWORD g,UWORD h,UWORD i,UWORD l,UBYTE m)
     /* [<][>][^][v][top][bottom][index][help] */
  43 {       WriteLUTPixelArray(a,b,c,d,e,f,g,h,i,l,m); }
  44 #endif
  45 
  46 #endif
  47 
  48 /* Various screen update functions available */
  49 static void CGX_NormalUpdate(_THIS, int numrects, SDL_Rect *rects);
  50 static void CGX_FakeUpdate(_THIS, int numrects, SDL_Rect *rects);
  51 
  52 BOOL SafeDisp=TRUE,SafeChange=TRUE;
  53 struct MsgPort *safeport=NULL,*dispport=NULL;
  54 ULONG safe_sigbit,disp_sigbit;
  55 
  56 int CGX_SetupImage(_THIS, SDL_Surface *screen)
     /* [<][>][^][v][top][bottom][index][help] */
  57 {
  58         if(screen->flags&SDL_HWSURFACE)
  59         {
  60                 SDL_Ximage=NULL;
  61 
  62                 if(!screen->hwdata)
  63                 {
  64                         if(!(screen->hwdata=malloc(sizeof(struct private_hwdata))))
  65                         {
  66                                 return -1;
  67                         }
  68                         D(bug("Creating system accel struct\n"));
  69                         screen->hwdata->lock=0;
  70                         screen->hwdata->bmap=SDL_RastPort->BitMap;
  71                         screen->hwdata->videodata=this;
  72                 }
  73 
  74                 this->UpdateRects = CGX_FakeUpdate;
  75 
  76                 D(bug("Accel video image configured.\n"));
  77                 return 0;
  78         }
  79 
  80         screen->pixels = malloc(screen->h*screen->pitch);
  81 
  82         if ( screen->pixels == NULL ) {
  83                 SDL_OutOfMemory();
  84                 return(-1);
  85         }
  86         SDL_Ximage=screen->pixels;
  87 
  88         if ( SDL_Ximage == NULL ) {
  89                 SDL_SetError("Couldn't create XImage");
  90                 return(-1);
  91         }
  92 
  93         this->UpdateRects = CGX_NormalUpdate;
  94 
  95         return(0);
  96 }
  97 
  98 void CGX_DestroyImage(_THIS, SDL_Surface *screen)
     /* [<][>][^][v][top][bottom][index][help] */
  99 {
 100         if ( SDL_Ximage ) {
 101                 free(SDL_Ximage);
 102                 SDL_Ximage = NULL;
 103         }
 104         if ( screen ) {
 105                 screen->pixels = NULL;
 106         }
 107 }
 108 
 109 int CGX_ResizeImage(_THIS, SDL_Surface *screen, Uint32 flags)
     /* [<][>][^][v][top][bottom][index][help] */
 110 {
 111         int retval;
 112 
 113         CGX_DestroyImage(this, screen);
 114 
 115         if ( flags & SDL_OPENGL ) {  /* No image when using GL */
 116                 retval = 0;
 117         } else {
 118                 retval = CGX_SetupImage(this, screen);
 119         }
 120         return(retval);
 121 }
 122 
 123 /* We don't actually allow hardware surfaces other than the main one */
 124 int CGX_AllocHWSurface(_THIS, SDL_Surface *surface)
     /* [<][>][^][v][top][bottom][index][help] */
 125 {
 126         D(bug("Alloc HW surface...%ld x %ld x %ld!\n",surface->w,surface->h,this->hidden->depth));
 127 
 128         if(surface==SDL_VideoSurface)
 129         {
 130                 D(bug("Allocation skipped, it's system one!\n"));
 131                 return 0;
 132         }
 133 
 134         if(!surface->hwdata)
 135         {
 136                 if(!(surface->hwdata=malloc(sizeof(struct private_hwdata))))
 137                         return -1;
 138                 
 139                 surface->hwdata->lock=NULL;
 140                 surface->hwdata->videodata=this;
 141         }
 142 
 143         if(surface->hwdata->bmap=AllocBitMap(surface->w,surface->h,this->hidden->depth,BMF_MINPLANES,SDL_Display->RastPort.BitMap))
 144         {
 145                 surface->flags|=SDL_HWSURFACE;
 146                 D(bug("...OK\n"));
 147                 return 0;
 148         }
 149         else
 150         {
 151                 free(surface->hwdata);
 152                 surface->hwdata=NULL;
 153         }
 154 
 155         return(-1);
 156 }
 157 void CGX_FreeHWSurface(_THIS, SDL_Surface *surface)
     /* [<][>][^][v][top][bottom][index][help] */
 158 {
 159         if(surface && surface!=SDL_VideoSurface && surface->hwdata)
 160         {
 161                 D(bug("Free hw surface.\n"));
 162 
 163                 if(surface->hwdata->mask)
 164                         free(surface->hwdata->mask);
 165 
 166                 if(surface->hwdata->bmap)
 167                         FreeBitMap(surface->hwdata->bmap);
 168 
 169                 free(surface->hwdata);
 170                 surface->hwdata=NULL;
 171         }
 172         return;
 173 }
 174 
 175 int CGX_LockHWSurface(_THIS, SDL_Surface *surface)
     /* [<][>][^][v][top][bottom][index][help] */
 176 {
 177         if (surface->hwdata)
 178         {
 179 //              D(bug("Locking a bitmap...\n"));
 180                 if(!surface->hwdata->lock)
 181                 {       
 182                         Uint32 pitch;
 183 
 184                         if(!(surface->hwdata->lock=LockBitMapTags(surface->hwdata->bmap,
 185                                         LBMI_BASEADDRESS,(ULONG)&surface->pixels,
 186                                         LBMI_BYTESPERROW,(ULONG)&pitch,TAG_DONE)))
 187                                 return -1;
 188 
 189 // surface->pitch e' a 16bit!
 190 
 191                         surface->pitch=pitch;
 192 
 193                         if(!currently_fullscreen&&surface==SDL_VideoSurface)
 194                                 surface->pixels=((char *)surface->pixels)+(surface->pitch*(SDL_Window->BorderTop+SDL_Window->TopEdge)+
 195                                         surface->format->BytesPerPixel*(SDL_Window->BorderLeft+SDL_Window->LeftEdge));
 196                 }
 197                 else
 198                         D(bug("Already locked!!!\n"));
 199         }
 200         return(0);
 201 }
 202 void CGX_UnlockHWSurface(_THIS, SDL_Surface *surface)
     /* [<][>][^][v][top][bottom][index][help] */
 203 {
 204         if(surface->hwdata && surface->hwdata->lock)
 205         {
 206                 UnLockBitMap(surface->hwdata->lock);
 207                 surface->hwdata->lock=NULL;
 208                 surface->pixels=NULL;
 209         }
 210 }
 211 
 212 int CGX_FlipHWSurface(_THIS, SDL_Surface *surface)
     /* [<][>][^][v][top][bottom][index][help] */
 213 {
 214         static int current=0;
 215 
 216         if(this->hidden->dbuffer)
 217         {
 218                 if(!SafeChange)
 219                 {
 220                         Wait(disp_sigbit);
 221 // Non faccio nulla, vuoto solo la porta
 222                         while(GetMsg(dispport)!=NULL) 
 223                                 ;
 224                         SafeChange=TRUE;
 225                 }
 226 
 227                 if(ChangeScreenBuffer(SDL_Display,this->hidden->SB[current^1]))
 228                 {
 229                         surface->hwdata->bmap=SDL_RastPort->BitMap=this->hidden->SB[current]->sb_BitMap;
 230                         SafeChange=FALSE;
 231                         SafeDisp=FALSE;
 232                         current^=1;
 233                 }
 234 
 235                 if(!SafeDisp)
 236                 {
 237                         Wait(safe_sigbit);
 238                         while(GetMsg(safeport)!=NULL) 
 239                                 ;
 240                         SafeDisp=TRUE;
 241                 }
 242 
 243         }
 244         return(0);
 245 }
 246 
 247 /* Byte-swap the pixels in the display image */
 248 static void CGX_SwapAllPixels(SDL_Surface *screen)
     /* [<][>][^][v][top][bottom][index][help] */
 249 {
 250         int x, y;
 251 
 252         switch (screen->format->BytesPerPixel) {
 253             case 2: {
 254                 Uint16 *spot;
 255                 for ( y=0; y<screen->h; ++y ) {
 256                         spot = (Uint16 *) ((Uint8 *)screen->pixels +
 257                                                 y * screen->pitch);
 258                         for ( x=0; x<screen->w; ++x, ++spot ) {
 259                                 *spot = SDL_Swap16(*spot);
 260                         }
 261                 }
 262             }
 263             break;
 264 
 265             case 4: {
 266                 Uint32 *spot;
 267                 for ( y=0; y<screen->h; ++y ) {
 268                         spot = (Uint32 *) ((Uint8 *)screen->pixels +
 269                                                 y * screen->pitch);
 270                         for ( x=0; x<screen->w; ++x, ++spot ) {
 271                                 *spot = SDL_Swap32(*spot);
 272                         }
 273                 }
 274             }
 275             break;
 276 
 277             default:
 278                 /* should never get here */
 279                 break;
 280         }
 281 }
 282 static void CGX_SwapPixels(SDL_Surface *screen, int numrects, SDL_Rect *rects)
     /* [<][>][^][v][top][bottom][index][help] */
 283 {
 284         int i;
 285         int x, minx, maxx;
 286         int y, miny, maxy;
 287 
 288         switch (screen->format->BytesPerPixel) {
 289             case 2: {
 290                 Uint16 *spot;
 291                 for ( i=0; i<numrects; ++i ) {
 292                         minx = rects[i].x;
 293                         maxx = rects[i].x+rects[i].w;
 294                         miny = rects[i].y;
 295                         maxy = rects[i].y+rects[i].h;
 296                         for ( y=miny; y<maxy; ++y ) {
 297                                 spot = (Uint16 *) ((Uint8 *)screen->pixels +
 298                                                 y * screen->pitch + minx * 2);
 299                                 for ( x=minx; x<maxx; ++x, ++spot ) {
 300                                         *spot = SDL_Swap16(*spot);
 301                                 }
 302                         }
 303                 }
 304             }
 305             break;
 306 
 307             case 4: {
 308                 Uint32 *spot;
 309                 for ( i=0; i<numrects; ++i ) {
 310                         minx = rects[i].x;
 311                         maxx = rects[i].x+rects[i].w;
 312                         miny = rects[i].y;
 313                         maxy = rects[i].y+rects[i].h;
 314                         for ( y=miny; y<maxy; ++y ) {
 315                                 spot = (Uint32 *) ((Uint8 *)screen->pixels +
 316                                                 y * screen->pitch + minx * 4);
 317                                 for ( x=minx; x<maxx; ++x, ++spot ) {
 318                                         *spot = SDL_Swap32(*spot);
 319                                 }
 320                         }
 321                 }
 322             }
 323             break;
 324 
 325             default:
 326                 /* should never get here */
 327                 break;
 328         }
 329 }
 330 
 331 #ifdef __SASC
 332 
 333 #define USE_WPA WritePixelArray
 334 #else
 335 
 336 void USE_WPA(char *a,int b,int c,int d, struct RastPort *e,int f,int g, int h, int i, Uint32 l)
     /* [<][>][^][v][top][bottom][index][help] */
 337 {
 338                 WritePixelArray(a,b,c,d,e,f,g,h,i,l);
 339 }
 340 
 341 #endif
 342 
 343 static void CGX_FakeUpdate(_THIS, int numrects, SDL_Rect *rects)
     /* [<][>][^][v][top][bottom][index][help] */
 344 {
 345 }
 346 
 347 static void CGX_NormalUpdate(_THIS, int numrects, SDL_Rect *rects)
     /* [<][>][^][v][top][bottom][index][help] */
 348 {
 349         int i,format,customroutine=0;
 350 #ifndef USE_CGX_WRITELUTPIXEL
 351         int bpp;
 352 #endif
 353         if(this->hidden->same_format)
 354         {
 355                 format=RECTFMT_RAW;
 356         }
 357         else switch(this->screen->format->BytesPerPixel)
 358         {
 359                 case 4:
 360                         format=RECTFMT_RGBA;
 361                         break;
 362                 case 3:
 363                         format=RECTFMT_RGB;
 364                         break;
 365                 case 2:
 366                         customroutine=1;
 367                         break;
 368                 case 1:
 369 //                      D(bug("soft depth: 8 hardbpp: %ld\n",this->hidden->depth));
 370                         if(this->hidden->depth>8)
 371                         {
 372 #ifndef USE_CGX_WRITELUTPIXEL
 373                                 if(this->hidden->depth>32)
 374                                         customroutine=4;
 375                                 else if(this->hidden->depth>16)
 376                                 {
 377                                         bpp=this->hidden->BytesPerPixel; // That one is the only one that needs bpp
 378                                         customroutine=2; // The slow one!
 379                                 }
 380                                 else
 381                                         customroutine=3;
 382 #else
 383 
 384                                 customroutine=2;
 385 #endif
 386                                 
 387 //                              format=RECTFMT_LUT8;   Vecchia funzione x usare la WritePixelArray.
 388                         }
 389                         else
 390                                 customroutine=1;
 391                         break;
 392                 default:
 393                         D(bug("Unable to blit this surface!\n"));       
 394                         return;
 395         }
 396 
 397         /* Check for endian-swapped X server, swap if necessary (VERY slow!) */
 398         if ( swap_pixels &&
 399              ((this->screen->format->BytesPerPixel%2) == 0) ) {
 400                 D(bug("Swappo! Lento!\n"));
 401                 CGX_SwapPixels(this->screen, numrects, rects);
 402                 for ( i=0; i<numrects; ++i ) {
 403                         if ( ! rects[i].w ) { /* Clipped? */
 404                                 continue;
 405                         }
 406                         USE_WPA(this->screen->pixels,rects[i].x, rects[i].y,this->screen->pitch,
 407                                         SDL_RastPort,SDL_Window->BorderLeft+rects[i].x,SDL_Window->BorderTop+rects[i].y,
 408                                         rects[i].w,rects[i].h,format);
 409                 }
 410                 CGX_SwapPixels(this->screen, numrects, rects);
 411         }
 412         else if (customroutine==2)
 413         {
 414 #ifdef USE_CGX_WRITELUTPIXEL
 415                 for ( i=0; i<numrects; ++i ) {
 416                         if ( ! rects[i].w ) { /* Clipped? */
 417                                 continue;
 418                         }
 419 
 420                         WLUT(this->screen->pixels,rects[i].x, rects[i].y,this->screen->pitch,
 421                                         SDL_RastPort,SDL_XPixels,SDL_Window->BorderLeft+rects[i].x,SDL_Window->BorderTop+rects[i].y,
 422                                         rects[i].w,rects[i].h,CTABFMT_XRGB8);
 423                 }
 424 #else
 425                 unsigned char *bm_address;
 426                 Uint32  destpitch;
 427                 APTR handle;
 428 
 429                 if(handle=LockBitMapTags(SDL_RastPort->BitMap,LBMI_BASEADDRESS,&bm_address,
 430                                                                 LBMI_BYTESPERROW,&destpitch,TAG_DONE))
 431                 {
 432                         int srcwidth;
 433                         unsigned char *destbase;
 434                         register int j,k,t;
 435                         register unsigned char *mask,*dst;
 436                         register unsigned char *src,*dest;
 437 
 438 // Aggiungo il bordo della finestra se sono fullscreen.
 439                         if(currently_fullscreen)
 440                                 destbase=bm_address;
 441                         else
 442                                 destbase=bm_address+(SDL_Window->TopEdge+SDL_Window->BorderTop)*destpitch+(SDL_Window->BorderLeft+SDL_Window->LeftEdge)*this->hidden->BytesPerPixel;
 443 
 444                         for ( i=0; i<numrects; ++i ) 
 445                         {
 446                                 srcwidth=rects[i].w;
 447 
 448                                 if ( !srcwidth ) { /* Clipped? */
 449                                         continue;
 450                                 }
 451 
 452                                 dest=destbase+rects[i].x*this->hidden->BytesPerPixel;
 453                                 dest+=(rects[i].y*destpitch);
 454                                 src=((char *)(this->screen->pixels))+rects[i].x;
 455                                 src+=(rects[i].y*this->screen->pitch);
 456                                 
 457                                 for(j=rects[i].h;j;--j)
 458                                 {
 459                                         dst=dest;
 460 // SLOW routine, used for 8->24 bit mapping
 461                                         for(k=0;k<srcwidth;k++)
 462                                         {
 463                                                 mask=(unsigned char *)(&SDL_XPixels[src[k]]);
 464                                                 for(t=0;t<bpp;t++)
 465                                                 {
 466                                                         dst[t]=mask[t];
 467                                                 }
 468                                                 dst+=bpp;
 469                                         }
 470                                         src+=this->screen->pitch;
 471                                         dest+=destpitch;
 472                                 }
 473                         }
 474                         UnLockBitMap(handle);
 475                 }
 476         }
 477         else if (customroutine==3)
 478         {
 479                 unsigned char *bm_address;
 480                 Uint32  destpitch;
 481                 APTR handle;
 482 
 483                 if(handle=LockBitMapTags(SDL_RastPort->BitMap,LBMI_BASEADDRESS,&bm_address,
 484                                                                 LBMI_BYTESPERROW,&destpitch,TAG_DONE))
 485                 {
 486                         int srcwidth;
 487                         unsigned char *destbase;
 488                         register int j,k;
 489                         register unsigned char *src,*dest;
 490                         register Uint16 *destl,*srcl;
 491 
 492                         if(currently_fullscreen)
 493                                 destbase=bm_address;
 494                         else
 495                                 destbase=bm_address+(SDL_Window->TopEdge+SDL_Window->BorderTop)*destpitch+(SDL_Window->BorderLeft+SDL_Window->LeftEdge)*this->hidden->BytesPerPixel;
 496 
 497                         for ( i=0; i<numrects; ++i ) 
 498                         {
 499                                 srcwidth=rects[i].w;
 500 
 501                                 if ( !srcwidth ) { /* Clipped? */
 502                                         continue;
 503                                 }
 504 
 505                                 dest=destbase+rects[i].x*this->hidden->BytesPerPixel;
 506                                 dest+=(rects[i].y*destpitch);
 507                                 src=((char *)(this->screen->pixels))+rects[i].x;
 508                                 src+=(rects[i].y*this->screen->pitch);
 509                                 
 510 // This is the fast, well not too slow, remapping code for 16bit displays
 511 
 512                                 for(j=rects[i].h;j;--j)
 513                                 {
 514                                         destl=(Uint16 *)dest;
 515 
 516                                         for(k=0;k<srcwidth;k++)
 517                                         {
 518                                                 srcl=(Uint16 *)&SDL_XPixels[src[k]];
 519                                                 *destl=*srcl;
 520                                                 destl++;
 521                                         }
 522                                         src+=this->screen->pitch;
 523                                         dest+=destpitch;
 524                                 }
 525                         }
 526                         UnLockBitMap(handle);
 527                 }
 528         }
 529         else if (customroutine==4)
 530         {
 531                 unsigned char *bm_address;
 532                 Uint32  destpitch;
 533                 APTR handle;
 534 
 535                 if(handle=LockBitMapTags(SDL_RastPort->BitMap,LBMI_BASEADDRESS,&bm_address,
 536                                                                 LBMI_BYTESPERROW,&destpitch,TAG_DONE))
 537                 {
 538                         int srcwidth;
 539                         unsigned char *destbase;
 540                         register int j,k;
 541                         register unsigned char *src,*dest;
 542                         register Uint32 *destl,*srcl;
 543 
 544                         if(currently_fullscreen)
 545                                 destbase=bm_address;
 546                         else
 547                                 destbase=bm_address+(SDL_Window->TopEdge+SDL_Window->BorderTop)*destpitch+(SDL_Window->BorderLeft+SDL_Window->LeftEdge)*this->hidden->BytesPerPixel;
 548 
 549                         for ( i=0; i<numrects; ++i ) 
 550                         {
 551                                 srcwidth=rects[i].w;
 552 
 553                                 if ( !srcwidth ) { /* Clipped? */
 554                                         continue;
 555                                 }
 556 
 557                                 dest=destbase+rects[i].x*this->hidden->BytesPerPixel;
 558                                 dest+=(rects[i].y*destpitch);
 559                                 src=((char *)(this->screen->pixels))+rects[i].x;
 560                                 src+=(rects[i].y*this->screen->pitch);
 561                                 
 562 // This is the fast, well not too slow, remapping code for 32bit displays
 563 
 564                                 for(j=rects[i].h;j;--j)
 565                                 {
 566                                         destl=(Uint32 *)dest;
 567 
 568                                         for(k=0;k<srcwidth;k++)
 569                                         {
 570                                                 srcl=(Uint32 *)&SDL_XPixels[src[k]];
 571                                                 *destl=*srcl;
 572                                                 destl++;
 573                                         }
 574                                         src+=this->screen->pitch;
 575                                         dest+=destpitch;
 576                                 }
 577                         }
 578                         UnLockBitMap(handle);
 579                 }
 580 #endif
 581         }
 582         else if(customroutine)
 583         {
 584                 unsigned char *bm_address;
 585                 Uint32  destpitch;
 586                 APTR handle;
 587 
 588 //              D(bug("Uso customroutine!\n"));
 589 
 590                 if(handle=LockBitMapTags(SDL_RastPort->BitMap,LBMI_BASEADDRESS,(ULONG)&bm_address,
 591                                                                 LBMI_BYTESPERROW,(ULONG)&destpitch,TAG_DONE))
 592                 {
 593                         unsigned char *destbase;
 594                         register int j,srcwidth;
 595                         register unsigned char *src,*dest;
 596 
 597 // Aggiungo il bordo della finestra se sono fullscreen.
 598                         if(currently_fullscreen)
 599                                 destbase=bm_address;
 600                         else
 601                                 destbase=bm_address+(SDL_Window->TopEdge+SDL_Window->BorderTop)*destpitch+(SDL_Window->BorderLeft+SDL_Window->LeftEdge)*this->screen->format->BytesPerPixel;
 602 
 603                         for ( i=0; i<numrects; ++i ) 
 604                         {
 605                                 srcwidth=rects[i].w;
 606 
 607                                 if ( !srcwidth ) { /* Clipped? */
 608                                         continue;
 609                                 }
 610 
 611                                 dest=destbase+rects[i].x*this->screen->format->BytesPerPixel;
 612                                 dest+=(rects[i].y*destpitch);
 613                                 src=((char *)(this->screen->pixels))+rects[i].x*this->screen->format->BytesPerPixel;
 614                                 src+=(rects[i].y*this->screen->pitch);
 615                                 
 616                                 srcwidth*=this->screen->format->BytesPerPixel;
 617 
 618 //                              D(bug("Rects: %ld,%ld %ld,%ld Src:%lx Dest:%lx\n",rects[i].x,rects[i].y,rects[i].w,rects[i].h,src,dest));
 619 
 620                                 for(j=rects[i].h;j;--j)
 621                                 {
 622                                         memcpy(dest,src,srcwidth);
 623                                         src+=this->screen->pitch;
 624                                         dest+=destpitch;
 625                                 }
 626                         }
 627                         UnLockBitMap(handle);
 628 //                      D(bug("Rectblit addr: %lx pitch: %ld rects:%ld srcptr: %lx srcpitch: %ld\n",bm_address,destpitch,numrects,this->screen->pixels,this->screen->pitch));
 629                 }
 630         }
 631         else
 632         {
 633                 for ( i=0; i<numrects; ++i ) {
 634                         if ( ! rects[i].w ) { /* Clipped? */
 635                                 continue;
 636                         }
 637                         USE_WPA(this->screen->pixels,rects[i].x, rects[i].y,this->screen->pitch,
 638                                         SDL_RastPort,SDL_Window->BorderLeft+rects[i].x,SDL_Window->BorderTop+rects[i].y,
 639                                         rects[i].w,rects[i].h,format);
 640 
 641 /*
 642                         XPutImage(GFX_Display, SDL_Window, SDL_GC, SDL_Ximage,
 643                                 rects[i].x, rects[i].y,
 644                                 rects[i].x, rects[i].y, rects[i].w, rects[i].h);
 645 */
 646                 }
 647         }
 648 /*
 649         if ( SDL_VideoSurface->flags & SDL_ASYNCBLIT ) {
 650                 ++blit_queued;
 651         } else {
 652         }
 653 */
 654 }
 655 
 656 void CGX_RefreshDisplay(_THIS)
     /* [<][>][^][v][top][bottom][index][help] */
 657 {
 658         int format,customroutine=0;
 659 #ifndef USE_CGX_WRITELUTPIXEL
 660         int bpp;
 661 #endif
 662         /* Don't refresh a display that doesn't have an image (like GL) */
 663         if ( ! SDL_Ximage ) {
 664                 return;
 665         }
 666 
 667         if(this->hidden->same_format)
 668         {
 669                 format=RECTFMT_RAW;
 670         }
 671         else switch(this->screen->format->BytesPerPixel)
 672         {
 673                 case 4:
 674                         format=RECTFMT_RGBA;
 675                         break;
 676                 case 3:
 677                         format=RECTFMT_RGB;
 678                         break;
 679                 case 2:
 680                         customroutine=1;
 681                         break;
 682                 case 1:
 683 //                      D(bug("soft depth: 8 hardbpp: %ld\n",this->hidden->depth));
 684                         if(this->hidden->depth>8)
 685                         {
 686 #ifndef USE_CGX_WRITELUTPIXEL
 687                                 if(this->hidden->depth>32)
 688                                         customroutine=4;
 689                                 else if(this->hidden->depth>16)
 690                                 {
 691                                         bpp=this->hidden->BytesPerPixel; // That one is the only one that needs bpp
 692                                         customroutine=2; // The slow one!
 693                                 }
 694                                 else
 695                                         customroutine=3;
 696 #else
 697 
 698                                 customroutine=2;
 699 #endif
 700 //                              format=RECTFMT_LUT8;
 701                         }
 702                         else
 703                                 customroutine=1;
 704                         break;
 705 
 706         }
 707 
 708                 /* Check for endian-swapped X server, swap if necessary */
 709         if ( swap_pixels &&
 710              ((this->screen->format->BytesPerPixel%2) == 0) ) {
 711                 CGX_SwapAllPixels(this->screen);
 712                 USE_WPA(this->screen->pixels,0,0,this->screen->pitch,
 713                                 SDL_RastPort,SDL_Window->BorderLeft,SDL_Window->BorderTop,
 714                                 this->screen->w,this->screen->h,format);
 715                 CGX_SwapAllPixels(this->screen);
 716         }
 717         else if (customroutine==2)
 718         {
 719 #ifdef USE_CGX_WRITELUTPIXEL
 720                 WLUT(this->screen->pixels,0,0,this->screen->pitch,
 721                                         SDL_RastPort,SDL_XPixels,SDL_Window->BorderLeft,SDL_Window->BorderTop,
 722                                         this->screen->w,this->screen->h,CTABFMT_XRGB8);
 723 #else
 724                 unsigned char *bm_address;
 725                 Uint32  destpitch;
 726                 APTR handle;
 727 
 728                 if(handle=LockBitMapTags(SDL_RastPort->BitMap,LBMI_BASEADDRESS,(ULONG)&bm_address,
 729                                                                 LBMI_BYTESPERROW,(ULONG)&destpitch,TAG_DONE))
 730                 {
 731                         register int j,k,t;
 732                         register unsigned char *mask,*dst;
 733                         register unsigned char *src,*dest;
 734 
 735 // Aggiungo il bordo della finestra se sono fullscreen.
 736                         if(!currently_fullscreen)
 737                                 dest=bm_address+(SDL_Window->TopEdge+SDL_Window->BorderTop)*destpitch+(SDL_Window->BorderLeft+SDL_Window->LeftEdge)*this->hidden->BytesPerPixel;
 738                         else
 739                                 dest=bm_address;
 740 
 741                         src=this->screen->pixels;
 742                                 
 743                         for(j=this->screen->h;j;--j)
 744                         {
 745                                 dst=dest;
 746 // SLOW routine, used for 8->24 bit mapping
 747                                 for(k=0;k<this->screen->w;k++)
 748                                 {
 749                                         mask=(unsigned char *)(&SDL_XPixels[src[k]]);
 750                                         for(t=0;t<bpp;t++)
 751                                         {
 752                                                 dst[t]=mask[t];
 753                                         }
 754                                         dst+=bpp;
 755                                 }
 756                                 src+=this->screen->pitch;
 757                                 dest+=destpitch;
 758                         }
 759                         UnLockBitMap(handle);
 760                 }
 761         }
 762         else if (customroutine==3)
 763         {
 764                 unsigned char *bm_address;
 765                 Uint32  destpitch;
 766                 APTR handle;
 767 
 768                 if(handle=LockBitMapTags(SDL_RastPort->BitMap,LBMI_BASEADDRESS,(ULONG)&bm_address,
 769                                                                 LBMI_BYTESPERROW,(ULONG)&destpitch,TAG_DONE))
 770                 {
 771                         register int j,k;
 772                         register unsigned char *src,*dest;
 773                         register Uint16 *destl,*srcl;
 774 
 775                         if(!currently_fullscreen)
 776                                 dest=bm_address+(SDL_Window->TopEdge+SDL_Window->BorderTop)*destpitch+(SDL_Window->BorderLeft+SDL_Window->LeftEdge)*this->hidden->BytesPerPixel;
 777                         else
 778                                 dest=bm_address;
 779 
 780                         src=this->screen->pixels;
 781                                 
 782 // This is the fast, well not too slow, remapping code for 16bit displays
 783 
 784                         for(j=this->screen->h;j;--j)
 785                         {
 786                                 destl=(Uint16 *)dest;
 787 
 788                                 for(k=0;k<this->screen->w;k++)
 789                                 {
 790                                         srcl=(Uint16 *)&SDL_XPixels[src[k]];
 791                                         *destl=*srcl;
 792                                         destl++;
 793                                 }
 794                                 src+=this->screen->pitch;
 795                                 dest+=destpitch;
 796                         }
 797                         UnLockBitMap(handle);
 798                 }
 799         }
 800         else if (customroutine==4)
 801         {
 802                 unsigned char *bm_address;
 803                 Uint32  destpitch;
 804                 APTR handle;
 805 
 806                 if(handle=LockBitMapTags(SDL_RastPort->BitMap,LBMI_BASEADDRESS,(ULONG)&bm_address,
 807                                                                 LBMI_BYTESPERROW,(ULONG)&destpitch,TAG_DONE))
 808                 {
 809                         register int j,k;
 810                         register unsigned char *src,*dest;
 811                         register Uint32 *destl,*srcl;
 812 
 813                         if(!currently_fullscreen)
 814                                 dest=bm_address+(SDL_Window->TopEdge+SDL_Window->BorderTop)*destpitch+(SDL_Window->BorderLeft+SDL_Window->LeftEdge)*this->hidden->BytesPerPixel;
 815                         else
 816                                 dest=bm_address;
 817 
 818                         src=this->screen->pixels;
 819                                 
 820 // This is the fast, well not too slow, remapping code for 32bit displays
 821 
 822                         for(j=this->screen->h;j;--j)
 823                         {
 824                                 destl=(Uint32 *)dest;
 825 
 826                                 for(k=0;k<this->screen->w;k++)
 827                                 {
 828                                         srcl=(Uint32 *)&SDL_XPixels[src[k]];
 829                                         *destl=*srcl;
 830                                         destl++;
 831                                 }
 832                                 src+=this->screen->pitch;
 833                                 dest+=destpitch;
 834                         }
 835                         UnLockBitMap(handle);
 836                 }
 837 #endif
 838         }
 839         else if(customroutine)
 840         {
 841                 unsigned char *bm_address;
 842                 Uint32  destpitch;
 843                 APTR handle;
 844 
 845                 if(handle=LockBitMapTags(SDL_RastPort->BitMap,
 846                                         LBMI_BASEADDRESS,(ULONG)&bm_address,
 847                                         LBMI_BYTESPERROW,(ULONG)&destpitch,TAG_DONE))
 848                 {
 849                         register int j;
 850                         register unsigned char *src,*dest;
 851 
 852                         if(!currently_fullscreen)
 853                                 dest=bm_address+(SDL_Window->TopEdge+SDL_Window->BorderTop)*destpitch+(SDL_Window->BorderLeft+SDL_Window->LeftEdge)*this->screen->format->BytesPerPixel;
 854                         else
 855                                 dest=bm_address;
 856 
 857                         src=this->screen->pixels;
 858                                 
 859 //                      D(bug("addr: %lx pitch: %ld src:%lx srcpitch: %ld\n",dest,destpitch,this->screen->pixels,this->screen->pitch));
 860 
 861                         if(this->screen->pitch==destpitch)
 862                         {
 863                                 memcpy(dest,src,this->screen->pitch*this->screen->h);
 864                         }
 865                         else
 866                         {
 867                                 for(j=this->screen->h;j;--j)
 868                                 {
 869                                         memcpy(dest,src,this->screen->pitch);
 870                                         src+=this->screen->pitch;
 871                                         dest+=destpitch;
 872                                 }
 873                         }
 874 
 875                         UnLockBitMap(handle);
 876                 }
 877         }
 878         else
 879         {
 880                 USE_WPA(this->screen->pixels,0,0,this->screen->pitch,
 881                                 SDL_RastPort,SDL_Window->BorderLeft,SDL_Window->BorderTop,
 882                                 this->screen->w,this->screen->h,format);
 883         }
 884 
 885 }

/* [<][>][^][v][top][bottom][index][help] */