[comp.sys.mac.programmer] PaletteManager vs. CopyBits

jdevries@zodiac.ADS.COM (Jeff De Vries) (02/02/90)

In response to an update event I'm trying to use CopyBits to blast an 
offscreen pixmap into a window that has an associated palette.  I'm going 
to first describe what I've got, what works, what doesn't work, and then 
ask a few questions.  

Disclaimer:  I try to describe what I think is going on at various points; 
these are my *guesses*!  Do not assume that they are correct!

Ingredients-

First, I have an offscreen pixmap.  This pixmap has an associated color table
that indicates what RGB color I want for each of the possible index values in
the data area.  In this particular case, the index values run from 0 to 255
because the pixel size is 8.  From now on, I'll refer to this as the pixmap.

Second, I have a small window using a palette and pmExplicit so I can monitor
the device color table.  This appears to always work.  I'll refer to this 
window as the color-watcher.

Third, I have my real, display CWindow.  I have a palette associated with this
window that is constructed from the same color table that is used by the
offscreen pixmap above.  The result of this is that I should be able to
say PmForeColor(x) and draw something in my window and the resulting color 
should match (within the palette tolerance) the color in the offscreen
pixmap for index value x.  I'll refer to this window as the window.

What Works -

If I set the pmUsage on the window palette to pmTolerant, and set the 
tolerance to 0 (i.e. exact match only) the following events appear
to happen:
1)  The window gets an activate event.  This causes ActivatePalette() to be
    called which causes the palette manager to do its magic to make sure the 
    colors in the palette are available.  An interesting result of this is
    that the color_watcher, just for a moment, shows that the device color
    table indices contain the same colors as the palette, and in the same
    order.  (I can tell because the colors in the palette are in a different
    order than the standard Apple color map).  They colors in the device then
    seem to scramble around; see question #1.
2)  I do the CopyBits from my offscreen pixmap to the window.  This appears
    to work, but see question #2.

What Doesn't Work (and possibly why) -

If I set the pmUsage to pmAnimated, (so I can animate the colormap), the
following events occur:
1)  The window gets an activate event.  ActivatePalette() grabs the colors
    that I need.  Part of grabbing animated colors involves making those 
    indices unavailable to other windows.  By the time ActivatePalette() has 
    grabbed all the indices that I want, the only ones that are left available 
    to other windows are the ones for black and white.  The color_watcher
    shows the same colors as in the pmTolerant case above, then goes to
    black and white.
2)  CopyBits from pixmap to window.  Result?  A black and white image and a
    black and white color_watcher.  Possible culprit?  CopyBits uses the
    color table of the gDevice of the destination, since it (appears) to need
    an inverse map.  Unfortunately, after the PaletteManager has grabbed
    its colors, the gDevice colormap is only left with black and white, so
    everything ends up black and white.  See (obvious) question #3.

Questions -

1)  After the Palette Manager has given me the colors I want, does it then try
    to re-order the device table so that the difference between my colors and 
    the colors that other windows are expecting is minimized?  After the 
    shuffle described above, the resulting device color table looks similiar
    to the original Apple color map, with my closest color going where the
    equivalent Apple color used to be.
1a) Is the PaletteManager smart enough to know what colors my palette is
    currently not actually using and re-use those indices for other windows?
2)  Does CopyBits try to preserve absolute colors across pixmaps?  Stated
    another way, does CopyBits do something like the following: Grab a pixel 
    from the source, find the absolute color for that pixel by looking at the 
    source color table, look at the (inverse) destination color table to find 
    the index of the color that most closely matches the absolute color, stuff 
    the index that was found into the destination pixmap.
3)  How do you use CopyBits with an animated palette?

Thanks for any clarification and answers!!

Jeff

-- 
Jeff De Vries                        Advanced Decision Systems
Sr. Software Engineer                1500 Plymouth Street
jdevries@ads.com;  (415) 960-7300    Mountain View, CA   94043-1230

herbw@midas.WR.TEK.COM (Herb Weiner) (02/23/90)

In Article <10713@zodiac.ADS.COM> jdevries@zodiac.ADS.COM (Jeff De Vries) writes:
 
> If I set the pmUsage to pmAnimated, (so I can animate the colormap), the
> following events occur:
> 2)  CopyBits from pixmap to window.  Result?  A black and white image and a
>     black and white color_watcher. ...   See (obvious) question #3.
>
> Questions -
>
> 3)  How do you use CopyBits with an animated palette?
 
In my opinion, Apple screwed up badly on this one.  To make it work, you need
to implement a custom search procedure.  If your window is active (you have
received an Activate Event, but have not received a deactivate event), You
need to install it immediately before you do your CopyBits, and you need to
remove it immediately after your CopyBits.  (If you do all this, you do not
need to worry about the client ID, because your CopyBits is the only possible
client.)
 
Refer to Inside Mac Volume V for more info on all this.

dplatt@coherent.com (Dave Platt) (02/23/90)

In article <1919@wrgate.WR.TEK.COM> herbw@midas.WR.TEK.COM (Herb Weiner) writes:
> In Article <10713@zodiac.ADS.COM> jdevries@zodiac.ADS.COM (Jeff De Vries) writes:
>
> > 3)  How do you use CopyBits with an animated palette?
>  
> In my opinion, Apple screwed up badly on this one.  To make it work, you need
> to implement a custom search procedure.  If your window is active (you have
> received an Activate Event, but have not received a deactivate event), You
> need to install it immediately before you do your CopyBits, and you need to
> remove it immediately after your CopyBits.  (If you do all this, you do not
> need to worry about the client ID, because your CopyBits is the only possible
> client.)

There's a much better way to do this if you have 32-bit Color QuickDraw
installed.  You can tag your off-screen PixMap so that [a] it uses the
same palette as the window, and [b] the values in the PixMap represent
palette indices, NOT colortable indices.  When you CopyBits() the
off-screen PixMap to the screen, CopyBits performs a palette-index-to
colortable-index lookup, and stores the correct [animated or non-
animated] color into the screen PixMap.  This lookup takes the place of
the usual colortable-index->RGBcolor->screen-colortable-index search...
which will not handle animated colors properly.

This feature works very well even if your destination window touches
multiple screens.  It's VERY hard to CopyBits() animated colors to a
multi-screen window with any other technique... and every other technique
I've tried or encountered is UGLY!
  
> Refer to Inside Mac Volume V for more info on all this.

Also the 32-bit Color QuickDraw documentation, available from APDA or on
Phil&Dave's Excellent but Generally Unavailable CD-ROM.
-- 
Dave Platt                                             VOICE: (415) 493-8805
  UUCP: ...!{ames,apple,uunet}!coherent!dplatt   DOMAIN: dplatt@coherent.com
  INTERNET:       coherent!dplatt@ames.arpa,  ...@uunet.uu.net 
  USNAIL: Coherent Thought Inc.  3350 West Bayshore #205  Palo Alto CA 94303

jimo@phred.UUCP (Jim Osborn) (03/01/90)

In article <47531@improper.coherent.com> dplatt@coherent.com (Dave Platt) writes:
>>...
>> > 3)  How do you use CopyBits with an animated palette?
>There's a much better way to do this if you have 32-bit Color QuickDraw
>installed.  You can tag your off-screen PixMap so that [a] it uses the
>same palette as the window, and [b] the values in the PixMap represent
>palette indices, NOT colortable indices.
>> Refer to Inside Mac Volume V for more info on all this.
>Also the 32-bit Color QuickDraw documentation, available from APDA or on
>Phil&Dave's Excellent but Generally Unavailable CD-ROM.

I couldn't find any reference to this in any of the info on the 32-bit
Color QuickDraw discs or on the CD-ROM, but it is mentioned in the
"All about the palette manager" article in Develop #1.  As the summary says:

	CTabHandle myCT;
	...
	(*myCT)->ctFlags |= 0x4000;

Now if only 32-bit QuickDraw weren't so slooooow. 8-(

-- 
pilchuck!jimo@phred		Jim Osborn, Physio Control Corp
				11811 Willows Rd, Redmond, WA, 98073
				206-867-4704 direct to my desk