1. Graphics Problems

Hello all,

I have a program that uses graphics exclusivly for the GUI and I have one minor
problem. Im using DIBSections for the imagery and double buffering the images
with memory DC's so I can bitblt the images to screen when needed at certain 
locations. What Ive found is in 256 color mode the screen and images retain 
their respective palette until my window looses focus.

I have this short piece of code that works fine for any window that may overlap
my window but if any window  is exclusive to the screen size (full screen) and 
recieves focus then my window losses its palette when it regains focus.
  
    elsif iMsg = WM_ACTIVATE then
   
          if LOWORD(wParam) =  0 then
             hdc = GetDC(hwnd)
             savedDC = c_func(xSaveDC,{hdc})
             ReleaseDC(hwnd, hdc) 
          
             
          elsif LOWORD(wParam) =  1 or LOWORD(wParam) =  2 then

                if lParam = hwnd then
                   ShowWindow(hwnd, SW_SHOWNORMAL)   
                   junk = c_func(xRestoreDC,{hdc, -1})
                   c_proc(UpdateWindow, {hwnd}) 
                end if

any ideas?

Euman
euman at bellsouth.net

5 2 1 - 1 - n - 5  The Doors

new topic     » topic index » view message » categorize

2. Re: Graphics Problems

----- Original Message ----- 
From: "Bernie Ryan" <xotron at localnet.com>
 
> euman at bellsouth.net wrote:
> > Hello all,
> > 
> > I have a program that uses graphics exclusivly for the GUI and I have 
> > one minor
>> <snip>

> Euman:
>   The -1 in RestoreDC maybe causing a problem if somewhere
>   in your program or windows the device context stack has
>   been disturbed.
> Bernie

Thanks Bernie for the reply.!

Here is a bit more info on my problem that might help you help me.

I also create a private DC,  I use CS_OWNDC.
(eg.  poke4(wndclass + style,  CS_OWNDC) )
a private device context is preserved throughout the lifetime of its associated 
window, you need to retrieve its handle only once.
the private device context is not retrieved from the GDI device-context cache.
This means that any attribute changes (in modes, colors, origins, and graphic
objects)
that you make to a private device context are preserved until you explicitly
modify them.

So I ask this: 

If I issue SaveDC( ) when my windows is deactivated and RestoreDC( ) when
my window is re-Activated how can the DC stack become corrupt in an unactive
state?

Maybe this will help???

Euman
euman at bellsouth.net
.

new topic     » goto parent     » topic index » view message » categorize

3. Re: Graphics Problems

----- Original Message ----- 
From: "Chris Bensler" <bensler at mail.com>
To: "EUforum" <EUforum at topica.com>

> Have you tried resetting the palette on WM_ACTIVATE?
> 
> Exotica requires you to rebuild custom graphics on WM_ACTIVATE. If not, 
> the video memory buffer is corrupted from other windows, and the custom 
> bitmaps are thrashed.
> I assume, it's a similar situation.
> 
> Chris
> 

Thanks Chris for the reply.!

I had tried resetting the palette initially and it didnt work.
I even tried using a memory DC to hold the window image
and bitblt this back to the hwndDC when the program came
back into focus. The image is there but has an awfull looking 
palette (all green and red and, neither of these colors are in the
the real image).

I have a routine in the code to move the window around
the screen and noticed that when the image looks as it should (colors)
that the image does not drag smoothly but when this (Red &Green)
image comes up, the image can be dragged around smoothly as
it does in 16 bit+ modes.

Im frustrated..... Thanks again, I 'll post the code if anyone would like. 
 
Euman
euman at bellsouth.net

5 2 1 - 1 - n - 5  The Doors

new topic     » goto parent     » topic index » view message » categorize

4. Re: Graphics Problems

> 
> Euman:
>   The -1 in RestoreDC maybe causing a problem if somewhere
>   in your program or windows the device context stack has
>   been disturbed.
> Bernie
>

Bernie you helpfull freind!

you indirectly (possibly) solved the whole mess.
you pointed right at the answer:

RestoreDC( ) -1  look at the DC it should be "savedDC"

                 if lParam = hwnd then
                    ShowWindow(hwnd, SW_SHOWNORMAL)   
                    junk = c_func(xRestoreDC,{hdc, -1})
                    c_proc(UpdateWindow, {hwnd}) 
                 end if

Thanks, I'll get back to you if this doesnt work!

Euman
euman at bellsouth.net

new topic     » goto parent     » topic index » view message » categorize

5. Re: Graphics Problems

Hello,

I think this should be book marked as one of the best sites that
explains palettes in Windows. (interested parties ofcourse)

http://www.compuphase.com/palette.htm

Euman
euman at bellsouth.net

new topic     » goto parent     » topic index » view message » categorize

6. Re: Graphics Problems

Hello all,

I hope I write this right!

See if you can wrap your brain around this....
My Graphics problem is not really an issue of my DC being corrupt
but instead a palette issue after all.

I downloaded this utility that allows you to snoop the palette across
the system and running apps. http://www.compuphase.com/palspy.zip

I opened Jasc PSP 7.0 and the palette the image I am displaying doesnt match
the palette from my program when I have SaveDC( ), RestoreDC and then
RealizePalette( ). The problem is that there are 20 colors that Windows uses
for a "system palette" and my "logical palette" contains (3) colors that are
system
colors,  these make my logical palette become unorginized.

I read that using PC_NOCOLLAPSE would eliminate this problem but it doesnt
seem to be working as advertised on Win 98 SE. What I am going to do is take
the (3) colors and slightly change these in the image to different RGB values so
they no longer are mapped to the system colors to see if this works.

I'll get back to you all to let you know my findings.

Euman

new topic     » goto parent     » topic index » view message » categorize

7. Re: Graphics Problems

Hello all,

Here is my updated Palette code!

I initialize the palette when I create my first DDB (DIB)
my DibSection code is not included here for size purposes.

This code originated with Win32lib but has evolved into
this much faster piece (maybe the Win32lib guys will like this?)

Keep in mind that when you use hDIB = c_func( xCreateDIBitmap
that this only creates a bitmap thats Device-Dependant and will
default to using the system palette (I really should change this for
less confusion, maybe later) Dib-Sections are not Dependant and
can render using a logical palette which this code in
global function createDIB presents "palette routine".

There is a way to convert DDB bitmaps to DibSections but I havent
included this code either. (READ MORE BELOW CODE)

-- (highly modified!)Code from win32lib development 
-- "contains palette code and optimizations"
-- Euman 2002

global atom newpal, palinfo
newpal = 0

-----------------------------------------------------------------------------
function packScanLine( sequence pixels )
    -- convert a scanline of data into a packed scanline
    integer fill
    sequence packed

    packed = pixels

    fill = and_bits( length( packed ), 4 - 1 )

    if fill then
        packed = packed & repeat( 0, 4-fill )
    end if

    return packed

end function

global atom ple
ple = myalloc(1028)

constant --CBM_CREATEDIB = #2, 
         CBM_INIT = #4 

atom memBitmapInfo

integer pal_exist
        pal_exist = 0  
 
global atom hPal --hpal = 0
global sequence spal

global function createDIB(atom hdc, sequence pal, sequence pixels) 

    integer palSize, headerSize, bitsPer, h, w, at
    atom memBits, hDIB, onine, lnine
    sequence ret
    
    palSize = length(pal)
    bitsPer = 8

    -- size of bitmap
    w = length( pixels[1] )
    h = length( pixels )   
    
       -- calculate the size of the BITMAPINFO header
    headerSize = 40 + (4 * palSize )
    
       -- Allocate memory for DIB
    memBitmapInfo = myalloc(headerSize)
     
    -- build the bitmap info header
    mypoke4( memBitmapInfo + 0, 40 )
    mypoke4( memBitmapInfo + 4, w )      -- Width in pixels.
    mypoke4( memBitmapInfo + 8, -h )     -- Height in pixels.
    mypoke ( memBitmapInfo + 12, {1,0} ) -- 1 color plane.
    mypoke ( memBitmapInfo + 14, {8,0} ) -- bits per pixel.
    mypoke4( memBitmapInfo + 32, 256 )   -- Colors used.
    mypoke4( memBitmapInfo + 36, 256 )   -- Colors used.
    
    for i = 1 to h do
        pixels[i] = packScanLine( pixels[i] )
    end for
    
    -- get bytes per scanline
    w = length( pixels[1] )
    
    -- Allocate storage
    memBits = myalloc(h * w)
       
    -- copy pixels to memory
    at = memBits
    for i = 1 to h do
        mypoke( at, pixels[i] )
        at = at + w
    end for
    
    at = memBitmapInfo + 40 
    
    if  pal_exist = 0 then

    c_proc(xSetSystemPaletteUse,{hdc, 1})  

    onine = myalloc(40)
    lnine = myalloc(40)
     
    junk = c_func(xGetSystemPaletteEntries,{hdc, 0, 10, onine}) 
    junk = c_func(xGetSystemPaletteEntries,{hdc, 246, 255, lnine}) 
     
    for i = 1 to palSize do
    
        if i < 11 then
           if i = 1 then
              junk = c_func(xCopyMemory,{at, onine,  40})
              at += 40
           end if
        elsif i > 246 then
            if i = 247 then
              junk = c_func(xCopyMemory,{at, lnine,  40})
              at += 40            
            end if
        else      
           mypoke(at, pal[i])          
           at = at + 4
        end if
        
    end for
 
    myfree(onine)
    myfree(lnine)
   
    pokew(ple + 0, #300)
    pokew(ple + 2, 256)

    junk = c_func(xCopyMemory,{ple+4, at - 1024,  1024})       
    newpal = c_func(xCreatePalette,{ple})     
    junk = c_func(xSetPaletteEntries, {newpal, 0, 255, ple+4})
    hPal = c_func(xSelectPalette, {hdc, newpal, 1})
    junk = c_func(xRealizePalette, {hdc})
    junk = c_func(xSelectPalette, {hdc, hPal, 1})
    
    pal_exist = 1
           
    else

    junk = c_func(xCopyMemory,{at, ple+4, 1024})
    
    end if
    
    -- Create the DIB.
    
    hDIB = c_func( xCreateDIBitmap, {
                        hdc, 
                        memBitmapInfo,
                        CBM_INIT, 
                        memBits,
                        memBitmapInfo, 
                        0} )
       myfree(memBits)
       myfree(memBitmapInfo)

       return hDIB
    
end function

--from windproc( )

    elsif iMsg = WM_ACTIVATE then
    
          if LOWORD(wParam) =  0 then

              hPal = c_func(xSelectPalette, {hdc, newpal, 0})  
              junk = c_func(xRealizePalette, {hdc})
              InvalidateRect(hwnd, NULL, 0)

              savedDC = c_func(xSaveDC,{hdc})
              --junk = 0
                 
          elsif LOWORD(wParam) =  1 or LOWORD(wParam) =  2 then

                if savedDC > 0 then

                   junk = c_func(xRestoreDC,{hdc, -1})  
                   hPal = c_func(xSelectPalette, {hdc, newpal, 0})  
                   junk = c_func(xRealizePalette, {hdc})

                   InvalidateRect(hwnd, NULL, 0)

                end if
          
          end if
                   
          return junk -- remember to return the ret-val from RealizePalette( )

This is really all there is to palette creation and It now works to display
multiple images that looks proper on all bit levels 
(assuming a palette compatible graphics card and monitor is installed.)

I can answer just about any question you might have about palettes 
now that Ive spent three days researching this.

Thanks again to all the help Wolf, Bernie and Chris!

Euman
euman at bellsouth.net

5 2 1 - 1 - n - 5  The Doors

new topic     » goto parent     » topic index » view message » categorize

8. Re: Graphics Problems

Before someone gets on me about one of the routines heres
an ammended version

    if  pal_exist = 0 then

    c_proc(xSetSystemPaletteUse,{hdc, 1})  

    onine = myalloc(40)
    lnine = myalloc(40)
     
    junk = c_func(xGetSystemPaletteEntries,{hdc, 0, 10, onine}) 
    junk = c_func(xGetSystemPaletteEntries,{hdc, 246, 255, lnine}) 
    
    junk = c_func(xCopyMemory,{at, onine,  40})
    at += 40

    for i = 10 to 245 do        
        mypoke(at, pal[i])          
        at = at + 4        
    end for
    
    junk = c_func(xCopyMemory,{at, lnine,  40})
    at += 40            

Euman
euman at bellsouth.net

5 2 1 - 1 - n - 5  The Doors

new topic     » goto parent     » topic index » view message » categorize

Search



Quick Links

User menu

Not signed in.

Misc Menu