mirror of
https://github.com/aaronsgiles/JPEGView.git
synced 2024-06-01 03:41:27 +00:00
92bdb55672
These are the sources for the final official release of JPEGView for the Mac, back in 1994.
1 line
5.6 KiB
C
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();
|
|
}
|