static int computePaintTextFlags(const LOGFONT& lf) { int textFlags = 0; switch (lf.lfQuality) { case NONANTIALIASED_QUALITY: textFlags = 0; break; case ANTIALIASED_QUALITY: textFlags = SkPaint::kAntiAlias_Flag; break; case CLEARTYPE_QUALITY: textFlags = (SkPaint::kAntiAlias_Flag | SkPaint::kLCDRenderText_Flag); break; default: textFlags = getDefaultGDITextFlags(); break; } // only allow features that SystemParametersInfo allows textFlags &= getDefaultGDITextFlags(); /* * FontPlatformData(...) will read our logfont, and try to honor the the lfQuality * setting (computing the corresponding SkPaint flags for AA and LCD). However, it * will limit the quality based on its query of SPI_GETFONTSMOOTHING. This could mean * we end up drawing the text in BW, even though our lfQuality requested antialiasing. * * Many web-fonts are so poorly hinted that they are terrible to read when drawn in BW. * In these cases, we have decided to FORCE these fonts to be drawn with at least grayscale AA, * even when the System (getDefaultGDITextFlags) tells us to draw only in BW. */ if (isWebFont(lf) && !isRunningLayoutTest()) textFlags |= SkPaint::kAntiAlias_Flag; return textFlags; }
static void setupPaintForFont(HFONT hfont, SkPaint* paint, PlatformContextSkia* pcs) { // FIXME: // Much of this logic could also happen in // FontCustomPlatformData::fontPlatformData and be cached, // allowing us to avoid talking to GDI at this point. // LOGFONT info; GetObject(hfont, sizeof(info), &info); int size = info.lfHeight; if (size < 0) size = -size; // We don't let GDI dpi-scale us (see SkFontHost_win.cpp). paint->setTextSize(SkIntToScalar(size)); SkTypeface* face = SkCreateTypefaceFromLOGFONT(info); paint->setTypeface(face); SkSafeUnref(face); // turn lfQuality into text flags uint32_t textFlags; switch (info.lfQuality) { case NONANTIALIASED_QUALITY: textFlags = 0; break; case ANTIALIASED_QUALITY: textFlags = SkPaint::kAntiAlias_Flag; break; case CLEARTYPE_QUALITY: textFlags = (SkPaint::kAntiAlias_Flag | SkPaint::kLCDRenderText_Flag); break; default: textFlags = getDefaultGDITextFlags(); break; } // only allow features that SystemParametersInfo allows textFlags &= getDefaultGDITextFlags(); // do this check after our switch on lfQuality if (disableTextLCD(pcs)) textFlags &= ~SkPaint::kLCDRenderText_Flag; // now copy in just the text flags uint32_t flags = paint->getFlags(); flags &= ~(SkPaint::kAntiAlias_Flag | SkPaint::kLCDRenderText_Flag); flags |= textFlags; paint->setFlags(flags); }
static void setupPaintForFont(SkPaint* paint, PlatformContextSkia* pcs, SkTypeface* face, float size, int quality) { paint->setTextSize(SkFloatToScalar(size)); paint->setTypeface(face); // turn quality into text flags uint32_t textFlags; switch (quality) { case NONANTIALIASED_QUALITY: textFlags = 0; break; case ANTIALIASED_QUALITY: textFlags = SkPaint::kAntiAlias_Flag; break; case CLEARTYPE_QUALITY: textFlags = (SkPaint::kAntiAlias_Flag | SkPaint::kLCDRenderText_Flag); break; default: textFlags = getDefaultGDITextFlags(); break; } // only allow features that SystemParametersInfo allows textFlags &= getDefaultGDITextFlags(); // do this check after our switch on lfQuality if (!pcs->couldUseLCDRenderedText()) { textFlags &= ~SkPaint::kLCDRenderText_Flag; // If we *just* clear our request for LCD, then GDI seems to // sometimes give us AA text, and sometimes give us BW text. Since the // original intent was LCD, we want to force AA (rather than BW), so we // add a special bit to tell Skia to do its best to avoid the BW: by // drawing LCD offscreen and downsampling that to AA. textFlags |= SkPaint::kGenA8FromLCD_Flag; } static const uint32_t textFlagsMask = SkPaint::kAntiAlias_Flag | SkPaint::kLCDRenderText_Flag | SkPaint::kGenA8FromLCD_Flag; // now copy in just the text flags SkASSERT(!(textFlags & ~textFlagsMask)); uint32_t flags = paint->getFlags(); flags &= ~textFlagsMask; flags |= textFlags; paint->setFlags(flags); }
static void setupPaintForFont(HFONT hfont, SkPaint* paint, PlatformContextSkia* pcs) { // FIXME: // Much of this logic could also happen in // FontCustomPlatformData::fontPlatformData and be cached, // allowing us to avoid talking to GDI at this point. // LOGFONT info; GetObject(hfont, sizeof(info), &info); int size = info.lfHeight; if (size < 0) size = -size; // We don't let GDI dpi-scale us (see SkFontHost_win.cpp). paint->setTextSize(SkIntToScalar(size)); SkTypeface* face = SkCreateTypefaceFromLOGFONT(info); paint->setTypeface(face); SkSafeUnref(face); uint32_t flags = paint->getFlags(); // clear our flags initially, and then selectively set them // based on the LOGFONT quality flags &= SkPaint::kAntiAlias_Flag; flags &= SkPaint::kLCDRenderText_Flag; switch (info.lfQuality) { case NONANTIALIASED_QUALITY: break; case ANTIALIASED_QUALITY: flags |= SkPaint::kAntiAlias_Flag; break; case CLEARTYPE_QUALITY: flags |= SkPaint::kAntiAlias_Flag; flags |= SkPaint::kLCDRenderText_Flag; break; default: flags |= getDefaultGDITextFlags(); break; } // do this check after our switch on lfQuality if (disableTextLCD(pcs)) flags &= ~SkPaint::kLCDRenderText_Flag; paint->setFlags(flags); }