TINYGL: Moved tglBlit functions inside the struct BlitImage.

This commit is contained in:
Stefano Musumeci 2014-07-15 16:32:14 +02:00
parent f1a848e947
commit baf872c963

View file

@ -92,6 +92,76 @@ public:
} }
}; };
FORCEINLINE bool clipBlitImage(TinyGL::GLContext *c, int &srcWidth, int &srcHeight, int &width, int &height, int &dstX, int &dstY, int &clampWidth, int &clampHeight) {
if (srcWidth == 0 || srcHeight == 0) {
srcWidth = _surface.w;
srcHeight = _surface.h;
}
if (width == 0 && height == 0) {
width = srcWidth;
height = srcHeight;
}
if (dstX >= c->fb->xsize|| dstY >= c->fb->ysize)
return false;
if (dstX + width > c->fb->xsize)
clampWidth = c->fb->xsize - dstX;
else
clampWidth = width;
if (dstY + height > c->fb->ysize)
clampHeight = c->fb->ysize - dstY;
else
clampHeight = height;
if (dstX < 0)
dstX = 0;
if (dstY < 0)
dstY = 0;
return true;
}
template <bool disableColoring>
void tglBlitRLE(int dstX, int dstY, int srcX, int srcY, int srcWidth, int srcHeight, float aTint, float rTint, float gTint, float bTint);
template <bool disableBlending, bool disableColoring, bool flipVertical, bool flipHorizontal>
void tglBlitSimple(int dstX, int dstY, int srcX, int srcY, int srcWidth, int srcHeight, float aTint, float rTint, float gTint, float bTint);
template <bool disableBlending, bool disableColoring, bool flipVertical, bool flipHorizontal>
void tglBlitScale(int dstX, int dstY, int width, int height, int srcX, int srcY, int srcWidth, int srcHeight, float aTint, float rTint, float gTint, float bTint);
template <bool disableBlending, bool disableColoring, bool flipVertical, bool flipHorizontal>
void tglBlitRotoScale(int dstX, int dstY, int width, int height, int srcX, int srcY, int srcWidth, int srcHeight, int rotation,
int originX, int originY, float aTint, float rTint, float gTint, float bTint);
//Utility function.
template <bool disableBlending, bool disableColoring, bool disableTransform, bool flipVertical, bool flipHorizontal>
FORCEINLINE void tglBlitGeneric(const BlitTransform &transform) {
if (disableTransform) {
if (disableBlending && flipVertical == false && flipHorizontal == false) {
tglBlitRLE<disableColoring>(transform._destinationRectangle.left, transform._destinationRectangle.top,
transform._sourceRectangle.left, transform._sourceRectangle.top, transform._sourceRectangle.width() , transform._sourceRectangle.height(),
transform._aTint, transform._rTint, transform._gTint, transform._bTint);
} else {
tglBlitSimple<disableBlending, disableColoring, flipVertical, flipHorizontal>(transform._destinationRectangle.left, transform._destinationRectangle.top,
transform._sourceRectangle.left, transform._sourceRectangle.top, transform._sourceRectangle.width() , transform._sourceRectangle.height(),
transform._aTint, transform._rTint, transform._gTint, transform._bTint);
}
} else {
if (transform._rotation == 0) {
tglBlitScale<disableBlending, disableColoring, flipVertical, flipHorizontal>(transform._destinationRectangle.left, transform._destinationRectangle.top,
transform._destinationRectangle.width(), transform._destinationRectangle.height(), transform._sourceRectangle.left, transform._sourceRectangle.top, transform._sourceRectangle.width() , transform._sourceRectangle.height(), transform._aTint, transform._rTint, transform._gTint, transform._bTint);
} else {
tglBlitRotoScale<disableBlending, disableColoring, flipVertical, flipHorizontal>(transform._destinationRectangle.left, transform._destinationRectangle.top,
transform._destinationRectangle.width(), transform._destinationRectangle.height(), transform._sourceRectangle.left, transform._sourceRectangle.top, transform._sourceRectangle.width() , transform._sourceRectangle.height(), transform._rotation,
transform._originX, transform._originY, transform._aTint, transform._rTint, transform._gTint, transform._bTint);
}
}
}
Common::Array<Line> _lines; Common::Array<Line> _lines;
Graphics::Surface _surface; Graphics::Surface _surface;
}; };
@ -122,49 +192,17 @@ void tglDeleteBlitImage(BlitImage *blitImage) {
} }
} }
FORCEINLINE bool clipBlitImage(BlitImage *blitImage, TinyGL::GLContext *c, int &srcWidth, int &srcHeight, int &width, int &height, int &dstX, int &dstY, int &clampWidth, int &clampHeight) {
if (srcWidth == 0 || srcHeight == 0) {
srcWidth = blitImage->_surface.w;
srcHeight = blitImage->_surface.h;
}
if (width == 0 && height == 0) {
width = srcWidth;
height = srcHeight;
}
if (dstX >= c->fb->xsize|| dstY >= c->fb->ysize)
return false;
if (dstX + width > c->fb->xsize)
clampWidth = c->fb->xsize - dstX;
else
clampWidth = width;
if (dstY + height > c->fb->ysize)
clampHeight = c->fb->ysize - dstY;
else
clampHeight = height;
if (dstX < 0)
dstX = 0;
if (dstY < 0)
dstY = 0;
return true;
}
template <bool disableColoring> template <bool disableColoring>
void tglBlitRLE(BlitImage *blitImage, int dstX, int dstY, int srcX, int srcY, int srcWidth, int srcHeight, float aTint, float rTint, float gTint, float bTint) { void BlitImage::tglBlitRLE(int dstX, int dstY, int srcX, int srcY, int srcWidth, int srcHeight, float aTint, float rTint, float gTint, float bTint) {
TinyGL::GLContext *c = TinyGL::gl_get_context(); TinyGL::GLContext *c = TinyGL::gl_get_context();
int clampWidth, clampHeight; int clampWidth, clampHeight;
int width = srcWidth, height = srcHeight; int width = srcWidth, height = srcHeight;
if (clipBlitImage(blitImage, c, srcWidth, srcHeight, width, height, dstX, dstY, clampWidth, clampHeight) == false) if (clipBlitImage(c, srcWidth, srcHeight, width, height, dstX, dstY, clampWidth, clampHeight) == false)
return; return;
Graphics::PixelBuffer srcBuf(blitImage->_surface.format, (byte *)blitImage->_surface.getPixels()); Graphics::PixelBuffer srcBuf(_surface.format, (byte *)_surface.getPixels());
srcBuf.shiftBy(srcX + (srcY * blitImage->_surface.w)); srcBuf.shiftBy(srcX + (srcY * _surface.w));
Graphics::PixelBuffer dstBuf(c->fb->cmode, c->fb->getPixelBuffer()); Graphics::PixelBuffer dstBuf(c->fb->cmode, c->fb->getPixelBuffer());
dstBuf.shiftBy(dstY * c->fb->xsize + dstX); dstBuf.shiftBy(dstY * c->fb->xsize + dstX);
@ -174,11 +212,11 @@ void tglBlitRLE(BlitImage *blitImage, int dstX, int dstY, int srcX, int srcY, in
int lineIndex = 0; int lineIndex = 0;
int maxY = srcY + clampHeight; int maxY = srcY + clampHeight;
int maxX = srcX + clampWidth; int maxX = srcX + clampWidth;
while (lineIndex < blitImage->_lines.size() && blitImage->_lines[lineIndex]._y < srcY) { while (lineIndex < _lines.size() && _lines[lineIndex]._y < srcY) {
lineIndex++; lineIndex++;
} }
while (lineIndex < blitImage->_lines.size() && blitImage->_lines[lineIndex]._y < maxY) { while (lineIndex < _lines.size() && _lines[lineIndex]._y < maxY) {
const BlitImage::Line &l = blitImage->_lines[lineIndex]; const BlitImage::Line &l = _lines[lineIndex];
if (l._x < maxX && l._x + l._length > srcX) { if (l._x < maxX && l._x + l._length > srcX) {
int length = l._length; int length = l._length;
int skipStart = (l._x < srcX) ? (srcX - l._x) : 0; int skipStart = (l._x < srcX) ? (srcX - l._x) : 0;
@ -202,20 +240,20 @@ void tglBlitRLE(BlitImage *blitImage, int dstX, int dstY, int srcX, int srcY, in
} }
template <bool disableBlending, bool disableColoring, bool flipVertical, bool flipHorizontal> template <bool disableBlending, bool disableColoring, bool flipVertical, bool flipHorizontal>
void tglBlitSimple(BlitImage *blitImage, int dstX, int dstY, int srcX, int srcY, int srcWidth, int srcHeight, float aTint, float rTint, float gTint, float bTint) { void BlitImage::tglBlitSimple(int dstX, int dstY, int srcX, int srcY, int srcWidth, int srcHeight, float aTint, float rTint, float gTint, float bTint) {
TinyGL::GLContext *c = TinyGL::gl_get_context(); TinyGL::GLContext *c = TinyGL::gl_get_context();
int clampWidth, clampHeight; int clampWidth, clampHeight;
int width = srcWidth, height = srcHeight; int width = srcWidth, height = srcHeight;
if (clipBlitImage(blitImage, c, srcWidth, srcHeight, width, height, dstX, dstY, clampWidth, clampHeight) == false) if (clipBlitImage(c, srcWidth, srcHeight, width, height, dstX, dstY, clampWidth, clampHeight) == false)
return; return;
Graphics::PixelBuffer srcBuf(blitImage->_surface.format, (byte *)blitImage->_surface.getPixels()); Graphics::PixelBuffer srcBuf(_surface.format, (byte *)_surface.getPixels());
if (flipVertical) { if (flipVertical) {
srcBuf.shiftBy(srcX + ((srcY + srcHeight - 1) * blitImage->_surface.w)); srcBuf.shiftBy(srcX + ((srcY + srcHeight - 1) * _surface.w));
} else { } else {
srcBuf.shiftBy(srcX + (srcY * blitImage->_surface.w)); srcBuf.shiftBy(srcX + (srcY * _surface.w));
} }
Graphics::PixelBuffer dstBuf(c->fb->cmode, c->fb->getPixelBuffer()); Graphics::PixelBuffer dstBuf(c->fb->cmode, c->fb->getPixelBuffer());
@ -243,24 +281,24 @@ void tglBlitSimple(BlitImage *blitImage, int dstX, int dstY, int srcX, int srcY,
} }
} }
if (flipVertical) { if (flipVertical) {
srcBuf.shiftBy(-blitImage->_surface.w); srcBuf.shiftBy(-_surface.w);
} else { } else {
srcBuf.shiftBy(blitImage->_surface.w); srcBuf.shiftBy(_surface.w);
} }
} }
} }
template <bool disableBlending, bool disableColoring, bool flipVertical, bool flipHorizontal> template <bool disableBlending, bool disableColoring, bool flipVertical, bool flipHorizontal>
void tglBlitScale(BlitImage *blitImage, int dstX, int dstY, int width, int height, int srcX, int srcY, int srcWidth, int srcHeight, void BlitImage::tglBlitScale(int dstX, int dstY, int width, int height, int srcX, int srcY, int srcWidth, int srcHeight,
float aTint, float rTint, float gTint, float bTint) { float aTint, float rTint, float gTint, float bTint) {
TinyGL::GLContext *c = TinyGL::gl_get_context(); TinyGL::GLContext *c = TinyGL::gl_get_context();
int clampWidth, clampHeight; int clampWidth, clampHeight;
if (clipBlitImage(blitImage, c, srcWidth, srcHeight, width, height, dstX, dstY, clampWidth, clampHeight) == false) if (clipBlitImage(c, srcWidth, srcHeight, width, height, dstX, dstY, clampWidth, clampHeight) == false)
return; return;
Graphics::PixelBuffer srcBuf(blitImage->_surface.format, (byte *)blitImage->_surface.getPixels()); Graphics::PixelBuffer srcBuf(_surface.format, (byte *)_surface.getPixels());
srcBuf.shiftBy(srcX + (srcY * blitImage->_surface.w)); srcBuf.shiftBy(srcX + (srcY * _surface.w));
Graphics::PixelBuffer dstBuf(c->fb->cmode, c->fb->getPixelBuffer()); Graphics::PixelBuffer dstBuf(c->fb->cmode, c->fb->getPixelBuffer());
@ -280,7 +318,7 @@ void tglBlitScale(BlitImage *blitImage, int dstX, int dstY, int width, int heigh
xSource = r; xSource = r;
} }
srcBuf.getARGBAt(((ySource * srcHeight) / height) * blitImage->_surface.w + ((xSource * srcWidth) / width), aDst, rDst, gDst, bDst); srcBuf.getARGBAt(((ySource * srcHeight) / height) * _surface.w + ((xSource * srcWidth) / width), aDst, rDst, gDst, bDst);
if (disableColoring) { if (disableColoring) {
if (disableBlending && aDst != 0) { if (disableBlending && aDst != 0) {
@ -300,16 +338,16 @@ void tglBlitScale(BlitImage *blitImage, int dstX, int dstY, int width, int heigh
} }
template <bool disableBlending, bool disableColoring, bool flipVertical, bool flipHorizontal> template <bool disableBlending, bool disableColoring, bool flipVertical, bool flipHorizontal>
void tglBlitRotoScale(BlitImage *blitImage, int dstX, int dstY, int width, int height, int srcX, int srcY, int srcWidth, int srcHeight, int rotation, void BlitImage::tglBlitRotoScale(int dstX, int dstY, int width, int height, int srcX, int srcY, int srcWidth, int srcHeight, int rotation,
int originX, int originY, float aTint, float rTint, float gTint, float bTint) { int originX, int originY, float aTint, float rTint, float gTint, float bTint) {
TinyGL::GLContext *c = TinyGL::gl_get_context(); TinyGL::GLContext *c = TinyGL::gl_get_context();
int clampWidth, clampHeight; int clampWidth, clampHeight;
if (clipBlitImage(blitImage, c, srcWidth, srcHeight, width, height, dstX, dstY, clampWidth, clampHeight) == false) if (clipBlitImage(c, srcWidth, srcHeight, width, height, dstX, dstY, clampWidth, clampHeight) == false)
return; return;
Graphics::PixelBuffer srcBuf(blitImage->_surface.format, (byte *)blitImage->_surface.getPixels()); Graphics::PixelBuffer srcBuf(_surface.format, (byte *)_surface.getPixels());
srcBuf.shiftBy(srcX + (srcY * blitImage->_surface.w)); srcBuf.shiftBy(srcX + (srcY * _surface.w));
Graphics::PixelBuffer dstBuf(c->fb->cmode, c->fb->getPixelBuffer()); Graphics::PixelBuffer dstBuf(c->fb->cmode, c->fb->getPixelBuffer());
@ -361,7 +399,7 @@ void tglBlitRotoScale(BlitImage *blitImage, int dstX, int dstY, int width, int h
dy = sh - dy; dy = sh - dy;
if ((dx >= 0) && (dy >= 0) && (dx < srcWidth) && (dy < srcHeight)) { if ((dx >= 0) && (dy >= 0) && (dx < srcWidth) && (dy < srcHeight)) {
srcBuf.getARGBAt(dy * blitImage->_surface.w + dx, aDst, rDst, gDst, bDst); srcBuf.getARGBAt(dy * _surface.w + dx, aDst, rDst, gDst, bDst);
if (disableColoring) { if (disableColoring) {
if (disableBlending && aDst != 0) { if (disableBlending && aDst != 0) {
dstBuf.setPixelAt((dstX + r) + (dstY + l) * c->fb->xsize, aDst, rDst, gDst, bDst); dstBuf.setPixelAt((dstX + r) + (dstY + l) * c->fb->xsize, aDst, rDst, gDst, bDst);
@ -382,30 +420,9 @@ void tglBlitRotoScale(BlitImage *blitImage, int dstX, int dstY, int width, int h
} }
} }
//Utility function. void tglBlit(BlitImage *blitImage, int x, int y) {
template <bool disableBlending, bool disableColoring, bool disableTransform, bool flipVertical, bool flipHorizontal> BlitTransform transform(x, y);
FORCEINLINE void tglBlitGeneric(BlitImage *blitImage, const BlitTransform &transform) { tglBlit(blitImage, transform);
if (disableTransform) {
if (disableBlending && flipVertical == false && flipHorizontal == false) {
tglBlitRLE<disableColoring>(blitImage, transform._destinationRectangle.left, transform._destinationRectangle.top,
transform._sourceRectangle.left, transform._sourceRectangle.top, transform._sourceRectangle.width() , transform._sourceRectangle.height(),
transform._aTint, transform._rTint, transform._gTint, transform._bTint);
} else {
tglBlitSimple<disableBlending, disableColoring, flipVertical, flipHorizontal>(blitImage, transform._destinationRectangle.left, transform._destinationRectangle.top,
transform._sourceRectangle.left, transform._sourceRectangle.top, transform._sourceRectangle.width() , transform._sourceRectangle.height(),
transform._aTint, transform._rTint, transform._gTint, transform._bTint);
}
} else {
if (transform._rotation == 0) {
tglBlitScale<disableBlending, disableColoring, flipVertical, flipHorizontal>(blitImage, transform._destinationRectangle.left, transform._destinationRectangle.top,
transform._destinationRectangle.width(), transform._destinationRectangle.height(), transform._sourceRectangle.left, transform._sourceRectangle.top, transform._sourceRectangle.width() , transform._sourceRectangle.height(), transform._aTint, transform._rTint, transform._gTint, transform._bTint);
} else
{
tglBlitRotoScale<disableBlending, disableColoring, flipVertical, flipHorizontal>(blitImage, transform._destinationRectangle.left, transform._destinationRectangle.top,
transform._destinationRectangle.width(), transform._destinationRectangle.height(), transform._sourceRectangle.left, transform._sourceRectangle.top, transform._sourceRectangle.width() , transform._sourceRectangle.height(), transform._rotation,
transform._originX, transform._originY, transform._aTint, transform._rTint, transform._gTint, transform._bTint);
}
}
} }
void tglBlit(BlitImage *blitImage, const BlitTransform &transform) { void tglBlit(BlitImage *blitImage, const BlitTransform &transform) {
@ -415,50 +432,50 @@ void tglBlit(BlitImage *blitImage, const BlitTransform &transform) {
bool disableBlend = c->enableBlend == false; bool disableBlend = c->enableBlend == false;
if (transform._flipHorizontally == false && transform._flipVertically == false) { if (transform._flipHorizontally == false && transform._flipVertically == false) {
if (disableColor && disableTransform && disableBlend) { if (disableColor && disableTransform && disableBlend) {
tglBlitGeneric<true, true, true, false, false>(blitImage, transform); blitImage->tglBlitGeneric<true, true, true, false, false>(transform);
} else if (disableColor && disableTransform) { } else if (disableColor && disableTransform) {
tglBlitGeneric<false, true, true, false, false>(blitImage, transform); blitImage->tglBlitGeneric<false, true, true, false, false>(transform);
} else if (disableTransform) { } else if (disableTransform) {
tglBlitGeneric<false, false, true, false, false>(blitImage, transform); blitImage->tglBlitGeneric<false, false, true, false, false>(transform);
} else { } else {
tglBlitGeneric<false, false, false, false, false>(blitImage, transform); blitImage->tglBlitGeneric<false, false, false, false, false>(transform);
} }
} else if (transform._flipHorizontally == false) { } else if (transform._flipHorizontally == false) {
if (disableColor && disableTransform && disableBlend) { if (disableColor && disableTransform && disableBlend) {
tglBlitGeneric<true, true, true, true, false>(blitImage, transform); blitImage->tglBlitGeneric<true, true, true, true, false>(transform);
} else if (disableColor && disableTransform) { } else if (disableColor && disableTransform) {
tglBlitGeneric<false, true, true, true, false>(blitImage, transform); blitImage->tglBlitGeneric<false, true, true, true, false>(transform);
} else if (disableTransform) { } else if (disableTransform) {
tglBlitGeneric<false, false, true, true, false>(blitImage, transform); blitImage->tglBlitGeneric<false, false, true, true, false>(transform);
} else { } else {
tglBlitGeneric<false, false, false, true, false>(blitImage, transform); blitImage->tglBlitGeneric<false, false, false, true, false>(transform);
} }
} else { } else {
if (disableColor && disableTransform && disableBlend) { if (disableColor && disableTransform && disableBlend) {
tglBlitGeneric<true, true, true, false, true>(blitImage, transform); blitImage->tglBlitGeneric<true, true, true, false, true>(transform);
} else if (disableColor && disableTransform) { } else if (disableColor && disableTransform) {
tglBlitGeneric<false, true, true, false, true>(blitImage, transform); blitImage->tglBlitGeneric<false, true, true, false, true>(transform);
} else if (disableTransform) { } else if (disableTransform) {
tglBlitGeneric<false, false, true, false, true>(blitImage, transform); blitImage->tglBlitGeneric<false, false, true, false, true>(transform);
} else { } else {
tglBlitGeneric<false, false, false, false, true>(blitImage, transform); blitImage->tglBlitGeneric<false, false, false, false, true>(transform);
} }
} }
} }
void tglBlitNoBlend(BlitImage *blitImage, const BlitTransform &transform) { void tglBlitNoBlend(BlitImage *blitImage, const BlitTransform &transform) {
if (transform._flipHorizontally == false && transform._flipVertically == false) { if (transform._flipHorizontally == false && transform._flipVertically == false) {
tglBlitGeneric<true, false, false, false, false>(blitImage, transform); blitImage->tglBlitGeneric<true, false, false, false, false>(transform);
} else if(transform._flipHorizontally == false) { } else if(transform._flipHorizontally == false) {
tglBlitGeneric<true, false, false, true, false>(blitImage, transform); blitImage->tglBlitGeneric<true, false, false, true, false>(transform);
} else { } else {
tglBlitGeneric<true, false, false, false, true>(blitImage, transform); blitImage->tglBlitGeneric<true, false, false, false, true>(transform);
} }
} }
void tglBlitFast(BlitImage *blitImage, int x, int y) { void tglBlitFast(BlitImage *blitImage, int x, int y) {
BlitTransform transform(x, y); BlitTransform transform(x, y);
tglBlitGeneric<true, true, true, false, false>(blitImage, transform); blitImage->tglBlitGeneric<true, true, true, false, false>(transform);
} }
Common::Point transformPoint(float x, float y, int rotation) { Common::Point transformPoint(float x, float y, int rotation) {