Mercurial > traipse_dev
diff orpg/mapper/background.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 | 072ffc1d466f |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/orpg/mapper/background.py Tue Jul 14 16:41:58 2009 -0500 @@ -0,0 +1,327 @@ +# 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: background.py +# Author: Chris Davis +# Maintainer: +# Version: +# $Id: background.py,v 1.29 2007/03/09 14:11:55 digitalxero Exp $ +# +# Description: This file contains some of the basic definitions for the chat +# utilities in the orpg project. +# +__version__ = "$Id: background.py,v 1.29 2007/03/09 14:11:55 digitalxero Exp $" + +from base import * +import thread +import urllib +import os.path +import time + +##----------------------------- +## background layer +##----------------------------- + +BG_NONE = 0 +BG_TEXTURE = 1 +BG_IMAGE = 2 +BG_COLOR = 3 + +class layer_back_ground(layer_base): + def __init__(self, canvas): + self.canvas = canvas + self.log = self.canvas.log + self.log.log("Enter layer_back_ground", ORPG_DEBUG) + self.settings = self.canvas.settings + layer_base.__init__(self) + self.canvas = canvas + self.r_h = RGBHex() + self.clear() + self.log.log("Exit layer_back_ground", ORPG_DEBUG) + + def error_loading_image(self, image): + self.log.log("Enter layer_back_ground->error_loading_image(self, image)", ORPG_DEBUG) + msg = "Unable to load image:" + `image` + dlg = wx.MessageDialog(self.canvas,msg,'File not Found',wx.ICON_EXCLAMATION) + dlg.ShowModal() + dlg.Destroy() + self.log.log("Exit layer_back_ground->error_loading_image(self, image)", ORPG_DEBUG) + + def clear(self): + self.log.log("Enter layer_back_ground->clear(self)", ORPG_DEBUG) + self.type = BG_NONE + self.bg_bmp = None + self.bg_color = None + self.img_path = None + self.local = False + self.localPath = '' + self.localTime = -1 + self.isUpdated = True + self.log.log("Exit layer_back_ground->clear(self)", ORPG_DEBUG) + + def get_type(self): + self.log.log("Enter layer_back_ground->get_type(self)", ORPG_DEBUG) + self.log.log("Exit layer_back_ground->get_type(self)", ORPG_DEBUG) + return self.type + + def get_img_path(self): + self.log.log("Enter layer_back_ground->get_type(self)", ORPG_DEBUG) + if self.img_path: + self.log.log("Exit layer_back_ground->get_type(self) return " + self.img_path, ORPG_DEBUG) + return self.img_path + else: + self.log.log("Exit layer_back_ground->get_type(self) return None", ORPG_DEBUG) + return "" + + def get_color(self): + self.log.log("Enter layer_back_ground->get_color(self)", ORPG_DEBUG) + hexcolor = "#FFFFFF" + if self.bg_color: + (red,green,blue) = self.bg_color.Get() + hexcolor = self.r_h.hexstring(red, green, blue) + self.log.log("Exit layer_back_ground->get_color(self)", ORPG_DEBUG) + return hexcolor + + def set_texture(self, path): + self.log.log("Enter layer_back_ground->set_texture(self, path)", ORPG_DEBUG) + self.isUpdated = True + + self.type = BG_TEXTURE + if self.img_path != path: + try: + self.bg_bmp = ImageHandler.load(path, "texture", 0) + if self.bg_bmp == None: + self.log.log("Invalid image type!", ORPG_GENERAL) + raise Exception, "Invalid image type!" + except: + self.error_loading_image(path) + self.img_path = path + self.log.log("Enter layer_back_ground->set_texture(self, path)", ORPG_DEBUG) + + def set_image(self, path, scale): + self.log.log("Enter layer_back_ground->set_image(self, path, scale)", ORPG_DEBUG) + self.isUpdated = True + + self.type = BG_IMAGE + if self.img_path != path: + self.bg_bmp = ImageHandler.load(path, "background", 0) + try: + if self.bg_bmp == None: + self.log.log("Invalid image type!", ORPG_GENERAL) + raise Exception, "Invalid image type!" + except: + self.error_loading_image(path) + self.img_path = path + self.log.log("Exit layer_back_ground->set_image(self, path, scale)", ORPG_DEBUG) + return (self.bg_bmp.GetWidth(),self.bg_bmp.GetHeight()) + + def set_color(self, color): + self.log.log("Enter layer_back_ground->set_color(self, color)", ORPG_DEBUG) + self.isUpdated = True + self.type = BG_COLOR + (r,g,b) = color.Get() + self.bg_color = cmpColour(r,g,b) + self.canvas.SetBackgroundColour(self.bg_color) + self.log.log("Exit layer_back_ground->set_color(self, color)", ORPG_DEBUG) + + def layerDraw(self, dc, scale, topleft, size): + self.log.log("Enter layer_back_ground->layerDraw(self, dc, scale, topleft, size)", ORPG_DEBUG) + if self.bg_bmp == None or not self.bg_bmp.Ok() or ((self.type != BG_TEXTURE) and (self.type != BG_IMAGE)): + self.log.log("Exit layer_back_ground->layerDraw(self, dc, scale, topleft, size) return False", ORPG_DEBUG) + return False + dc2 = wx.MemoryDC() + dc2.SelectObject(self.bg_bmp) + topLeft = [int(topleft[0]/scale), int(topleft[1]/scale)] + topRight = [int((topleft[0]+size[0]+1)/scale)+1, int((topleft[1]+size[1]+1)/scale)+1] + if (topRight[0] > self.canvas.size[0]): + topRight[0] = self.canvas.size[0] + if (topRight[1] > self.canvas.size[1]): + topRight[1] = self.canvas.size[1] + bmpW = self.bg_bmp.GetWidth() + bmpH = self.bg_bmp.GetHeight() + if self.type == BG_TEXTURE: + x = (topLeft[0]/bmpW)*bmpW + y1 = int(topLeft[1]/bmpH)*bmpH + if x < topLeft[0]: + posx = topLeft[0] + cl = topLeft[0]-x + else: + cl = 0 + posx = x + while x < topRight[0]: + if x+bmpW > topRight[0]: + cr = x+bmpW-topRight[0] + else: + cr = 0 + y = int(topLeft[1]/bmpH)*bmpH + if y < topLeft[1]: + posy = topLeft[1] + ct = topLeft[1]-y + else: + ct = 0 + posy = y + while y < topRight[1]: + if y+bmpH > topRight[1]: + cb = y+bmpH-topRight[1] + else: + cb = 0 + newW = bmpW-cr-cl + newH = bmpH-cb-ct + if newW < 0: + newW = 0 + if newH < 0: + newH = 0 + dc.DrawBitmap(self.bg_bmp, posx, posy) + dc.Blit(posx, posy, newW, newH, dc2, cl, ct) + ct = 0 + y = y+bmpH + posy = y + cl = 0 + x = x+bmpW + posx = x + elif self.type == BG_IMAGE: + x = 0 + y = 0 + if x < topLeft[0]: + posx = topLeft[0] + cl = topLeft[0]-x + else: + cl = 0 + posx = x + + if y < topLeft[1]: + posy = topLeft[1] + ct = topLeft[1]-y + else: + ct = 0 + posy = y + if x+bmpW > topRight[0]: + cr = x+bmpW-topRight[0] + else: + cr = 0 + if y+bmpH > topRight[1]: + cb = y+bmpH-topRight[1] + else: + cb = 0 + newW = bmpW-cr-cl + newH = bmpH-cb-ct + if newW < 0: + newW = 0 + if newH < 0: + newH = 0 + dc.DrawBitmap(self.bg_bmp, posx, posy) + dc.Blit(posx, posy, newW, newH, dc2, cl, ct) + dc2.SelectObject(wx.NullBitmap) + del dc2 + self.log.log("Exit layer_back_ground->layerDraw(self, dc, scale, topleft, size)", ORPG_DEBUG) + return True + + def layerToXML(self, action="update"): + self.log.log("Enter layer_back_ground->layerToXML(self, " + action + ")", ORPG_DEBUG) + xml_str = "<bg" + if self.bg_color != None: + (red,green,blue) = self.bg_color.Get() + hexcolor = self.r_h.hexstring(red, green, blue) + xml_str += ' color="' + hexcolor + '"' + if self.img_path != None: + xml_str += ' path="' + urllib.quote(self.img_path).replace('%3A', ':') + '"' + if self.type != None: + xml_str += ' type="' + str(self.type) + '"' + if self.local and self.img_path != None: + xml_str += ' local="True"' + xml_str += ' localPath="' + urllib.quote(self.localPath).replace('%3A', ':') + '"' + xml_str += ' localTime="' + str(self.localTime) + '"' + xml_str += "/>" + self.log.log(xml_str, ORPG_DEBUG) + self.log.log("Exit layer_back_ground->layerToXML(self, " + action + ")", ORPG_DEBUG) + if (action == "update" and self.isUpdated) or action == "new": + self.isUpdated = False + return xml_str + else: + return '' + + def layerTakeDOM(self, xml_dom): + self.log.log("Enter layer_back_ground->layerTakeDOM(self, xml_dom)", ORPG_DEBUG) + type = BG_COLOR + color = xml_dom.getAttribute("color") + self.log.log("color=" + color, ORPG_DEBUG) + path = urllib.unquote(xml_dom.getAttribute("path")) + self.log.log("path=" + path, ORPG_DEBUG) + + # Begin ted's map changes + if xml_dom.hasAttribute("color"): + r,g,b = self.r_h.rgb_tuple(xml_dom.getAttribute("color")) + self.set_color(cmpColour(r,g,b)) + # End ted's map changes + if xml_dom.hasAttribute("type"): + type = int(xml_dom.getAttribute("type")) + self.log.log("type=" + str(type), ORPG_DEBUG) + + if type == BG_TEXTURE: + if path != "": + self.set_texture(path) + + elif type == BG_IMAGE: + if path != "": + self.set_image(path, 1) + + elif type == BG_NONE: + self.clear() + + if xml_dom.hasAttribute('local') and xml_dom.getAttribute('local') == 'True' and os.path.exists(urllib.unquote(xml_dom.getAttribute('localPath'))): + self.localPath = urllib.unquote(xml_dom.getAttribute('localPath')) + self.local = True + self.localTime = int(xml_dom.getAttribute('localTime')) + if self.localTime-time.time() <= 144000: + file = open(self.localPath, "rb") + imgdata = file.read() + file.close() + filename = os.path.split(self.localPath) + (imgtype,j) = mimetypes.guess_type(filename[1]) + postdata = urllib.urlencode({'filename':filename[1], 'imgdata':imgdata, 'imgtype':imgtype}) + thread.start_new_thread(self.upload, (postdata, self.localPath, type)) + self.log.log("Exit layer_back_ground->layerTakeDOM(self, xml_dom)", ORPG_DEBUG) + + def upload(self, postdata, filename, type): + self.lock.acquire() + if type == 'Image' or type == 'Texture': + url = self.settings.get_setting('ImageServerBaseURL') + file = urllib.urlopen(url, postdata) + recvdata = file.read() + file.close() + try: + xml_dom = minidom.parseString(recvdata)._get_documentElement() + if xml_dom.nodeName == 'path': + path = xml_dom.getAttribute('url') + path = urllib.unquote(path) + + if type == 'Image': + self.set_image(path, 1) + else: + self.set_texture(path) + + self.localPath = filename + self.local = True + self.localTime = time.time() + else: + print xml_dom.getAttribute('msg') + except Exception, e: + print e + print recvdata + self.lock.release()