// ResFont.cpp: implementation of the CResFont class.
//
//////////////////////////////////////////////////////////////////////
#include "ResFont.h"
#include <os/os.h>
#include <string.h>
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CResFont::CResFont(dword inst, word id)
{
m_refs = 0;
m_header = (const FontDirEntry*) resFind(inst, RT_FONT, id, 0);
if (!m_header || m_header->Version != 0x200)
{
m_header = NULL;
m_chartable = NULL;
}
else
m_chartable = (const GlyphInfo20*) ((const byte*) m_header + SIZEOF_FONTDIRENTRY20);
}
CResFont::~CResFont()
{
}
HRESULT CResFont::QueryInterface(REFIID iid, void ** ppvObject)
{
if (InlineIsEqualGUID(iid, IID_IUnknown) ||
InlineIsEqualGUID(iid, IID_IFont))
{
AddRef();
*ppvObject = (IFont*) this;
return S_OK;
}
else
return E_FAIL;
}
HRESULT CResFont::DrawText(ISurface* pSurf, int x, int y, const wchar_t* str,
pixel_t pixColour)
{
const GlyphInfo20 *gi;
const byte* data;
int cx, cy;
pixel_t pix;
surface_t desc;
byte* buf;
rectangle_t rect;
if (!m_chartable || !m_header)
return E_FAIL;
if (SUCCEEDED(pSurf->Lock(&desc)))
{
pSurf->GetClipRect(&rect);
x += rect.left;
y += rect.top;
buf = (byte*) desc.pMemory + y * desc.nPitch;
for (; *str; str++)
{
gi = m_chartable + ((char) *str - m_header->FirstChar);
data = (const byte*) m_header + gi->GIoffset;
for (cy = 0; cy < m_header->PixHeight; cy++)
{
for (cx = 0; cx < gi->GIwidth; cx++)
{
pix = data[cy] & (0x80 >> cx);
if (pix)
buf[x + cx + cy * desc.nPitch] = pixColour;
//pSurf->SetPixel(x + cx, y + cy, pixColour);
}
}
x += gi->GIwidth;
}
pSurf->Unlock();
}
return S_OK;
}
HRESULT CResFont::GetTextExtent(const wchar_t* str, point_t* size)
{
const GlyphInfo20 *gi;
if (!m_chartable || !m_header)
{
size->x = size->y = 0;
return E_FAIL;
}
size->x = 0;
for (; *str; str++)
{
gi = m_chartable + ((char) *str - m_header->FirstChar);
size->x += gi->GIwidth;
}
size->y = m_header->PixHeight;
return S_OK;
}