зеркало из https://github.com/mozilla/pjs.git
merge
This commit is contained in:
Коммит
ede917972c
|
@ -78,7 +78,11 @@ gfxGDIFont::gfxGDIFont(GDIFontEntry *aFontEntry,
|
||||||
mSpaceGlyph(0),
|
mSpaceGlyph(0),
|
||||||
mNeedsBold(aNeedsBold)
|
mNeedsBold(aNeedsBold)
|
||||||
{
|
{
|
||||||
mShaper = new gfxGDIShaper(this);
|
if (static_cast<GDIFontEntry*>(GetFontEntry())->mForceGDI) {
|
||||||
|
mShaper = new gfxGDIShaper(this);
|
||||||
|
} else {
|
||||||
|
mShaper = new gfxUniscribeShaper(this);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
gfxGDIFont::~gfxGDIFont()
|
gfxGDIFont::~gfxGDIFont()
|
||||||
|
@ -102,31 +106,6 @@ gfxGDIFont::CopyWithAntialiasOption(AntialiasOption anAAOption)
|
||||||
&mStyle, mNeedsBold, anAAOption);
|
&mStyle, mNeedsBold, anAAOption);
|
||||||
}
|
}
|
||||||
|
|
||||||
static PRBool
|
|
||||||
UseUniscribe(gfxTextRun *aTextRun,
|
|
||||||
const PRUnichar *aString,
|
|
||||||
PRUint32 aRunStart,
|
|
||||||
PRUint32 aRunLength)
|
|
||||||
{
|
|
||||||
PRUint32 flags = aTextRun->GetFlags();
|
|
||||||
PRBool useGDI;
|
|
||||||
|
|
||||||
PRBool isXP = (gfxWindowsPlatform::WindowsOSVersion()
|
|
||||||
< gfxWindowsPlatform::kWindowsVista);
|
|
||||||
|
|
||||||
// bug 561304 - Uniscribe bug produces bad positioning at certain
|
|
||||||
// font sizes on XP, so default to GDI on XP using logic of 3.6
|
|
||||||
|
|
||||||
useGDI = isXP &&
|
|
||||||
(flags &
|
|
||||||
(gfxTextRunFactory::TEXT_OPTIMIZE_SPEED |
|
|
||||||
gfxTextRunFactory::TEXT_IS_RTL)
|
|
||||||
) == gfxTextRunFactory::TEXT_OPTIMIZE_SPEED;
|
|
||||||
|
|
||||||
return !useGDI ||
|
|
||||||
ScriptIsComplex(aString + aRunStart, aRunLength, SIC_COMPLEX) == S_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
gfxGDIFont::InitTextRun(gfxContext *aContext,
|
gfxGDIFont::InitTextRun(gfxContext *aContext,
|
||||||
gfxTextRun *aTextRun,
|
gfxTextRun *aTextRun,
|
||||||
|
@ -141,32 +120,20 @@ gfxGDIFont::InitTextRun(gfxContext *aContext,
|
||||||
NS_WARNING("invalid font! expect incorrect text rendering");
|
NS_WARNING("invalid font! expect incorrect text rendering");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
PRBool ok = mShaper->InitTextRun(aContext, aTextRun, aString,
|
||||||
PRBool ok;
|
|
||||||
|
|
||||||
GDIFontEntry *fe = static_cast<GDIFontEntry*>(GetFontEntry());
|
|
||||||
if (UseUniscribe(aTextRun, aString, aRunStart, aRunLength)
|
|
||||||
&& !fe->mForceGDI)
|
|
||||||
{
|
|
||||||
if (!mUniscribeShaper) {
|
|
||||||
mUniscribeShaper = new gfxUniscribeShaper(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
// use Uniscribe shaping
|
|
||||||
ok = mUniscribeShaper->InitTextRun(aContext, aTextRun, aString,
|
|
||||||
aRunStart, aRunLength);
|
|
||||||
if (ok) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_WARNING("uniscribe text shaping failed, switching to GDI shaper");
|
|
||||||
fe->mForceGDI = PR_TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
// use GDI shaping
|
|
||||||
ok = mShaper->InitTextRun(aContext, aTextRun, aString,
|
|
||||||
aRunStart, aRunLength);
|
aRunStart, aRunLength);
|
||||||
NS_WARN_IF_FALSE(ok, "text shaping failed, expect broken or missing text");
|
if (!ok) {
|
||||||
|
// shaping failed; if we were using uniscribe, fall back to GDI
|
||||||
|
GDIFontEntry *fe = static_cast<GDIFontEntry*>(GetFontEntry());
|
||||||
|
if (!fe->mForceGDI) {
|
||||||
|
NS_WARNING("uniscribe failed, switching to GDI shaper");
|
||||||
|
fe->mForceGDI = PR_TRUE;
|
||||||
|
mShaper = new gfxGDIShaper(this);
|
||||||
|
ok = mShaper->InitTextRun(aContext, aTextRun, aString,
|
||||||
|
aRunStart, aRunLength);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
NS_WARN_IF_FALSE(ok, "shaper failed, expect broken or missing text");
|
||||||
}
|
}
|
||||||
|
|
||||||
const gfxFont::Metrics&
|
const gfxFont::Metrics&
|
||||||
|
|
|
@ -85,10 +85,6 @@ protected:
|
||||||
|
|
||||||
void FillLogFont(LOGFONTW& aLogFont, gfxFloat aSize);
|
void FillLogFont(LOGFONTW& aLogFont, gfxFloat aSize);
|
||||||
|
|
||||||
// mShaper is used for the GDI shaper, mUniscribeShaper
|
|
||||||
// for the Uniscribe version if needed
|
|
||||||
nsAutoPtr<gfxFontShaper> mUniscribeShaper;
|
|
||||||
|
|
||||||
gfxFloat mAdjustedSize;
|
gfxFloat mAdjustedSize;
|
||||||
|
|
||||||
HFONT mFont;
|
HFONT mFont;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче