📄 sdl_cgximage.c
字号:
}
WLUT(this->screen->pixels,rects[i].x, rects[i].y,this->screen->pitch,
SDL_RastPort,SDL_XPixels,SDL_Window->BorderLeft+rects[i].x,SDL_Window->BorderTop+rects[i].y,
rects[i].w,rects[i].h,CTABFMT_XRGB8);
}
#else
unsigned char *bm_address;
Uint32 destpitch;
APTR handle;
if(handle=LockBitMapTags(SDL_RastPort->BitMap,LBMI_BASEADDRESS,&bm_address,
LBMI_BYTESPERROW,&destpitch,TAG_DONE))
{
int srcwidth;
unsigned char *destbase;
register int j,k,t;
register unsigned char *mask,*dst;
register unsigned char *src,*dest;
// Aggiungo il bordo della finestra se sono fullscreen.
if(currently_fullscreen)
destbase=bm_address;
else
destbase=bm_address+(SDL_Window->TopEdge+SDL_Window->BorderTop)*destpitch+(SDL_Window->BorderLeft+SDL_Window->LeftEdge)*this->hidden->BytesPerPixel;
for ( i=0; i<numrects; ++i )
{
srcwidth=rects[i].w;
if ( !srcwidth ) { /* Clipped? */
continue;
}
dest=destbase+rects[i].x*this->hidden->BytesPerPixel;
dest+=(rects[i].y*destpitch);
src=((char *)(this->screen->pixels))+rects[i].x;
src+=(rects[i].y*this->screen->pitch);
for(j=rects[i].h;j;--j)
{
dst=dest;
// SLOW routine, used for 8->24 bit mapping
for(k=0;k<srcwidth;k++)
{
mask=(unsigned char *)(&SDL_XPixels[src[k]]);
for(t=0;t<bpp;t++)
{
dst[t]=mask[t];
}
dst+=bpp;
}
src+=this->screen->pitch;
dest+=destpitch;
}
}
UnLockBitMap(handle);
}
}
else if (customroutine==3)
{
unsigned char *bm_address;
Uint32 destpitch;
APTR handle;
if(handle=LockBitMapTags(SDL_RastPort->BitMap,LBMI_BASEADDRESS,&bm_address,
LBMI_BYTESPERROW,&destpitch,TAG_DONE))
{
int srcwidth;
unsigned char *destbase;
register int j,k;
register unsigned char *src,*dest;
register Uint16 *destl,*srcl;
if(currently_fullscreen)
destbase=bm_address;
else
destbase=bm_address+(SDL_Window->TopEdge+SDL_Window->BorderTop)*destpitch+(SDL_Window->BorderLeft+SDL_Window->LeftEdge)*this->hidden->BytesPerPixel;
for ( i=0; i<numrects; ++i )
{
srcwidth=rects[i].w;
if ( !srcwidth ) { /* Clipped? */
continue;
}
dest=destbase+rects[i].x*this->hidden->BytesPerPixel;
dest+=(rects[i].y*destpitch);
src=((char *)(this->screen->pixels))+rects[i].x;
src+=(rects[i].y*this->screen->pitch);
// This is the fast, well not too slow, remapping code for 16bit displays
for(j=rects[i].h;j;--j)
{
destl=(Uint16 *)dest;
for(k=0;k<srcwidth;k++)
{
srcl=(Uint16 *)&SDL_XPixels[src[k]];
*destl=*srcl;
destl++;
}
src+=this->screen->pitch;
dest+=destpitch;
}
}
UnLockBitMap(handle);
}
}
else if (customroutine==4)
{
unsigned char *bm_address;
Uint32 destpitch;
APTR handle;
if(handle=LockBitMapTags(SDL_RastPort->BitMap,LBMI_BASEADDRESS,&bm_address,
LBMI_BYTESPERROW,&destpitch,TAG_DONE))
{
int srcwidth;
unsigned char *destbase;
register int j,k;
register unsigned char *src,*dest;
register Uint32 *destl,*srcl;
if(currently_fullscreen)
destbase=bm_address;
else
destbase=bm_address+(SDL_Window->TopEdge+SDL_Window->BorderTop)*destpitch+(SDL_Window->BorderLeft+SDL_Window->LeftEdge)*this->hidden->BytesPerPixel;
for ( i=0; i<numrects; ++i )
{
srcwidth=rects[i].w;
if ( !srcwidth ) { /* Clipped? */
continue;
}
dest=destbase+rects[i].x*this->hidden->BytesPerPixel;
dest+=(rects[i].y*destpitch);
src=((char *)(this->screen->pixels))+rects[i].x;
src+=(rects[i].y*this->screen->pitch);
// This is the fast, well not too slow, remapping code for 32bit displays
for(j=rects[i].h;j;--j)
{
destl=(Uint32 *)dest;
for(k=0;k<srcwidth;k++)
{
srcl=(Uint32 *)&SDL_XPixels[src[k]];
*destl=*srcl;
destl++;
}
src+=this->screen->pitch;
dest+=destpitch;
}
}
UnLockBitMap(handle);
}
#endif
}
else if(customroutine)
{
unsigned char *bm_address;
Uint32 destpitch;
APTR handle;
// D(bug("Using customroutine!\n"));
if(handle=LockBitMapTags(SDL_RastPort->BitMap,LBMI_BASEADDRESS,(ULONG)&bm_address,
LBMI_BYTESPERROW,(ULONG)&destpitch,TAG_DONE))
{
unsigned char *destbase;
register int j,srcwidth;
register unsigned char *src,*dest;
// Aggiungo il bordo della finestra se sono fullscreen.
if(currently_fullscreen)
destbase=bm_address;
else
destbase=bm_address+(SDL_Window->TopEdge+SDL_Window->BorderTop)*destpitch+(SDL_Window->BorderLeft+SDL_Window->LeftEdge)*this->screen->format->BytesPerPixel;
for ( i=0; i<numrects; ++i )
{
srcwidth=rects[i].w;
if ( !srcwidth ) { /* Clipped? */
continue;
}
dest=destbase+rects[i].x*this->screen->format->BytesPerPixel;
dest+=(rects[i].y*destpitch);
src=((char *)(this->screen->pixels))+rects[i].x*this->screen->format->BytesPerPixel;
src+=(rects[i].y*this->screen->pitch);
srcwidth*=this->screen->format->BytesPerPixel;
// 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));
for(j=rects[i].h;j;--j)
{
memcpy(dest,src,srcwidth);
src+=this->screen->pitch;
dest+=destpitch;
}
}
UnLockBitMap(handle);
// D(bug("Rectblit addr: %lx pitch: %ld rects:%ld srcptr: %lx srcpitch: %ld\n",bm_address,destpitch,numrects,this->screen->pixels,this->screen->pitch));
}
}
else
{
for ( i=0; i<numrects; ++i ) {
if ( ! rects[i].w ) { /* Clipped? */
continue;
}
USE_WPA(this->screen->pixels,rects[i].x, rects[i].y,this->screen->pitch,
SDL_RastPort,SDL_Window->BorderLeft+rects[i].x,SDL_Window->BorderTop+rects[i].y,
rects[i].w,rects[i].h,format);
}
}
}
void CGX_RefreshDisplay(_THIS)
{
int format,customroutine=0;
#ifndef USE_CGX_WRITELUTPIXEL
int bpp;
#endif
/* Don't refresh a display that doesn't have an image (like GL) */
if ( ! SDL_Ximage ) {
return;
}
if(this->hidden->same_format && !use_picasso96)
{
format=RECTFMT_RAW;
}
else switch(this->screen->format->BytesPerPixel)
{
case 4:
format=RECTFMT_RGBA;
break;
case 3:
format=RECTFMT_RGB;
break;
case 2:
customroutine=1;
break;
case 1:
// D(bug("soft depth: 8 hardbpp: %ld\n",this->hidden->depth));
if(this->hidden->depth>8)
{
#ifndef USE_CGX_WRITELUTPIXEL
if(this->hidden->depth>32)
customroutine=4;
else if(this->hidden->depth>16)
{
bpp=this->hidden->BytesPerPixel; // That one is the only one that needs bpp
customroutine=2; // The slow one!
}
else
customroutine=3;
#else
customroutine=2;
#endif
// format=RECTFMT_LUT8;
}
else
customroutine=1;
break;
}
/* Check for endian-swapped X server, swap if necessary */
if ( swap_pixels &&
((this->screen->format->BytesPerPixel%2) == 0) ) {
CGX_SwapAllPixels(this->screen);
USE_WPA(this->screen->pixels,0,0,this->screen->pitch,
SDL_RastPort,SDL_Window->BorderLeft,SDL_Window->BorderTop,
this->screen->w,this->screen->h,format);
CGX_SwapAllPixels(this->screen);
}
else if (customroutine==2)
{
#ifdef USE_CGX_WRITELUTPIXEL
WLUT(this->screen->pixels,0,0,this->screen->pitch,
SDL_RastPort,SDL_XPixels,SDL_Window->BorderLeft,SDL_Window->BorderTop,
this->screen->w,this->screen->h,CTABFMT_XRGB8);
#else
unsigned char *bm_address;
Uint32 destpitch;
APTR handle;
if(handle=LockBitMapTags(SDL_RastPort->BitMap,LBMI_BASEADDRESS,(ULONG)&bm_address,
LBMI_BYTESPERROW,(ULONG)&destpitch,TAG_DONE))
{
register int j,k,t;
register unsigned char *mask,*dst;
register unsigned char *src,*dest;
// Aggiungo il bordo della finestra se sono fullscreen.
if(!currently_fullscreen)
dest=bm_address+(SDL_Window->TopEdge+SDL_Window->BorderTop)*destpitch+(SDL_Window->BorderLeft+SDL_Window->LeftEdge)*this->hidden->BytesPerPixel;
else
dest=bm_address;
src=this->screen->pixels;
for(j=this->screen->h;j;--j)
{
dst=dest;
// SLOW routine, used for 8->24 bit mapping
for(k=0;k<this->screen->w;k++)
{
mask=(unsigned char *)(&SDL_XPixels[src[k]]);
for(t=0;t<bpp;t++)
{
dst[t]=mask[t];
}
dst+=bpp;
}
src+=this->screen->pitch;
dest+=destpitch;
}
UnLockBitMap(handle);
}
}
else if (customroutine==3)
{
unsigned char *bm_address;
Uint32 destpitch;
APTR handle;
if(handle=LockBitMapTags(SDL_RastPort->BitMap,LBMI_BASEADDRESS,(ULONG)&bm_address,
LBMI_BYTESPERROW,(ULONG)&destpitch,TAG_DONE))
{
register int j,k;
register unsigned char *src,*dest;
register Uint16 *destl,*srcl;
if(!currently_fullscreen)
dest=bm_address+(SDL_Window->TopEdge+SDL_Window->BorderTop)*destpitch+(SDL_Window->BorderLeft+SDL_Window->LeftEdge)*this->hidden->BytesPerPixel;
else
dest=bm_address;
src=this->screen->pixels;
// This is the fast, well not too slow, remapping code for 16bit displays
for(j=this->screen->h;j;--j)
{
destl=(Uint16 *)dest;
for(k=0;k<this->screen->w;k++)
{
srcl=(Uint16 *)&SDL_XPixels[src[k]];
*destl=*srcl;
destl++;
}
src+=this->screen->pitch;
dest+=destpitch;
}
UnLockBitMap(handle);
}
}
else if (customroutine==4)
{
unsigned char *bm_address;
Uint32 destpitch;
APTR handle;
if(handle=LockBitMapTags(SDL_RastPort->BitMap,LBMI_BASEADDRESS,(ULONG)&bm_address,
LBMI_BYTESPERROW,(ULONG)&destpitch,TAG_DONE))
{
register int j,k;
register unsigned char *src,*dest;
register Uint32 *destl,*srcl;
if(!currently_fullscreen)
dest=bm_address+(SDL_Window->TopEdge+SDL_Window->BorderTop)*destpitch+(SDL_Window->BorderLeft+SDL_Window->LeftEdge)*this->hidden->BytesPerPixel;
else
dest=bm_address;
src=this->screen->pixels;
// This is the fast, well not too slow, remapping code for 32bit displays
for(j=this->screen->h;j;--j)
{
destl=(Uint32 *)dest;
for(k=0;k<this->screen->w;k++)
{
srcl=(Uint32 *)&SDL_XPixels[src[k]];
*destl=*srcl;
destl++;
}
src+=this->screen->pitch;
dest+=destpitch;
}
UnLockBitMap(handle);
}
#endif
}
else if(customroutine)
{
unsigned char *bm_address;
Uint32 destpitch;
APTR handle;
if(handle=LockBitMapTags(SDL_RastPort->BitMap,
LBMI_BASEADDRESS,(ULONG)&bm_address,
LBMI_BYTESPERROW,(ULONG)&destpitch,TAG_DONE))
{
register int j;
register unsigned char *src,*dest;
if(!currently_fullscreen)
dest=bm_address+(SDL_Window->TopEdge+SDL_Window->BorderTop)*destpitch+(SDL_Window->BorderLeft+SDL_Window->LeftEdge)*this->screen->format->BytesPerPixel;
else
dest=bm_address;
src=this->screen->pixels;
// D(bug("addr: %lx pitch: %ld src:%lx srcpitch: %ld\n",dest,destpitch,this->screen->pixels,this->screen->pitch));
if(this->screen->pitch==destpitch)
{
memcpy(dest,src,this->screen->pitch*this->screen->h);
}
else
{
for(j=this->screen->h;j;--j)
{
memcpy(dest,src,this->screen->pitch);
src+=this->screen->pitch;
dest+=destpitch;
}
}
UnLockBitMap(handle);
}
}
else
{
USE_WPA(this->screen->pixels,0,0,this->screen->pitch,
SDL_RastPort,SDL_Window->BorderLeft,SDL_Window->BorderTop,
this->screen->w,this->screen->h,format);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -