#!/usr/bin/python3 # -*- coding: utf-8 -*- """ Doc... """ import argparse import sys from PyQt4 import QtGui from PIL import Image, ImageDraw def main(): parser = argparse.ArgumentParser(description='coetool: convert from .coe file (VGA mem) to image file and vice versa', epilog='Example: coetool --convert rom_vga.coe outimage.jpg') parser.add_argument('-c', '--convert', metavar='FILE', nargs=2, help='convert from IN_FILE to OUT_FILE (supported output formats: bmp, jpg, png, pdf and coe )' ) args = parser.parse_args() if args.convert: convert(args.convert[0], args.convert[1]) else: run_gui() def run_gui(): print('run gui') app = QtGui.QApplication(sys.argv) w = QtGui.QWidget() w.resize(250, 150) w.move(300, 300) w.setWindowTitle('Simple') w.show() sys.exit(app.exec_()) def convert(in_file, out_file): in_file_ext = in_file.rsplit('.',maxsplit=1)[1].lower() out_file_ext = out_file.rsplit('.',maxsplit=1)[1].lower() conversion = CoeConverter(in_file, out_file) if in_file_ext != 'coe' and out_file_ext != 'coe' : print('No .coe file') elif in_file_ext == 'coe': if out_file_ext == 'bmp': conversion.doBMP() elif out_file_ext == 'jpg': conversion.doJPG() elif out_file_ext == 'png': conversion.doPNG() elif out_file_ext == 'pdf': conversion.doPDF() else: print('img extension unknown') else: if in_file_ext not in ['bmp', 'jpg', 'png']: print('img format not supported') else: conversion.createCOE() class CoeConverter: def __init__(self, in_file, out_file): self.in_file = in_file self.out_file = out_file self.in_file_ext = in_file.rsplit('.',maxsplit=1)[1].lower() self.out_file_ext = out_file.rsplit('.',maxsplit=1)[1].lower() self.rgb332_palette=[] #RGB palette generation: Red(3bits) Green(3bits) Blue(2bits)/1pixel = 256 colors (as used in .coe VGA mem files) for i in range(256): self.rgb332_palette.append(int(((i & 224) >> 5)*(255/7))) # & 224 means a bit mask for the MSB and >> 5 is a bitwise to strip LSB bits self.rgb332_palette.append(int(((i & 28) >> 2)*(255/7))) self.rgb332_palette.append(int((i & 3)*(255/3))) self.img_data() def img_data(self): def coe_parse(key_name, key_end_char, separator): with open(self.in_file, encoding='utf-8', mode='r') as coefile: coefile_data = coefile.read() key=key_name key_offset=coefile_data.find(key) key_end=coefile_data.find(key_end_char,key_offset) #find end char starting from key place key_value=coefile_data[key_offset:key_end].split(separator)[1] #value is 2nd element in the split return key_value if self.in_file_ext == 'coe': self.imgbytes = bytes.fromhex(coe_parse('memory_initialization_vector=', ';', '=').replace(',', '').replace('\n','')) self.height=int(coe_parse('Height:',',',' ')) self.width=int(coe_parse('Width:','\n',' ')) #end char = new line! self.img = Image.frombytes('P', (self.height, self.width), self.imgbytes) self.img.putpalette(self.rgb332_palette) else: img = Image.open(self.in_file) self.height = str(img.size[1]) self.width = str(img.size[0]) self.imgbytes =[format(i, '02x').upper() for i in list(img.getdata())] def createCOE(self): with open(self.out_file, encoding='utf-8', mode='wt') as out_coe_file: out_coe_file.write('; VGA Memory Map\n; .COE file with hex coefficients\n; Height: '+self.height+', Width: '+self.width+'\n\nmemory_initialization_radix=16;\n') out_coe_file.write('memory_initialization_vector=\n') for i,b in enumerate(self.imgbytes): if i > 0 and i % 32 == 0: out_coe_file.write('\n') if i == len(self.imgbytes)-1: out_coe_file.write(b) else: out_coe_file.write(b+',') out_coe_file.write(';') print('file ' + self.out_file + ' written to disk') def doBMP(self): self.img.save(self.out_file, 'BMP') print('file ' + self.out_file + ' written to disk') self.img.show() def doJPG(self): self.img.convert('RGB').save(self.out_file, 'JPEG') print('file ' + self.out_file + ' written to disk') self.img.show() def doPNG(self): self.img.save(self.out_file, 'PNG') print('file ' + self.out_file + ' written to disk') self.img.show() def doPDF(self): self.img.convert('RGB').save(self.out_file, 'PDF') print('file ' + self.out_file + ' written to disk') self.img.show() if __name__ == '__main__': main()