diff orpg/mapper/images.py @ 0:4385a7d0efd1 grumpy-goblin

Deleted and repushed it with the 'grumpy-goblin' branch. I forgot a y
author sirebral
date Tue, 14 Jul 2009 16:41:58 -0500
parents
children d5e81dac98ff
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/orpg/mapper/images.py	Tue Jul 14 16:41:58 2009 -0500
@@ -0,0 +1,158 @@
+# Copyright (C) 2000-2001 The OpenRPG Project
+#
+#    openrpg-dev@lists.sourceforge.net
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+# --
+#
+# File: mapper/images.py
+# Author: OpenRPG
+# Maintainer:
+# Version:
+#   $Id: images.py,v 1.21 2007/12/11 04:07:15 digitalxero Exp $
+#
+# Description:
+#
+__version__ = "$Id: images.py,v 1.21 2007/12/11 04:07:15 digitalxero Exp $"
+
+import urllib
+import Queue
+import thread
+from threading import Lock
+import time
+from orpg.orpg_wx import *
+from orpg.orpgCore import *
+
+def singleton(cls):
+    instances = {}
+    def getinstance():
+        if cls not in instances:
+            instances[cls] = cls()
+        return instances[cls]
+    return getinstance()
+
+class ImageHandlerClass(object):
+    __cache = {}
+    __fetching = {}
+    __queue = Queue.Queue(0)
+    __lock = Lock()
+
+    def load(self, path, image_type, imageId):
+        # Load an image, with a intermideary fetching image shown while it loads in a background thread
+        if self.__cache.has_key(path):
+            return wx.ImageFromMime(self.__cache[path][1], self.__cache[path][2]).ConvertToBitmap()
+        if not self.__fetching.has_key(path):
+            self.__fetching[path] = True
+            #Start Image Loading Thread
+            thread.start_new_thread(self.__loadThread, (path, image_type, imageId))
+        else:
+            if self.__fetching[path] is True:
+                thread.start_new_thread(self.__loadCacheThread, (path, image_type, imageId))
+        return wx.Bitmap(open_rpg.get_component("dir_struct")["icon"] + "fetching.png", wx.BITMAP_TYPE_PNG)
+
+    def directLoad(self, path):
+        # Directly load an image, no threads
+        if self.__cache.has_key(path):
+            return wx.ImageFromMime(self.__cache[path][1], self.__cache[path][2]).ConvertToBitmap()
+        uriPath = urllib.unquote(path)
+        try:
+            d = urllib.urlretrieve(uriPath)
+            # We have to make sure that not only did we fetch something, but that
+            # it was an image that we got back.
+            if d[0] and d[1].getmaintype() == "image":
+                self.__cache[path] = (path, d[0], d[1].gettype(), None)
+                return wx.ImageFromMime(self.__cache[path][1], self.__cache[path][2]).ConvertToBitmap()
+            else:
+                open_rpg.get_component('log').log("Image refused to load or URI did not reference a valid image: " + path, ORPG_GENERAL, True)
+                return None
+        except IOError:
+            open_rpg.get_component('log').log("Unable to resolve/open the specified URI; image was NOT loaded: " + path, ORPG_GENERAL, True)
+            return None
+
+    def cleanCache(self):
+        # Shrinks the Cache down to the proper size
+        try:
+            cacheSize = int(open_rpg.get_component('settings').get_setting("ImageCacheSize"))
+        except:
+            cacheSize = 32
+        cache = self.__cache.keys()
+        cache.sort()
+        for key in cache[cacheSize:]:
+            del self.__cache[key]
+
+    def flushCache(self):
+        #    This function will flush all images contained within the image cache.
+        self.__lock.acquire()
+        try:
+            keyList = self.__cache.keys()
+            for key in keyList:
+                del self.__cache[key]
+        finally:
+            self.__lock.release()
+        urllib.urlcleanup()
+
+#Private Methods
+    def __loadThread(self, path, image_type, imageId):
+        uriPath = urllib.unquote(path)
+        self.__lock.acquire()
+        try:
+            d = urllib.urlretrieve(uriPath)
+            # We have to make sure that not only did we fetch something, but that
+            # it was an image that we got back.
+            if d[0] and d[1].getmaintype() == "image":
+                self.__cache[path] = (path, d[0], d[1].gettype(), imageId)
+                self.__queue.put((self.__cache[path], image_type, imageId))
+                if self.__fetching.has_key(path):
+                    del self.__fetching[path]
+            else:
+                open_rpg.get_component('log').log("Image refused to load or URI did not reference a valid image: " + path, ORPG_GENERAL, True)
+                self.__fetching[path] = False
+        except IOError:
+            self.__fetching[path] = False
+            open_rpg.get_component('log').log("Unable to resolve/open the specified URI; image was NOT laoded: " + path, ORPG_GENERAL, True)
+        finally:
+            self.__lock.release()
+
+    def __loadCacheThread(self, path, image_type, imageId):
+        try:
+            st = time.time()
+            while self.__fetching.has_key(path) and self.__fetching[path] is not False:
+                time.sleep(0.025)
+                if (time.time()-st) > 120:
+                    open_rpg.get_component('log').log("Timeout: " + path, ORPG_GENERAL, True)
+                    break
+        except:
+            self.__fetching[path] = False
+            open_rpg.get_component('log').log("Unable to resolve/open the specified URI; image was NOT loaded: " + path, ORPG_GENERAL, True)
+            return 
+        self.__lock.acquire()
+        try:
+            open_rpg.get_component('log').log("Adding Image to Queue from Cache: " + str(self.__cache[path]), ORPG_DEBUG)
+            self.__queue.put((self.__cache[path], image_type, imageId))
+        finally:
+            self.__lock.release()
+
+#Property Methods
+    def _getCache(self):
+        return self.__cache
+
+    def _getQueue(self):
+        return self.__queue
+
+#Properties
+    Cache = property(_getCache)
+    Queue = property(_getQueue)
+
+ImageHandler = singleton(ImageHandlerClass)