TweetFollow Us on Twitter

Foundation Of Quickdraw
Volume Number:1
Issue Number:2
Column Tag:features of Mac Pascal

QuickDraw Graphics

By Chris Derossi

One of the most valuable features of Mac Pascal is it ability to take advantage of the Macintosh’s powerful ROM capabilities. To do this, Mac Pascal must be able to access the various routines that are contained within the Mac Toolbox. In this month’s column, we will examine the interface between Mac Pascal and the ROM, and the necessary data structures for accessing quickdraw. Finally, a sample program is included which makes use of quickdraw’s graphics routines.

In order to communicate to the Toolbox, several data structures have to be defined. These data structures are all presented in Pascal format because the routines contained in the Mac ROM are constructed for a Pascal environment. Unlike other programming languages, this makes data compatiblitly pretty much straight forward for Mac Pascal users. But before we get into the details, let’s briefly describe some of the theory behind QuickDraw.

FOUNDATION OF QUICKDRAW

QuickDraw graphics exist in cartesian coordinate planes. What this means is that graphics may be present on any portion of a continuous surface. The QuickDraw planes are finite, and extend from values -32768 to 32767 in both the vertical and horizontal directions. The smallest unit of distance that QuickDraw can work with is 1. An area of 1 by 1 is, therefore, a point. The boundary separating two points at sequential locations of the plane is of size zero. This means that two points placed next to each other are continuous, and have no space between them. Keep in mind that these are theoretical concepts, not screen bit-map specifications.

QUICKDRAW DATA STRUCTURES

In Mac Pascal, the data structure ‘Point’ is a record with two components representing the coordinates of the upper left corner of a point. The two fields of Point are Point.h and Point.v which are the horizontal and vertical coordinates respectively. Each value is of type Integer.

The rectangle is a common object found in QuickDraw. Rectangles are frequently used to create windows, define drawing areas, and to provide parameters for manipualting other objects. A rectangle has four parameters. These are: Top, Left, Bottom, and Right. These parameters may be thought of as four integers, or as the two points TopLeft and BottomRight. In actuality, the second method is used, and the type ‘Rect’ is defined as a record with the two fields Rect.TopLeft and Rect.BotRight. Each of the fields is of type point.

Another object defined with points is the line. Although there is no Mac Pascal data type for this object, it can be characterized by two points, for the beginning and ending positions of the line.

The final data type we will examine this month is the pattern. QuickDraw allows regions to be filled with patterns, as is done with the paint bucket in MacPaint. A pattern is a set of sixty-four points either on or off, arranged in an eight by eight square. To fill an area larger than eight by eight, the Macintosh repeats the pattern both vertically and horizontally as many times as neccessary. The upper left corner of the pattern is aligned with the coordinate (0,0), and is independent of the coordinates of the area being filled.

Since a byte is eight bits, and a bit represents one point, patterns can be represented as a series of eight bytes. In Mac Pascal, the type ‘Pattern’ is an array [0..7] of 0..255, which is effectively eight sequential bytes. There are some predefined patterns including White, Black, and Grey.

DRAWING IN QUICKDRAW

The drawing mechanism in QuickDraw is the Pen. The pen has modifyable properties which include location, width, height, and pattern. There are further properties which will be covered in a later column. A pen of width and height of one, and a pattern of black will always draw with one-point wide, black lines.

In addition to the many objects of QuickDraw, many actions are available to be performed on or with them. Most objects may be Framed, Painted, Filled, and Erased. The QuickDraw actions are called QuickDraw verbs, and they are applied to objects. The verb Frame specifies that the outline of the given object should be drawn. The verb Paint means that the object is drawn completely filled. Each of these actions use the pen for drawing, and as such use the current pen pattern. The verb Erase does not use the pen pattern, but instead uses the pattern currently set for the background. Fill allows you to specify a pattern to use, and is therefore a little bit more versatile than Paint.

For example, FrameRect will draw the outline of a rectangle, while PaintRect will draw a solid rectangle. FillRect will draw a solid rectangle in the given pattern. EraseRect clears the given rectangle to the current background pattern.

Each verb-object combination is a procedure, and takes applicable parameters. The Rect procedures take a rectangle as their only parameter. The FillRect procedure needs a Rect first, and a Pattern second. The rectangle is drawn as a solid with the pattern.

A frequently encountered situation is one where the Macintosh needs to know if a given point is inside a particular rectangle. (i.e. is the mouse’s position inside a certain window?) To satisfy this need, a function titled PtInRect returns a boolean of True if the point is inside the rectangle, and False if not. The parameters of this function are a point first, and then a rectangle.

PROGRAMMING EXAMPLE

Now let us examine the example program that makes use of these data structures, procedures, and functions. The operation of the program is fairly simple and straight forward. The user is presented with a blank background and the mouse pointer. The user forms rectangles by pressing the mouse button when the pointer is at one of the rectangle’s corners, and holds the button down while dragging the mouse to the opposite diagonal corner. In order to provide some feedback about the shape of the rectangle, a ‘rubber banding’ diagonal line follows the mouse until the button is released. When the button is released, the rubber band line is removed, and the rectangle is drawn.

WHERE’S THE MOUSE?

After the rectangle is drawn, the user may place the mouse pointer inside the rectangle, and press the button. As long as the button is held, the Mac continually fills the rectangle with random, changing patterns. Once the mouse button is pressed outside of the rectangle, the pattern is frozen, and a new rectangle is begun. (Please see the sample output in fig. 1.)

The construction of the program is not complex. The variable declarations for the main program consist of three points and one rectangle. The points are used as work variables for reading the mouse location, and the rectangle is the one currently being drawn or filled.

The main program calls two procedures. The first one allows the user to create the rectangle, and provides the rubberbanding effect. The second one creates random patterns and fills the rectangle.

Since the value of a rectangle’s Top must be less than or equal to that of its bottom, two procedures called ‘Min’ and ‘Max’ help keep the points in the right order. The same holds true for the Left and Right values.

The key procedure calls in the Make_Rect procedure are Button, GetMouse, DrawLine, PenPat, FrameRect, and InsetRect. The function Button returns True if the mouse button is pressed, and False if not. GetMouse uses two VAR parameters for obtaining the current horizontal and vertical position of the mouse pointer.

Since we need to draw and erase the rubberbanding line, we use the two pen patterns of Black and White. This has the disadvantage of erasing whatever the line passes over, but you can’t have everything in a simple little program. The procedure PenPat sets the working pen pattern to the passed value.

DrawLine uses two points, this time in the form of four coordinates, to designate the starting and ending points of the line. DrawLine, of course, uses the current pen pattern.

Finally, after the mouse button is released, the rectangle is drawn with FrameRect. This is done with the pen pattern set to black. Since we don’t want to draw over the outline with subsequent FillRect calls, the procedure InsetRect is called to change the coordinates of the rectangle by one on each side, making it slightly smaller.

After the rectangle is drawn, the Fill_Rect procedure is called to fill it in. Note, please, that Fill_Rect is distinct from FillRect. Fill_Rect uses the calls Button, GetMouse, PtInRect, Random, and FillRect to perform its task. Button and GetMouse are used as before. PtInRect determines if the mouse is inside the new rectangle when the button is depressed.

A new pattern is created by calling the function Random eight times within a loop. Random returns a value from -32768 and 32767. Abs and Mod are used to bring the random number in the range 0..255. After the random pattern is created, FillRect is called to draw the pattern into the rectangle.

MODIFYING THE PROGRAM

The program runs forever, and the menu option Halt must be chosen to exit. In order to overcome this, you might want to modify the program to present you with a Black or Grey box (read rectangle) where you’d click the mouse to quit. Where in the program would you draw the rectangle? At what point or points would you have to check to see if it has been clicked? How will you handle rectangles that overlap your ‘exit’ box? These exercises are left to the student!

That’s it for this month. In the next column, we’ll further explore the powerful features of QuickDraw, and find out what makes it so unique and wonderful among graphic tools. We’ll also have another program that utilizes these terrific features. If you like our Pascal column or have programming ideas of your own to contribute, please feel free to write me care of MacTech. Ciao.

program MacTutor_QD_Demo;

{ This program will use the standard features of } {QuickDraw to introduce 
use of QuickDraw data} {structures and routine calls from MacPascal.} 

{ -- By Chris Derossi}

 var
  P1, P2, P3 : Point;
  WorkingRect : Rect;

 function Min (Num1, Num2 : integer) : integer;

{ return the minimum of the two numbers passed.}

 begin
  if Num1 < Num2 then
   Min := Num1
  else
    Min := Num2;
 end;

 function Max (Num1, Num2 : integer) : integer;

{ returns the maximum of two numbers passed.}

 begin
  if Num1 > Num2 then
  Max := Num1
  else
    Max := Num2;
 end;

 procedure Make_Rect (var theRect : Rect);

{ This is the first of the two main procedure. It} 
{allows the user to select diagonal corners of the} 
{rectangle to be drawn, using a ‘rubber band’ line.} 
{When the button is released, the recatangle is} 
{drawn.}

 begin
  repeat
   until Button;  {Wait till the button is pressed}
  GetMouse(P1.h, P1.v); {Where was the mouse?}
  P2 := P1;
  P3 := P1;
  while Button do  {update while button is down.}
   begin
      GetMouse(P3.h, P3.v);
    if (P2.h <> P3.h) or (P2.v <> p3.v) then  
 {the mouse has moved}
    begin
        PenPat(White);
      DrawLine(P1.h, P1.v, P2.h, P2.v);  
 {Erase the old line}
      PenPat(Black);
    DrawLine(P1.h, P1.v, P3.h, P3.v);  
 {Draw the new line}
    P2 := P3;
    end;
   end;

  PenPat(White);  {Erase line for the last time.}
  DrawLine(P1.h, P1.v, P2.h, P2.v);
  PenPat(Black);
  theRect.TopLeft.v := Min(P1.v, P2.v); 
  
{Set the rectangle, making sure}
  theRect.TopLeft.h := Min(P1.h, P2.h);   
{that the top is above the bottom}
  theRect.BotRight.v := Max(P1.v, P2.v); 
{and the left is less than the}
  theRect.BotRight.h := Max(P1.h, P2.h); {right.}

  FrameRect(theRect);   {Draw the rectangle}
  InsetRect(theRect, 1, 1);  
{Shrink it so that the pattern does not draw}
 {over the rectangle frame.}
 end;

 procedure Fill_Rect (theRect : Rect);

  var
   myPat : Pattern;
   Index : Integer;
   Done : Boolean;

 begin
  Done := False;
  while not Done do  
{continue until the mouse is outside of the}
   {new rectangle.}
   begin
    repeat
      until Button;   {Wait for the button}
    GetMouse(P1.h, P1.v);
    if PtInRect(P1, theRect) then  
{is the mouse in the rectangle?}
    begin
    for Index := 0 to 7 do
     myPat[Index] := Abs(Random) mod 256; {make a random pattern}
     FillRect(theRect, myPat);  {Fill the rectangle}
    end
    else
    Done := True;
   end; {While}
 end; {Fill_Rect}


begin  {Main Program}
 while true do
  begin
    Make_Rect(WorkingRect);
    Fill_Rect(WorkingRect);
  end;
end.   {Main}

 

Community Search:
MacTech Search:

Software Updates via MacUpdate

Together 3.6.1 - Store and organize all...
Together helps you organize your Mac, giving you the ability to store, edit and preview your files in a single clean, uncluttered interface. Features Smart storage. With simple drag-and-drop... Read more
Cloud 4.1.1 - File sharing from your men...
Cloud is simple file sharing for the Mac. Drag a file from your Mac to the CloudApp icon in the menubar and we take care of the rest. A link to the file will automatically be copied to your clipboard... Read more
OmniFocus 2.7.1 - GTD task manager with...
OmniFocus helps you manage your tasks the way that you want, freeing you to focus your attention on the things that matter to you most. Capturing tasks and ideas is always a keyboard shortcut away in... Read more
CleanApp 5.1.1 - Application deinstaller...
CleanApp is an application deinstaller and archiver.... Your hard drive gets fuller day by day, but do you know why? CleanApp 5 provides you with insights how to reclaim disk space. There are... Read more
ForkLift 3.0 Beta 2 - Powerful file mana...
ForkLift is a powerful file manager and ferociously fast FTP client clothed in a clean and versatile UI that offers the combination of absolute simplicity and raw power expected from a well-executed... Read more
Sublime Text 3126 - Sophisticated text e...
Sublime Text is a sophisticated text editor for code, markup, and prose. You'll love the slick user interface, extraordinary features, and amazing performance. Features Goto Anything. Use Goto... Read more
1Password 6.3.3 - Powerful password mana...
1Password is a password manager that uniquely brings you both security and convenience. It is the only program that provides anti-phishing protection and goes beyond password management by adding Web... Read more
WhatsApp 0.2.1880 - Desktop client for W...
WhatsApp is the desktop client for WhatsApp Messenger, a cross-platform mobile messaging app which allows you to exchange messages without having to pay for SMS. WhatsApp Messenger is available for... Read more
NeoFinder 6.9.3 - Catalog your external...
NeoFinder (formerly CDFinder) rapidly organizes your data, either on external or internal disks, or any other volumes. It catalogs all your data, so you stay in control of your data archive or disk... Read more
Amadeus Pro 2.3.1 - Multitrack sound rec...
Amadeus Pro lets you use your Mac computer for any audio-related task, such as live audio recording, digitizing tapes and records, converting between a variety of sound formats, etc. Thanks to its... Read more

How to Rule With a Firm Hand in My Majes...
My Majesty is a kingdom management sim not unlike August’s magisterial hit, Reigns. It’s essentially a reskin of developer Tigrido’s previous management sim, Dictator. As supreme ruler of the land, you must consult with a number of subjects to... | Read more »
Our 5 Favorite iMessage Sticker Packs
At long last, iMessage joins the ranks of messaging apps the likes of LINE and Whatsapp, adding an impressive collection of stickers. They’re a great way to add a little something extra to your daily conversations. [Read more] | Read more »
How to get past Vulture Island's tr...
Vulture Island is a colorful and quirky mish-mash of platforming and puzzles. It’s creative and fresh, but sometimes the game can throw a curveball at you, leaving you stuck as to how you should progress. These tips will help you explore smoothly... | Read more »
The new Clash of Kings is just for Weste...
If you’ve played the original Clash of Kings, you’ll probably recognise the city building, alliance forging and strategic battles in Clash of Kings: The West. What sets this version apart is that it’s tailor made for a Western audience and the... | Read more »
Frost - Survival card game (Games)
Frost - Survival card game 1.12.1 Device: iOS Universal Category: Games Price: $3.99, Version: 1.12.1 (iTunes) Description: *Warning: the game will work on iPhone 5C and above and iPad Pro / 4. Other devices are not supported* | Read more »
How to build and care for your team in D...
Before you hit the trail and become a dog sledding legend, there’s actually a fair bit of prep work to be done. In Dog Sled Saga, you’re not only racing, you’re also building and caring for a team of furry friends. There’s a lot to consider—... | Read more »
How to win every race in Dog Sled Saga
If I had to guess, I’d say Dog Sled Saga is the most adorable racing game on the App Store right now. It’s a dog sled racing sim full of adorable, loyal puppies. Just look at those fluffy little tails wagging. Behind that cute, pixelated facade is... | Read more »
Let the war games commence in Gunship Ba...
Buzz Lightyear famously said, “This isn’t flying, this is falling – with style!” In the case of Gunship Battle: Second War, though, this really is flying - with style! The flight simulator app from Joycity puts you in control of 20 faithfully... | Read more »
How to get a high score in Fired Up
Fired Up is Noodlecake Games’ high score chasing, firefighting adventure. You take control of a wayward firefighter who propels himself up the side of a highrise with blasts of water. Sound silly? It is. It’s also pretty difficult. You can’t... | Read more »
NBA 2K17 (Games)
NBA 2K17 1.0 Device: iOS iPhone Category: Games Price: $7.99, Version: 1.0 (iTunes) Description: Following the record-breaking launch of NBA 2K16, the NBA 2K franchise continues to stake its claim as the most authentic sports video... | Read more »

Price Scanner via MacPrices.net

15-inch 2.2GHz Retina MacBook Pro on sale for...
B&H Photo has the 2015 15″ 2.2GHz Retina MacBook Pro (MJLQ2LL/A) on sale for $1799, including free shipping plus NY sales tax only. Amazon also has the 2015 15″ 2.2GHz Retina MacBook Pro (... Read more
Toughbook Celebrates 20 Years of Ruggedized M...
Panasonic System Communications Company of North America, Division of Panasonic Corporation of North America (Panasonic) today celebrates the 20th anniversary of its industry-leading Toughbook mobile... Read more
12-inch 1.1GHz Gray Retina MacBook on sale fo...
B&H Photo has the 2016 12″ 1.1GHz Gray Retina MacBook on sale for $1199.99 including free shipping plus NY sales tax only. Their price is $100 off MSRP. Read more
13-inch 2.5GHz MacBook Pro (Apple refurbished...
Apple has Certified Refurbished 13″ 2.5GHz MacBook Pros available for $829, or $270 off the cost of new models. Apple’s one-year warranty is standard, and shipping is free: - 13″ 2.5GHz MacBook Pros... Read more
Save 30% on Camera Guard’s Secure Protection...
To celebrate the release of macOS Sierra, Miami-based security solutions company, ProtectStar has announced a special 30% discount on Camera Guard Professional for Mac 2016. This innovative security... Read more
DVDFab Special Deal – Get a 1-Year Free Licen...
Beijing, China based specialist in the field of DVD, Blu-ray and video backup solutions, Fengtao Software has launched its Autumn Special Deals 2016, giving a 1-year free license of a randomly picked... Read more
21-inch iMacs on sale for up to $120 off MSRP
B&H Photo has 21″ iMacs on sale for up to $120 off MSRP including free shipping plus NY sales tax only: - 21″ 3.1GHz iMac 4K: $1379 $120 off MSRP - 21″ 2.8GHz iMac: $1199.99 $100 off MSRP - 21″ 1... Read more
13-inch 2.7GHz/256GB Retina MacBook Pro on sa...
Amazon.com has the 13″ 2.7GHz/256GB Retina Apple MacBook Pro on sale for $151 off MSRP including free shipping: - 13″ 2.7GHz/256GB Retina MacBook Pro (sku MF840LL/A): $1348 $151 off MSRP Read more
Apple TVs on sale for up to $50 off MSRP
Best Buy has 32GB and 64GB Apple TVs on sale for $40-$50 off MSRP on their online store. Choose free shipping or free local store pickup (if available). Sale prices for online orders only, in-store... Read more
Apple refurbished 13-inch Retina MacBook Pros...
Apple has Certified Refurbished 13″ Retina MacBook Pros available for up to $270 off the cost of new models. An Apple one-year warranty is included with each model, and shipping is free: - 13″ 2.7GHz... Read more

Jobs Board

Restaurant Manager (Neighborhood Captain) - A...
…in every aspect of daily operation. WHY YOU'LL LIKE IT: You'll be the Big Apple . You'll solve problems. You'll get to show your ability to handle the stress and Read more
Sr. *Apple* Mac Engineer - Net2Source Inc....
…staffing, training and technology. We have following position open with our client. Sr. Apple Mac Engineer6+ Months CTH Start date : 19th Sept Travelling Job If Read more
*Apple* Retail - Multiple Positions-Norfolk,...
Job Description: Sales Specialist - Retail Customer Service and Sales Transform Apple Store visitors into loyal Apple customers. When customers enter the store, Read more
Restaurant Manager (Neighborhood Captain) - A...
…in every aspect of daily operation. WHY YOU'LL LIKE IT: You'll be the Big Apple . You'll solve problems. You'll get to show your ability to handle the stress and Read more
Lead *Apple* Solutions Consultant - Apple (...
# Lead Apple Solutions Consultant Job Number: 51829230 Detroit, Michigan, United States Posted: Sep. 19, 2016 Weekly Hours: 40.00 **Job Summary** The Lead ASC is an Read more
All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.