From 386b338c233ba090c936e62c7f6f1765bfc58371 Mon Sep 17 00:00:00 2001 From: Quinn Dunki Date: Sun, 25 Dec 2016 13:43:14 -0700 Subject: [PATCH] Code cleanup - Also fixed a bug with high bit determination --- HiSprite.py | 127 +++++++++++++++++++++++++++++++++++---------------- V2Make.scpt | Bin 3362 -> 3362 bytes boxw_mix.png | Bin 242 -> 247 bytes hisprite.dsk | Bin 143360 -> 143360 bytes 4 files changed, 87 insertions(+), 40 deletions(-) diff --git a/HiSprite.py b/HiSprite.py index 7376bfa..12f13c1 100755 --- a/HiSprite.py +++ b/HiSprite.py @@ -3,14 +3,14 @@ import sys,os,png class Colors: - black,magenta,green,orange,blue,white = range(6) + black,magenta,green,orange,blue,white,key = range(7) def main(argv): if len(argv)<1: - printHorzontalLookup() + printHorizontalLookup() exit(0) pngfile = sys.argv[1] @@ -23,7 +23,7 @@ def main(argv): width = pngdata[0] height = pngdata[1] - pixeldata = pngdata[2] + pixelData = pngdata[2] byteWidth = width/2+1+1 # TODO: Calculate a power of two for this niceName = os.path.splitext(pngfile)[0].upper() @@ -49,43 +49,37 @@ def main(argv): print "\tldx PARAM1" print rowStartCalculatorCode(); - spriteChunks = layoutSpriteChunk(pixeldata,width,height,shift) + spriteChunks = layoutSpriteChunk(pixelData,width,height,shift) for row in range(height): for chunkIndex in range(len(spriteChunks)): print spriteChunks[chunkIndex][row] print "\n" - - - -def layoutSpriteChunk(pixeldata,width,height,shift): - bitmap = [[0 for x in range(width)] for y in range(height)] - - byteWidth = width/2+1+1 # TODO: Calculate a power of two for this - spriteChunks = [["" for y in range(height)] for x in range(byteWidth)] +def layoutSpriteChunk(pixelData,width,height,shift): + + colorStreams = byteStreamsFromPixels(pixelData,width,height,shift,bitsForColor,highBitForColor) + maskStreams = byteStreamsFromPixels(pixelData,width,height,shift,bitsForMask,highBitForMask) + code = generateBlitter(colorStreams,maskStreams,height) + + return code + + +def byteStreamsFromPixels(pixelData,width,height,shift,bitDelegate,highBitDelegate): + + byteStreams = ["" for x in range(height)] + byteWidth = width/2+1+1 - # Layout rows for row in range(height): - pixelRow = bitmap[row] bitStream = "" # Compute raw bitstream for row from PNG pixels for pixelIndex in range(width): - pixel = pixelColor(pixeldata,row,pixelIndex) - if pixel == Colors.black: - bitStream += "00" - else: - if pixel == Colors.white: - bitStream += "11" - else: - if pixel == Colors.green or pixel == Colors.orange: - bitStream += "01" - else: - bitStream += "10" - + pixel = pixelColor(pixelData,row,pixelIndex) + bitStream += bitDelegate(pixel) + # Shift bit stream as needed bitStream = shiftStringRight(bitStream,shift) bitStream = bitStream[:byteWidth*8] @@ -107,17 +101,28 @@ def layoutSpriteChunk(pixeldata,width,height,shift): bitChunk += fillOutByte(7-remainingBits) else: bitChunk = bitStream[bitPos:bitPos+7] - + bitChunk = bitChunk[::-1] - # Set palette bit as needed. Note that we prefer high-bit white - # because blue fringe is less noticeable than magenta - highBit = "0" - if pixel == Colors.orange or pixel == Colors.blue or pixel == Colors.white: - highBit = "1" - + # Determine palette bit from first pixel on each row + highBit = highBitDelegate(pixelData[row][0]) + byteSplits[byteIndex] = highBit + bitChunk bitPos += 7 + + byteStreams[row] = byteSplits; + + return byteStreams + + +def generateBlitter(colorStreams,maskStreams,height): + + byteWidth = len(colorStreams[0]) + spriteChunks = [["" for y in range(height)] for x in range(byteWidth)] + + for row in range(height): + + byteSplits = colorStreams[row] # Generate blitting code for chunkIndex in range(len(byteSplits)): @@ -152,7 +157,8 @@ def rowStartCalculatorCode(): "\tldy PARAM0\n" + \ "\tlda DIV7_2,y\n" + \ "\ttay\n"; - + + def fillOutByte(numBits): filler = "" for bit in range(numBits): @@ -174,11 +180,49 @@ def shiftStringRight(string,shift): result += string return result - -def pixelColor(pixeldata,row,col): - r = pixeldata[row][col*3] - g = pixeldata[row][col*3+1] - b = pixeldata[row][col*3+2] + +def bitsForColor(pixel): + + if pixel == Colors.black: + return "00" + else: + if pixel == Colors.white: + return "11" + else: + if pixel == Colors.green or pixel == Colors.orange: + return "01" + + # blue or magenta + return "10" + + +def bitsForMask(pixel): + + if pixel == Colors.black: + return "00" + + return "11" + + +def highBitForColor(pixel): + + # Note that we prefer high-bit white because blue fringe is less noticeable than magenta. + highBit = "0" + if pixel == Colors.orange or pixel == Colors.blue or pixel == Colors.white: + highBit = "1" + + return highBit + + +def highBitForMask(pixel): + + return "1" + + +def pixelColor(pixelData,row,col): + r = pixelData[row][col*3] + g = pixelData[row][col*3+1] + b = pixelData[row][col*3+2] color = Colors.black if r==255 and g==0 and b==255: @@ -195,10 +239,13 @@ def pixelColor(pixeldata,row,col): else: if r==255 and g==255 and b==255: color = Colors.white + else: + if r==g and r==b and r!=0 and r!=255: # Any gray is chroma key + color = Colors.key return color -def printHorzontalLookup(): +def printHorizontalLookup(): disclaimer() print "DIV7_2:" diff --git a/V2Make.scpt b/V2Make.scpt index 403811f78b690bd9aaab5af0178675c5c9124eef..bffa4adf78ef875972c66266de16c545cbfd90f1 100644 GIT binary patch delta 22 ecmZ1^wMc4%1}D>7_Q_hDeoXtmZ?588!3+RdYzO=R delta 22 ecmZ1^wMc4%1}D?K?~}DS{g^g9-(1DHf*Am02nfFb diff --git a/boxw_mix.png b/boxw_mix.png index 6f186fb91ba91731d1580326dfec31dd0a81c4f5..396d56619cb28f26a17c305af709314c4c894eae 100644 GIT binary patch delta 130 zcmV-|0Db@R0rvrrR0kFx6s0*)L6KW5a9c@4K~xCWWsbWIfG`Y1pCd-1XNOFa5i$)s zxQ(-uDJ}v8rz@=U?^z57_VWO&lZ{y&C`zpZWW)LzB8HQE9K#EM{S2Efd^FY2gSVnm k?u~3uv8ZNs@hBDU1)O*%+1{4$AOHXW07*qoM6N<$g7n-p_y7O^ delta 125 zcmV-@0D}Mb0rCNmR0jbFDdD>;Gm%>?YgS1_K~xCWWsboKz%UF0uOTD#-yJfIN9bDm z+S$o{B&3iCp@$BE2v@k$NCReui_wniXE|W9Ib4vO3RjKLZO;ZeRN#7#MWd`I+pz-l frnI?Bqc;H`mWDNDcqU<;00000NkvXXu0mjf{a7@I diff --git a/hisprite.dsk b/hisprite.dsk index 567e0775e3f63b7b17346515c1fa0470d2edcc22..3d22c89fd2127d7a7c9c786e2d45d9c7d76cf748 100644 GIT binary patch delta 36 qcmZp8z|ru4W5Yyl-kFN(ybKJF84^H@=6T%h^SBwe&*NrFQUL(yYYUD5 delta 36 qcmZp8z|ru4W5Yyl-f4=`d<+ba84^H@=6T%h^SBwe&*NrFQUL(wI}36E