/* * @implemented */ BOOL WINAPI LpkExtTextOut( HDC hdc, int x, int y, UINT fuOptions, const RECT *lprc, LPCWSTR lpString, UINT uCount, const INT *lpDx, INT unknown) { LPWORD glyphs = NULL; INT cGlyphs; UNREFERENCED_PARAMETER(unknown); if (!(fuOptions & ETO_IGNORELANGUAGE)) fuOptions |= ETO_IGNORELANGUAGE; /* Check text direction */ if ((GetLayout(hdc) & LAYOUT_RTL) || (GetTextAlign(hdc) & TA_RTLREADING)) { if (!(fuOptions & ETO_RTLREADING)) fuOptions |= ETO_RTLREADING; } /* Check if the string requires complex script processing and not a "glyph indices" array */ if (ScriptIsComplex(lpString, uCount, SIC_COMPLEX) == S_OK && !(fuOptions & ETO_GLYPH_INDEX)) { BIDI_Reorder(hdc, lpString, uCount, GCP_REORDER, (fuOptions & ETO_RTLREADING) ? WINE_GCPW_FORCE_RTL : WINE_GCPW_FORCE_LTR, NULL, uCount, NULL, &glyphs, &cGlyphs); fuOptions |= ETO_GLYPH_INDEX; if (uCount > cGlyphs) cGlyphs = uCount; return ExtTextOutW(hdc, x, y, fuOptions, lprc, (LPWSTR)glyphs, cGlyphs, lpDx); } return ExtTextOutW(hdc, x, y, fuOptions, lprc, lpString, uCount, lpDx); }
static bool UseUniscribe(gfxShapedWord *aShapedWord, const PRUnichar *aString) { uint32_t flags = aShapedWord->Flags(); bool useGDI; bool 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, aShapedWord->Length(), SIC_COMPLEX) == S_OK; }
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; }
static gboolean text_is_simple (const char *text, gint length) { gboolean retval; wchar_t *wtext; long wlen; wtext = (wchar_t *) g_utf8_to_utf16 (text, length, NULL, &wlen, NULL); if (wtext == NULL) return TRUE; retval = (ScriptIsComplex (wtext, wlen, SIC_COMPLEX) == S_FALSE); g_free (wtext); #ifdef BASIC_WIN32_DEBUGGING if (pango_win32_debug) g_print ("text_is_simple: %.*s (%ld wchar_t): %s\n", MIN (length, 10), text, wlen, retval ? "YES" : "NO"); #endif return retval; }