diff options
-rw-r--r-- | src/tileset.py | 46 |
1 files changed, 32 insertions, 14 deletions
diff --git a/src/tileset.py b/src/tileset.py index 2528d8a..ab77223 100644 --- a/src/tileset.py +++ b/src/tileset.py @@ -425,29 +425,47 @@ class KPTileset(object): @staticmethod def RGB4A3Decode(tex): + import time + b = time.clock() + + out = bytearray(1024*512*4) dest = QtGui.QImage(1024,512,QtGui.QImage.Format_ARGB32) dest.fill(Qt.transparent) + # Some fairly ugly code, in an attempt to make it run faster + dest_setPixel = dest.setPixel + _xrange = xrange + + tex = bytearray(tex) + i = 0 - for ytile in xrange(0, 512, 4): - for xtile in xrange(0, 1024, 4): - for ypixel in xrange(ytile, ytile + 4): - for xpixel in xrange(xtile, xtile + 4): - if(xpixel >= 1024 or ypixel >= 512): - continue + xtile_range = _xrange(0, 1024, 4) + ytile_range = _xrange(0, 512, 4) + + for ytile in ytile_range: + ypixel_range = _xrange(ytile, ytile + 4) - newpixel = struct.unpack_from('>H', tex, i)[0] - # newpixel = (int(tex[i]) << 8) | int(tex[i+1]) + for xtile in xtile_range: + xpixel_range = _xrange(xtile, xtile + 4) - alpha = ((newpixel & 0x7000) >> 12) * 255 / 0x7 - red = ((newpixel & 0xF00) >> 8) * 255 / 0xF - green = ((newpixel & 0xF0) >> 4) * 255 / 0xF - blue = (newpixel & 0xF) * 255 / 0xF + for ypixel in ypixel_range: + for xpixel in xpixel_range: - argb = (blue) | (green << 8) | (red << 16) | (alpha << 24) - dest.setPixel(xpixel, ypixel, argb) + bit1 = tex[i] + bit2 = tex[i+1] + + dest_setPixel(xpixel, ypixel, + ((((bit1 & 0x70) >> 4) * 255 / 7) << 24) | + (((bit1 & 0xF) * 255 / 15) << 16) | + ((((bit2 & 0xF0) >> 4) * 255 / 15) << 8) | + ((bit2 & 0xF) * 255 / 15) + ) i += 2 + + e = time.clock() + print(e - b) + return dest |