From 85fb59060a0fdfcff93ae1c70dd49e0f93e55ab6 Mon Sep 17 00:00:00 2001 From: Chris Craik Date: Tue, 2 Oct 2012 13:50:20 -0700 Subject: Compensate for canvas-side vertical text translation in bounding box computation bug:7267294 Change-Id: Ia6de9264b6c3680707b8fb8833d69d7cc7e850e8 --- .../graphics/android/context/PlatformGraphicsContext.h | 1 + .../android/context/PlatformGraphicsContextRecording.cpp | 2 ++ .../android/context/PlatformGraphicsContextRecording.h | 2 ++ .../graphics/android/context/PlatformGraphicsContextSkia.h | 1 + Source/WebCore/platform/graphics/android/fonts/FontAndroid.cpp | 10 ++++++++-- 5 files changed, 14 insertions(+), 2 deletions(-) (limited to 'Source') diff --git a/Source/WebCore/platform/graphics/android/context/PlatformGraphicsContext.h b/Source/WebCore/platform/graphics/android/context/PlatformGraphicsContext.h index 56aceff..14537c8 100644 --- a/Source/WebCore/platform/graphics/android/context/PlatformGraphicsContext.h +++ b/Source/WebCore/platform/graphics/android/context/PlatformGraphicsContext.h @@ -148,6 +148,7 @@ public: const IntRect& thumb = IntRect()) = 0; virtual SkCanvas* recordingCanvas() = 0; + virtual void setTextOffset(FloatSize offset) = 0; void setRawState(State* state) { m_state = state; } diff --git a/Source/WebCore/platform/graphics/android/context/PlatformGraphicsContextRecording.cpp b/Source/WebCore/platform/graphics/android/context/PlatformGraphicsContextRecording.cpp index 867ff56..8c87cfb 100644 --- a/Source/WebCore/platform/graphics/android/context/PlatformGraphicsContextRecording.cpp +++ b/Source/WebCore/platform/graphics/android/context/PlatformGraphicsContextRecording.cpp @@ -914,6 +914,8 @@ void PlatformGraphicsContextRecording::drawPosText(const void* inText, size_t by return; } FloatRect bounds = approximateTextBounds(byteLength / sizeof(uint16_t), inPos, inPaint); + bounds.move(m_textOffset); // compensate font rendering-side translates + const SkPaint* paint = mRecording->recording()->getSkPaint(inPaint); size_t posSize = sizeof(SkPoint) * paint->countText(inText, byteLength); void* text = heap()->alloc(byteLength); diff --git a/Source/WebCore/platform/graphics/android/context/PlatformGraphicsContextRecording.h b/Source/WebCore/platform/graphics/android/context/PlatformGraphicsContextRecording.h index 061ee0e..b120ac3 100644 --- a/Source/WebCore/platform/graphics/android/context/PlatformGraphicsContextRecording.h +++ b/Source/WebCore/platform/graphics/android/context/PlatformGraphicsContextRecording.h @@ -64,6 +64,7 @@ public: virtual bool isPaintingDisabled(); virtual SkCanvas* recordingCanvas(); + virtual void setTextOffset(FloatSize offset) { m_textOffset = offset; } virtual ContextType type() { return RecordingContext; } @@ -209,6 +210,7 @@ private: bool m_hasText; bool m_isEmpty; RecordingContextCanvasProxy m_canvasProxy; + FloatSize m_textOffset; }; } diff --git a/Source/WebCore/platform/graphics/android/context/PlatformGraphicsContextSkia.h b/Source/WebCore/platform/graphics/android/context/PlatformGraphicsContextSkia.h index 6bf53d7..2c1d8cb 100644 --- a/Source/WebCore/platform/graphics/android/context/PlatformGraphicsContextSkia.h +++ b/Source/WebCore/platform/graphics/android/context/PlatformGraphicsContextSkia.h @@ -39,6 +39,7 @@ public: virtual ContextType type() { return PaintingContext; } virtual SkCanvas* recordingCanvas() { return mCanvas; } + virtual void setTextOffset(FloatSize offset) {} // FIXME: This is used by ImageBufferAndroid, which should really be // managing the canvas lifecycle itself diff --git a/Source/WebCore/platform/graphics/android/fonts/FontAndroid.cpp b/Source/WebCore/platform/graphics/android/fonts/FontAndroid.cpp index fcb78ed..03d2fb2 100644 --- a/Source/WebCore/platform/graphics/android/fonts/FontAndroid.cpp +++ b/Source/WebCore/platform/graphics/android/fonts/FontAndroid.cpp @@ -218,8 +218,11 @@ void Font::drawGlyphs(GraphicsContext* gc, const SimpleFontData* font, point.xy + [width, height, width, height, ...], so we have to convert */ - if (font->platformData().orientation() == Vertical) - y += SkFloatToScalar(font->fontMetrics().floatAscent(IdeographicBaseline) - font->fontMetrics().floatAscent()); + if (font->platformData().orientation() == Vertical) { + float yOffset = SkFloatToScalar(font->fontMetrics().floatAscent(IdeographicBaseline) - font->fontMetrics().floatAscent()); + gc->platformContext()->setTextOffset(FloatSize(0.0f, -yOffset)); // compensate for offset in bounds calculation + y += yOffset; + } if (EmojiFont::IsAvailable()) { // set filtering, to make scaled images look nice(r) @@ -272,6 +275,9 @@ void Font::drawGlyphs(GraphicsContext* gc, const SimpleFontData* font, if (font->platformData().orientation() == Vertical) canvas->restore(); } + + if (font->platformData().orientation() == Vertical) + gc->platformContext()->setTextOffset(FloatSize()); // reset to undo above } void Font::drawEmphasisMarksForComplexText(WebCore::GraphicsContext*, WebCore::TextRun const&, WTF::AtomicString const&, WebCore::FloatPoint const&, int, int) const -- cgit v1.1