From 8d3cf05b73b20ab0f0814d89680a9006fda4d22d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A1roly=20Balogh?= Date: Sun, 7 Jan 2018 18:31:40 +0000 Subject: [PATCH] palmunits: optimized palmcube slightly, and added offscreen rendering to eliminate flickering on real devices git-svn-id: trunk@37933 - --- packages/palmunits/examples/palmcube.pas | 59 ++++++++++++++++++------ 1 file changed, 44 insertions(+), 15 deletions(-) diff --git a/packages/palmunits/examples/palmcube.pas b/packages/palmunits/examples/palmcube.pas index 758fc89e54..9461bac12c 100644 --- a/packages/palmunits/examples/palmcube.pas +++ b/packages/palmunits/examples/palmcube.pas @@ -14,7 +14,8 @@ program palmcube; uses - event_, sysevent, systemmgr, window, font; + event_, sysevent, systemmgr, window, font, + errorbase, rect; type tvertex = record @@ -180,7 +181,6 @@ var scale: longint; sx,sy: string; begin - WinEraseWindow(); WinGetWindowExtent(w,h); scale:=(min(h,w) div 5) shl 16; @@ -194,33 +194,58 @@ begin rcube[i].y:=cy + sarlongint(mulfp(vy,scale),16); end; - for i:=low(faces) to high(faces) do - begin - if (faces[i].edge and 1) > 0 then - WinDrawLine(rcube[faces[i].v1].x,rcube[faces[i].v1].y, - rcube[faces[i].v2].x,rcube[faces[i].v2].y); - if (faces[i].edge and 2) > 0 then - WinDrawLine(rcube[faces[i].v2].x,rcube[faces[i].v2].y, - rcube[faces[i].v3].x,rcube[faces[i].v3].y); - if (faces[i].edge and 4) > 0 then - WinDrawLine(rcube[faces[i].v3].x,rcube[faces[i].v3].y, - rcube[faces[i].v1].x,rcube[faces[i].v1].y); - end; - str(tx,sx); str(ty,sy); sx:='FPC Cube! X:'+sx+' Y:'+sy; + + WinEraseWindow(); WinDrawChars(@sx[1],length(sx),1,h-FntLineHeight); + + for i:=low(faces) to high(faces) do + begin + with faces[i] do + begin + if (edge and 1) > 0 then + WinDrawLine(rcube[v1].x,rcube[v1].y, + rcube[v2].x,rcube[v2].y); + if (edge and 2) > 0 then + WinDrawLine(rcube[v2].x,rcube[v2].y, + rcube[v3].x,rcube[v3].y); + if (edge and 4) > 0 then + WinDrawLine(rcube[v3].x,rcube[v3].y, + rcube[v1].x,rcube[v1].y); + end; + end; end; +function CreateOffscreenWin(var offScreen: WinHandle; var screen: WinHandle; var r: RectangleType): boolean; +var + err: word; + w, h: smallint; +begin + WinGetWindowExtent(w,h); + offScreen:=WinCreateOffscreenWindow(w,h,screenFormat,err); + screen:= WinGetDrawWindow(); + if err = 0 then + WinSetDrawWindow(offScreen); + r.topLeft.x:=0; + r.topLeft.y:=0; + r.extent.x:=h; + r.extent.y:=w; + CreateOffscreenWin:=err = 0; +end; procedure EventLoop; var event: EventType; prevX,prevY: smallint; + offscreen: boolean; + offScrWin, scrWin: WinHandle; + r: RectangleType; begin prevX:=-1; prevY:=-1; + offScreen:=CreateOffscreenWin(offScrWin,scrWin,r); repeat EvtGetEvent(event, 20); SysHandleEvent(event); @@ -229,8 +254,12 @@ begin prevX:=event.screenX; prevY:=event.screenY; paintcube(prevX,prevY); + if offscreen then + WinCopyRectangle(offScrWin, scrWin, r, 0, 0, winPaint); end; until (event.eType = appStopEvent); + if offscreen then + WinDeleteWindow(offScrWin, false); end; begin