summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpixel <pixel>2004-12-12 02:14:37 +0000
committerpixel <pixel>2004-12-12 02:14:37 +0000
commit5ddab7e162f7477089d495eb9a76ff13f4b2b0a4 (patch)
tree8baec23b708a74d8fdf109f4ec1795daf2e90ef6
parent03a381dd18d3b4f80fe422b9e54258af36966660 (diff)
Fixing STR decoding/encoding (yeah!)
-rw-r--r--lib/luapsx.cpp67
-rw-r--r--psxdev/bs.c5
-rw-r--r--psxdev/vlc.c2
3 files changed, 38 insertions, 36 deletions
diff --git a/lib/luapsx.cpp b/lib/luapsx.cpp
index da66ac6..6a784d3 100644
--- a/lib/luapsx.cpp
+++ b/lib/luapsx.cpp
@@ -17,7 +17,7 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
-/* $Id: luapsx.cpp,v 1.7 2004-11-27 21:47:56 pixel Exp $ */
+/* $Id: luapsx.cpp,v 1.8 2004-12-12 02:14:37 pixel Exp $ */
#include <LuaHandle.h>
#include "luapsx.h"
@@ -29,11 +29,11 @@ void over(Byte * d, Byte R, Byte G, Byte B, Byte A) {
d[2] = B;
}
-void alpha(Byte * d, Byte R, Byte G, Byte B, Byte A) {
- A = MIN(A, (Byte) 128);
- d[0] = ((int)d[0] * (128 - A) + R * A) >> 7;
- d[1] = ((int)d[1] * (128 - A) + G * A) >> 7;
- d[2] = ((int)d[2] * (128 - A) + B * A) >> 7;
+void alpha(Byte d[3], Byte R, Byte G, Byte B, Byte A) {
+ A = MIN(A, (Byte) 255);
+ d[0] = MIN(((int)d[0] * (255 - A) + R * A) >> 8, 255);
+ d[1] = MIN(((int)d[1] * (255 - A) + G * A) >> 8, 255);
+ d[2] = MIN(((int)d[2] * (255 - A) + B * A) >> 8, 255);
}
void lighten(Byte * d, Byte R, Byte G, Byte B, Byte A) {
@@ -133,65 +133,67 @@ int sLua_psx::psx_proceed_statics(Lua * L, int n, int caller) {
case PSX_BSDECODE:
r = 1;
{
+ bs_init();
Buffer * b = new Buffer(true);
Handle * f = (Handle *) LuaObject::getme(L, 1);
int width = L->tonumber(2);
int height = L->tonumber(3);
- Byte * in = (Byte *) malloc(f->GetSize() + 10);
+ Byte * in = (Byte *) malloc(f->GetSize() + 16);
Byte * out = (Byte *) malloc(width * height * 3);
LuaBuffer lb(b);
lb.pushdestruct(L);
f->read(in, f->GetSize());
bs_decode_rgb24(out, (bs_header_t *) in, width, height, 0);
- for (int i = 0; i < width * height * 3; i++) {
- b[i] = out[i];
- }
+ b->write(out, width * height * 3);
free(out);
free(in);
}
+ break;
case PSX_BSENCODE:
r = 3;
{
- unsigned short out[0x80000];
+ static unsigned short out[0x80000];
+ int width, height;
Buffer * b = new Buffer(true);
LuaBuffer lb(b);
lb.pushdestruct(L);
Handle * f = (Handle *) LuaObject::getme(L, 1);
bs_input_image_t img;
- img.width = L->tonumber(2);
- img.height = L->tonumber(3);
+ width = L->tonumber(2);
+ height = L->tonumber(3);
int max_size = 14112, cur_size;
int q_scale = 1;
if (n >= 4)
max_size = L->tonumber(4);
if (n >= 5)
q_scale = L->tonumber(5);
- img.lpbits = (Byte *) malloc(f->GetSize());
- img.top = img.lpbits;
- img.nextline = img.width * 3;
- img.bit = 24;
+ Byte * in = (Byte *) malloc(f->GetSize());
- f->read(img.lpbits, f->GetSize());
-
- bs_init();
+ f->read(in, f->GetSize());
- cur_size = max_size + 1;
+ bs_init();
for (cur_size = max_size + 1; max_size < cur_size; q_scale++) {
+ img.width = width;
+ img.height = height;
+ img.lpbits = in;
+ img.top = img.lpbits;
+ img.nextline = img.width * 3;
+ img.bit = 24;
cur_size = bs_encode((bs_header_t *) out, &img, 2, q_scale, 0);
}
-
- for (int i = 0; i < cur_size; i++) {
- b[i] = out[i];
- }
+ q_scale--;
+
+ b->write(out, cur_size);
L->push((lua_Number) cur_size);
L->push((lua_Number) q_scale);
}
+ break;
case PSX_BLIT:
r = 0;
{
- Handle * d = (Handle *) LuaObject::getme(L, 1);
+ Buffer * d = (Buffer *) LuaObject::getme(L, 1);
Handle * s = (Handle *) LuaObject::getme(L, 2);
int dw = L->tonumber(3),
dh = L->tonumber(4),
@@ -201,7 +203,7 @@ int sLua_psx::psx_proceed_statics(Lua * L, int n, int caller) {
sy = L->tonumber(8),
bl = L->tonumber(9);
int bytes, dstart = 0, dskip = 0, sstart = 0, sskip = 0, i, j;
- Byte RGB[3], R, G, B, A = 128;
+ Byte RGB[3], R, G, B, A = 255;
void (*op_func)(Byte *, Byte, Byte, Byte, Byte);
switch(bl) {
@@ -281,26 +283,25 @@ int sLua_psx::psx_proceed_statics(Lua * L, int n, int caller) {
dskip = (dw - sw) * 3;
d->seek(dstart);
+ d->wseek(dstart);
s->seek(sstart);
- for (i = 0; i < sh; i++, s->seek(sskip, SEEK_CUR), d->seek(dskip, SEEK_CUR)) {
+ for (i = 0; i < sh; i++, s->seek(sskip, SEEK_CUR), d->seek(dskip, SEEK_CUR), d->wseek(dskip, SEEK_CUR)) {
for (j = 0; j < sw; j++) {
RGB[0] = d->readU8();
RGB[1] = d->readU8();
RGB[2] = d->readU8();
- d->seek(-3, SEEK_CUR);
R = s->readU8();
G = s->readU8();
B = s->readU8();
if (bytes == 4)
A = s->readU8();
op_func(RGB, R, G, B, A);
- d->writeU8(R);
- d->writeU8(G);
- d->writeU8(B);
+ d->writeU8(RGB[0]);
+ d->writeU8(RGB[1]);
+ d->writeU8(RGB[2]);
}
}
-
}
}
return r;
diff --git a/psxdev/bs.c b/psxdev/bs.c
index a79a877..41c2a8c 100644
--- a/psxdev/bs.c
+++ b/psxdev/bs.c
@@ -152,6 +152,7 @@ static void encode_init (bs_context_t *ctxt, void *outbuf, int type, int q_scale
static void encode_finish (bs_context_t *ctxt)
{
+ putbits(ctxt, 32704, 16);
putbits_flush(ctxt);
ctxt->bsbuf[0] = (((ctxt->rlsize+1)/2)+31)&~31;
}
@@ -277,7 +278,7 @@ void bs_init (void)
}
int bs_encode (bs_header_t *outbuf,bs_input_image_t *img,int type,int q_scale,
- const unsigned char *myiqtab)
+ const unsigned char *myiqtab)
{
unsigned char image[16][16][3];
BLOCK blk[6][DCTSIZE2];
@@ -340,7 +341,7 @@ int bs_encode (bs_header_t *outbuf,bs_input_image_t *img,int type,int q_scale,
}
}
- encode_finish(ctxt);
+ encode_finish(ctxt);
rl = (ctxt->bs_size * 2);
free (ctxt);
diff --git a/psxdev/vlc.c b/psxdev/vlc.c
index 4ff3d06..34288c2 100644
--- a/psxdev/vlc.c
+++ b/psxdev/vlc.c
@@ -428,7 +428,7 @@ static void yuv2rgb15(BLOCK *blk,Uint16 *image)
}
}
-enum {R, G, B};
+enum {B, G, R};
static void yuv2rgb24(BLOCK *blk,Uint8 image[][3])
{