static void test_logfont(void) { LOGFONTA lfa, lfa2; GpFont *font; GpFontFamily *family; GpStatus stat; GpGraphics *graphics; HDC hdc = GetDC(0); INT style; REAL rval; UINT16 em_height, line_spacing; Unit unit; GdipCreateFromHDC(hdc, &graphics); memset(&lfa, 0, sizeof(LOGFONTA)); memset(&lfa2, 0xff, sizeof(LOGFONTA)); lstrcpyA(lfa.lfFaceName, "Tahoma"); stat = GdipCreateFontFromLogfontA(hdc, &lfa, &font); expect(Ok, stat); stat = GdipGetLogFontA(font, graphics, &lfa2); expect(Ok, stat); ok(lfa2.lfHeight < 0, "Expected negative height\n"); expect(0, lfa2.lfWidth); expect(0, lfa2.lfEscapement); expect(0, lfa2.lfOrientation); ok((lfa2.lfWeight >= 100) && (lfa2.lfWeight <= 900), "Expected weight to be set\n"); expect(0, lfa2.lfItalic); expect(0, lfa2.lfUnderline); expect(0, lfa2.lfStrikeOut); ok(lfa2.lfCharSet == GetTextCharset(hdc) || lfa2.lfCharSet == ANSI_CHARSET, "Expected %x or %x, got %x\n", GetTextCharset(hdc), ANSI_CHARSET, lfa2.lfCharSet); expect(0, lfa2.lfOutPrecision); expect(0, lfa2.lfClipPrecision); expect(0, lfa2.lfQuality); expect(0, lfa2.lfPitchAndFamily); GdipDeleteFont(font); memset(&lfa, 0, sizeof(LOGFONTA)); lfa.lfHeight = 25; lfa.lfWidth = 25; lfa.lfEscapement = lfa.lfOrientation = 50; lfa.lfItalic = lfa.lfUnderline = lfa.lfStrikeOut = TRUE; memset(&lfa2, 0xff, sizeof(LOGFONTA)); lstrcpyA(lfa.lfFaceName, "Tahoma"); stat = GdipCreateFontFromLogfontA(hdc, &lfa, &font); expect(Ok, stat); stat = GdipGetLogFontA(font, graphics, &lfa2); expect(Ok, stat); ok(lfa2.lfHeight < 0, "Expected negative height\n"); expect(0, lfa2.lfWidth); expect(0, lfa2.lfEscapement); expect(0, lfa2.lfOrientation); ok((lfa2.lfWeight >= 100) && (lfa2.lfWeight <= 900), "Expected weight to be set\n"); expect(TRUE, lfa2.lfItalic); expect(TRUE, lfa2.lfUnderline); expect(TRUE, lfa2.lfStrikeOut); ok(lfa2.lfCharSet == GetTextCharset(hdc) || lfa2.lfCharSet == ANSI_CHARSET, "Expected %x or %x, got %x\n", GetTextCharset(hdc), ANSI_CHARSET, lfa2.lfCharSet); expect(0, lfa2.lfOutPrecision); expect(0, lfa2.lfClipPrecision); expect(0, lfa2.lfQuality); expect(0, lfa2.lfPitchAndFamily); stat = GdipGetFontStyle(font, &style); expect(Ok, stat); ok (style == (FontStyleItalic | FontStyleUnderline | FontStyleStrikeout), "Expected , got %d\n", style); stat = GdipGetFontUnit(font, &unit); expect(Ok, stat); expect(UnitWorld, unit); stat = GdipGetFontHeight(font, graphics, &rval); expect(Ok, stat); expectf(25.347656, rval); stat = GdipGetFontSize(font, &rval); expect(Ok, stat); expectf(21.0, rval); stat = GdipGetFamily(font, &family); expect(Ok, stat); stat = GdipGetEmHeight(family, FontStyleRegular, &em_height); expect(Ok, stat); expect(2048, em_height); stat = GdipGetLineSpacing(family, FontStyleRegular, &line_spacing); expect(Ok, stat); expect(2472, line_spacing); GdipDeleteFontFamily(family); GdipDeleteFont(font); memset(&lfa, 0, sizeof(lfa)); lfa.lfHeight = -25; lstrcpyA(lfa.lfFaceName, "Tahoma"); stat = GdipCreateFontFromLogfontA(hdc, &lfa, &font); expect(Ok, stat); memset(&lfa2, 0xff, sizeof(lfa2)); stat = GdipGetLogFontA(font, graphics, &lfa2); expect(Ok, stat); expect(lfa.lfHeight, lfa2.lfHeight); stat = GdipGetFontUnit(font, &unit); expect(Ok, stat); expect(UnitWorld, unit); stat = GdipGetFontHeight(font, graphics, &rval); expect(Ok, stat); expectf(30.175781, rval); stat = GdipGetFontSize(font, &rval); expect(Ok, stat); expectf(25.0, rval); stat = GdipGetFamily(font, &family); expect(Ok, stat); stat = GdipGetEmHeight(family, FontStyleRegular, &em_height); expect(Ok, stat); expect(2048, em_height); stat = GdipGetLineSpacing(family, FontStyleRegular, &line_spacing); expect(Ok, stat); expect(2472, line_spacing); GdipDeleteFontFamily(family); GdipDeleteFont(font); GdipDeleteGraphics(graphics); ReleaseDC(0, hdc); }
static void test_font_substitution(void) { WCHAR ms_shell_dlg[LF_FACESIZE]; HDC hdc; HFONT hfont; LOGFONTA lf; GpStatus status; GpGraphics *graphics; GpFont *font; GpFontFamily *family; int ret; hdc = CreateCompatibleDC(0); status = GdipCreateFromHDC(hdc, &graphics); expect(Ok, status); hfont = GetStockObject(DEFAULT_GUI_FONT); ok(hfont != 0, "GetStockObject(DEFAULT_GUI_FONT) failed\n"); memset(&lf, 0xfe, sizeof(lf)); ret = GetObjectA(hfont, sizeof(lf), &lf); ok(ret == sizeof(lf), "GetObject failed\n"); ok(!lstrcmpA(lf.lfFaceName, "MS Shell Dlg"), "wrong face name %s\n", lf.lfFaceName); MultiByteToWideChar(CP_ACP, 0, lf.lfFaceName, -1, ms_shell_dlg, LF_FACESIZE); status = GdipCreateFontFromLogfontA(hdc, &lf, &font); expect(Ok, status); memset(&lf, 0xfe, sizeof(lf)); status = GdipGetLogFontA(font, graphics, &lf); expect(Ok, status); ok(!lstrcmpA(lf.lfFaceName, "Microsoft Sans Serif") || !lstrcmpA(lf.lfFaceName, "Tahoma"), "wrong face name %s\n", lf.lfFaceName); GdipDeleteFont(font); status = GdipCreateFontFamilyFromName(ms_shell_dlg, NULL, &family); expect(Ok, status); status = GdipCreateFont(family, 12, FontStyleRegular, UnitPoint, &font); expect(Ok, status); memset(&lf, 0xfe, sizeof(lf)); status = GdipGetLogFontA(font, graphics, &lf); expect(Ok, status); ok(!lstrcmpA(lf.lfFaceName, "Microsoft Sans Serif") || !lstrcmpA(lf.lfFaceName, "Tahoma"), "wrong face name %s\n", lf.lfFaceName); GdipDeleteFont(font); GdipDeleteFontFamily(family); status = GdipCreateFontFamilyFromName(nonexistent, NULL, &family); ok(status == FontFamilyNotFound, "expected FontFamilyNotFound, got %d\n", status); lstrcpyA(lf.lfFaceName, "ThisFontShouldNotExist"); status = GdipCreateFontFromLogfontA(hdc, &lf, &font); expect(Ok, status); memset(&lf, 0xfe, sizeof(lf)); status = GdipGetLogFontA(font, graphics, &lf); expect(Ok, status); ok(!lstrcmpA(lf.lfFaceName, "Arial"), "wrong face name %s\n", lf.lfFaceName); GdipDeleteFont(font); /* empty FaceName */ lf.lfFaceName[0] = 0; status = GdipCreateFontFromLogfontA(hdc, &lf, &font); expect(Ok, status); memset(&lf, 0xfe, sizeof(lf)); status = GdipGetLogFontA(font, graphics, &lf); expect(Ok, status); ok(!lstrcmpA(lf.lfFaceName, "Arial"), "wrong face name %s\n", lf.lfFaceName); GdipDeleteFont(font); /* zeroing out lfWeight and lfCharSet leads to font creation failure */ lf.lfWeight = 0; lf.lfCharSet = 0; lstrcpyA(lf.lfFaceName, "ThisFontShouldNotExist"); font = NULL; status = GdipCreateFontFromLogfontA(hdc, &lf, &font); todo_wine ok(status == NotTrueTypeFont || broken(status == FileNotFound), /* before XP */ "expected NotTrueTypeFont, got %d\n", status); /* FIXME: remove when wine is fixed */ if (font) GdipDeleteFont(font); /* empty FaceName */ lf.lfFaceName[0] = 0; font = NULL; status = GdipCreateFontFromLogfontA(hdc, &lf, &font); todo_wine ok(status == NotTrueTypeFont || broken(status == FileNotFound), /* before XP */ "expected NotTrueTypeFont, got %d\n", status); /* FIXME: remove when wine is fixed */ if (font) GdipDeleteFont(font); GdipDeleteGraphics(graphics); DeleteDC(hdc); }
static void test_font_transform(void) { static const WCHAR string[] = { 'A',0 }; GpStatus status; HDC hdc; LOGFONTA lf; GpFont *font; GpGraphics *graphics; GpMatrix *matrix; GpStringFormat *format, *typographic; PointF pos[1] = { { 0,0 } }; REAL height, margin_y; RectF bounds, rect; hdc = CreateCompatibleDC(0); status = GdipCreateFromHDC(hdc, &graphics); expect(Ok, status); status = GdipSetPageUnit(graphics, UnitPixel); expect(Ok, status); status = GdipCreateStringFormat(0, LANG_NEUTRAL, &format); expect(Ok, status); status = GdipStringFormatGetGenericTypographic(&typographic); expect(Ok, status); memset(&lf, 0, sizeof(lf)); lstrcpyA(lf.lfFaceName, "Tahoma"); lf.lfHeight = -100; lf.lfWidth = 100; status = GdipCreateFontFromLogfontA(hdc, &lf, &font); expect(Ok, status); margin_y = 100.0 / 8.0; /* identity matrix */ status = GdipCreateMatrix(&matrix); expect(Ok, status); status = GdipSetWorldTransform(graphics, matrix); expect(Ok, status); status = GdipGetLogFontA(font, graphics, &lf); expect(Ok, status); expect(-100, lf.lfHeight); expect(0, lf.lfWidth); expect(0, lf.lfEscapement); expect(0, lf.lfOrientation); status = GdipGetFontHeight(font, graphics, &height); expect(Ok, status); expectf(120.703125, height); set_rect_empty(&rect); set_rect_empty(&bounds); status = GdipMeasureString(graphics, string, -1, font, &rect, format, &bounds, NULL, NULL); expect(Ok, status); expectf(0.0, bounds.X); expectf(0.0, bounds.Y); todo_wine expectf(height + margin_y, bounds.Height); set_rect_empty(&rect); set_rect_empty(&bounds); status = GdipMeasureString(graphics, string, -1, font, &rect, typographic, &bounds, NULL, NULL); expect(Ok, status); expectf(0.0, bounds.X); expectf(0.0, bounds.Y); expectf_(height, bounds.Height, 1.0); set_rect_empty(&bounds); status = GdipMeasureDriverString(graphics, (const UINT16 *)string, -1, font, pos, DriverStringOptionsCmapLookup, NULL, &bounds); expect(Ok, status); expectf(0.0, bounds.X); expectf_(-100.0, bounds.Y, 0.05); expectf_(height, bounds.Height, 0.5); set_rect_empty(&bounds); status = GdipMeasureDriverString(graphics, (const UINT16 *)string, -1, font, pos, DriverStringOptionsCmapLookup, matrix, &bounds); expect(Ok, status); expectf(0.0, bounds.X); expectf_(-100.0, bounds.Y, 0.05); expectf_(height, bounds.Height, 0.5); /* scale matrix */ status = GdipScaleMatrix(matrix, 2.0, 3.0, MatrixOrderAppend); expect(Ok, status); status = GdipSetWorldTransform(graphics, matrix); expect(Ok, status); status = GdipGetLogFontA(font, graphics, &lf); expect(Ok, status); expect(-300, lf.lfHeight); expect(0, lf.lfWidth); expect(0, lf.lfEscapement); expect(0, lf.lfOrientation); status = GdipGetFontHeight(font, graphics, &height); expect(Ok, status); expectf(120.703125, height); set_rect_empty(&rect); set_rect_empty(&bounds); status = GdipMeasureString(graphics, string, -1, font, &rect, format, &bounds, NULL, NULL); expect(Ok, status); expectf(0.0, bounds.X); expectf(0.0, bounds.Y); todo_wine expectf(height + margin_y, bounds.Height); set_rect_empty(&rect); set_rect_empty(&bounds); status = GdipMeasureString(graphics, string, -1, font, &rect, typographic, &bounds, NULL, NULL); expect(Ok, status); expectf(0.0, bounds.X); expectf(0.0, bounds.Y); expectf_(height, bounds.Height, 0.05); set_rect_empty(&bounds); status = GdipMeasureDriverString(graphics, (const UINT16 *)string, -1, font, pos, DriverStringOptionsCmapLookup, NULL, &bounds); expect(Ok, status); expectf(0.0, bounds.X); expectf_(-100.0, bounds.Y, 0.05); expectf_(height, bounds.Height, 0.2); set_rect_empty(&bounds); status = GdipMeasureDriverString(graphics, (const UINT16 *)string, -1, font, pos, DriverStringOptionsCmapLookup, matrix, &bounds); expect(Ok, status); expectf(0.0, bounds.X); todo_wine expectf_(-300.0, bounds.Y, 0.15); todo_wine expectf(height * 3.0, bounds.Height); /* scale + ratate matrix */ status = GdipRotateMatrix(matrix, 45.0, MatrixOrderAppend); expect(Ok, status); status = GdipSetWorldTransform(graphics, matrix); expect(Ok, status); status = GdipGetLogFontA(font, graphics, &lf); expect(Ok, status); expect(-300, lf.lfHeight); expect(0, lf.lfWidth); expect_(3151, lf.lfEscapement, 1); expect_(3151, lf.lfOrientation, 1); status = GdipGetFontHeight(font, graphics, &height); expect(Ok, status); expectf(120.703125, height); set_rect_empty(&rect); set_rect_empty(&bounds); status = GdipMeasureString(graphics, string, -1, font, &rect, format, &bounds, NULL, NULL); expect(Ok, status); expectf(0.0, bounds.X); expectf(0.0, bounds.Y); todo_wine expectf(height + margin_y, bounds.Height); set_rect_empty(&rect); set_rect_empty(&bounds); status = GdipMeasureString(graphics, string, -1, font, &rect, typographic, &bounds, NULL, NULL); expect(Ok, status); expectf(0.0, bounds.X); expectf(0.0, bounds.Y); expectf_(height, bounds.Height, 0.05); set_rect_empty(&bounds); status = GdipMeasureDriverString(graphics, (const UINT16 *)string, -1, font, pos, DriverStringOptionsCmapLookup, NULL, &bounds); expect(Ok, status); expectf(0.0, bounds.X); expectf_(-100.0, bounds.Y, 0.05); expectf_(height, bounds.Height, 0.2); set_rect_empty(&bounds); status = GdipMeasureDriverString(graphics, (const UINT16 *)string, -1, font, pos, DriverStringOptionsCmapLookup, matrix, &bounds); expect(Ok, status); todo_wine expectf_(-43.814377, bounds.X, 0.05); todo_wine expectf_(-212.235611, bounds.Y, 0.05); todo_wine expectf_(340.847534, bounds.Height, 0.05); /* scale + ratate + shear matrix */ status = GdipShearMatrix(matrix, 4.0, 5.0, MatrixOrderAppend); expect(Ok, status); status = GdipSetWorldTransform(graphics, matrix); expect(Ok, status); status = GdipGetLogFontA(font, graphics, &lf); expect(Ok, status); todo_wine expect(1032, lf.lfHeight); expect(0, lf.lfWidth); expect_(3099, lf.lfEscapement, 1); expect_(3099, lf.lfOrientation, 1); status = GdipGetFontHeight(font, graphics, &height); expect(Ok, status); expectf(120.703125, height); set_rect_empty(&rect); set_rect_empty(&bounds); status = GdipMeasureString(graphics, string, -1, font, &rect, format, &bounds, NULL, NULL); expect(Ok, status); expectf(0.0, bounds.X); expectf(0.0, bounds.Y); todo_wine expectf(height + margin_y, bounds.Height); set_rect_empty(&rect); set_rect_empty(&bounds); status = GdipMeasureString(graphics, string, -1, font, &rect, typographic, &bounds, NULL, NULL); expect(Ok, status); expectf(0.0, bounds.X); expectf(0.0, bounds.Y); expectf_(height, bounds.Height, 0.2); set_rect_empty(&bounds); status = GdipMeasureDriverString(graphics, (const UINT16 *)string, -1, font, pos, DriverStringOptionsCmapLookup, NULL, &bounds); expect(Ok, status); expectf(0.0, bounds.X); expectf_(-100.0, bounds.Y, 0.2); expectf_(height, bounds.Height, 0.2); set_rect_empty(&bounds); status = GdipMeasureDriverString(graphics, (const UINT16 *)string, -1, font, pos, DriverStringOptionsCmapLookup, matrix, &bounds); expect(Ok, status); todo_wine expectf_(-636.706848, bounds.X, 0.05); todo_wine expectf_(-175.257523, bounds.Y, 0.05); todo_wine expectf_(1532.984985, bounds.Height, 0.05); /* scale + ratate + shear + translate matrix */ status = GdipTranslateMatrix(matrix, 10.0, 20.0, MatrixOrderAppend); expect(Ok, status); status = GdipSetWorldTransform(graphics, matrix); expect(Ok, status); status = GdipGetLogFontA(font, graphics, &lf); expect(Ok, status); todo_wine expect(1032, lf.lfHeight); expect(0, lf.lfWidth); expect_(3099, lf.lfEscapement, 1); expect_(3099, lf.lfOrientation, 1); status = GdipGetFontHeight(font, graphics, &height); expect(Ok, status); expectf(120.703125, height); set_rect_empty(&rect); set_rect_empty(&bounds); status = GdipMeasureString(graphics, string, -1, font, &rect, format, &bounds, NULL, NULL); expect(Ok, status); expectf(0.0, bounds.X); expectf(0.0, bounds.Y); todo_wine expectf(height + margin_y, bounds.Height); set_rect_empty(&rect); set_rect_empty(&bounds); status = GdipMeasureString(graphics, string, -1, font, &rect, typographic, &bounds, NULL, NULL); expect(Ok, status); expectf(0.0, bounds.X); expectf(0.0, bounds.Y); expectf_(height, bounds.Height, 0.1); set_rect_empty(&bounds); status = GdipMeasureDriverString(graphics, (const UINT16 *)string, -1, font, pos, DriverStringOptionsCmapLookup, NULL, &bounds); expect(Ok, status); expectf(0.0, bounds.X); expectf_(-100.0, bounds.Y, 0.2); expectf_(height, bounds.Height, 0.2); set_rect_empty(&bounds); status = GdipMeasureDriverString(graphics, (const UINT16 *)string, -1, font, pos, DriverStringOptionsCmapLookup, matrix, &bounds); expect(Ok, status); todo_wine expectf_(-626.706848, bounds.X, 0.05); todo_wine expectf_(-155.257523, bounds.Y, 0.05); todo_wine expectf_(1532.984985, bounds.Height, 0.05); GdipDeleteMatrix(matrix); GdipDeleteFont(font); GdipDeleteGraphics(graphics); GdipDeleteStringFormat(typographic); GdipDeleteStringFormat(format); DeleteDC(hdc); }
static void test_logfont(void) { LOGFONTA lfa, lfa2; GpFont *font; GpStatus stat; GpGraphics *graphics; HDC hdc = GetDC(0); INT style; GdipCreateFromHDC(hdc, &graphics); memset(&lfa, 0, sizeof(LOGFONTA)); memset(&lfa2, 0xff, sizeof(LOGFONTA)); /* empty FaceName */ lfa.lfFaceName[0] = 0; stat = GdipCreateFontFromLogfontA(hdc, &lfa, &font); expect(NotTrueTypeFont, stat); lstrcpyA(lfa.lfFaceName, "Arial"); stat = GdipCreateFontFromLogfontA(hdc, &lfa, &font); if (stat == FileNotFound) { skip("Arial not installed.\n"); return; } expect(Ok, stat); stat = GdipGetLogFontA(font, graphics, &lfa2); expect(Ok, stat); ok(lfa2.lfHeight < 0, "Expected negative height\n"); expect(0, lfa2.lfWidth); expect(0, lfa2.lfEscapement); expect(0, lfa2.lfOrientation); ok((lfa2.lfWeight >= 100) && (lfa2.lfWeight <= 900), "Expected weight to be set\n"); expect(0, lfa2.lfItalic); expect(0, lfa2.lfUnderline); expect(0, lfa2.lfStrikeOut); expect(GetTextCharset(hdc), lfa2.lfCharSet); expect(0, lfa2.lfOutPrecision); expect(0, lfa2.lfClipPrecision); expect(0, lfa2.lfQuality); expect(0, lfa2.lfPitchAndFamily); GdipDeleteFont(font); memset(&lfa, 0, sizeof(LOGFONTA)); lfa.lfHeight = 25; lfa.lfWidth = 25; lfa.lfEscapement = lfa.lfOrientation = 50; lfa.lfItalic = lfa.lfUnderline = lfa.lfStrikeOut = TRUE; memset(&lfa2, 0xff, sizeof(LOGFONTA)); lstrcpyA(lfa.lfFaceName, "Arial"); stat = GdipCreateFontFromLogfontA(hdc, &lfa, &font); expect(Ok, stat); stat = GdipGetLogFontA(font, graphics, &lfa2); expect(Ok, stat); ok(lfa2.lfHeight < 0, "Expected negative height\n"); expect(0, lfa2.lfWidth); expect(0, lfa2.lfEscapement); expect(0, lfa2.lfOrientation); ok((lfa2.lfWeight >= 100) && (lfa2.lfWeight <= 900), "Expected weight to be set\n"); expect(TRUE, lfa2.lfItalic); expect(TRUE, lfa2.lfUnderline); expect(TRUE, lfa2.lfStrikeOut); expect(GetTextCharset(hdc), lfa2.lfCharSet); expect(0, lfa2.lfOutPrecision); expect(0, lfa2.lfClipPrecision); expect(0, lfa2.lfQuality); expect(0, lfa2.lfPitchAndFamily); stat = GdipGetFontStyle(font, &style); expect(Ok, stat); ok (style == (FontStyleItalic | FontStyleUnderline | FontStyleStrikeout), "Expected , got %d\n", style); GdipDeleteFont(font); GdipDeleteGraphics(graphics); ReleaseDC(0, hdc); }