Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(48)

Unified Diff: webkit/port/platform/graphics/chromium/FontChromiumWin.cpp

Issue 8615: Add support for transformed, stoked, shadowed, filled text. We do this by... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 12 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: webkit/port/platform/graphics/chromium/FontChromiumWin.cpp
===================================================================
--- webkit/port/platform/graphics/chromium/FontChromiumWin.cpp (revision 6975)
+++ webkit/port/platform/graphics/chromium/FontChromiumWin.cpp (working copy)
@@ -26,12 +26,14 @@
#include "config.h"
#include <windows.h>
+#include "AffineTransform.h"
#include "ChromiumBridge.h"
#include "Font.h"
#include "FontFallbackList.h"
#include "GlyphBuffer.h"
#include "PlatformContextSkia.h"
#include "SimpleFontData.h"
+#include "SkiaFontWin.h"
#include "SkiaUtils.h"
#include "UniscribeHelperTextRun.h"
@@ -40,6 +42,76 @@
namespace WebCore {
+static bool windowsCanHandleTextDrawing(GraphicsContext* context)
+{
+ // Check for non-translation transforms.
+ const AffineTransform& xform = context->getCTM();
+ if (xform.b() != 0 || // Y skew
+ xform.c() != 0 || // X skew
+ xform.a() != 1.0 || // X scale
+ xform.d() != 1.0)
+ return false;
+
+ // Check for stroke effects.
+ if (context->platformContext()->getTextDrawingMode() != cTextFill)
+ return false;
+
+ // Check for shadow effects.
+ if (context->platformContext()->getDrawLooper())
M-A Ruel 2008/12/15 19:54:51 shadow should be ignored when printing on Windows.
+ return false;
+
+ return true;
+}
+
+static bool PaintSkiaText(PlatformContextSkia* platformContext,
+ HFONT hfont,
+ int numGlyphs,
+ const WORD* glyphs,
+ const int* advances,
+ const SkPoint& origin)
+{
+ int textMode = platformContext->getTextDrawingMode();
+
+ // Filling (if necessary). This is the common case.
+ SkPaint paint;
+ platformContext->setupPaintForFilling(&paint);
+ paint.setFlags(SkPaint::kAntiAlias_Flag);
+ bool didFill = false;
+ if ((textMode & cTextFill) && SkColorGetA(paint.getColor())) {
+ if (!SkiaDrawText(hfont, platformContext->canvas(), origin, &paint,
+ &glyphs[0], &advances[0], numGlyphs))
+ return false;
+ didFill = true;
+ }
+
+ // Stroking on top (if necessary).
+ if ((textMode & WebCore::cTextStroke) &&
+ platformContext->getStrokeStyle() != NoStroke &&
+ platformContext->getStrokeThickness() > 0) {
+
+ paint.reset();
+ platformContext->setupPaintForStroking(&paint, NULL, 0);
+ paint.setFlags(SkPaint::kAntiAlias_Flag);
+ if (didFill) {
+ // If there is a shadow and we filled above, there will already be
+ // a shadow. We don't want to draw it again or it will be too dark
+ // and it will go on top of the fill.
+ //
+ // Note that this isn't strictly correct, since the stroke could be
+ // very thick and the shadow wouldn't account for this. The "right"
+ // thing would be to draw to a new layer and then draw that layer
+ // with a shadow. But this is a lot of extra work for something
+ // that isn't normally an issue.
+ paint.setLooper(NULL)->safeUnref();
+ }
+
+ if (!SkiaDrawText(hfont, platformContext->canvas(), origin,
+ &paint, &glyphs[0], &advances[0], numGlyphs))
+ return false;
+ }
+ return true;
+}
+
void Font::drawGlyphs(GraphicsContext* graphicsContext,
const SimpleFontData* font,
const GlyphBuffer& glyphBuffer,
@@ -82,6 +154,8 @@
int x = static_cast<int>(point.x());
int lineTop = static_cast<int>(point.y()) - font->ascent();
+ bool canUseGDI = windowsCanHandleTextDrawing(graphicsContext);
M-A Ruel 2008/12/15 19:54:51 I wonder if canUseGDI should always be true when p
+
// We draw the glyphs in chunks to avoid having to do a heap allocation for
// the arrays of characters and advances. Since ExtTextOut is the
// lowest-level text output function on Windows, there should be little
@@ -105,10 +179,19 @@
bool success = false;
for (int executions = 0; executions < 2; ++executions) {
- success = !!ExtTextOut(hdc, x, lineTop, ETO_GLYPH_INDEX, NULL,
- reinterpret_cast<const wchar_t*>(&glyphs[0]),
- curLen,
- &advances[0]);
+ if (canUseGDI) {
+ success = !!ExtTextOut(hdc, x, lineTop, ETO_GLYPH_INDEX, NULL,
+ reinterpret_cast<const wchar_t*>(&glyphs[0]),
+ curLen, &advances[0]);
+ } else {
+ // Skia's text draing origin is the baseline, like WebKit, not
M-A Ruel 2008/12/15 19:54:51 drawing
+ // the top, like Windows.
+ SkPoint origin = { x, point.y() };
+ success = PaintSkiaText(context,
+ font->platformData().hfont(), numGlyphs,
+ reinterpret_cast<const WORD*>(&glyphs[0]),
M-A Ruel 2008/12/15 19:54:51 80 cols, if you care.
+ &advances[0], origin);
+ }
if (!success && executions == 0) {
// Ask the browser to load the font for us and retry.

Powered by Google App Engine
This is Rietveld 408576698