JPEGView/Source/C/ColorsWindow.c
Aaron Giles 92bdb55672 JPEGView 3.3 for Macintosh
These are the sources for the final official release of JPEGView for the
Mac, back in 1994.
2015-02-05 00:18:10 -08:00

1 line
5.6 KiB
C

/*********************************************************/
/* This source code copyright (c) 1991-2001, Aaron Giles */
/* See the Read Me file for licensing information. */
/* Contact email: mac@aarongiles.com */
/*********************************************************/
#if THINK_C
#include "THINK.Header"
#elif applec
#pragma load ":Headers:MPW.Header"
#elif __MWERKS__
//#include "MW.Header"
#else
#include "JPEGView.h"
#endif
/*
* Local variables:
* lColorsWindow = pointer to the colors window
*
*/
static WindowPtr gColorsWindow = nil;
/*
* OpenColors()
*
* Purpose: Creates and initializes the colors window
* Inputs: none
* Returns: nothing
*
*/
OSErr OpenColors(void)
{
Rect theRect, mainRect;
OSErr theErr = noErr;
Point where;
if (gColorsWindow) {
if (!WindowVisible(gColorsWindow)) FWShowWindow(gColorsWindow);
return noErr;
}
if (!(gColorsWindow = AllocateWindow())) return memFullErr;
PushPort();
MySetPort(nil);
if (gColorsWindow = FWGetNewFloatingWindow(rColorsWindow, (Ptr)gColorsWindow,
(WindowPtr)-1)) {
MySetPort((CGrafPtr)gColorsWindow);
theRect = gColorsWindow->portRect;
OffsetRect(&theRect, -theRect.left, -theRect.top);
if (gThePrefs.colorsBounds.top != gThePrefs.colorsBounds.bottom) {
gThePrefs.colorsBounds.right = gThePrefs.colorsBounds.left + Width(&theRect);
gThePrefs.colorsBounds.bottom = gThePrefs.colorsBounds.top + Height(&theRect);
}
GetActiveRect(gMainMonitor, &mainRect);
where.h = mainRect.right - kWindowBorderWidth - Width(&theRect);
where.v = mainRect.top + kWindowBorderHeight + GetMBarHeight() + gTitleBarHeight;
PlaceWindow(gColorsWindow, &gThePrefs.colorsBounds, where);
gThePrefs.colorsOpen = true;
PopPort();
return noErr;
} else theErr = memFullErr;
CloseColors();
PopPort();
return theErr;
}
/*
* CloseColors()
*
* Purpose: Closes the colors window
* Inputs: none
* Returns: nothing
*
*/
void CloseColors(void)
{
PushPort();
MySetPort(nil);
if (gColorsWindow) {
gThePrefs.colorsOpen = false;
SaveWindowPosition(gColorsWindow, &gThePrefs.colorsBounds);
FWCloseWindow(gColorsWindow);
DeallocateWindow(gColorsWindow);
}
gColorsWindow = nil;
PopPort();
}
/*
* GetColorsWindow()
*
* Purpose: Returns a pointer to the statistics window
* Inputs: none
* Returns: nothing
*
*/
WindowPtr GetColorsWindow(void)
{
return gColorsWindow;
}
/*
* DrawColorsWindow()
*
* Purpose: Draws the statistics window
* Inputs: none
* Returns: nothing
*
*/
void DrawColorsWindow(void)
{
short rows, cols, rowSize, colSize, theDepth, r, c;
CTabHandle theColors;
GDHandle theDevice;
RGBColor theColor;
Rect theRect;
if (!gColorsWindow) return;
PushPort();
MySetPort((CGrafPtr)gColorsWindow);
theRect = gColorsWindow->portRect;
GlobalRect(&theRect, gColorsWindow);
theDevice = GetMaxDevice(&theRect);
CalcVis((WindowPeek)gColorsWindow);
if (theDevice) {
theDepth = (*(*theDevice)->gdPMap)->pixelSize;
theColors = (*(*theDevice)->gdPMap)->pmTable;
if (theDepth <= 8) {
switch (theDepth) {
case 1: rows = 1, cols = 2; break;
case 2: rows = 1, cols = 4; break;
case 4: rows = 2, cols = 8; break;
case 8: rows = 8, cols = 32; break;
}
rowSize = Height(&gColorsWindow->portRect) / rows - ((rows == 1) ? 1 : 0);
colSize = Width(&gColorsWindow->portRect) / cols;
for (r = 0; r < rows; r++)
for (c = 0; c < cols; c++) {
RGBForeColor(&(*theColors)->ctTable[r * cols + c].rgb);
theRect.left = colSize * c + 1;
theRect.right = theRect.left + colSize - 1;
theRect.top = rowSize * r + 1;
theRect.bottom = theRect.top + rowSize - 1;
PaintRect(&theRect);
}
RGBForeColor(&gWhite);
for (c = 0; c <= cols; c++) {
MoveTo(c * colSize, gColorsWindow->portRect.top);
LineTo(c * colSize, gColorsWindow->portRect.bottom);
}
for (r = 0; r <= rows; r++) {
MoveTo(gColorsWindow->portRect.left, r * rowSize);
LineTo(gColorsWindow->portRect.right, r * rowSize);
}
} else {
colSize = Width(&gColorsWindow->portRect) / 256;
rowSize = Height(&gColorsWindow->portRect) / 4;
theRect.left = 1;
theRect.right = 1 + colSize;
for (c = 255; c > 0; c--) {
theRect.top = 1;
theRect.bottom = rowSize;
theColor.red = theColor.green = theColor.blue = c << 8;
RGBForeColor(&theColor);
PaintRect(&theRect);
theRect.top += rowSize;
theRect.bottom += rowSize;
theColor.green = theColor.blue = 0;
RGBForeColor(&theColor);
PaintRect(&theRect);
theRect.top += rowSize;
theRect.bottom += rowSize;
theColor.green = theColor.red;
theColor.red = 0;
RGBForeColor(&theColor);
PaintRect(&theRect);
theRect.top += rowSize;
theRect.bottom += rowSize;
theColor.blue = theColor.green;
theColor.green = 0;
RGBForeColor(&theColor);
PaintRect(&theRect);
theRect.left += colSize;
theRect.right += colSize;
}
}
}
PopPort();
}
/*
* DoColorsHelp(globalPt)
*
* Purpose: Pops up help for the colors windoid; needed because it should be displayed even
* if it's not "active"
* Inputs: globalPt = point, in global coordinates, where the mouse is
* Returns: nothing
*
*/
void DoColorsHelp(Point globalPt)
{
HMMessageRecord theRecord;
Point tip = { 0, 0 };
Rect aRect;
if (HMIsBalloon() || gInBackground) return;
PushPort();
SetPort(gColorsWindow);
if (HMExtractHelpMsg(kHMRectListResType, rColorsWindow, 1, kHMEnabledItem, &theRecord) == noErr) {
tip = globalPt;
aRect = gColorsWindow->portRect;
GlobalRect(&aRect, gColorsWindow);
HMShowBalloon(&theRecord, tip, &aRect, nil, 0, 0, kHMRegularWindow);
}
PopPort();
}