Retired Document
Important: This sample code may not represent best practices for current development. The project may use deprecated symbols and illustrate technologies and techniques that are no longer recommended.
CodeWarrior (OS 9)/main.c
/* |
File: main.c |
Contains: |
Written by: EL |
Copyright: Copyright © 1992-1999 by Apple Computer, Inc., All Rights Reserved. |
You may incorporate this Apple sample source code into your program(s) without |
restriction. This Apple sample source code has been provided "AS IS" and the |
responsibility for its operation is yours. You are not permitted to redistribute |
this Apple sample source code as "Apple sample source code" after having made |
changes. If you're going to re-distribute the source, we require that you make |
it clear in the source that the code was descended from Apple sample source |
code, but that you've made changes. |
Change History (most recent first): |
08/2000 JM Carbonized, non-Carbon code is commented out |
for demonstration purposes. |
7/13/1999 KG Updated for Metrowerks Codewarror Pro 2.1 |
*/ |
#include "FX.h" |
#include <Fonts.h> |
#include <TextEdit.h> |
#include <Dialogs.h> |
#include <Resources.h> |
#include <TextUtils.h> |
#include <stdio.h> |
#include <string.h> |
/* Global Variable Definitions */ |
WindowPtr gWindow; |
GWorldPtr gGWorld = nil; |
int gCurrentExample = 11; |
itemType tItem[numTItems]; |
itemType aItem[numAItems]; |
itemType cItem[numCItems]; |
itemType dItem[numDItems]; |
itemType mItem[numMItems]; |
itemType bItem[numBItems]; |
itemType pItem[numPItems]; |
itemType lItem[numLItems]; |
itemSettings settings; |
void main() |
{ |
//MaxApplZone(); |
initMac(); |
createOffscreen( 1 ); |
createWindow(); |
resetItems(); |
defineItems(); |
eventLoop(); |
} |
void initMac() |
{ |
/*InitGraf( &qd.thePort ); |
InitFonts(); |
InitWindows(); |
InitMenus(); |
TEInit(); |
InitDialogs( nil );*/ |
InitCursor(); |
FlushEvents( 0, everyEvent ); |
setUpMenus(); |
} |
void createOffscreen(int pictItem) |
{ |
PicHandle pict; |
Rect rect; |
CGrafPtr currentPort; |
GDHandle currentDevice; |
if (gGWorld != nil) |
DisposeGWorld( gGWorld ); |
pict = (PicHandle)GetResource( 'PICT', pictItem + 127 ); |
rect = (**pict).picFrame; |
GetGWorld( ¤tPort, ¤tDevice ); |
NewGWorld( &gGWorld, 32, &rect, nil, nil, 0 ); |
//LockPixels( (*gGWorld).portPixMap ); |
LockPixels( GetPortPixMap(gGWorld)); |
SetGWorld( gGWorld, nil ); |
DrawPicture( pict, &rect ); |
SetGWorld( currentPort, currentDevice ); |
ReleaseResource( (Handle)pict ); |
} |
void createWindow() |
{ |
int width, height; |
int left, top; |
Rect rect; |
Rect tempRect1; |
BitMap bitMap; |
//width = 58 + ((*gGWorld).portRect.right - (*gGWorld).portRect.left) * 2; |
//height = 230 + (*gGWorld).portRect.bottom - (*gGWorld).portRect.top; |
GetPortBounds(gGWorld, &tempRect1); |
width = 58 + (tempRect1.right - tempRect1.left) * 2; |
height = 230 + tempRect1.bottom - tempRect1.top; |
//left = (((qd.screenBits.bounds.right - qd.screenBits.bounds.left) - width) / 2); |
//top = (((qd.screenBits.bounds.bottom - qd.screenBits.bounds.top) - height) / 2) + 20; |
tempRect1 = GetQDGlobalsScreenBits(&bitMap)->bounds; |
left = (((tempRect1.right - tempRect1.left) - width) / 2); |
top = (((tempRect1.bottom - tempRect1.top) - height) / 2) + 20; |
SetRect( &rect, left, top, left + width, top + height ); |
gWindow = NewCWindow( 0L, &rect, "\pQuickDraw Special Effects", true, noGrowDocProc, |
(WindowPtr)-1L, true, 0 ); |
//SetPort( gWindow ); |
SetPortWindowPort( gWindow ); |
} |
void resetItems() |
{ |
settings.tItem = 1; |
settings.aItem = 1; |
settings.cItem = 1; |
settings.mItem = 1; |
settings.dItem = 1; |
settings.pItem = 1; |
settings.lItem = 1; |
} |
void defineItems() |
{ |
int i; |
int col, row; |
char tNames[numTItems][15] = { "srcCopy", "srcOr", "srcXor", "srcBic", |
"notSrcCopy", "notSrcOr", "notSrcXor", "notSrcBic" }; |
char aNames[numAItems][15] = { "blend", "addPin", "addOver", "subPin", |
"adMax", "subMin", "adMin", "transparent" }; |
char cNames[numCItems][15] = { "None", "Inverse", "FG Only", "BG Only" }; |
char dNames[numDItems][15] = { "Dithering OFF", "Dithering ON" }; |
char mNames[numMItems][15] = { "None", "Search Proc", "ColorTable" }; |
char bNames[numBItems][15] = { "White", "Black", "White&Black" }; |
char pNames[numPItems][15] = { "SeedCFill", "SeedFill" }; |
char lNames[numLItems][15] = { "CalcCMask", "CalcMask" }; |
Rect tempRect1; |
settings.bItem = 1; |
col = 15; |
//row = (*gWindow).portRect.bottom - 157; |
row = GetPortBounds(GetWindowPort(gWindow), &tempRect1)->bottom - 157; |
for (i = 0; i < numTItems; i++) |
{ |
strcpy(P2CStr(tItem[i].label),tNames[i]); |
C2PStr((char *)tItem[i].label); |
SetRect( &tItem[i].rect, col + 40, row + (i * 15), |
col + 40 + 90, row + ((i + 1) * 15) ); |
} |
for (i = 0; i < numAItems; i++) |
{ |
strcpy(P2CStr(aItem[i].label),aNames[i]); |
C2PStr((char *)aItem[i].label); |
SetRect( &aItem[i].rect, col + 140, row + (i * 15), |
col + 140 + 90, row + ((i + 1) * 15) ); |
} |
for (i = 0; i < numCItems; i++) |
{ |
strcpy(P2CStr(cItem[i].label),cNames[i]); |
C2PStr((char *)cItem[i].label); |
SetRect( &cItem[i].rect, col + 240, row + (i * 15), |
col + 240 + 90, row + ((i + 1) * 15) ); |
} |
for (i = 0; i < numDItems; i++) |
{ |
strcpy(P2CStr(dItem[i].label),dNames[i]); |
C2PStr((char *)dItem[i].label); |
SetRect( &dItem[i].rect, col + 240, row + 90 + (i * 15), |
col + 240 + 90, row + 90 + ((i + 1) * 15) ); |
} |
for (i = 0; i < numMItems; i++) |
{ |
strcpy(P2CStr(mItem[i].label),mNames[i]); |
C2PStr((char *)mItem[i].label); |
SetRect( &mItem[i].rect, col + 340, row + (i * 15), |
col + 340 + 90, row + ((i + 1) * 15) ); |
} |
for (i = 0; i < numBItems; i++) |
{ |
strcpy(P2CStr(bItem[i].label),bNames[i]); |
C2PStr((char *)bItem[i].label); |
SetRect( &bItem[i].rect, col + 340, row + 75 + (i * 15), |
col + 340 + 90, row + 75 + ((i + 1) * 15) ); |
} |
for (i = 0; i < numPItems; i++) |
{ |
strcpy(P2CStr(pItem[i].label),pNames[i]); |
C2PStr((char *)pItem[i].label); |
SetRect( &pItem[i].rect, col + 440, row + (i * 15), |
col + 440 + 90, row + ((i + 1) * 15) ); |
} |
for (i = 0; i < numLItems; i++) |
{ |
strcpy(P2CStr(lItem[i].label),lNames[i]); |
C2PStr((char *)lItem[i].label); |
SetRect( &lItem[i].rect, col + 440, row + 60 + (i * 15), |
col + 440 + 90, row + 60 + ((i + 1) * 15) ); |
} |
} |
void updateWindow() |
{ |
long ticks; |
drawBackground(); |
drawAllItems(); |
drawExampleName(); |
drawSourceImage(); |
ticks = drawFXImage(); |
drawTime( ticks ); |
} |
void drawBackground() |
{ |
Rect rect; |
RGBColor color; |
Rect tempRect1; |
color.red = color.green = color.blue = 8700; |
RGBForeColor( &color ); |
//PaintRect( &(*gWindow).portRect ); |
PaintRect( GetPortBounds(GetWindowPort(gWindow), &tempRect1)); |
TextFont( kFontIDTimes ); |
TextMode( srcOr ); |
TextSize( 24 ); |
drawName( 85, 22, "\pSource Image" ); |
//drawName( (*gWindow).portRect.right - 215, 22, "\pNew Image" ); |
drawName( GetPortBounds(GetWindowPort(gWindow), &tempRect1)->right - 215, 22, "\pNew Image" ); |
/*SetRect( &rect, 15, (*gWindow).portRect.bottom - 180, |
(*gWindow).portRect.right - 15, (*gWindow).portRect.bottom - 30 );*/ |
GetPortBounds(GetWindowPort(gWindow), &tempRect1); |
SetRect( &rect, 15, tempRect1.bottom - 180, tempRect1.right - 15, tempRect1.bottom - 30); |
drawDeepBox( &rect ); |
TextSize( 12 ); |
drawName( tItem[0].rect.left, tItem[0].rect.top - 8, "\pTransfer Mode" ); |
drawName( aItem[0].rect.left, aItem[0].rect.top - 8, "\pArithmetic Mode" ); |
drawName( cItem[0].rect.left, cItem[0].rect.top - 8, "\pColorization" ); |
drawName( dItem[0].rect.left, dItem[0].rect.top - 8, "\pDither" ); |
drawName( mItem[0].rect.left, mItem[0].rect.top - 8, "\pColor Mapping" ); |
drawName( bItem[0].rect.left, bItem[0].rect.top - 8, "\pDestination" ); |
drawName( pItem[0].rect.left, pItem[0].rect.top - 8, "\pPaint Bucket" ); |
drawName( lItem[0].rect.left, lItem[0].rect.top - 8, "\pLasso Tool" ); |
} |
void drawAllItems() |
{ |
drawTransferItems(); |
drawArithmeticItems(); |
drawColorizeItems(); |
drawDitherItems(); |
drawMappingItems(); |
drawDestinationItems(); |
drawPaintBucketItems(); |
drawLassoToolItems(); |
} |
void drawTransferItems() |
{ |
int i; |
Boolean listEnabled; |
listEnabled = (gCurrentExample / 10 == transferID || gCurrentExample / 10 == customID); |
for (i = 0; i < numTItems; i++) |
drawItem( tItem[i].rect.left, tItem[i].rect.top, &tItem[i].label, |
listEnabled, settings.tItem == i + 1 ); |
} |
void drawArithmeticItems() |
{ |
int i; |
Boolean listEnabled; |
listEnabled = (gCurrentExample / 10 == arithmeticID); |
for (i = 0; i < numAItems; i++) |
drawItem( aItem[i].rect.left, aItem[i].rect.top, &aItem[i].label, |
listEnabled, settings.aItem == i + 1 ); |
} |
void drawColorizeItems() |
{ |
int i; |
Boolean listEnabled; |
listEnabled = (gCurrentExample / 10 == colorizationID || gCurrentExample / 10 == customID); |
for (i = 0; i < numCItems; i++) |
drawItem( cItem[i].rect.left, cItem[i].rect.top, &cItem[i].label, |
listEnabled, settings.cItem == i + 1 ); |
} |
void drawDitherItems() |
{ |
int i; |
Boolean listEnabled; |
listEnabled = (gCurrentExample / 10 == ditherID || gCurrentExample / 10 == customID); |
for (i = 0; i < numDItems; i++) |
drawItem( dItem[i].rect.left, dItem[i].rect.top, &dItem[i].label, |
listEnabled, settings.dItem == i + 1 ); |
} |
void drawMappingItems() |
{ |
int i; |
Boolean listEnabled; |
listEnabled = (gCurrentExample / 10 == searchProcID || gCurrentExample / 10 == customID); |
for (i = 0; i < numMItems; i++) |
drawItem( mItem[i].rect.left, mItem[i].rect.top, &mItem[i].label, |
listEnabled, settings.mItem == i + 1 ); |
} |
void drawDestinationItems() |
{ |
int i; |
for (i = 0; i < numBItems; i++) |
drawItem( bItem[i].rect.left, bItem[i].rect.top, &bItem[i].label, |
true, settings.bItem == i + 1 ); |
} |
void drawPaintBucketItems() |
{ |
int i; |
Boolean listEnabled; |
// listEnabled = (gCurrentExample / 10 == paintBucketID); |
listEnabled = false; |
for (i = 0; i < numPItems; i++) |
drawItem( pItem[i].rect.left, pItem[i].rect.top, &pItem[i].label, |
listEnabled, settings.pItem == i + 1 ); |
} |
void drawLassoToolItems() |
{ |
int i; |
Boolean listEnabled; |
// listEnabled = (gCurrentExample / 10 == lassoID); |
listEnabled = false; |
for (i = 0; i < numLItems; i++) |
drawItem( lItem[i].rect.left, lItem[i].rect.top, &lItem[i].label, |
listEnabled, settings.lItem == i + 1 ); |
} |
void drawName(int left, int top, Str255 name ) |
{ |
RGBColor color; |
ForeColor( blackColor ); |
MoveTo( left + 1, top + 1 ); |
DrawString( name ); |
color.red = color.green = 0xffff; |
color.blue = 40000; |
RGBForeColor( &color ); |
MoveTo( left, top ); |
DrawString( name ); |
} |
void drawItem(int left, int top, Str255 *label, Boolean listEnabled, Boolean itemEnabled ) |
{ |
Rect rect; |
RGBColor color, markColor; |
if (listEnabled) |
color.red = color.green = color.blue = 0xffff; |
else |
color.red = color.green = color.blue = 0xffff / 2; |
SetRect( &rect, left, top + 2, left + 12, top + 14 ); |
ForeColor( blackColor ); |
FrameOval( &rect ); |
OffsetRect( &rect, -1, -1 ); |
RGBForeColor( &color ); |
FrameOval( &rect ); |
if (listEnabled && itemEnabled) |
markColor.red = markColor.green = markColor.blue = 0xffff; |
else if (itemEnabled) |
markColor.red = markColor.green = markColor.blue = 0xffff / 2; |
else |
markColor.red = markColor.green = markColor.blue = 8700; |
InsetRect( &rect, 3, 3 ); |
RGBForeColor( &markColor ); |
PaintOval( &rect ); |
ForeColor( blackColor ); |
MoveTo( left + 16, top + 11 ); |
DrawString( (unsigned char*)label ); |
RGBForeColor( &color ); |
MoveTo( left + 15, top + 10 ); |
DrawString( (unsigned char*)label ); |
} |
void drawDeepBox( Rect *rect ) |
{ |
Rect box; |
box = *rect; |
box.right += 2; |
box.bottom += 2; |
ForeColor( blackColor ); |
FrameRect( &box ); |
OffsetRect( &box, -1, -1 ); |
ForeColor( whiteColor ); |
FrameRect( &box ); |
} |
void drawExampleName() |
{ |
int left, top; |
Rect rect; |
Str255 label = "\pCurrent Example: "; |
Str255 name[9] = { "\p TRANSFER MODES", "\pARITHMETIC MODES", "\p DITHERING", |
"\p COLORIZATION", "\p COLOR MAPPING", "\p PAINT BUCKET", |
"\p LASSO TOOL", "\pPIXEL AVERAGING", "\p CUSTOM" }; |
Rect tempRect1; |
left = 15; |
//top = (*gWindow).portRect.bottom - 13; |
top = GetPortBounds(GetWindowPort(gWindow), &tempRect1)->bottom - 13; |
drawName( left, top, label ); |
left += StringWidth( label ); |
SetRect( &rect, left - 2, top - 12, left + 130, top + 4 ); |
eraseRect( &rect ); |
drawName( left, top, name[(gCurrentExample / 10) - 1] ); |
} |
void drawTime( long ticks ) |
{ |
Rect rect; |
int left, top; |
float seconds; |
char cString[40]; |
Rect tempRect1; |
//left = (*gWindow).portRect.right - 130; |
//top = (*gWindow).portRect.bottom - 13; |
GetPortBounds(GetWindowPort(gWindow), &tempRect1); |
left = tempRect1.right - 130; |
top = tempRect1.bottom - 13; |
SetRect( &rect, left - 2, top - 12, left + 90, top + 4 ); |
eraseRect( &rect ); |
seconds = (float)ticks / 60.0; |
sprintf( &cString[0], "Draw Time: %03.03f secs", seconds ); |
drawName( left, top, C2PStr( cString ) ); |
} |
void eraseRect( Rect *rect ) |
{ |
RGBColor color; |
color.red = color.green = color.blue = 8700; |
RGBForeColor( &color ); |
PaintRect( rect ); |
} |
void drawSourceImage() |
{ |
Rect rect; |
Rect outlineRect; |
Rect tempRect1; |
/*SetRect( &rect, 20, 37, 20 + (*gGWorld).portRect.right, |
37 + (*gGWorld).portRect.bottom );*/ |
GetPortBounds(gGWorld, &tempRect1); |
SetRect( &rect, 20, 37, 20 + tempRect1.right, 37 + tempRect1.bottom); |
outlineRect = rect; |
InsetRect( &outlineRect, -5, -5 ); |
drawDeepBox( &outlineRect ); |
ForeColor( blackColor ); |
BackColor( whiteColor ); |
/*CopyBits( (BitMap *)(*(*gGWorld).portPixMap), &gWindow->portBits, |
&(**(*gGWorld).portPixMap).bounds, &rect, srcCopy, nil );*/ |
CopyBits( (BitMap *)(*(GetPortPixMap(gGWorld))), GetPortBitMapForCopyBits(GetWindowPort(gWindow)), |
&((**(GetPortPixMap(gGWorld))).bounds), &rect, srcCopy, nil ); |
} |
Copyright © 2003 Apple Computer, Inc. All Rights Reserved. Terms of Use | Privacy Policy | Updated: 2003-10-27