mirror of
https://github.com/ctm/executor.git
synced 2024-11-15 13:05:51 +00:00
1 line
5.8 KiB
C
1 line
5.8 KiB
C
/*------------------------------------------------------------------------------
|
|
#
|
|
# 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");
|
|
}
|