def GetTextureInfoFromURL(self, path, currentURL=None, fromWhere=None): if path.endswith('.blue'): return self._GetPic_blue(path) fullPath = corebrowserutil.ParseURL(path, currentURL)[0] cacheData = self.browserCache.GetFromCache(fullPath) if not cacheData: cacheData = self.GetTextureFromURL(path, currentURL, fromWhere=fromWhere, sizeonly=1) if cacheData and os.path.exists(cacheData[0].replace( 'cache:/', blue.paths.ResolvePath(u'cache:/'))): return cacheData
def GetTextureFromURL(self, path, currentURL=None, ignoreCache=0, dontcache=0, fromWhere=None, sizeonly=0, retry=1): if path.endswith('.blue'): return self.GetPic_blue(path) fullPath = corebrowserutil.ParseURL(path, currentURL)[0] if path.startswith('res:'): try: surface = trinity.Tr2HostBitmap() surface.CreateFromFile(path) w, h = surface.width, surface.height bw, bh = uiutil.GetBuffersize(w), uiutil.GetBuffersize(h) if sizeonly: return (path, w, h, bw, bh) return self.ReturnTexture(path, w, h, bw, bh) except: self.LogError('Failed to load image', path) if self.urlloading.has_key(fullPath): del self.urlloading[fullPath] sys.exc_clear() return self.ErrorPic(sizeonly) if ignoreCache: sm.GetService('browserCache').InvalidateImage(fullPath) while self.urlloading.has_key(fullPath): blue.pyos.BeNice() if not dontcache: cacheData = sm.GetService('browserCache').GetFromCache(fullPath) if cacheData and os.path.exists(cacheData[0].replace( 'cache:/', blue.paths.ResolvePath(u'cache:/'))): if sizeonly: return cacheData return self.ReturnTexture(*cacheData) try: self.urlloading[fullPath] = 1 ret = corebrowserutil.GetStringFromURL(fullPath) cacheID = int( str(blue.os.GetWallclockTime()) + str(uthread.uniqueId() or uthread.uniqueId())) imagestream = ret.read() ext = None if 'content-type' in ret.headers.keys( ) and ret.headers['content-type'].startswith('image/'): ext = ret.headers['content-type'][6:] if ext == None or ext == 'png': header = imagestream[:16] for sig, sext in [('PNG', 'PNG'), ('GIF', 'GIF'), ('JFI', 'JPEG'), ('BM8', 'BMP')]: for i in xrange(0, 12): if header[i:i + 3] == sig: ext = sext break if not ext: header = imagestream[-16:] for sig, sext in [('XFILE', 'TGA')]: for i in xrange(0, 10): if header[i:i + 5] == sig: ext = sext break if ext: filename = '%sBrowser/Img/%s.%s' % ( blue.paths.ResolvePath(u'cache:/'), cacheID, ext) resfile = blue.classes.CreateInstance('blue.ResFile') if not resfile.Open(filename, 0): resfile.Create(filename) resfile.Write(imagestream) resfile.Close() if ext.upper() == 'GIF': g = DrawArea() g.setBgColor(Transparent) g.loadGIF(filename.replace(u'/', u'\\').encode('utf8')) ext = 'PNG' filename = u'%sBrowser/Img/%s.%s' % ( blue.paths.ResolvePath(u'cache:/'), cacheID, ext) g.outPNG(filename.replace(u'/', u'\\').encode('utf8')) surface = trinity.Tr2HostBitmap() surface.CreateFromFile(filename) w, h = surface.width, surface.height bw, bh = uiutil.GetBuffersize(w), uiutil.GetBuffersize(h) cachePath = 'cache:/Browser/Img/%s.%s' % (cacheID, ext) if 'pragma' not in ret.headers.keys( ) or ret.headers['Pragma'].find('no-cache') == -1: sm.GetService('browserCache').Cache( fullPath, (cachePath, w, h, bw, bh)) del self.urlloading[fullPath] if sizeonly: return (cachePath, w, h, bw, bh) return self.ReturnTexture(cachePath, w, h, bw, bh) del self.urlloading[fullPath] return self.ErrorPic(sizeonly) except Exception as e: if retry: sys.exc_clear() if self.urlloading.has_key(fullPath): del self.urlloading[fullPath] return self.GetTextureFromURL(path, currentURL, ignoreCache, dontcache, fromWhere, sizeonly, 0) self.LogError(e, 'Failed to load image', repr(path)) if self.urlloading.has_key(fullPath): del self.urlloading[fullPath] sys.exc_clear() return self.ErrorPic(sizeonly)