diff -r 000000000000 -r ca70ae20a155 src/extras/imgviewer.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/extras/imgviewer.py Tue Feb 16 10:07:05 2010 +0530 @@ -0,0 +1,168 @@ +# Copyright (c) 2005 Nokia Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +import appuifw, e32, os +from graphics import * +import key_codes + +appuifw.app.screen='full' +appuifw.app.body=canvas=appuifw.Canvas() +backup_image=Image.new(canvas.size) +canvas.clear(0) +center=[0,0] +zoom=1 +zoomstepindex=0 +screensize=canvas.size +screenrect=(0,0,screensize[0],screensize[1]) +step=30 +textloc=(screensize[0]*0.3,screensize[1]*.5) + +if e32.in_emulator(): + imagedir=u'c:\\images' +else: + imagedir=u'e:\\images' +files=map(unicode,os.listdir(imagedir)) + +index=appuifw.selection_list(files) + +lock=e32.Ao_lock() + +def fullupdate(): + backup_image.clear(bgcolor) + update() + +def nextpic(): + global index,finished + index=(index+1)%len(files) + finished=1 + loaded_image.stop() + lock.signal() + +def prevpic(): + global index,finished + index=(index-1)%len(files) + finished=1 + loaded_image.stop() + lock.signal() + +def zoomin(): + global zoomstepindex,zoom + if zoomstepindex < (len(zoomsteps)-1): + zoomstepindex+=1 + zoom=zoomsteps[zoomstepindex] + fullupdate() + +def zoomout(): + global zoomstepindex + if zoomstepindex > 0: + zoomstepindex-=1 + zoom=zoomsteps[zoomstepindex] + backup_image.clear(bgcolor) + fullupdate() + + +def isvalidcenter(c): + iw,ih=(loaded_image.size[0],loaded_image.size[1]) + srcsize=(int(screensize[0]/zoom),int(screensize[1]/zoom)) + vw,vh=(srcsize[0]/2,srcsize[1]/2) + return (c[0]+vw=0 and + c[1]+vh=0) +def move(delta): + global center + c=center + for k in range(1,4): + t=[c[0]+int(delta[0]*k*20/zoom), + c[1]+int(delta[1]*k*20/zoom)] + center=t + update() + +bgcolor=0 + +canvas.bind(key_codes.EKey3,nextpic) +canvas.bind(key_codes.EKey1,prevpic) +canvas.bind(key_codes.EKey5,zoomin) +canvas.bind(key_codes.EKey0,zoomout) +canvas.bind(key_codes.EKeyLeftArrow,lambda:move((-1,0))) +canvas.bind(key_codes.EKeyRightArrow,lambda:move((1,0))) +canvas.bind(key_codes.EKeyUpArrow,lambda:move((0,-1))) +canvas.bind(key_codes.EKeyDownArrow,lambda:move((0,1))) + +def rect_intersection(r1,r2): + return (max(r1[0],r2[0]),max(r1[1],r2[1]), + min(r1[2],r2[2]),min(r1[3],r2[3])) + +def update(): + global zoom + zoom=zoomsteps[zoomstepindex] + # We convert the screen rect into image coordinates, compute its + # intersection with the image rect and transform it back to screen + # coordinates. + imgrect=(0,0,loaded_image.size[0],loaded_image.size[1]) + ss=(int(screensize[0]/zoom),int(screensize[1]/zoom)) + screenrect_imgcoords=(center[0]-ss[0]/2,center[1]-ss[1]/2, + center[0]+ss[0]/2,center[1]+ss[1]/2) + sourcerect=rect_intersection(screenrect_imgcoords,imgrect) + targetrect=(int((sourcerect[0]-center[0])*zoom+screensize[0]/2), + int((sourcerect[1]-center[1])*zoom+screensize[1]/2), + int((sourcerect[2]-center[0])*zoom+screensize[0]/2), + int((sourcerect[3]-center[1])*zoom+screensize[1]/2)) + backup_image.clear(bgcolor) + backup_image.blit(loaded_image,source=sourcerect,target=targetrect,scale=1) + if not finished: + backup_image.text(textloc,u'Loading....',(255,255,0)) + backup_image.text((0,10),files[index],(0,255,0)) + canvas.blit(backup_image) + +global finished +finished=0 +def finishload(err): + global finished + finished=1 + +running=1 +def quit(): + global running,lock + running=0 + lock.signal() + +appuifw.app.exit_key_handler=quit +backup_image.clear(bgcolor) + +selected_file=imagedir+"\\"+files[index] +imginfo=Image.inspect(selected_file) +imgsize=imginfo['size'] +loaded_image=Image.new(imgsize) + +im=None +while running: + selected_file=imagedir+"\\"+files[index] + imgsize=Image.inspect(selected_file)['size'] + backup_image.text(textloc,u'Loading.',(255,255,0)) + finished=0 + if imgsize != loaded_image.size: + loaded_image=Image.new(imgsize) + loaded_image.load(selected_file, callback=finishload) + backup_image.text(textloc,u'Loading..',(255,255,0)) + zoomsteps=[1.*screensize[0]/loaded_image.size[0],.25,.5,1] + zoomstepindex=0 + center=[loaded_image.size[0]/2,loaded_image.size[1]/2] + backup_image.text(textloc,u'Loading...',(255,255,0)) + while not finished: + update() + e32.ao_sleep(0.5) + fullupdate() + lock.wait() +loaded_image=None +backup_image=None