WindowsXP-SP1/windows/advcore/gdiplus/engine/runtime/runtime.cpp
2020-09-30 16:53:49 +02:00

194 lines
3.5 KiB
C++

/**************************************************************************\
*
* Copyright (c) 1999 Microsoft Corporation
*
* Module Name:
*
* GDI+ runtime initialization
*
* Abstract:
*
* Initialization and uninitialization functions for the GDI+ run-time.
*
* Revision History:
*
* 09/08/1999 agodfrey
* Created it.
*
\**************************************************************************/
#include "precomp.hpp"
HINSTANCE DllInstance;
/**************************************************************************\
*
* Function Description:
*
* GDI+ run-time initialization function.
*
* Arguments:
*
* NONE
*
* Return Value:
*
* FALSE if failure
*
\**************************************************************************/
BOOL
GpRuntime::Initialize()
{
OSInfo::Initialize();
if (!DllInstance)
DllInstance = GetModuleHandleA(0);
return TRUE;
}
/**************************************************************************\
*
* Function Description:
*
* GDI+ run-time cleanup function.
*
* Arguments:
*
* NONE
*
* Return Value:
*
* NONE
*
\**************************************************************************/
VOID
GpRuntime::Uninitialize()
{
}
/**************************************************************************\
*
* Function Description:
*
* raise to an integer power (up to
*
* Arguments:
*
* exp - an integer exponent
*
* Return Value:
*
* 2^exp. If exp >= 31, then return 2^31.
*
\**************************************************************************/
UINT
GpRuntime::Gppow2 (UINT exp)
{
UINT maxexp = (sizeof(UINT)*8) - 1;
UINT rv = 1;
if (exp >= maxexp)
{
return (rv << maxexp);
}
else
{
while (exp--)
{
rv <<= 1;
}
}
return rv;
}
/**************************************************************************\
*
* Function Description:
*
* raise to an integer power (up to
*
* Arguments:
*
* x - an integer value
*
* Return Value:
*
* floor of log base 2 of x. If x = 0, return 0.
*
\**************************************************************************/
UINT
GpRuntime::Gplog2 (UINT x)
{
UINT rv = 0;
x >>= 1;
while (x)
{
rv++;
x >>= 1;
}
return rv;
}
/**************************************************************************\
*
* Function Description:
*
* Moves a block of memory. Handles overlapping cases.
*
* Arguments:
*
* dest - The destination buffer
* src - The source buffer
* count - The number of bytes to copy
*
* Return Value:
*
* dest
*
* Revision History:
*
* 10/22/1999 AGodfrey
* Wrote it.
*
\******************************************************************************/
void *
GpRuntime::GpMemmove(
void *dest,
const void *src,
size_t count )
{
const BYTE *s = static_cast<const BYTE *>(src);
BYTE *d = static_cast<BYTE *>(dest);
// Test for the overlapping case we care about - dest is within the source
// buffer. The other case is handled by the normal loop.
if ((d > s) && (d < s + count))
{
d += count;
s += count;
while (count)
{
*--d = *--s;
count--;
}
}
else
{
while (count)
{
*d++ = *s++;
count--;
}
}
return dest;
}