hilary@snll-arpagw.UUCP (Hilary Jones) (08/01/90)
My application needs to have complete control over the color table, so I use
RestoreEntries to load it. In the good old days, I had the routine load all 256
ColorTable entries at one time, and everything worked fine -- except,
whenever I loaded the table, I got an annoying glitch on the screen. After
some experimentation, I found I could make the problem go away by never
loading more than 64 entries at a time. Presumably the idea is to have the
load done before the vertical retrace is complete.
However I now have another problem. Every so often, the load isn't done
accurately. When that happens, most levels _are_ loaded correctly but one
entry (usually the first one) gets set to black. That means I can't see the
menus, so it's pretty hard to overlook the error! This happens quite
unpredictably. I can call the routine repeatedly without doing anything
significant (like allocating memory) between calls, and it will fail perhaps
once out of every ten times.
I have tried debugging with TC's debugger, but it's pretty hard to prove that
the device table is loaded wrong when the screen is showing black on black!
I've tried using TMON, but that's too tedious. At least it doesn't reveal
problems when I scramble the heap or look for bad arguments to toolbox
routines. I've removed all my INIT's and tried running under MonoFinder,
but the problem remains. I've tried waiting for the vertical blanking
interval, since it seems like it has to be a timing problem of some sort,
but that didn't help.
So, I need help! This is all being done on a Mac II using System 6.0.3 and
a standard Apple Video Card. Here's a rough idea of what the code does:
size = sizeof(ColorTable) + 63*sizeof(ColorSpec); /* 64-level table */
shortLut = (CTabHandle) NewHandle(size);
HLock(shortLut);
(**shortLut).ctSize = 63;
(**shortLut).ctFlags = 0;
/* Build new lut and load it in 64-level chunks */
for (j=0;j<256;j+=64) {
reqList[0] = 64;
for (i=1;i<=64;i++) {
reqList[i]=i-1+j;
(**shortLut).ctTable[i-1].value = i-1;
(**shortLut).ctTable[i-1].rgb = ....; /* e.g., Apple's defaults */
}
RestoreEntries(shortLut,0,&reqList);
}
What am I doing wrong? Or, to rephrase the question, how do I load the lookup
table without getting glitches? I don't want to use the Palette Manager if it
forces all of my windows to try to match the colors in the top window. That
would make the background windows update too slowly.