From 024a2c85d087fa2b90e20923eeb351a637eca97e Mon Sep 17 00:00:00 2001 From: Jeff Armstrong Date: Sat, 30 Jul 2011 13:34:22 -0400 Subject: Monochrome png viewing example now generally works. Slight mods to the AES code. --- example/pngview.py | 326 ++++++++++++++++++++++++++++++++--------------------- 1 file changed, 197 insertions(+), 129 deletions(-) (limited to 'example') diff --git a/example/pngview.py b/example/pngview.py index d53e166..e24ddee 100644 --- a/example/pngview.py +++ b/example/pngview.py @@ -1,130 +1,198 @@ -import gem -import gem.vdi - -import sys - -import png - -# Taken from resource headers -MENU = 0 -M_ABOUT = 7 -M_QUIT = 16 -ABOUT = 1 -B_ABOUT_OK = 1 - -def redraw(window,data): - - window.begin_update() - vh = window.graphics_handle() - - rgbdata = data[2] - - wrect = window.get_work_rect() - - for r in window.get_invalid_rectangles(): - todraw = window.intersect_work_area(r) - if todraw is not None: - gem.vdi.vs_clip(vh, True, todraw) - image_y = 0 - for r in rgbdata: - image_x = 0 - - pvalue = 0 - pcount = 0 - for c in r: - - pvalue = pvalue + c - pcount = pcount + 1 - - if pcount == 3: - - pvalue = pvalue / 3 - - if c > pvalue: - gem.vdi.vsf_color(vh,0) - else: - gem.vdi.vsf_color(vh,1) - x = wrect[0] + image_x - y = wrect[1] + image_y - gem.vdi.bar(vh,(x,y,1,1)) - image_x = image_x + 1 - #if image_x > data[0]: - # raise RuntimeError("Point {0} exceeds limit {1}".format(image_x,data[0])) - pcount = 0 - pvalue = 0 - - image_y = image_y + 1 - - gem.vdi.vs_clip(vh, False, todraw) - - window.end_update() - -class AppMessageEvent(gem.MessageEvent): - def __init__(self,app): - gem.MessageEvent.__init__(self) - - self.app = app - self.window = app.windows[0] - - def handle_menu(self, item, title=None): - if item == M_QUIT: - self.app.send_message((gem.WM_CLOSED, 0, 0, self.window.id)) - - elif item == M_ABOUT: - dlg = self.app.get_resource_address(gem.R_TREE,ABOUT) - self.app.draw_tree(dlg,2) - self.app.form_do(dlg) - - if title is not None: - self.app.set_menu_state(title) - - def process(self): - - # First call the super's process() - gem.MessageEvent.process(self) - - if self.message == gem.WM_CLOSED: - self.app.event_processing = False - - elif self.message == gem.WM_TOPPED: - self.window.top() - - elif self.message == gem.WM_MOVED or self.message == gem.WM_SIZED: - rect = (self.get_word(4),self.get_word(5),self.get_word(6),self.get_word(7)) - self.window.resize(rect) - - elif self.message == gem.WM_REDRAW: - redraw(self.window,self.app.data) - - # Menu handling - elif self.message == gem.MN_SELECTED: - self.handle_menu(self.get_word(4),title=self.get_word(3)) - -def start_app(filename): - - reader = png.Reader(filename) - data = reader.asRGB8() - - app = gem.Application() - app.load_resource("simple.rsc") - app.set_menu(MENU) - - app.data = data - - w = app.new_window((0,10,data[0],data[1]),filename, - type=gem.NAME|gem.MOVER|gem.CLOSER) - - app.message_event = AppMessageEvent(app) - - app.event_loop() - - app.destroy() - - -if __name__ == "__main__": - print("Simple PNG Viewer for GEM") - if len(sys.argv) < 2: - print("Usage: {0} ".format(sys.argv[0])) - else: - print("Now processing {0}".format(sys.argv[1])) +import gem +import gem.vdi + +import sys + +import png + +# Taken from resource headers +MENU = 0 +M_ABOUT = 7 +M_QUIT = 16 +ABOUT = 1 +B_ABOUT_OK = 1 + +class PictureWindow(gem.Window): + def __init__(self,app,filename,wh,data): + gem.Window.__init__(self, type=gem.NAME|gem.CLOSER|gem.MOVER) + + self.set_name(filename) + self.data = data + + self.open((10,10,wh[0],wh[1]+10)) + + def draw(self): + + self.begin_update() + vh = self.graphics_handle() + + wrect = self.get_work_rect() + + for rect in self.get_invalid_rectangles(): + todraw = self.intersect_work_area(rect) + if todraw is not None: + gem.vdi.vs_clip(vh, True, todraw) + image_y = 0 + for r in self.data: + image_x = 0 + + for c in r: + + if c > 128: + gem.vdi.vsf_color(vh,0) + else: + gem.vdi.vsf_color(vh,1) + x = wrect[0] + image_x + y = wrect[1] + image_y + gem.vdi.bar(vh,(x,y,1,1)) + image_x = image_x + 1 + + image_y = image_y + 1 + + gem.vdi.vs_clip(vh, False, todraw) + + self.end_update() + +class LoadingWindow(gem.Window): + def __init__(self,app,filename): + gem.Window.__init__(self, type=gem.NAME|gem.CLOSER) + + self.set_name("Loading "+filename) + + self.reader = png.Reader(filename) + self.raw_data = self.reader.asRGBA8() + + self.data = [] + self.done = False + self.row = 0 + + #self.load_thread = threading.Thread(target=self.load) + #self.load_thread.start() + + def load(self): + rgbdata = self.raw_data[2] + + for r in rgbdata: + self.row = self.row + 1 + + pvalue = 0 + pcount = 0 + + row = [] + for c in r: + if pcount < 3: + pvalue = pvalue + c + pcount = pcount + 1 + + if pcount == 4: + pvalue = pvalue / 3 + + row.append(pvalue) + + #if image_x > data[0]: + # raise RuntimeError("Point {0} exceeds limit {1}".format(image_x,data[0])) + pcount = 0 + pvalue = 0 + + self.data.append(row) + self.draw() + + self.done = True + self.close() + #self.app.send_message((0,self.app.id,0,gem.WM_CLOSED)) + + def draw(self): + wrect = self.get_work_rect() + + vh = self.graphics_handle() + self.begin_update() + + for r in self.get_invalid_rectangles(): + todraw = self.intersect_work_area(r) + if todraw is not None: + gem.vdi.vs_clip(vh, True, todraw) + + w = wrect[2]*self.row/self.raw_data[1] + + gem.vdi.vsf_color(vh,0) + gem.vdi.bar(vh,(wrect[0],wrect[1],w,wrect[3])) + + gem.vdi.vsf_color(vh,1) + gem.vdi.bar(vh,(wrect[0]+w,wrect[1],wrect[2]-w,wrect[3])) + + gem.vdi.vs_clip(vh, False, todraw) + + self.end_update() + +class AppMessageEvent(gem.MessageEvent): + def __init__(self,app,window): + gem.MessageEvent.__init__(self) + + self.app = app + self.window = window + + def handle_menu(self, item, title=None): + if item == M_QUIT: + self.app.send_message((gem.WM_CLOSED, 0, 0, self.window.id)) + + elif item == M_ABOUT: + dlg = self.app.get_resource_address(gem.R_TREE,ABOUT) + self.app.draw_tree(dlg,2) + self.app.form_do(dlg) + + if title is not None: + self.app.set_menu_state(title) + + def process(self): + + # First call the super's process() + gem.MessageEvent.process(self) + + if self.message == gem.WM_CLOSED: + self.app.event_processing = False + + elif self.message == gem.WM_TOPPED: + self.window.top() + + elif self.message == gem.WM_MOVED or self.message == gem.WM_SIZED: + rect = (self.get_word(4),self.get_word(5),self.get_word(6),self.get_word(7)) + self.window.resize(rect) + + elif self.message == gem.WM_REDRAW: + self.window.draw() + + # Menu handling + elif self.message == gem.MN_SELECTED: + self.handle_menu(self.get_word(4),title=self.get_word(3)) + + +def start_app(filename): + + app = gem.Application() + app.load_resource("simple.rsc") + app.set_menu(MENU) + + wload = LoadingWindow(app,filename) + app.windows.append(wload) + wload.open((10,10,250,50)) + wload.load() + #app.message_event = AppMessageEvent(app,wload) + + #app.event_loop() + + wpic = PictureWindow(app,filename,(wload.raw_data[0],wload.raw_data[1]),wload.data) + app.windows.append(wpic) + app.message_event = AppMessageEvent(app,wpic) + + app.event_loop() + + app.destroy() + + +if __name__ == "__main__": + print("Simple PNG Viewer for GEM") + if len(sys.argv) < 2: + print("Usage: {0} ".format(sys.argv[0])) + else: + print("Now processing {0}".format(sys.argv[1])) start_app(sys.argv[1]) \ No newline at end of file -- cgit v1.2.3