class Image(object): _twips = sysinfo.display_twips() _pixels = sysinfo.display_pixels() _default_density = (float(_twips[0]) / _pixels[0], float(_twips[1]) / _pixels[1]) _modemap = { '1': _graphics.EGray2, 'L': _graphics.EGray256, 'RGB12': _graphics.EColor4K, 'RGB16': _graphics.EColor64K, 'RGB': _graphics.EColor16M } _moderevmap = _revdict(_modemap) def __init__(self, img): self._image = img if img.twipsize == (0, 0): img.twipsize = (self._default_density[0] * img.size[0], self._default_density[1] * img.size[1]) self._drawapi = self._image._drawapi self._draw = _graphics.Draw(self._image) self._bitmapapi = self._image._bitmapapi self.getpixel = self._image.getpixel self._lock = None self._errcode = 0 self._waiting = 0 self._resized_image = None for k in _graphics._draw_methods: setattr(self, k, getattr(self._draw, k)) size = property(lambda self: self._image.size) mode = property(lambda self: self._moderevmap[self._image.mode]) twipsize = property( lambda self: self._image.twipsize, lambda self, value: setattr(self._image, "twipsize", value)) def from_cfbsbitmap(bitmap): return Image(_graphics.ImageFromCFbsBitmap(bitmap)) from_cfbsbitmap = staticmethod(from_cfbsbitmap) def from_buffer(buffer, mime="image/jpeg", ignore_errors=True): def finish_load(errcode): img._errcode = errcode lock.signal() lock = e32.Ao_lock() img = Image(_graphics.ImageFromBuffer(buffer, mime, finish_load)) lock.wait() if not ignore_errors and img._errcode != 0: raise SymbianError, (img._errcode, "Error loading image:" + e32.strerror(img._errcode)) return img from_buffer = staticmethod(from_buffer) def from_icon(filename, image_id, size): if e32.s60_version_info >= (3, 0): return Image( _graphics.ImageFromIcon(filename, image_id, size[0], size[1])) else: raise RuntimeError('not supported') from_icon = staticmethod(from_icon) def new(size, mode='RGB16'): if not Image._modemap.has_key(mode): raise ValueError('invalid mode') return Image(_graphics.ImageNew(size, Image._modemap[mode])) new = staticmethod(new) if not SDK12: def open(filename): def finish_load(errcode): img._errcode = errcode lock.signal() lock = e32.Ao_lock() img = Image(_graphics.ImageOpen(unicode(filename), finish_load)) lock.wait() if img._errcode != 0: raise SymbianError, (img._errcode, "Error loading image:" + e32.strerror(img._errcode)) return img open = staticmethod(open) def inspect(filename): (size, mode) = _graphics.ImageInspect(unicode(filename)) return {'size': size} inspect = staticmethod(inspect) def load(self, filename, callback=None): self._wait() self._filename = unicode(filename) self._usercallback = callback self._lock = e32.Ao_lock() self._image.load(self._filename, self._callback) if callback is None: self._wait() if self._errcode != 0: err = self._errcode self._errcode = 0 raise SymbianError, (err, "Error loading image:" + e32.strerror(err)) def save(self, filename, callback=None, format=None, quality=75, bpp=24, compression='default'): if format is None: if filename.lower().endswith( '.jpg') or filename.lower().endswith('.jpeg'): format = 'JPEG' elif filename.lower().endswith('.png'): format = 'PNG' else: raise ValueError( 'unrecognized suffix and format not specified') self._wait() lock = e32.Ao_lock() self._image.save(unicode(filename), self._callback, format, quality, compression, bpp) # If the code above didn't raise an exception, this method # will succeed, so now it's safe to modify object state. self._usercallback = callback self._lock = lock if callback is None: self._wait() if self._errcode != 0: err = self._errcode self._errcode = 0 raise SymbianError, (err, "Error saving image:" + e32.strerror(err)) def resize(self, size, callback=None, keepaspect=0): self._wait() newimage = Image.new(size, self.mode) lock = e32.Ao_lock() self._image.resize(newimage, keepaspect, self._callback) # If the code above didn't raise an exception, this method # will succeed, so now it's safe to modify object state. self._lock = lock self._usercallback = callback self._resized_image = newimage if callback is None: self._wait() if self._errcode != 0: err = self._errcode self._errcode = 0 raise SymbianError, (err, "Error resizing image:" + e32.strerror(err)) t = self._resized_image self._resized_image = None return t def transpose(self, direction, callback=None): self._wait() if direction == ROTATE_90 or direction == ROTATE_270: newsize = (self.size[1], self.size[0]) else: newsize = self.size newimage = Image.new(newsize, self.mode) lock = e32.Ao_lock() self._image.transpose(newimage, direction, self._callback) # If the code above didn't raise an exception, this method # will succeed, so now it's safe to modify object state. self._lock = lock self._usercallback = callback self._resized_image = newimage if callback is None: self._wait() if self._errcode != 0: err = self._errcode self._errcode = 0 raise RuntimeError("Error resizing image:" + str(err)) t = self._resized_image self._resized_image = None return t def _callback(self, errcode): self._errcode = errcode if self._lock: self._lock.signal() self._lock = None if self._usercallback is not None: t = self._usercallback self._usercallback = None if self._resized_image is not None: # resize in progress if self._errcode == 0: newimage = self._resized_image self._resized_image = None t(newimage) else: t(None) else: t(self._errcode) def _wait(self): if self._lock: if self._waiting: raise RuntimeError("Image object busy.") self._waiting = 1 self._lock.wait() self._waiting = 0 def stop(self): self._image.stop() if self._lock: self._errcode = 0 self._lock.signal() self._lock = None
def test_display_twips(self): self._test_util("display_twips", sysinfo.display_twips())
# limitations under the License. import sysinfo print "OS: " print sysinfo.os_version() print "SW: " print sysinfo.sw_version() print "IMEI: " print sysinfo.imei() print "Bat: " print sysinfo.battery() print "Net: " print sysinfo.signal() print "Ram: " print sysinfo.total_ram() print "Rom: " print sysinfo.total_rom() print "MaxRamDrive: " print sysinfo.max_ramdrive_size() print "Twips: " print sysinfo.display_twips() print "Pixels: " print sysinfo.display_pixels() print "RamFree: " print sysinfo.free_ram() print "DriveSpace: " print sysinfo.free_drivespace() print "RingType: " print sysinfo.ring_type()