#!/usr/local/bin/python

# $Id: NokiaImagePlugin.py.html,v 1.4 2006/09/19 09:42:30 john Exp $
#
# JW

import Image, ImageFile, ImagePalette, struct

class NokiaOTAImageFile(ImageFile.ImageFile):

   format = 'Nokia OTA'
   format_description = 'Nokia OTA Bitmap "Operator Logo"'

   def _open(self):
      icons, width, height, bpp = struct.unpack('BBBB', self.fp.read(4))

      self.mode = '1'
      self.size = ( width, height )
      self.tile = [ ( "raw", ( 0, 0, width, height ), 4, ( self.mode, 0, 1 ) ) ]

      self.info['icons'] = icons

class NokiaGMSImageFile(ImageFile.ImageFile):

   format = 'Nokia GMS'
   format_description = 'Nokia GMS Bitmap "Picture Message"'

   def _open(self):
      self.fp.seek(3)
      msglen = ord(self.fp.read(1))
      self.info['message'] = self.fp.read(msglen)
      self.fp.seek(3, 1)

      icons, width, height, bpp = struct.unpack('BBBB', self.fp.read(4))

      self.mode = '1'
      self.size = ( width, height )
      self.tile = [ ( "raw", ( 0, 0, width, height ), self.fp.tell(), ( self.mode, 0, 1 ) ) ]

      self.info['icons'] = icons

def _save(im, fp, filename):
   if im.mode != '1':
      raise StandardError("Image must be in 1-bpp mode")

   if im.encoderinfo.has_key("message"):
      message = im.encoderinfo["message"]
   else:
      message = ""

   # If a message exists then we write a GMS, otherwise an OTB.
   if message:
      fp.write(struct.pack("BBBB", 0x30, 0, 0, len(message)))
      fp.write(message)
      fp.write(struct.pack("BBB", 2, 1, 0))

   fp.write(struct.pack("BBBB", 0, im.size[0], im.size[1], 1))

   ImageFile._save(im, fp, [ ( "raw", ( 0, 0 ) + im.size, 0, "1" ) ])

   try:
      fp.flush()
   except:
      pass

Image.register_open("Nokia OTA", NokiaOTAImageFile)
Image.register_extension("Nokia OTA", ".otb")
Image.register_open("Nokia GMS", NokiaGMSImageFile)
Image.register_extension("Nokia GMS", ".gms")
Image.register_save("Nokia OTA", _save)
Image.register_save("Nokia GMS", _save)