/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 4 -*- * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "mozilla/Util.h" #include "nsCOMPtr.h" #include "nsTArray.h" #include "nsString.h" #include "nsDependentString.h" #include "prinrval.h" #include "gfxContext.h" #include "gfxFont.h" #include "gfxPlatform.h" #include "gfxFontTest.h" #if defined(XP_MACOSX) #include "gfxTestCocoaHelper.h" #endif #ifdef MOZ_WIDGET_GTK #include "gtk/gtk.h" #endif using namespace mozilla; struct TestEntry { const char* mFamilies; const char* mString; }; TestEntry testList[] = { #include "per-word-runs.h" { nsnull, nsnull } // terminator }; already_AddRefed MakeContext () { const int size = 200; nsRefPtr surface; surface = gfxPlatform::GetPlatform()-> CreateOffscreenSurface(gfxIntSize(size, size), gfxASurface::ContentFromFormat(gfxASurface::ImageFormatRGB24)); gfxContext *ctx = new gfxContext(surface); NS_IF_ADDREF(ctx); return ctx; } nsRefPtr fontGroup; const char* lastFamilies = nsnull; void RunTest (TestEntry *test, gfxContext *ctx) { if (!lastFamilies || strcmp(lastFamilies, test->mFamilies)) { gfxFontStyle style_western_normal_16 (FONT_STYLE_NORMAL, NS_FONT_STRETCH_NORMAL, 400, 16.0, NS_NewPermanentAtom(NS_LITERAL_STRING("en")), 0.0, false, false, false, NS_LITERAL_STRING(""), NS_LITERAL_STRING("")); fontGroup = gfxPlatform::GetPlatform()->CreateFontGroup(NS_ConvertUTF8toUTF16(test->mFamilies), &style_western_normal_16, nsnull); } nsAutoPtr textRun; PRUint32 i; bool isASCII = true; for (i = 0; test->mString[i]; ++i) { if (test->mString[i] & 0x80) { isASCII = false; } } gfxTextRunFactory::Parameters params = { ctx, nsnull, nsnull, nsnull, 0, 60 }; PRUint32 flags = gfxTextRunFactory::TEXT_IS_PERSISTENT; PRUint32 length; if (isASCII) { flags |= gfxTextRunFactory::TEXT_IS_ASCII | gfxTextRunFactory::TEXT_IS_8BIT; length = strlen(test->mString); textRun = fontGroup->MakeTextRun(reinterpret_cast(test->mString), length, ¶ms, flags); } else { NS_ConvertUTF8toUTF16 str(nsDependentCString(test->mString)); length = str.Length(); textRun = fontGroup->MakeTextRun(str.get(), length, ¶ms, flags); } // Should we test drawing? // textRun->Draw(ctx, gfxPoint(0,0), 0, length, nsnull, nsnull, nsnull); textRun->GetAdvanceWidth(0, length, nsnull); } PRUint32 iterations = 20; int main (int argc, char **argv) { #ifdef MOZ_WIDGET_GTK gtk_init(&argc, &argv); #endif #ifdef XP_MACOSX CocoaPoolInit(); #endif // Initialize XPCOM nsresult rv = NS_InitXPCOM2(nsnull, nsnull, nsnull); if (NS_FAILED(rv)) return -1; if (!gfxPlatform::GetPlatform()) return -1; // let's get all the xpcom goop out of the system fflush (stderr); fflush (stdout); nsRefPtr context = MakeContext(); // Start timing PRIntervalTime start = PR_IntervalNow(); for (PRUint32 i = 0; i < iterations; ++i) { for (uint test = 0; test < ArrayLength(testList) - 1; test++) { RunTest(&testList[test], context); } } PRIntervalTime end = PR_IntervalNow(); printf("Elapsed time (ms): %d\n", PR_IntervalToMilliseconds(end - start)); fflush (stderr); fflush (stdout); }