add blitToBufferRotate to blitbuffer.c

pull/2/merge
Qingping Hou 11 years ago
parent c755309682
commit 78691fd499

@ -30,7 +30,18 @@
#define ASSERT_BLITBUFFER_BOUNDARIES(bb,bb_ptr) {}
#endif // DEBUG
inline int setPixel(BlitBuffer *bb, int x, int y, int c) {
inline int getPixel(BlitBuffer *bb, int x, int y) {
uint8_t *dstptr = (uint8_t*)(bb->data) + (y * bb->pitch) + (x / 2);
ASSERT_BLITBUFFER_BOUNDARIES(bb, dstptr);
if(x % 2 == 0) {
return (*dstptr & 0xF0) >> 4;
} else {
return *dstptr & 0x0F;
}
}
inline void setPixel(BlitBuffer *bb, int x, int y, int c) {
uint8_t *dstptr = (uint8_t*)(bb->data) + (y * bb->pitch) + (x / 2);
ASSERT_BLITBUFFER_BOUNDARIES(bb, dstptr);
@ -41,7 +52,6 @@ inline int setPixel(BlitBuffer *bb, int x, int y, int c) {
*dstptr &= 0xF0;
*dstptr |= c;
}
return 0;
}
/*
@ -252,6 +262,64 @@ static int blitToBuffer(lua_State *L) {
return 0;
}
static int rotate_table[3][2] = {
/* cos, sin */
{0, 1}, /* 90 degree */
{-1, 0}, /* 180 degree */
{0, -1}, /* 270 degree */
};
/** @brief rotate and blit to buffer
*
* Currently, only support rotation of 90, 180, 270 degree.
* */
static int blitToBufferRotate(lua_State *L) {
BlitBuffer *dst = (BlitBuffer*) luaL_checkudata(L, 1, "blitbuffer");
BlitBuffer *src = (BlitBuffer*) luaL_checkudata(L, 2, "blitbuffer");
int degree = luaL_checkint(L, 3);
int i, j, x, y, /* src and dst coordinate */
x_adj = 0, y_adj = 0; /* value for translation after rotatation */
int cosT = rotate_table[degree/90-1][0],
sinT = rotate_table[degree/90-1][1],
u, v;
switch (degree) {
case 180:
y_adj = dst->h;
case 90:
x_adj = dst->w;
break;
case 270:
y_adj = dst->h;
break;
}
u = x_adj;
v = y_adj;
for (j = 0; j < src->h; j++) {
/*
* x = -sinT * j + x_adj;
* y = cosT * j + y_adj;
*/
x = u;
y = v;
for (i = 0; i < src->w; i++) {
/*
* each (i, j) maps to (x, y)
* x = cosT * i - sinT * j + x_adj;
* y = cosT * j + sinT * i + y_adj;
*/
setPixel(dst, x, y, getPixel(src, i, j));
x += cosT;
y += sinT;
}
u -= sinT;
v += cosT;
}
return 0;
}
static int addblitToBuffer(lua_State *L) {
BlitBuffer *dst = (BlitBuffer*) luaL_checkudata(L, 1, "blitbuffer");
BlitBuffer *src = (BlitBuffer*) luaL_checkudata(L, 2, "blitbuffer");
@ -772,6 +840,7 @@ static const struct luaL_Reg blitbuffer_meth[] = {
{"getWidth", getWidth},
{"getHeight", getHeight},
{"blitFrom", blitToBuffer},
{"blitFromRotate", blitToBufferRotate},
{"addblitFrom", addblitToBuffer},
{"blitFullFrom", blitFullToBuffer},
{"paintRect", paintRect},

Loading…
Cancel
Save