Optimize low color packed sprites

git-svn-id: svn://svn.cc65.org/cc65/trunk@5951 b7a2c559-68d2-44c3-8de9-860c34a00d81
This commit is contained in:
karri
2012-12-17 17:48:56 +00:00
parent 4697cf255f
commit 2f860697b8

View File

@@ -189,7 +189,7 @@ static void AssembleByte(unsigned bits, char val)
} while (--bits); } while (--bits);
} }
static unsigned char ChoosePackagingMode(signed len, signed index, char LineBuffer[512]) static unsigned char ChoosePackagingMode(signed len, signed index, char ColorBits, char LineBuffer[512])
{ {
--len; --len;
if (!len) { if (!len) {
@@ -198,6 +198,18 @@ static unsigned char ChoosePackagingMode(signed len, signed index, char LineBuff
if (LineBuffer[index] != LineBuffer[index + 1]) { if (LineBuffer[index] != LineBuffer[index + 1]) {
return 0; return 0;
} }
if (ColorBits > 2) {
return 1;
}
if (LineBuffer[index] != LineBuffer[index + 2]) {
return 0;
}
if (ColorBits > 1) {
return 1;
}
if (LineBuffer[index] != LineBuffer[index + 3]) {
return 0;
}
return 1; return 1;
} }
@@ -260,7 +272,7 @@ static void encodeSprite(StrBuf *D, enum Mode M, char ColorBits, char ColorMask,
case smPacked: case smPacked:
i = 0; i = 0;
while (len) { while (len) {
if (ChoosePackagingMode(len, i, LineBuffer)) { if (ChoosePackagingMode(len, i, ColorBits, LineBuffer)) {
/* Make runlength packet */ /* Make runlength packet */
V = LineBuffer[i]; V = LineBuffer[i];
++i; ++i;
@@ -282,7 +294,7 @@ static void encodeSprite(StrBuf *D, enum Mode M, char ColorBits, char ColorMask,
*d_ptr++ = V; *d_ptr++ = V;
--len; --len;
count = 0; count = 0;
while (ChoosePackagingMode(len, i, LineBuffer) == 0 && len && count != 15) { while (ChoosePackagingMode(len, i, ColorBits, LineBuffer) == 0 && len && count != 15) {
V = LineBuffer[i++]; V = LineBuffer[i++];
*d_ptr++ = V; *d_ptr++ = V;
++count; ++count;
@@ -309,7 +321,7 @@ static void encodeSprite(StrBuf *D, enum Mode M, char ColorBits, char ColorMask,
} }
i = 0; i = 0;
while (len) { while (len) {
if (ChoosePackagingMode(len, i, LineBuffer)) { if (ChoosePackagingMode(len, i, ColorBits, LineBuffer)) {
/* Make runlength packet */ /* Make runlength packet */
V = LineBuffer[i]; V = LineBuffer[i];
++i; ++i;
@@ -331,7 +343,7 @@ static void encodeSprite(StrBuf *D, enum Mode M, char ColorBits, char ColorMask,
*d_ptr++ = V; *d_ptr++ = V;
--len; --len;
count = 0; count = 0;
while (ChoosePackagingMode(len, i, LineBuffer) == 0 && len && count != 15) { while (ChoosePackagingMode(len, i, ColorBits, LineBuffer) == 0 && len && count != 15) {
V = LineBuffer[i++]; V = LineBuffer[i++];
*d_ptr++ = V; *d_ptr++ = V;
++count; ++count;