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
Example #2
0
 def test_display_twips(self):
     self._test_util("display_twips", sysinfo.display_twips())
Example #3
0
# 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()