From f03d5c54d8479adbaa9cb9e14ad2a4c58d0bd2bd Mon Sep 17 00:00:00 2001 From: karri Date: Mon, 12 Nov 2012 19:26:11 +0000 Subject: [PATCH] Add shaped mode git-svn-id: svn://svn.cc65.org/cc65/trunk@5931 b7a2c559-68d2-44c3-8de9-860c34a00d81 --- src/sp65/lynxsprite.c | 51 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 49 insertions(+), 2 deletions(-) diff --git a/src/sp65/lynxsprite.c b/src/sp65/lynxsprite.c index abc83006f..b8c2a8721 100644 --- a/src/sp65/lynxsprite.c +++ b/src/sp65/lynxsprite.c @@ -133,12 +133,12 @@ static void AssembleByte(unsigned bits, char val) byte <<= bit_counter; OutBuffer[OutIndex++] = byte; if (!OutIndex) { - Error ("Sprite is too large for the Lynx"); + Error ("ASprite is too large for the Lynx"); } if (byte & 0x1) { OutBuffer[OutIndex++] = byte; if (!OutIndex) { - Error ("Sprite is too large for the Lynx"); + Error ("BSprite is too large for the Lynx"); } } } @@ -325,6 +325,53 @@ static void encodeSprite(StrBuf *D, enum Mode M, char ColorBits, char ColorMask, break; case smShaped: + if (LastOpaquePixel >= 0 && LastOpaquePixel < len) { + len = LastOpaquePixel; + } + AssembleByte(0, 0); + i = 0; + while (len) { + if (ChoosePackagingMode(len, i, LineBuffer)) { + /* Make runlength packet */ + V = LineBuffer[i]; + ++i; + --len; + count = 0; + do { + ++count; + ++i; + --len; + } while (V == LineBuffer[i] && len && count != 15); + + AssembleByte(5, count); + AssembleByte(ColorBits, V); + + } else { + /* Make packed literal packet */ + d_ptr = differ; + V = LineBuffer[i++]; + *d_ptr++ = V; + --len; + count = 0; + while (ChoosePackagingMode(len, i, LineBuffer) == 0 && len && count != 15) { + V = LineBuffer[i++]; + *d_ptr++ = V; + ++count; + --len; + } + + AssembleByte(5, count | 0x10); + d_ptr = differ; + do { + AssembleByte(ColorBits, *d_ptr++); + } while (--count >= 0); + + } + } + AssembleByte(5, 0); + AssembleByte(8, 0); + /* Write the buffer to file */ + WriteOutBuffer(D); break; } } -- 2.39.5