TweetFollow Us on Twitter

About Color Animation
Volume Number:6
Issue Number:5
Column Tag:Pascal Procedures

Related Info: Vert. Retrace Mgr Event Manager Color Quickdraw

Color Animation

By Ajay Nath, Oakland Gardens, NY

Note: Source code files accompanying article are located on MacTech CD-ROM or source code disks.

[Ajay Nath has B.A. degrees in Mathematics and Chemistry from New York University and is currently a third year medical student at the Mount Sinai School of Medicine where he tries to find the time to program and to learn medicine.]

It all started when I started playing with a shareware breakout game. Paul, a friend of mine who saw me playing it, thought it was neat and liked playing it but there were a few problems with the game. It was an old game and didn’t use the larger screen of my Mac IIcx or color and it had other annoying things about it. Well I’ve been much too busy to write a new game for my friend, but I was able to discover a method for doing simple animation that will work well on a Mac II or better machine.

When I first sat down and thought about the problem I thought, well I’ll simply use a vbl task to set a global variable and my program’s main loop will examine that variable and know when to draw. To do this I declared a variable of the following simple type:

{1}

 XVBLRec= RECORD
 xVBLTask : VBLTask;
 xDoTask: INTEGER;
 END;

The first field of the record (xVBLTask) is used in the calls to install and remove the vbl task, the second field xDoTask is an integer which the vbl task I use will set to 1 when it runs. My programs main loop just has to examine the xDoTask field and draw when it is non-zero.

This technique is not very different from the method which involves examining the current value of the Mac global variable TickCount and drawing when it changes, i.e. (in pseudocode):

{2}

 count = TickCount;
 while count = TickCount do nothing;
 { start drawing real fast! }.

On older Macs the TickCount was changed when vbl tasks were run so the above method was really very similar to using a vbl task to set a global variable.

I took a quick look in Inside Mac Vol. V (pp. 566-567) before I started writing my vbl task and found some interesting information there. The new Macs have vertical retrace interrupts which can vary according to their video card and we can create vbl tasks which run at the ‘heart rate’ of the whichever video card we want. Well, the obvious thing to do is to run our vbl task at the rate of the video card of our main screen, and we then should be able to do simple animation easily! The new calls are called SlotVInstall and SlotVRemove and just like the old calls need a pointer to a vbltask record but in addition, need a slot number so they know which slot to attach the vbl task to. All we need to know then is the slot number of the video card which drives our main screen. After a quick five minute search through IM V I found a call, “GetVideoDefault”, which would give me the slot number of the default video card and I was on my way.

I used TML Pascal II to write my main program and used MPW Assembler to write the vbl task. I’ll explain the vbl tasks code first since its so simple (only three lines). When the task runs, register A0 is a ptr to our vbltask record and this allows us to reset our tasks vblcount. Since we defined an integer that comes right after this record in our XVBLRec type (see above), we can change its value to 1 at this point since A0 points to our record. The three lines of the vbl task do the following (in pseudocode):

1) reset the vblcount

2) set the xDoTask variable to 1

3) return (exit) from the vbl task.

All the main program loop has to do is (in pseudocode):

 repeat
 if (xDoTask <> 0) begin
 DrawStuff;
 set xDoTask to 0
 endif
 until done

The following MPW commands will build and run the example program (you may need to change the paths to build it on your hard disk):

# 3

####
Asm vbltask.a
TMLPascal slotvbltaskdemo.p
Link -w -t ‘APPL’ -c ‘????’ 
 slotvbltaskdemo.p.o vbltask.a.o 
 “HD-80:MPW:Libraries:Libraries:”Runtime.o 
 “HD-80:MPW:Libraries:Libraries:”Interface.o 
 “HD-80:MPW:Libraries:TMLPLibraries:”TMLPasLib.o 
 “HD-80:MPW:Libraries:TMLPLibraries:”SANELib.o 
 -o SlotVBLTaskDemo
Rez -append -o SlotVBLTaskDemo slotvbltaskdemo.r
SlotVBLTaskDemo
####

Note that the code does check to make sure that the machine its running on is a Mac II or better before running, since the new calls are not available on lower end machines. On lower machines using regular vbl tasks is probably sufficient to do simple animation. That’s about all the explanation the code needs other than to say that it ‘bounces’ a red string vertically in its draggable window and can run in the background.

There is a bug which occurs when things are being drawn at the top of the screen and when you use the simple method of ‘erase old stuff then draw new stuff’ as I do in this example. You may see things start to flicker when drawing at the top of the screen. The problem I think is in the way the screen is drawn which is left to right and from top to bottom. I haven’t thought of a solution for this problem yet other than to use a call to CopyBits to blast in whatever your drawing, rather then to use straight QuickDraw calls. If anyone can think of a good explanation of this problem and how to solve it I’d like to hear about it.

Much love and thanks to the boys of ‘9A’ and of course, to K.S.

Listing:  vbltask.a

 INCLUDE‘SysEqu.a’
 EXPORT MyVBLTask

MyVBLTask PROC
;
; On entry A0 is a ptr to our XVBLRec which was defined
; as follows:
;
;XVBLRec= RECORD
;xVBLTask : VBLTask;
;xDoTask: INTEGER;
;END;
;
; We can use MPW RECORDs to define it in assembly as follows:
;
XVBLRec RECORD 0
xVBLTaskDS.BvblPhase+2
xDoTask DS.W1
 ENDR

kVBLCount EQU    1

 WITH XVBLRec
 ; Reset the vblCount
 MOVE.W #kVBLCount,XVBLRec+xVBLTask+vblCount(A0)

 ; Make xDoTask non-zero
 MOVE.W #1,XVBLRec+xDoTask(A0)

 ; Exit Task
 RTS

ENDWITH
ENDP
 END  ; For Assembler
Listing:  slotvbltaskdemo.p

PROGRAM SlotVBLTaskDemo;

USES
 MemTypes, QuickDraw, OSIntf, ToolIntf;

{ Declare our external vbl task }
PROCEDURE MyVBLTask; EXTERNAL;

CONST
 F =  False;
 T =  True;
 kBallSpeed =  4;

TYPE
 XVBLRec= RECORD
 xVBLTask : VBLTask;
 xDoTask: INTEGER;
 END;

VAR
 gDone  : BOOLEAN;
 gVideoInfoRec : DefVideoRec;
 gEvt : EventRecord;
 gFontInfo: FontInfo;
 gBoxDir: INTEGER;
 gBoxRect : Rect;
 gBoxColor: RGBColor;
 gBoxString :  Str255;

 gDragRect,
 gRect  : Rect;
 gMainWindow:  WindowPtr;
 gWRec  : WindowRecord;

 gXVBLRec : XVBLRec;

{ Proc to run if a crash occurs }
PROCEDURE Crash;
BEGIN
 ExitToShell;
END;

{ Proc that does MacInits }
PROCEDURE MacInits;
BEGIN
 MaxApplZone;

 MoreMasters;
 MoreMasters;
 MoreMasters;
 MoreMasters;

 InitGraf (@thePort);
 InitFonts;
 InitWindows;
 InitMenus;
 TEInit;
 InitDialogs (@Crash);
 InitCursor;
END;

{ Proc that sets up our window }
PROCEDURE SetUpWindows;
BEGIN
 gRect := ScreenBits.bounds;
 WITH gRect DO BEGIN
 left := left + 20;
 right := left + 400;
 top := top + 40;
 bottom := bottom - 20;
 END;

 gMainWindow := NewCWindow (@gWRec, gRect,
 ‘SlotVBLTaskDemo - Click in this window to Exit’,
 T, noGrowDocProc, WindowPtr (-1), F, 0);
 SetPort (gMainWindow);
END;

{ Proc that sets up the box for our ball }
PROCEDURE SetUpBox;
VAR
 width  : INTEGER;
BEGIN
 gBoxDir := kBallSpeed;

 gBoxString := ‘I love you Manu’;

 width := StringWidth (gBoxString);

 GetFontInfo (gFontInfo);

 WITH gBoxRect DO BEGIN
 top := 10;
 bottom := top + gFontInfo.ascent + gFontInfo.descent;
 left := ((gRect.right - gRect.left) DIV 2) - (width DIV 2);
 right := left + width;
 END;

 WITH gBoxColor DO BEGIN
 red := -1;
 green := 0;
 blue := 0;
 END;

 RGBForeColor (gBoxColor);
END;

{ Proc that inits our globals }
PROCEDURE GlobalInits;
BEGIN
 SetUpWindows;
 SetUpBox;
 gDragRect := ScreenBits.bounds;
 InsetRect (gDragRect, 4, 4);

 gDone := F;
END;

{ Proc that cleans up before we exit }
PROCEDURE CleanUps;
BEGIN
 CloseWindow (gMainWindow);
END;

{ Func that makes sure we run in the currect environment }
FUNCTION EnvironmentOK : BOOLEAN;
VAR
 err  : OSErr;
 theWorld : SysEnvRec;
BEGIN
 EnvironmentOK := F; { Assume env is bad }

 err := SysEnvirons (curSysEnvVers, theWorld);

 IF (err = noErr) THEN BEGIN
 IF (theWorld.machineType >= envMacII) THEN
 EnvironmentOK := T;
 END; { IF }
END;

{ Func that sets up our vbl task }
FUNCTION VBLTaskSetUp : BOOLEAN;
VAR
 err  : OSErr;
BEGIN
 VBLTaskSetUp := F; { Assume we fail }

 GetVideoDefault (@gVideoInfoRec);

 WITH gXVBLRec DO BEGIN
 xDoTask := 0;

 WITH xVBLTask DO BEGIN
 qType := ORD (vType);
 vblAddr := @MyVBLTask;
 vblCount := 1;
 vblPhase := 0;
 END;

 err := SlotVInstall (@xVBLTask, gVideoInfoRec.sdSlot);
 IF (err = noErr) THEN
 VBLTaskSetUp := T; { We succeeded! }
 END;
END;

{ Proc that removes our vbl task }
PROCEDURE RemoveVBLTask;
VAR
 err  : OSErr;
BEGIN
 err := SlotVRemove (@gXVBLRec.xVBLTask, gVideoInfoRec.sdSlot);
END;

{ Proc that draws our window }
PROCEDURE DrawStuff;
VAR
 oldPort: GrafPtr;
BEGIN
 GetPort (oldPort);
 SetPort (gMainWindow);
 EraseRect (gBoxRect);

 WITH gBoxRect DO BEGIN
 top := top + gBoxDir;
 bottom := bottom + gBoxDir;
 END;

 IF (gBoxRect.bottom >= gWRec.port.portRect.bottom) THEN
 gBoxDir := -kBallSpeed
 ELSE BEGIN
 IF (gBoxRect.top <= gWRec.port.portRect.top) THEN
 gBoxDir := kBallSpeed;
 END;

 MoveTo (gBoxRect.left, gBoxRect.bottom - gFontInfo.descent);
 DrawString (gBoxString);

 SetPort (oldPort);
END;

{ Proc that handles mouse downs }
PROCEDURE DoMouseDown;
VAR
 result : INTEGER;
 whichWindow:  WindowPtr;
BEGIN
 result := FindWindow (gEvt.where, whichWindow);

 CASE result OF
 inContent:
 gDone := T;
 inDrag:
 DragWindow (whichWindow, gEvt.where, gDragRect);
 OTHERWISE
 END;
END;

{ Main }
BEGIN
 MacInits;

 IF (EnvironmentOK) THEN BEGIN
 GlobalInits;

 IF (VBLTaskSetUp) THEN BEGIN

 REPEAT
 IF NOT (WaitNextEvent (mDownMask, gEvt, 0, NIL)) THEN BEGIN
 IF (gXVBLRec.xDoTask <> 0) THEN BEGIN
 DrawStuff;
 gXVBLRec.xDoTask := 0;
 END;
 END
 ELSE
 DoMouseDown;
 UNTIL (gDone);
 RemoveVBLTask;
 END;
 CleanUps;
 END;

 ExitToShell; { Back to the Finder! (or MultiFinder) }
END.
Listing:  slotvbltaskdemo.r

#include “Types.r”
#define kMinSize 25/* application’s minimum size (in K) */
#define kPrefSize50/* application’s preferred size (in K) */

resource ‘SIZE’ (-1) {
 dontSaveScreen,
 acceptSuspendResumeEvents,
 enableOptionSwitch,
 canBackground,  /* we can background  */
 multiFinderAware,
 backgroundAndForeground,
 dontGetFrontClicks,
 ignoreChildDiedEvents,
 not32BitCompatible,
 reserved,
 reserved,
 reserved,
 reserved,
 reserved,
 reserved,
 reserved,
 kPrefSize * 1024,
 kMinSize * 1024 
};

 
AAPL
$100.96
Apple Inc.
-0.83
MSFT
$47.52
Microsoft Corpora
+0.84
GOOG
$596.08
Google Inc.
+6.81

MacTech Search:
Community Search:

Software Updates via MacUpdate

WhatRoute 1.13.0 - Geographically trace...
WhatRoute is designed to find the names of all the routers an IP packet passes through on its way from your Mac to a destination host. It also measures the round-trip time from your Mac to the... Read more
Chromium 37.0.2062.122 - Fast and stable...
Chromium is an open-source browser project that aims to build a safer, faster, and more stable way for all Internet users to experience the web. FreeSMUG-Free OpenSource Mac User Group build is... Read more
Attachment Tamer 3.1.14b9 - Take control...
Attachment Tamer gives you control over attachment handling in Apple Mail. It fixes the most annoying Apple Mail flaws, ensures compatibility with other email software, and allows you to set up how... Read more
Duplicate Annihilator 5.0 - Find and del...
Duplicate Annihilator takes on the time-consuming task of comparing the images in your iPhoto library using effective algorithms to make sure that no duplicate escapes. Duplicate Annihilator detects... Read more
jAlbum Pro 12.2 - Organize your digital...
jAlbum Pro has all the features you love in jAlbum, but comes with a commercial license. With jAlbum, you can create gorgeous custom photo galleries for the Web without writing a line of code!... Read more
jAlbum 12.2 - Create custom photo galler...
With jAlbum, you can create gorgeous custom photo galleries for the Web without writing a line of code! Beginner-friendly, with pro results Simply drag and drop photos into groups, choose a design... Read more
Quicken 2015 2.0.4 - Complete personal f...
Quicken 2015 helps you manage all your personal finances in one place, so you can see where you're spending and where you can save. Quicken automatically categorizes your financial transactions,... Read more
iMazing 1.0 - Complete iOS device manage...
iMazing (formerly DiskAid) is the ultimate iOS device manager with capabilities far beyond what iTunes offers. With iMazing and your iOS device (iPhone, iPad, or iPod), you can: Copy music to and... Read more
Xcode 6.0.1 - Integrated development env...
Apple Xcode is Apple Computer's integrated development environment (IDE) for OS X. The full Xcode package is free to ADC members and includes all the tools you need to create, debug, and optimize... Read more
Apple Safari 7.1 - Apple's Web brow...
Apple Safari in OS X Mavericks brings you all-new ways to find and enjoy the best of the web. It works with iCloud to give you a seamless browsing experience across all your devices. It looks out for... Read more

Latest Forum Discussions

See All

View Source – HTML, JavaScript and CSS...
View Source – HTML, JavaScript and CSS 1.0 Device: iOS Universal Category: Utilities Price: $.99, Version: 1.0 (iTunes) Description: View Source is an app plus an iOS 8 Safari extension that makes it easy to do one key web developer... | Read more »
Avenged Sevenfold’s Hail To The King: De...
Avenged Sevenfold’s Hail To The King: Deathbat is Coming to iOS on October 16th Posted by Jessica Fisher on September 19th, 2014 [ permalink ] Just in time for Halloween, on October 16 Avenged Sevenfold will be launching | Read more »
Talisman Has Gone Universal – Can Now be...
Talisman Has Gone Universal – Can Now be Played on the iPhone Posted by Jessica Fisher on September 19th, 2014 [ permalink ] | Read more »
Tap Army Review
Tap Army Review By Jennifer Allen on September 19th, 2014 Our Rating: :: SHOOT EM ALLUniversal App - Designed for iPhone and iPad Mindless but fun, Tap Army is a lane-based shooter that should help you relieve some stress.   | Read more »
Monsters! Volcanoes! Loot! Epic Island f...
Monsters! Volcanoes! Loot! | Read more »
Plunder Pirates: Tips, Tricks, Strategie...
Ahoy There, Seadogs: Interested in knowing our thoughts on all this plundering and pirating? Check out our Plunder Pirates Review! Have you just downloaded the rather enjoyable pirate-em-up Plunder Pirates and are in need of some assistance? Never... | Read more »
Goat Simulator Review
Goat Simulator Review By Lee Hamlet on September 19th, 2014 Our Rating: :: THE GRUFFEST OF BILLY GOATSUniversal App - Designed for iPhone and iPad Unleash chaos as a grumpy goat in this humorous but short-lived casual game.   | Read more »
A New and Improved Wunderlist is Here fo...
A New and Improved Wunderlist is Here for iOS 8 Posted by Jessica Fisher on September 19th, 2014 [ permalink ] Universal App - Designed for iPhone and iPad | Read more »
Evernote Update for iOS 8 Adds Web Clipp...
Evernote Update for iOS 8 Adds Web Clipping, Quick Notes, and More Posted by Ellis Spice on September 19th, 2014 [ permalink ] | Read more »
Apple Names Ultimate Productivity Bundl...
Apple Names Ultimate Productivity Bundle by Readdle as the Essential Bundle on the App Store Posted by Jessica Fisher on September 19th, 2014 [ permalink | Read more »

Price Scanner via MacPrices.net

Mac Pros available for up to $260 off MSRP
Adorama has Mac Pros on sale for up to $260 off MSRP. Shipping is free, and Adorama charges sales tax in NY & NJ only: - 4-core Mac Pro: $2839.99, $160 off MSRP - 6-core Mac Pro: $3739.99, $260... Read more
13-inch 2.6GHz/256GB Retina MacBook Pros avai...
B&H Photo has the 13″ 2.6GHz/256GB Retina MacBook Pro on sale for $1379 including free shipping plus NY sales tax only. Their price is $120 off MSRP. Read more
Previous-generation 15-inch 2.0GHz Retina Mac...
B&H Photo has leftover previous-generation 15″ 2.0GHz Retina MacBook Pros now available for $1599 including free shipping plus NY sales tax only. Their price is $400 off original MSRP. B&H... Read more
21″ 2.7GHz iMac available for $1179, save $12...
Adorama has 21″ 2.7GHz Hawell iMacs on sale for $1179.99 including free shipping. Their price is $120 off MSRP. NY and NJ sales tax only. Read more
iOS 8 Adoption Rate Slower than iOS 7, 6, Hit...
Apple began pushing out iOS 8 updates to eligible devices around 1pm ET on September 17, 2014. However, unlike with iOS 7, which boasted a wide variety of differences from its predecessor iOS 6, in... Read more
LIkely Final Definitive OS X 10.9.5 Mavericks...
Apple has released what will almost certainly be the last incremental version number update of OS X 10.9 Mavericks (save for futire security updates) before OS X 10.10 Yosemite is released next month... Read more
Fingerprints, Apple Pay and Identity Theft Wa...
On Sep 9th, CEO Tim Cook unveiled Apple Pay, along with the new iPhone 6 and iWatch. Apple Pay is a newly developed technology that utilizes a near field communication (NFC) to enable customer... Read more
Amazon Introduces Two All-New Kindles
Amazon on Thursday introduced the 7th generation of its Kindle dedicated e-reader device: Kindle Voyage, its top-of-the-line e-reader, and the new $79 Kindle, with a 20% faster processor, twice the... Read more
Save up to $300 on the price of a new Mac wit...
Purchase a new Mac or iPad at The Apple Store for Education and take up to $300 off MSRP. All teachers, students, and staff of any educational institution qualify for the discount. Shipping is free,... Read more
13-inch 2.8GHz Retina MacBook Pro available f...
B&H Photo has the new 2014 13″ 2.8GHz Retina MacBook Pro on sale for $1699.99 including free shipping plus NY sales tax only. They’ll also include free copies of Parallels Desktop and LoJack for... Read more

Jobs Board

Project Manager, *Apple* Financial Services...
**Job Summary** Apple Financial Services (AFS) offers consumers, businesses and educational institutions ways to finance Apple purchases. We work with national and Read more
*Apple* Retail - Multiple Positions (US) - A...
Sales Specialist - Retail Customer Service and Sales Transform Apple Store visitors into loyal Apple customers. When customers enter the store, you're also the Read more
*Apple* Retail - Multiple Positions (US) - A...
Sales Specialist - Retail Customer Service and Sales Transform Apple Store visitors into loyal Apple customers. When customers enter the store, you're also the Read more
*Apple* Retail - Multiple Positions (US) - A...
Sales Specialist - Retail Customer Service and Sales Transform Apple Store visitors into loyal Apple customers. When customers enter the store, you're also the Read more
*Apple* Retail - Multiple Positions (US) - A...
Sales Specialist - Retail Customer Service and Sales Transform Apple Store visitors into loyal Apple customers. When customers enter the store, you're also the Read more
All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.