1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-08-13 19:54:17 +02:00

Refactored and hopefully fixed blitWithRotateNclip functions family

This commit is contained in:
Michał W. Urbańczyk
2009-03-26 17:55:10 +00:00
parent 1915811a2e
commit 21155f3b35

View File

@@ -473,6 +473,15 @@ SDL_Surface * CSDL_Ext::alphaTransform(SDL_Surface *src)
return src;
}
// <=>
void prepareOutRect(SDL_Rect &dst, const SDL_Rect *dstRect, const SDL_Rect *clip_rect)
{
dst.x = std::max(dstRect->x,clip_rect->x);
dst.y = std::max(dstRect->y,clip_rect->y);
dst.w = std::max(0,std::min(dstRect->w - (dst.x - dstRect->x), clip_rect->x + clip_rect->w - dst.x));
dst.h = std::max(0,std::min(dstRect->h - (dst.y - dstRect->y), clip_rect->y + clip_rect->h - dst.y));
}
void CSDL_Ext::blitWithRotate1(SDL_Surface *src,SDL_Rect * srcRect, SDL_Surface * dst, SDL_Rect * dstRect)//srcRect is not used, works with 8bpp sources and 24bpp dests
{
Uint8 *dp, *sp = (Uint8 *)src->pixels;
@@ -492,32 +501,9 @@ void CSDL_Ext::blitWithRotate1(SDL_Surface *src,SDL_Rect * srcRect, SDL_Surface
void CSDL_Ext::blitWithRotate1clip(SDL_Surface *src,SDL_Rect * srcRect, SDL_Surface * dst, SDL_Rect * dstRect)//srcRect is not used, works with 8bpp sources and 24bpp dests
{
Uint8 *dp, *sp = (Uint8 *)src->pixels;
for(int i=0; i<dstRect->h; i++)
{
if(i + dstRect->y + 1 >= dst->clip_rect.y && i + dstRect->y + 1 <= dst->clip_rect.y + dst->clip_rect.h)
{
dp = (Uint8 *)dst->pixels + (i+dstRect->y)*dst->pitch + (dstRect->x+dstRect->w)*dst->format->BytesPerPixel;
for(int j=0; j<dstRect->w; j++, sp++)
{
if((dstRect->x+dstRect->w - j-1) >= dst->clip_rect.x && (dstRect->x+dstRect->w - j) <= dst->clip_rect.x + dst->clip_rect.w)
{
const SDL_Color * const color = src->format->palette->colors+(*sp);
*(--dp) = color->r;
*(--dp) = color->g;
*(--dp) = color->b;
}
else
{
dp-=3;
}
}
}
else
{
sp+=dstRect->w;
}
}
SDL_Rect realDest;
prepareOutRect(realDest,dstRect,&dst->clip_rect);
blitWithRotate1(src,srcRect,dst,&realDest);
}
void CSDL_Ext::blitWithRotate2(SDL_Surface *src,SDL_Rect * srcRect, SDL_Surface * dst, SDL_Rect * dstRect)//srcRect is not used, works with 8bpp sources and 24bpp dests
@@ -539,32 +525,9 @@ void CSDL_Ext::blitWithRotate2(SDL_Surface *src,SDL_Rect * srcRect, SDL_Surface
void CSDL_Ext::blitWithRotate2clip(SDL_Surface *src,SDL_Rect * srcRect, SDL_Surface * dst, SDL_Rect * dstRect)//srcRect is not used, works with 8bpp sources and 24bpp dests
{
Uint8 *dp, *sp = (Uint8 *)src->pixels;
for(int i=0; i<dstRect->h; i++)
{
if((dstRect->y + dstRect->h - i) >= dst->clip_rect.y && (dstRect->y + dstRect->h - i) <= dst->clip_rect.y + dst->clip_rect.h)
{
dp = (Uint8 *)dst->pixels + (dstRect->y + dstRect->h - 1 - i)*dst->pitch + dstRect->x*dst->format->BytesPerPixel;
for(int j=0; j<dstRect->w; j++, sp++)
{
if(j + dstRect->x >= dst->clip_rect.x && j + dstRect->x+1 <= dst->clip_rect.x + dst->clip_rect.w)
{
const SDL_Color * const color = src->format->palette->colors+(*sp);
*(dp++) = color->b;
*(dp++) = color->g;
*(dp++) = color->r;
}
else
{
dp+=3;
}
}
}
else
{
sp+=dstRect->w;
}
}
SDL_Rect realDest;
prepareOutRect(realDest,dstRect,&dst->clip_rect);
blitWithRotate2(src,srcRect,dst,&realDest);
}
void CSDL_Ext::blitWithRotate3(SDL_Surface *src,SDL_Rect * srcRect, SDL_Surface * dst, SDL_Rect * dstRect)//srcRect is not used, works with 8bpp sources and 24bpp dests
@@ -586,32 +549,9 @@ void CSDL_Ext::blitWithRotate3(SDL_Surface *src,SDL_Rect * srcRect, SDL_Surface
void CSDL_Ext::blitWithRotate3clip(SDL_Surface *src,SDL_Rect * srcRect, SDL_Surface * dst, SDL_Rect * dstRect)//srcRect is not used, works with 8bpp sources and 24bpp dests
{
Uint8 *dp, *sp = (Uint8 *)src->pixels;
for(int i=0; i<dstRect->h; i++)
{
if((dstRect->y + dstRect->h - i) >= dst->clip_rect.y && (dstRect->y + dstRect->h - i) <= dst->clip_rect.y + dst->clip_rect.h)
{
dp = (Uint8 *)dst->pixels + (dstRect->y + dstRect->h - 1 - i)*dst->pitch + (dstRect->x+dstRect->w)*dst->format->BytesPerPixel;
for(int j=0; j<dstRect->w; j++, sp++)
{
if((dstRect->x+dstRect->w - j) >= dst->clip_rect.x && (dstRect->x+dstRect->w - j) <= dst->clip_rect.x + dst->clip_rect.w)
{
const SDL_Color * const color = src->format->palette->colors+(*sp);
*(--dp) = color->r;
*(--dp) = color->g;
*(--dp) = color->b;
}
else
{
dp -=3;
}
}
}
else
{
sp+=dstRect->w;
}
}
SDL_Rect realDest;
prepareOutRect(realDest,dstRect,&dst->clip_rect);
blitWithRotate3(src,srcRect,dst,&realDest);
}
int CSDL_Ext::blit8bppAlphaTo24bpp(SDL_Surface * src, SDL_Rect * srcRect, SDL_Surface * dst, SDL_Rect * dstRect)