/*------------------------------------------------------------------------------
#
#	Macintosh Developer Technical Support
#
#	Simple Color QuickDraw Sample Application
#
#	SillyBalls
#
#	SillyBalls.c	-	C Source
#
#	Copyright © 1988 Apple Computer, Inc.
#	All rights reserved.
#
#	Versions:	1.0					8/88
#
#	Components:	SillyBalls.c		August 1, 1988
#				SillyBalls.make		August 1, 1988
#
#	This is a very simple sample program that demonstrates how to use Color 
#	QuickDraw.  It is about two pages of code, and does nothing more than open
#	a color window and draw randomly colored ovals in the window.
#	
#	The purpose is to show how to get some initial results with Color QuickDraw.
#	It is a complete program and is very short to be as clear as possible.
#	
#	It does not have an Event Loop.  It is not fully functional in the sense that
#	it does not do all the things you would expect a well behaved Macintosh 
#	program to do, like size the window naturally, have an event loop, use menus, 
#	etc.
#
#	See Sample and TESample for the general structure and MultiFinder techniques that
#	we recommend that you use when building a new application.
#
------------------------------------------------------------------------------*/

	
//	Version 1.0:	6/2/88
//					7/20/88	 DJB	Converted to C
//	
//	purpose		To demonstrate a simple color App using Color QuickDraw.
//						It draws colored balls in a color window, then uses colored
//						text inverted in the ball.  The ball location and color is Random.
//						
//						This program was written by Bo3b Johnson, 1/88.
//						
//						The inverted Bob text was a Skippy Blair special concept,
//						kept for obvious aesthetic reasons.

//MW -cut out some other program descriptions.-

//MW ** Metrowerks note **
//   All changed code by Metrowerks is commented by "//MW".
//   There is one type of modification to the original source:
//   ¥ Added argument type and return type to function definitions.
//	   In order to pass with extended error checking on.
//	
//   8/31/93 JA


#include <Types.h>
#include <Memory.h>
#include <Quickdraw.h>
#include <Fonts.h>
#include <Events.h>
#include <Menus.h>
#include <Windows.h>
#include <TextEdit.h>
#include <Dialogs.h>
#include <OSUtils.h>
#include <ToolUtils.h>
#include <SegLoad.h>
#include <Sound.h>

/* Constants */
#define BallWidth		20
#define BallHeight		20
#define BobSize			8		/* Size of text in each ball */

/* Globals */
Rect	windRect;
	
/* Prototypes */
void Initialize(void);
void NewBall(void);

// 
//	Main body of program SillyBalls
//

//MW specified argument and return type.
int main(void)
{
	Initialize();
	
	do {
		NewBall();
	} while (!Button());

	return 0;	
}

// 
//	Initialize everything for the program, make sure we can run
//

//MW specified argument and return type.
void Initialize(void)
{
	WindowPtr	mainPtr;
	OSErr		error;
	SysEnvRec	theWorld;
		
	//
	//	Test the computer to be sure we can do color.  
	//	If not we would crash, which would be bad.  
	//	If we canÕt run, just beep and exit.
	//

	error = SysEnvirons(1, &theWorld);
	if (theWorld.hasColorQD == false) {
		SysBeep(50);
		ExitToShell();					/* If no color QD, we must leave. */
	}
	
	/* Initialize all the needed managers. */
	InitGraf(&qd.thePort);
	InitFonts();
	InitWindows();
	InitMenus();
	TEInit();
	InitDialogs(nil);
	InitCursor();

	//
	//	To make the Random sequences truly random, we need to make the seed start
	//	at a different number.  An easy way to do this is to put the current time
	//	and date into the seed.  Since it is always incrementing the starting seed
	//	will always be different.  DonÕt for each call of Random, or the sequence
	//	will no longer be random.  Only needed once, here in the init.
	//
	GetDateTime((unsigned long*) &qd.randSeed);

	//
	//	Make a new window for drawing in, and it must be a color window.  
	//	The window is full screen size, made smaller to make it more visible.
	//
	windRect = qd.screenBits.bounds;
	InsetRect(&windRect, 50, 50);
	mainPtr = NewCWindow(nil, &windRect, "\pBob Land", true, documentProc, 
						(WindowPtr) -1, false, 0);
		
	SetPort(mainPtr);						/* set window to current graf port */
	TextSize(BobSize);						/* smaller font for drawing. */
}


// 
//	NewBall: make another ball in the window at a random location and color.
//

//MW -specified argument and return type.-
void NewBall(void)
{
	RGBColor	ballColor;
	Rect		ballRect;
	long int	newLeft,
				newTop;
	
	// 
	//	Make a random new color for the ball.
	//
	ballColor.red   = (unsigned short)Random();
	ballColor.green = (unsigned short)Random();
	ballColor.blue  = (unsigned short)Random();
	
	// 
	//	Set that color as the new color to use in drawing.
	//
	RGBForeColor (&ballColor);

	//	
	//	Make a Random new location for the ball, that is normalized to the window size.  
	//	This makes the Integer from Random into a number that is 0..windRect.bottom
	//	and 0..windRect.right.  They are normalized so that we don't spend most of our
	//	time drawing in places outside of the window.
	//
	newTop = Random();	newLeft = Random();
	newTop = ((newTop+32767) * windRect.bottom)/65536;
	newLeft = ((newLeft+32767) * windRect.right)/65536;
	SetRect(&ballRect, (short)newLeft, (short)newTop, (short)(newLeft+BallWidth), (short)(newTop+BallHeight));
	
	//
	//	Move pen to the new location, and paint the colored ball.
	//
	MoveTo((short)newLeft, (short)newTop);
	PaintOval (&ballRect);
	
	//
	//	Move the pen to the middle of the new ball position, for the text
	//
	MoveTo((short)(ballRect.left + BallWidth/2 - BobSize), 
		(short)(ballRect.top + BallHeight/2 + BobSize/2 -1));
	
	//	
	//	Invert the color and draw the text there.  This wonÕt look quite right in 1 bit
	//	mode, since the foreground and background colors will be the same.
	//	Color QuickDraw special cases this to not invert the color, to avoid
	//	invisible drawing.
	//
	InvertColor(&ballColor); 
	RGBForeColor(&ballColor);
	DrawString("\pBob");
}
