PRBool gfxGDIFont::InitTextRun(gfxContext *aContext, gfxTextRun *aTextRun, const PRUnichar *aString, PRUint32 aRunStart, PRUint32 aRunLength, PRInt32 aRunScript) { if (!mMetrics) { Initialize(); } if (!mIsValid) { NS_WARNING("invalid font! expect incorrect text rendering"); return PR_FALSE; } PRBool ok = PR_FALSE; if (mHarfBuzzShaper) { if (gfxPlatform::GetPlatform()->UseHarfBuzzLevel() >= gfxUnicodeProperties::ScriptShapingLevel(aRunScript)) { ok = mHarfBuzzShaper->InitTextRun(aContext, aTextRun, aString, aRunStart, aRunLength, aRunScript); } } if (!ok) { GDIFontEntry *fe = static_cast<GDIFontEntry*>(GetFontEntry()); PRBool useUniscribeOnly = !fe->IsTrueType() || fe->IsSymbolFont(); if (useUniscribeOnly || (UseUniscribe(aTextRun, aString, aRunStart, aRunLength) && !fe->mForceGDI)) { // first try Uniscribe if (!mUniscribeShaper) { mUniscribeShaper = new gfxUniscribeShaper(this); } ok = mUniscribeShaper->InitTextRun(aContext, aTextRun, aString, aRunStart, aRunLength, aRunScript); if (ok) { return PR_TRUE; } // fallback to GDI shaping if (!useUniscribeOnly) { if (!mPlatformShaper) { CreatePlatformShaper(); } ok = mPlatformShaper->InitTextRun(aContext, aTextRun, aString, aRunStart, aRunLength, aRunScript); } } else { // first use GDI if (!mPlatformShaper) { CreatePlatformShaper(); } ok = mPlatformShaper->InitTextRun(aContext, aTextRun, aString, aRunStart, aRunLength, aRunScript); if (ok) { return PR_TRUE; } // first try Uniscribe if (!mUniscribeShaper) { mUniscribeShaper = new gfxUniscribeShaper(this); } // use Uniscribe shaping ok = mUniscribeShaper->InitTextRun(aContext, aTextRun, aString, aRunStart, aRunLength, aRunScript); } #if DEBUG if (!ok) { NS_ConvertUTF16toUTF8 name(GetName()); char msg[256]; sprintf(msg, "text shaping with both uniscribe and GDI failed for" " font: %s", name.get()); NS_WARNING(msg); } #endif } return ok; }
bool gfxGDIFont::ShapeWord(gfxContext *aContext, gfxShapedWord *aShapedWord, const PRUnichar *aString, bool aPreferPlatformShaping) { if (!mMetrics) { Initialize(); } if (!mIsValid) { NS_WARNING("invalid font! expect incorrect text rendering"); return false; } bool ok = false; // Ensure the cairo font is set up, so there's no risk it'll fall back to // creating a "toy" font internally (see bug 544617). // We must check that this succeeded, otherwise we risk cairo creating the // wrong kind of font internally as a fallback (bug 744480). if (!SetupCairoFont(aContext)) { return false; } #ifdef MOZ_GRAPHITE if (mGraphiteShaper && gfxPlatform::GetPlatform()->UseGraphiteShaping()) { ok = mGraphiteShaper->ShapeWord(aContext, aShapedWord, aString); } #endif if (!ok && mHarfBuzzShaper) { if (gfxPlatform::GetPlatform()->UseHarfBuzzForScript(aShapedWord->Script())) { ok = mHarfBuzzShaper->ShapeWord(aContext, aShapedWord, aString); } } if (!ok) { GDIFontEntry *fe = static_cast<GDIFontEntry*>(GetFontEntry()); bool preferUniscribe = (!fe->IsTrueType() || fe->IsSymbolFont()) && !fe->mForceGDI; if (preferUniscribe || UseUniscribe(aShapedWord, aString)) { // first try Uniscribe if (!mUniscribeShaper) { mUniscribeShaper = new gfxUniscribeShaper(this); } ok = mUniscribeShaper->ShapeWord(aContext, aShapedWord, aString); if (ok) { return true; } // fallback to GDI shaping if (!mPlatformShaper) { CreatePlatformShaper(); } ok = mPlatformShaper->ShapeWord(aContext, aShapedWord, aString); } else { // first use GDI if (!mPlatformShaper) { CreatePlatformShaper(); } ok = mPlatformShaper->ShapeWord(aContext, aShapedWord, aString); if (ok) { return true; } // try Uniscribe if GDI failed if (!mUniscribeShaper) { mUniscribeShaper = new gfxUniscribeShaper(this); } // use Uniscribe shaping ok = mUniscribeShaper->ShapeWord(aContext, aShapedWord, aString); } #if DEBUG if (!ok) { NS_ConvertUTF16toUTF8 name(GetName()); char msg[256]; sprintf(msg, "text shaping with both uniscribe and GDI failed for" " font: %s", name.get()); NS_WARNING(msg); } #endif } if (ok && IsSyntheticBold()) { float synBoldOffset = GetSyntheticBoldOffset() * CalcXScale(aContext); aShapedWord->AdjustAdvancesForSyntheticBold(synBoldOffset); } return ok; }
bool gfxGDIFont::InitTextRun(gfxContext *aContext, gfxTextRun *aTextRun, const PRUnichar *aString, PRUint32 aRunStart, PRUint32 aRunLength, PRInt32 aRunScript, bool aPreferPlatformShaping) { if (!mMetrics) { Initialize(); } if (!mIsValid) { NS_WARNING("invalid font! expect incorrect text rendering"); return false; } bool ok = false; // ensure the cairo font is set up, so there's no risk it'll fall back to // creating a "toy" font internally (see bug 544617) SetupCairoFont(aContext); if (mHarfBuzzShaper) { if (gfxPlatform::GetPlatform()->UseHarfBuzzForScript(aRunScript)) { ok = mHarfBuzzShaper->InitTextRun(aContext, aTextRun, aString, aRunStart, aRunLength, aRunScript); } } if (!ok) { GDIFontEntry *fe = static_cast<GDIFontEntry*>(GetFontEntry()); bool preferUniscribe = (!fe->IsTrueType() || fe->IsSymbolFont()) && !fe->mForceGDI; if (preferUniscribe || UseUniscribe(aTextRun, aString, aRunStart, aRunLength)) { // first try Uniscribe if (!mUniscribeShaper) { mUniscribeShaper = new gfxUniscribeShaper(this); } ok = mUniscribeShaper->InitTextRun(aContext, aTextRun, aString, aRunStart, aRunLength, aRunScript); if (ok) { return true; } // fallback to GDI shaping if (!mPlatformShaper) { CreatePlatformShaper(); } ok = mPlatformShaper->InitTextRun(aContext, aTextRun, aString, aRunStart, aRunLength, aRunScript); } else { // first use GDI if (!mPlatformShaper) { CreatePlatformShaper(); } ok = mPlatformShaper->InitTextRun(aContext, aTextRun, aString, aRunStart, aRunLength, aRunScript); if (ok) { return true; } // try Uniscribe if GDI failed if (!mUniscribeShaper) { mUniscribeShaper = new gfxUniscribeShaper(this); } // use Uniscribe shaping ok = mUniscribeShaper->InitTextRun(aContext, aTextRun, aString, aRunStart, aRunLength, aRunScript); } #if DEBUG if (!ok) { NS_ConvertUTF16toUTF8 name(GetName()); char msg[256]; sprintf(msg, "text shaping with both uniscribe and GDI failed for" " font: %s", name.get()); NS_WARNING(msg); } #endif } return ok; }