#include <string.h> #include <gui/font.h> class VgaFont : public IFont { protected: const byte* pFontData; public: VgaFont(const byte* buf); STDMETHOD(QueryInterface)(REFIID iid, void ** ppvObject); IMPLEMENT_IUNKNOWN(VgaFont); STDMETHOD(DrawText)(ISurface* pSurf, int x, int y, const wchar_t* str, pixel_t pixColour); STDMETHOD(GetTextExtent)(const wchar_t* str, point_t* size); }; IFont* CreateFont(const byte* pFontData) { return new VgaFont(pFontData); } VgaFont::VgaFont(const byte* buf) { pFontData = buf; m_refs = 0; } HRESULT VgaFont::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 VgaFont::DrawText(ISurface* pSurf, int x, int y, const wchar_t* str, pixel_t pixColour) { const byte *pCharData; const wchar_t* ch; byte pix, *buf; int cx, cy; surface_t desc; rectangle_t rect; if (SUCCEEDED(pSurf->Lock(&desc))) { pSurf->GetClipRect(&rect); x += rect.left; y += rect.top; buf = (byte*) desc.pMemory + y * desc.nPitch; for (ch = str; *ch; ch++) { pCharData = pFontData + (byte) *ch * 8; for (cy = 0; cy < 8; cy++) { if (pCharData[cy]) { for (cx = 0; cx < 8; cx++) { pix = pCharData[cy] & (0x80 >> cx); if (pix) buf[x + cx + cy * desc.nPitch] = pixColour; //pSurf->SetPixel(x + cx, y + cy, pixColour); } } } x += 8; } pSurf->Unlock(); } return S_OK; } HRESULT VgaFont::GetTextExtent(const wchar_t* str, point_t* size) { size->x = wcslen(str) * 8; size->y = 8; return S_OK; }