#pragma lint -1#pragma optimize -1#pragma cdev InkBlot/* * InkBlot T2 screensaver. * * Kelvin W Sherlock, December 2004 * */#include #include #include #include #include #include #include #include #include "inkblot.h"const char *SizeString = "\pInkBlot Size";const char *ScatterString = "\pInkBlot Scatter";const Word MyColorTable[16] ={ 0x0fff, 0x0eee, 0x0ddd, 0x0ccc, 0x0bbb, 0x0aaa, 0x0999, 0x0888, 0x0777, 0x0666, 0x0555, 0x0444, 0x0333, 0x0222, 0x0111, 0x0000};Word MyID;Word fSize;Word fScatter;GrafPortPtr SetupWindow;Word SetupFileNumber;/* * blank the screen. */LongWord Blank(Word *volatile movePtr){Word i;Word flip_h;Word flip_v;Word w;Word h;Word x;Word y;Longword tick;Word c;Word scatter; srand(time(NULL)); SetColorTable(0, MyColorTable); for(;;) { ClearScreen(0); // 1 -- create an inkblot i = rand() % 3; // 00, 01, or 10 switch(i) { case 0: // flip both flip_h = 1; flip_v = 1; w = 160; h = 100; break; case 1: flip_h = 0; flip_v = 1; w = 320; h = 100; break; case 2: flip_h = 1; flip_v = 0; w = 160; h = 200; break; } x = rand() % w; y = rand() % h; scatter = (fScatter << 1) + 1; for (i = 0; i < fSize; i++) { if (*movePtr) return 0; x += (rand() % scatter) - fScatter; y += (rand() % scatter) - fScatter; // constrain to our quadrant. if (x > w) x -= w; if (y > h) y -= h; if (x < 0) x += w; if (y < 0) y += h; //asm {brk 0xea} c = GetPixel320(x, y); if (c == 15) continue; c += rand() % 8 + 1; if (c > 15) c = 15; SetPixel320(x, y, c); if (flip_h) SetPixel320(319 - x, y, c); if (flip_v) SetPixel320(x, 199 - y, c); if (flip_h && flip_v) SetPixel320(319 - x, 199 - y, c); } tick = GetTick() + (15 * 60); // now display it for 15 seconds or so for (;;) { if (GetTick() > tick) break; if (*movePtr) return 0; } } return 0;}void LoadConfig(void){ fSize = LoadConfigResource(SizeString, 80000); fScatter = LoadConfigResource(ScatterString, 3);}LongWord DoMakeT2(void){Word fd; fd = GetCurResourceFile(); SetCurResourceFile(SetupFileNumber); LoadConfig(); SetCurResourceFile(fd); NewControl2(SetupWindow, resourceToResource, (long) CtrlList); LoadConfig(); SetCtlValueByID(fScatter, SetupWindow, CtrlScatter); SetCtlValueByID(fSize, SetupWindow, CtrlSize); return 5; // 2 controls.}void DoSaveT2(void){Word fd; /* Save current resource file and switch in Twilight.Setup */ fd = GetCurResourceFile (); SetCurResourceFile(SetupFileNumber); /* Get control values */ fScatter = GetCtlValueByID (SetupWindow, CtrlScatter); fSize = GetCtlValueByID (SetupWindow, CtrlSize); /* Save control values */ SaveConfigResource (ScatterString, fScatter); SaveConfigResource (SizeString, fSize); /* Restore old resource file */ SetCurResourceFile(fd);}LongWord InkBlot(LongWord data2, LongWord data1, Word message){ MyID = MMStartUp(); switch(message) { case MakeT2: SetupWindow = (GrafPortPtr) data1; SetupFileNumber = (Word) data2; return DoMakeT2(); break; case BlankT2: return Blank((Word *)data1); break; case SaveT2: DoSaveT2(); break; case LoadSetupT2: LoadConfig(); break; case HitT2: if (data2 == CtrlScatter) return 1; if (data2 == CtrlSize) return 1; break; case UnloadSetupT2: break; case KillT2: break; } return 1;}