#!/usr/bin/env python
# -*- coding: utf-8 -*-
""""""

import sys, os
import Numeric
import Image, ImageDraw, ImageFont

class prepareImg:
	"""Подготавливает изображение"""
	def __init__(self, imgfile):
		self.img = Image.open(imgfile).convert('1')

	def get_bitmap(self):
		w,h = self.img.size
		tlist = []
		for y in range(h):
			for x in range(w):
				tlist.append( not bool( self.img.getpixel((x,y)) ) )
		return ((w,h), Numeric.array(tlist))

	def _bytelen(self, bits):
		bits += bits%8
		if bits%8:
			bits = self._bytelen(bits)
		return bits

	def _list_to_byte(self, tlist):
		ret = 0
		for i in range(len(tlist)):
			ret |= tlist[i] and (1<<i)
		return ret

	def get_bytemap(self):
		(w,h), aim = self.get_bitmap()
		aim.shape = (h,w)
		hb = self._bytelen(h)>>3
		aim.resize((self._bytelen(h),w))
		tlist = []
		for y in range(hb):
			for x in range(w):
				tlist.append( self._list_to_byte( aim[(0+8*y):(8+8*y),x].tolist() ) )
		return ((w,hb), Numeric.array(tlist))



class genCode:
	"""Генератор кода"""
	def __init__(self, imgfile, outfile=False, comment_mode=True):
		"""
		imgfile - string, путь до файла изображения
		outfile - string/file, файл в который направляется вывод.
		comment_mode - bool, вариант комментариев: подробные(умолч.)/краткие(False)
		"""
		self.pim = prepareImg(imgfile)
		self.imgname = os.path.basename(imgfile)
		self.commode = comment_mode
		self.stdout = False
		if outfile:
			if not 'write' in dir(outfile):
				self.out = open(outfile, 'w')
			else:
				self.out = outfile
		else:
			self.out = sys.stdout
			self.stdout = True

	def __del__(self):
		if not self.stdout:
			self.out.close()

	def comment(self):
		"""Генерирует комментарий (ASCII art)"""
		(w,h), aim = self.pim.get_bitmap()
		aim.shape = (h,w)
		self.out.write(u"/* image name: %s\n" % (self.imgname))
		self.out.write(u" * image size: %dx%d\n" % (w,h))
		if self.commode:
			for line in aim.tolist():
				self.out.write(u" * ")
				for point in line:
					if point:
						self.out.write(u"#")
					else:
						self.out.write(u".")
				self.out.write(u"\n")
		self.out.write(u" */\n")

	def data(self):
		(w,h), bim = self.pim.get_bytemap()
		tlist = bim.tolist()
		self.out.write( u"/* byte length: %d */\n" % (w*h) )
		sep = u", "
		for i in range(len(tlist)):
			if not (i+1)%10:
				nl = u"\n"
			else:
				nl = u""
			if i == len(tlist)-1:
				nl = u"\n"
				sep = u""
			self.out.write( "0x%02X%s%s" % (tlist[i], sep, nl) )

	def c_type(self, arr_suffix=u"__data", arr_type=u"uint8_t PROGMEM", bmp_inc=u"lcd/bmp.h"):
		imgname = self.imgname.replace('.', '_')
		(w,h), aim = self.pim.get_bitmap()
		del(aim)
		if '0' <= imgname[0] <= '9':
			imgname = 'i'+imgname
		self.out.write( u"#include \"%s\"\n\n" % bmp_inc )
		self.comment()
		self.out.write( u"\n%s %s%s[]={\n" % (arr_type, imgname, arr_suffix) )
		self.data()
		self.out.write( u"};\n" )
		self.out.write( u"bitmap_pt %s = {%d, %d, %s%s};\n" % (imgname, w, h, imgname, arr_suffix) )
		self.out.write( u"// extern bitmap_pt %s;\n" % imgname )


if __name__ == "__main__":
	pass