home *** CD-ROM | disk | FTP | other *** search
- /****************************************************//* *//* File: offscrnGraphics.c *//* *//* Program: Imageer *//* *//* By: Jason Hodges-Harris *//* *//* Created: 26/10/95 00:00:00 AM *//* *//* Version: 1.0.0d3 *//* *//* Copyright: © 1995-96 Apple Computer, Inc., */ /* all rights reserved. */ /* *//****************************************************//**** Macintosh Toolbox Headers *****/#ifndef __PALETTES__#include <Palettes.h>#endif#ifndef __QDOFFSCREEN__#include <QDOffscreen.h>#endif#ifndef __TYPES__#include <Types.h>#endif/**** Application headers and prototypes ****/#ifndef __IMAGEERAPPHEADER__#include "Imageer.app.h"#endif#ifndef __IMAGEERPROTOSHEADER__#include "Imageer.protos.h"#endif/**** Default RGB Colors ****/static const RGBColor kRGBBlack = {0x0000, 0x0000, 0x0000};static const RGBColor kRGBWhite = {0xFFFF, 0xFFFF, 0xFFFF};/**** Create GWorld attached to the image window document structure ****/#pragma segment ImageWorldGWorldPtr CreateOffscreen (CTabHandle theCTabHndl, short theXsize, short theYsize, short theBitDepth,GWorldFlags theFlags){ GWorldPtr theGWorldPtr = nil; QDErr theError; Rect theRect; SetRect(&theRect,0,0,theXsize,theYsize); theError = NewGWorld (&theGWorldPtr,theBitDepth,&theRect,theCTabHndl,nil,theFlags); if (theError) { DisplayAlert (rGenAlert,rQDMessages,iFailGWorldAlloc); return nil; } return theGWorldPtr;}/**** Draw image palette colors ****/#pragma segment ImageWorldOSErr DrawImageColors(WindowPtr theWindow){ ImageDocHndl theColorsDocHndl = nil, theFrontDocHndl = nil; PaletteHandle windowPalette; WindowPtr frontWindow, theNextWindow; RGBColor oldForeColor, newForeColor; Rect colorRect; short countX, countY, colorIndex = 0, numberColors; OSErr error = noErr; Boolean isImageWindow = false; GetForeColor (&oldForeColor); frontWindow = FrontWindow(); while (!isImageWindow && frontWindow) { theFrontDocHndl = (ImageDocHndl)GetWRefCon(theWindow); if (!(**theFrontDocHndl).isColorsWindow) { isImageWindow = true; } else { theNextWindow = &((WindowPeek)frontWindow)->nextWindow->port; frontWindow = theNextWindow; } } theColorsDocHndl = (ImageDocHndl)GetWRefCon(theWindow); if (theColorsDocHndl) { switch ((**theColorsDocHndl).theImageDepth) { case 1: DisplayAlert (rGenWarning,rErrMessages,iNotImplemented); break; case 2: windowPalette = (**theColorsDocHndl).theColorsPalette; numberColors = (**windowPalette).pmEntries; for (countX = 0;countX<128;countX+=32) { GetEntryColor (windowPalette, colorIndex, &newForeColor); SetRect(&colorRect,16+ countX,16,countX+20,52); RGBForeColor(&newForeColor); PaintRect(&colorRect); colorIndex++; } RGBForeColor(&oldForeColor); return error; break; case 4: windowPalette = (**theColorsDocHndl).theColorsPalette; numberColors = (**windowPalette).pmEntries; for (countY = 0;countY<32;countY+=16) { for (countX = 0;countX<128;countX+=32) { GetEntryColor (windowPalette, colorIndex, &newForeColor); SetRect(&colorRect,16+ countX,16+countY,countX+20,32+countY); RGBForeColor(&newForeColor); PaintRect(&colorRect); colorIndex++; } } RGBForeColor(&oldForeColor); return error; break; case 8: windowPalette = (**theColorsDocHndl).theColorsPalette; numberColors = (**windowPalette).pmEntries; for (countY = 0;countY<32;countY+=4) { for (countX = 0;countX<128;countX+=4) { GetEntryColor (windowPalette, colorIndex, &newForeColor); SetRect(&colorRect,16+ countX,16+ countY,countX+20,countY+20); RGBForeColor(&newForeColor); PaintRect(&colorRect); colorIndex++; } } RGBForeColor(&oldForeColor); return error; break; case 16: case 32: for (countY = 0;countY<4;countY++) { for (countX = 0;countX<128;countX+=2) { SetRect(&colorRect,16+ countX,16+(countY*8),countX+18,24+(countY*8)); switch (countY) { case 0: newForeColor.red = countX << 9; newForeColor.green = countX << 9; newForeColor.blue = countX << 9; RGBForeColor(&newForeColor); PaintRect(&colorRect); break; case 1: newForeColor.red = countX << 9; newForeColor.green = 0; newForeColor.blue = 0; RGBForeColor(&newForeColor); PaintRect(&colorRect); break; case 2: newForeColor.red = 0; newForeColor.green = countX << 9; newForeColor.blue = 0; RGBForeColor(&newForeColor); PaintRect(&colorRect); break; case 3: newForeColor.red = 0; newForeColor.green = 0; newForeColor.blue = countX << 9; RGBForeColor(&newForeColor); PaintRect(&colorRect); break; } } } RGBForeColor(&oldForeColor); return error; break; } } return kDefaultAppError;}/**** Force the colortable to be reset ****/#pragma segment ImageWorldvoid ForceRestoreColors(void){ RestoreDeviceClut(nil); PaintBehind(nil, GetGrayRgn()); DrawMenuBar();}/**** Transfer visible portion of GWorld to current window ****/#pragma segment ImageWorldOSErr TransferImageToWindow(ImageDocHndl theWindDocHndl, WindowPtr theWindow){ PixMapHandle thePixMapHndl = nil; CGrafPtr oldPort; GDHandle oldGDev; RGBColor oldForeColor, oldBackColor; Rect sourceRect,
- destRect; OSErr error = noErr; GetGWorld(&oldPort,&oldGDev); SetGWorld((**theWindDocHndl).theImageWorld,nil); GetForeColor(&oldForeColor); GetBackColor(&oldBackColor); RGBForeColor(&kRGBBlack); RGBBackColor(&kRGBWhite); thePixMapHndl = GetGWorldPixMap((**theWindDocHndl).theImageWorld); if (PixMap32Bit(thePixMapHndl)) // if 32bit mode needed == true SaveSetMMUMode(true); if (!LockPixels(thePixMapHndl)) error = kFailedLockPixels; if (!error) { sourceRect = (**theWindDocHndl).theImageWorld->portRect; destRect = theWindow->portRect; destRect.right -= kScrollBarWidth; // resize port rect to exclude controller area destRect.bottom -= kScrollBarWidth; if (!EqualRect(&destRect,&sourceRect)) sourceRect = *CalcVisibleImage(theWindDocHndl,&destRect); SetGWorld(oldPort,oldGDev); CopyBits((BitMap*)(*thePixMapHndl), (BitMap*)&((*theWindow).portBits), &sourceRect,&destRect,srcCopy,nil); } UnlockPixels(thePixMapHndl); // unlock GWorld SaveSetMMUMode(false); return error;}/**** Calculate the visible area of window contents region ****/#pragma segment ImageWorldRect* CalcVisibleImage(ImageDocHndl theWindDocHndl,const Rect *destRect){ Rect displayRect; short theXvalue, theYvalue; theXvalue = GetControlValue((**theWindDocHndl).theHScrollBar); theYvalue = GetControlValue((**theWindDocHndl).theVScrollBar); SetRect(&displayRect,theXvalue,theYvalue,destRect->right+theXvalue,destRect->bottom+theYvalue); return &displayRect;}/**** Set and Reset the address mode between 24 and 32 bits ****/#pragma segment ImageWorldvoid SaveSetMMUMode(Boolean isSaveMode){ static signed char theAddrMode = true32b; static Boolean swapModeNeeded = false; if (isSaveMode == true) { if(GetMMUMode() == false32b) // get current addr mode { swapModeNeeded = true; // in 24 bit mode swap needed SwapMMUMode (&theAddrMode); // switch to 32 bit mode } } else if (swapModeNeeded == true) SwapMMUMode (&theAddrMode);}/**** Calc new index depth colors window palette ****/#pragma segment ImageWorldOSErr UpdateColorsWindPalette(ImageDocHndl theImageWindDocHndl, WindowPtr theImageWindow){ ImageDocHndl theFrntWindHndl; GrafPtr oldPort; WindowPtr theWindow, theNextWindow; OSErr error = noErr; GetPort(&oldPort); theWindow = FrontWindow(); while (theWindow) { theFrntWindHndl = (ImageDocHndl)GetWRefCon(theWindow); if ((*theFrntWindHndl)->isColorsWindow) { if ((*theImageWindDocHndl)->theImageDepth != (*theFrntWindHndl)->theImageDepth) (*theFrntWindHndl)->theImageDepth = (*theImageWindDocHndl)->theImageDepth; if ((*theFrntWindHndl)->theImageDepth <= 8 && !(*theImageWindDocHndl)->isUsingQDGX) { if ((*theFrntWindHndl)->theColorsPalette) DisposePalette((*theFrntWindHndl)->theColorsPalette); (*theFrntWindHndl)->theColorsPalette = NewPalette(256, (*(*theImageWindDocHndl)->theImageWorld->portPixMap)->pmTable, pmTolerant+pmExplicit,0); if ((*theFrntWindHndl)->theColorsPalette) NSetPalette(theWindow,(*theFrntWindHndl)->theColorsPalette,pmAllUpdates); else error = kFailMakePalette; } SetPort(theWindow); InvalRect(&theWindow->portRect); SetPort(oldPort); theWindow = nil; } if (theWindow) { theNextWindow = &((WindowPeek)theWindow)->nextWindow->port; theWindow = theNextWindow; } } return error;}