summaryrefslogtreecommitdiffstats
path: root/Mac/Demo/imgbrowse/imgbrowse.py
blob: 56d6d3128fbafde3d76112670020c851b87471a5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
"""imgbrowse - Display pictures using img"""

import FrameWork
import EasyDialogs
import Res
import Qd
import QuickDraw
import Win
#import List
import sys
import struct
import img
import imgformat
import macfs
import struct


# Where is the picture window?
LEFT=200
TOP=64
MINWIDTH=64
MINHEIGHT=64
MAXWIDTH=320
MAXHEIGHT=320

def dumppixmap(data):
	baseAddr, \
		rowBytes, \
		t, l, b, r, \
		pmVersion, \
		packType, packSize, \
		hRes, vRes, \
		pixelType, pixelSize, \
		cmpCount, cmpSize, \
		planeBytes, pmTable, pmReserved \
			= struct.unpack("lhhhhhhhlllhhhhlll", data)
	print 'Base:       0x%x'%baseAddr
	print 'rowBytes:   %d (0x%x)'%(rowBytes&0x3fff, rowBytes)
	print 'rect:       %d, %d, %d, %d'%(t, l, b, r)
	print 'pmVersion:  0x%x'%pmVersion
	print 'packing:    %d %d'%(packType, packSize)
	print 'resolution: %f x %f'%(float(hRes)/0x10000, float(vRes)/0x10000)
	print 'pixeltype:  %d, size %d'%(pixelType, pixelSize)
	print 'components: %d, size %d'%(cmpCount, cmpSize)
	print 'planeBytes: %d (0x%x)'%(planeBytes, planeBytes)
	print 'pmTable:    0x%x'%pmTable
	print 'pmReserved: 0x%x'%pmReserved

def mk16pixmap(w, h, data):
	"""kludge a pixmap together"""
	rv = struct.pack("lhhhhhhhlllhhhhlll",
		id(data)+12,
		w*2 + 0x8000,
		0, 0, h, w,
		0,
		0, 0, # XXXX?
		72<<16, 72<<16,
		16, 16, # XXXX
		3, 5,
		0, 0, 0)
	print 'Our pixmap, size %d:'%len(rv)
	dumppixmap(rv)
	return Qd.RawBitMap(rv)

def main():
	print 'hello world'
	imgbrowse()

class imgbrowse(FrameWork.Application):
	def __init__(self):
		# First init menus, etc.
		FrameWork.Application.__init__(self)
		self.lastwin = None
		# Finally, go into the event loop
		self.mainloop()
		
	def makeusermenus(self):
		self.filemenu = m = FrameWork.Menu(self.menubar, "File")
		self.openitem = FrameWork.MenuItem(m, "Open...", "O", self.opendoc)
		self.infoitem = FrameWork.MenuItem(m, "Info", "I", self.info)
		self.quititem = FrameWork.MenuItem(m, "Quit", "Q", self.quit)
	
	def quit(self, *args):
		raise self
		
	def opendoc(self, *args):
		fss, ok = macfs.StandardGetFile() # Any file type
		if not ok:
			return
		bar = EasyDialogs.ProgressBar('Reading and converting...')
		pathname = fss.as_pathname()
		try:
			rdr = img.reader(imgformat.macrgb16, pathname)
		except img.error, arg:
			EasyDialogs.Message(`arg`)
			return
		w, h = rdr.width, rdr.height
		bar.set(10)
		data = rdr.read()
		del bar
		pixmap = mk16pixmap(w, h, data)
		self.showimg(w, h, pixmap)
			
	def showimg(self, w, h, pixmap):
		win = imgwindow(self)
		win.open(w, h, pixmap)
		self.lastwin = win

	def info(self, *args):
		if self.lastwin:
			self.lastwin.info()		
		
class imgwindow(FrameWork.Window):
	def open(self, width, height, pixmap):
		self.pixmap = pixmap
		self.pictrect = (0, 0, width, height)
		bounds = (LEFT, TOP, LEFT+width, TOP+height)
		
		self.wid = Win.NewCWindow(bounds, "Picture", 1, 0, -1, 1, 0)
		self.do_postopen()
		
	def do_update(self, *args):
		pass
		currect = self.fitrect()
		print 'PICT:', self.pictrect
		print 'WIND:', currect
		print 'ARGS:', (self.pixmap, self.wid.GetWindowPort().portBits, self.pictrect,
				currect, QuickDraw.srcCopy, None)
		self.info()
		Qd.CopyBits(self.pixmap, self.wid.GetWindowPort().portBits, self.pictrect,
				currect, QuickDraw.srcCopy+QuickDraw.ditherCopy, None)
##		Qd.DrawPicture(self.picture, currect)
		
	def fitrect(self):
		"""Return self.pictrect scaled to fit in window"""
		graf = self.wid.GetWindowPort()
		screenrect = graf.portRect
		picwidth = self.pictrect[2] - self.pictrect[0]
		picheight = self.pictrect[3] - self.pictrect[1]
		if picwidth > screenrect[2] - screenrect[0]:
			factor = float(picwidth) / float(screenrect[2]-screenrect[0])
			picwidth = picwidth / factor
			picheight = picheight / factor
		if picheight > screenrect[3] - screenrect[1]:
			factor = float(picheight) / float(screenrect[3]-screenrect[1])
			picwidth = picwidth / factor
			picheight = picheight / factor
		return (screenrect[0], screenrect[1], screenrect[0]+int(picwidth),
				screenrect[1]+int(picheight))
				
	def info(self):
		graf = self.wid.GetWindowPort()
		bits = graf.portBits
		dumppixmap(bits.pixmap_data)

main()