/* * Copyright (C) 2007 Google (Evan Stade) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include <stdarg.h> #include "windef.h" #include "winbase.h" #include "wingdi.h" #include "winnls.h" #include "objbase.h" #include "gdiplus.h" #include "gdiplus_private.h" GpStatus WINGDIPAPI GdipCreateFontFromLogfontW(HDC hdc, GDIPCONST LOGFONTW *logfont, GpFont **font) { HFONT hfont, oldfont; TEXTMETRICW textmet; if(!logfont || !font) return InvalidParameter; *font = GdipAlloc(sizeof(GpFont)); if(!*font) return OutOfMemory; memcpy(&(*font)->lfw.lfFaceName, logfont->lfFaceName, LF_FACESIZE * sizeof(WCHAR)); (*font)->lfw.lfHeight = logfont->lfHeight; (*font)->lfw.lfItalic = logfont->lfItalic; (*font)->lfw.lfUnderline = logfont->lfUnderline; (*font)->lfw.lfStrikeOut = logfont->lfStrikeOut; hfont = CreateFontIndirectW(&(*font)->lfw); oldfont = SelectObject(hdc, hfont); GetTextMetricsW(hdc, &textmet); (*font)->lfw.lfHeight = -textmet.tmHeight; (*font)->lfw.lfWeight = textmet.tmWeight; SelectObject(hdc, oldfont); DeleteObject(hfont); return Ok; } GpStatus WINGDIPAPI GdipCreateFontFromLogfontA(HDC hdc, GDIPCONST LOGFONTA *lfa, GpFont **font) { LOGFONTW lfw; if(!lfa || !font) return InvalidParameter; memcpy(&lfw, lfa, FIELD_OFFSET(LOGFONTA,lfFaceName) ); if(!MultiByteToWideChar(CP_ACP, 0, lfa->lfFaceName, -1, lfw.lfFaceName, LF_FACESIZE)) return GenericError; GdipCreateFontFromLogfontW(hdc, &lfw, font); return Ok; } GpStatus WINGDIPAPI GdipDeleteFont(GpFont* font) { if(!font) return InvalidParameter; GdipFree(font); return Ok; } GpStatus WINGDIPAPI GdipCreateFontFromDC(HDC hdc, GpFont **font) { HFONT hfont; LOGFONTW lfw; if(!font) return InvalidParameter; hfont = (HFONT)GetCurrentObject(hdc, OBJ_FONT); if(!hfont) return GenericError; if(!GetObjectW(hfont, sizeof(LOGFONTW), &lfw)) return GenericError; return GdipCreateFontFromLogfontW(hdc, &lfw, font); } /* FIXME: use graphics */ GpStatus WINGDIPAPI GdipGetLogFontW(GpFont *font, GpGraphics *graphics, LOGFONTW *lfw) { if(!font || !graphics || !lfw) return InvalidParameter; *lfw = font->lfw; return Ok; } GpStatus WINGDIPAPI GdipCloneFont(GpFont *font, GpFont **cloneFont) { if(!font || !cloneFont) return InvalidParameter; *cloneFont = GdipAlloc(sizeof(GpFont)); if(!*cloneFont) return OutOfMemory; **cloneFont = *font; return Ok; }