olson@endor.harvard.edu (Eric K. Olson) (01/06/88)
I need a way to set the GDevice color lookup table (clut) with a specific clut. I would like a friendly way. Here's what I do now: setclut(object) objectptr object; { GDHandle gdev; if (object->window==FrontWindow()) { gdev=GetGDevice(); HLock(object->clut); SetEntries(0,(*(object->clut))->ctSize,&((*(object->clut))->ctTable)); (*(*(*gdev)->gdPMap)->pmTable)->ctSeed=(*(object->clut))->ctSeed; HUnlock(object->clut); } } object is just a data structure containing, among other things, a WindowPtr (object->window) and a Detached clut resource (object->clut). Note that, in the above, I also set the Gdevice's ctSeed to match the clut, so that it won't try to remap all the pixels. Note also that I am working with Color PixMaps: RGBForeColor and RGBBackColor have no meaning here, and I must have the GDevice clut match the PixMap clut exactly, in order. The problem with this technique is that it: 1. Isn't very friendly (according to IM-V) 2. Doesn't set any GDevice clut beyond this MainDevice's. I can traverse the GDevice list myself, and check for intersections of GDRects with the content region of the window: setclut(object) objectptr object; { GDHandle gdev; GDHandle save; if (object->window==FrontWindow()) { save=GetGDevice(); gdev=GetMainDevice(); while (gdev) { HLock(gdev); if (RectInRgn(&((*gdev)->gdRect), ((WindowPeek) object->window)->contRgn)) { HUnlock(gdev); SetGDevice(gdev); HLock(object->clut); SetEntries(0,(*(object->clut))->ctSize, &((*(object->clut))->ctTable)); (*(*(*gdev)->gdPMap)->pmTable)->ctSeed= (*(object->clut))->ctSeed; HUnlock(object->clut); } HUnlock(gdev); gdev=GetNextDevice(gdev); } SetGDevice(save); } } For some reason this only finds one GDevice (the main one). A SysBeep placed after the while rings once. Can anyone give me a hint as to why? I thought the Palette Manager pmExplicit mode would do what I want (and it would do this traversal for me): it did not. It didn't seem to do anything. What is pmExplicit for? Setting an exact color map is a common need: ImageStudio and PixelPaint both have to do this, and both only work on the MainDevice. I would like to work on all attached screens, setting cluts as needed by window positions. It's not uncommon for me to need to have an 8-bit all grey clut on one screen and a 4-bit all grey clut on another, and I'd like them all to update the GDevice cluts so I get perfect colors (grays). The code above would do that if it worked (I suppose one could say that about any code...) Thanks in Advance. -Eric (defun maybe (x) (maybe (not x))) Eric K. Olson olson@endor.harvard.edu harvard!endor!olson D0760 (Name) (ArpaNet) (UseNet) (AppleLink)