/*++

 Copyright (c) 1999 Microsoft Corporation

 Module Name:

    TonkaConstruction.cpp

 Abstract:

    Workaround for GDI behavior difference when bltting palettized bitmaps. On 
    Win9x GDI first looked at the current index for a color match when building 
    a lookup table, but on NT, it simply searches from the beginning. This 
    breaks palette animation. The fix is to make sure that the entries that are 
    animated are different from all the others.
    
 Notes:

    This is an app specific shim.

 History:

    12/02/2001 linstev  Created

--*/

#include "precomp.h"

IMPLEMENT_SHIM_BEGIN(TonkaConstruction)
#include "ShimHookMacro.h"

APIHOOK_ENUM_BEGIN
    APIHOOK_ENUM_ENTRY(CreatePalette) 
APIHOOK_ENUM_END

/*++

 Make sure index 10->15 are different from all other entries.

--*/

HPALETTE
APIHOOK(CreatePalette)(
    CONST LOGPALETTE *lplgpl    
    )
{
Restart:
    for (int i=10; i<=15; i++) {
        LPDWORD p1 = (DWORD *)&lplgpl->palPalEntry[i];
        for (int j=16; j<=255; j++) {
            LPDWORD p2 = (DWORD *)&lplgpl->palPalEntry[j]; 

            if (*p1 == *p2) {
                //
                // Entry is the same, so make it different
                //
                *p1 = *p1-1;
                goto Restart;
            }
        }
    }
    
    return ORIGINAL_API(CreatePalette)(lplgpl);
}
   
/*++

 Register hooked functions

--*/

HOOK_BEGIN
    APIHOOK_ENTRY(GDI32.DLL, CreatePalette)
HOOK_END

IMPLEMENT_SHIM_END