This patch makes drawHighlightForText a completely cross-platform method
authorhyatt <hyatt@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 11 May 2006 21:56:29 +0000 (21:56 +0000)
committerhyatt <hyatt@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 11 May 2006 21:56:29 +0000 (21:56 +0000)
        implemented by the GraphicsContext.  The platform-specific implementations
        of the method in the Font class have been eliminated.

        Reviewed by andersca

        * platform/Font.h:
        * platform/FontData.h:
        Remove the drawHighlight methods.  Change the selectionRect method in
        Font to return a FloatRect so that the GraphicsContext can do an accurate
        fill.

        * platform/GraphicsContext.cpp:
        (WebCore::GraphicsContext::drawHighlightForText):
        Implement the drawHighlightFunction in terms of the cross-platform
        Font selectionRect functions and a new float-based fillRect graphics context
        function.

        * platform/GraphicsContext.h:
        * platform/cairo/GraphicsContextCairo.cpp:
        (WebCore::GraphicsContext::fillRect):
        * platform/cg/GraphicsContextCG.cpp:
        (WebCore::GraphicsContext::fillRect):
        Add the new float-based fillRect function for Cairo and CG.

        * platform/mac/FontData.mm:
        (WebCore::CG_draw):
        (WebCore::ATSU_draw):
        Removed the CG and ATSU drawHighlight methods.  Remove the drawing of
        the background from the deprecated draw methods (they'll be removed
        soon).

        * platform/mac/FontMac.mm:
        (WebCore::Font::selectionRectForText):
        * platform/win/FontWin.cpp:
        (WebCore::Font::selectionRectForText):
        Change selectionRectForText to return a FloatRect instead of an IntRect,
        so that the GraphicsContext can do a precise fill.

        * rendering/InlineTextBox.cpp:
        (WebCore::InlineTextBox::selectionRect):
        (WebCore::InlineTextBox::positionForOffset):
        Modify the callers who expect an int-based selection rect so that they call
        enclosingIntRect.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@14304 268f45cc-cd09-0410-ab3c-d52691b4dbfc

WebCore/ChangeLog
WebCore/platform/Font.h
WebCore/platform/FontData.h
WebCore/platform/GraphicsContext.cpp
WebCore/platform/GraphicsContext.h
WebCore/platform/cairo/GraphicsContextCairo.cpp
WebCore/platform/cg/GraphicsContextCG.cpp
WebCore/platform/mac/FontData.mm
WebCore/platform/mac/FontMac.mm
WebCore/platform/win/FontWin.cpp
WebCore/rendering/InlineTextBox.cpp

index 79e8a42..c4ea797 100644 (file)
@@ -1,3 +1,50 @@
+2006-05-11  David Hyatt  <hyatt@apple.com>
+
+        This patch makes drawHighlightForText a completely cross-platform method
+        implemented by the GraphicsContext.  The platform-specific implementations
+        of the method in the Font class have been eliminated.
+
+        Reviewed by andersca
+
+        * platform/Font.h:
+        * platform/FontData.h:
+        Remove the drawHighlight methods.  Change the selectionRect method in
+        Font to return a FloatRect so that the GraphicsContext can do an accurate
+        fill.
+
+        * platform/GraphicsContext.cpp:
+        (WebCore::GraphicsContext::drawHighlightForText):
+        Implement the drawHighlightFunction in terms of the cross-platform
+        Font selectionRect functions and a new float-based fillRect graphics context
+        function.
+
+        * platform/GraphicsContext.h:
+        * platform/cairo/GraphicsContextCairo.cpp:
+        (WebCore::GraphicsContext::fillRect):
+        * platform/cg/GraphicsContextCG.cpp:
+        (WebCore::GraphicsContext::fillRect):
+        Add the new float-based fillRect function for Cairo and CG.
+
+        * platform/mac/FontData.mm:
+        (WebCore::CG_draw):
+        (WebCore::ATSU_draw):
+        Removed the CG and ATSU drawHighlight methods.  Remove the drawing of
+        the background from the deprecated draw methods (they'll be removed
+        soon).
+
+        * platform/mac/FontMac.mm:
+        (WebCore::Font::selectionRectForText):
+        * platform/win/FontWin.cpp:
+        (WebCore::Font::selectionRectForText):
+        Change selectionRectForText to return a FloatRect instead of an IntRect,
+        so that the GraphicsContext can do a precise fill.
+
+        * rendering/InlineTextBox.cpp:
+        (WebCore::InlineTextBox::selectionRect):
+        (WebCore::InlineTextBox::positionForOffset):
+        Modify the callers who expect an int-based selection rect so that they call
+        enclosingIntRect.
+
 2006-05-11  Darin Adler  <darin@apple.com>
 
         Reviewed by Adele.
index a129586..736b6d2 100644 (file)
@@ -42,6 +42,7 @@ class FontFallbackList;
 class GraphicsContext;
 class IntPoint;
 class IntRect;
+class FloatRect;
 class FloatPoint;
 
 enum Pitch { UnknownPitch, FixedPitch, VariablePitch };
@@ -109,9 +110,6 @@ public:
 
     void drawText(GraphicsContext*, const TextRun&, const IntPoint&, int tabWidth, int xpos,
                   int toAdd, TextDirection, bool visuallyOrdered) const;
-    void drawHighlightForText(GraphicsContext*, const TextRun&, const IntPoint&, int h, 
-                              int tabWidth, int xpos, int toAdd, 
-                              TextDirection d, bool visuallyOrdered, const Color& backgroundColor) const;
     void drawLineForText(GraphicsContext*, const IntPoint&, int yOffset, int width) const;
     void drawLineForMisspelling(GraphicsContext*, const IntPoint&, int width) const;
     int misspellingLineThickness(GraphicsContext*) const;
@@ -120,8 +118,8 @@ public:
     
     int checkSelectionPoint(const TextRun&, int toAdd, int tabWidth, int xpos,
         int x, TextDirection, bool visuallyOrdered, bool includePartialGlyphs) const;
-    IntRect selectionRectForText(const TextRun&, const IntPoint&, int h, int tabWidth, int xpos, int width,
-                                 bool rtl, bool visuallyOrdered = false) const;
+    FloatRect selectionRectForText(const TextRun&, const IntPoint&, int h, int tabWidth, int xpos, int width,
+                                   bool rtl, bool visuallyOrdered = false) const;
     
     int width(const TextRun&, int tabWidth = 0, int xpos = 0) const;
 
index e1182e6..6ce379f 100644 (file)
@@ -112,7 +112,6 @@ public:
     // drawing
     void drawRun(const WebCoreTextRun* run, const WebCoreTextStyle* style, const WebCoreTextGeometry* geometry);
     FloatRect selectionRectForRun(const WebCoreTextRun* run, const WebCoreTextStyle* style, const WebCoreTextGeometry* geometry);
-    void drawHighlightForRun(const WebCoreTextRun* run, const WebCoreTextStyle* style, const WebCoreTextGeometry* geometry);
     void drawLineForCharacters(const FloatPoint& point, float yOffset, int width, const Color& color, float thickness);
     void drawLineForMisspelling(const FloatPoint& point, int width);
     int misspellingLineThickness() const { return 3; }
index aa2e65d..7c080a4 100644 (file)
@@ -207,7 +207,7 @@ void GraphicsContext::drawHighlightForText(const TextRun& run, const IntPoint& p
     if (paintingDisabled())
         return;
 
-    return font().drawHighlightForText(this, run, point, h, tabWidth, xpos, toAdd, d, visuallyOrdered, backgroundColor);
+    fillRect(font().selectionRectForText(run, point, h, tabWidth, xpos, toAdd, d == RTL, visuallyOrdered), backgroundColor);
 }
 
 void GraphicsContext::drawLineForText(const IntPoint& point, int yOffset, int width)
index 33b84a2..bdf7946 100644 (file)
@@ -87,6 +87,7 @@ namespace WebCore {
         void drawConvexPolygon(const IntPointArray&);
 
         void fillRect(const IntRect&, const Color&);
+        void fillRect(const FloatRect&, const Color&);
         void clearRect(const FloatRect&);
         void strokeRect(const FloatRect&, float lineWidth);
 
index 406bb10..12d0e7c 100644 (file)
@@ -343,6 +343,15 @@ void GraphicsContext::fillRect(const IntRect& rect, const Color& color)
         fillRectSourceOver(m_data->context, rect, color);
 }
 
+void GraphicsContext::fillRect(const FloatRect& rect, const Color& color)
+{
+    if (paintingDisabled())
+        return;
+
+    if (color.alpha())
+        fillRectSourceOver(m_data->context, rect, color);
+}
+
 void GraphicsContext::addClip(const IntRect& rect)
 {
     if (paintingDisabled())
index fa290f1..62d8f92 100644 (file)
@@ -315,6 +315,17 @@ void GraphicsContext::fillRect(const IntRect& rect, const Color& color)
     }
 }
 
+void GraphicsContext::fillRect(const FloatRect& rect, const Color& color)
+{
+    if (paintingDisabled())
+        return;
+    if (color.alpha()) {
+        CGContextRef context = platformContext();
+        setCGFillColor(context, color);
+        CGContextFillRect(context, rect);
+    }
+}
+
 void GraphicsContext::addClip(const IntRect& rect)
 {
     if (paintingDisabled())
index 811e87c..dedaeea 100644 (file)
@@ -165,10 +165,6 @@ static int ATSU_pointToOffset(FontData *, const WebCoreTextRun *, const WebCoreT
 static NSRect CG_selectionRect(FontData *, const WebCoreTextRun *, const WebCoreTextStyle *, const WebCoreTextGeometry *);
 static NSRect ATSU_selectionRect(FontData *, const WebCoreTextRun *, const WebCoreTextStyle *, const WebCoreTextGeometry *);
 
-// Drawing highlight.
-static void CG_drawHighlight(FontData *, const WebCoreTextRun *, const WebCoreTextStyle *, const WebCoreTextGeometry *);
-static void ATSU_drawHighlight(FontData *, const WebCoreTextRun *, const WebCoreTextStyle *, const WebCoreTextGeometry *);
-
 static bool setUpFont(FontData *);
 
 // Iterator functions
@@ -594,14 +590,6 @@ FloatRect FontData::selectionRectForRun(const WebCoreTextRun* run, const WebCore
         return CG_selectionRect(this, run, style, geometry);
 }
 
-void FontData::drawHighlightForRun(const WebCoreTextRun* run, const WebCoreTextStyle* style, const WebCoreTextGeometry* geometry)
-{
-    if (shouldUseATSU(run))
-        ATSU_drawHighlight(this, run, style, geometry);
-    else
-        CG_drawHighlight(this, run, style, geometry);
-}
-
 void FontData::drawLineForMisspelling(const FloatPoint& point, int width)
 {
     // Constants for pattern color
@@ -883,18 +871,6 @@ static void drawGlyphs(NSFont *font, NSColor *color, CGGlyph *glyphs, CGSize *ad
     CGContextSetShouldSmoothFonts(cgContext, originalShouldUseFontSmoothing);
 }
 
-static void CG_drawHighlight(FontData *renderer, const WebCoreTextRun * run, const WebCoreTextStyle *style, const WebCoreTextGeometry *geometry)
-{
-    if (run->length == 0)
-        return;
-
-    if (style->backgroundColor == nil)
-        return;
-
-    [style->backgroundColor set];
-    [NSBezierPath fillRect:CG_selectionRect(renderer, run, style, geometry)];
-}
-
 static NSRect CG_selectionRect(FontData *renderer, const WebCoreTextRun * run, const WebCoreTextStyle *style, const WebCoreTextGeometry *geometry)
 {
     float yPos = geometry->useFontMetricsForSelectionYAndHeight
@@ -963,9 +939,6 @@ static void CG_draw(FontData *renderer, const WebCoreTextRun *run, const WebCore
     // Calculate the starting point of the glyphs to be displayed by adding
     // all the advances up to the first glyph.
     startX += geometry->point.x();
-
-    if (style->backgroundColor != nil)
-        CG_drawHighlight(renderer, run, style, geometry);
     
     // Swap the order of the glyphs if right-to-left.
     if (style->rtl) {
@@ -1468,19 +1441,6 @@ static WebCoreTextRun addDirectionalOverride(const WebCoreTextRun *run, bool rtl
     return runWithOverride;
 }
 
-static void ATSU_drawHighlight(FontData *renderer, const WebCoreTextRun *run, const WebCoreTextStyle *style, const WebCoreTextGeometry *geometry)
-{
-    // The only Cocoa calls made here are to NSColor and NSBezierPath, and they do not raise exceptions.
-
-    if (style->backgroundColor == nil)
-        return;
-    if (run->to <= run->from)
-        return;
-    
-    [style->backgroundColor set];
-    [NSBezierPath fillRect:ATSU_selectionRect(renderer, run, style, geometry)];
-}
-
 static NSRect ATSU_selectionRect(FontData *renderer, const WebCoreTextRun *run, const WebCoreTextStyle *style, const WebCoreTextGeometry *geometry)
 {
     int from = run->from;
@@ -1564,9 +1524,6 @@ static void ATSU_draw(FontData *renderer, const WebCoreTextRun *run, const WebCo
     ATSULayoutParameters params;
     createATSULayoutParameters(&params, renderer, &completeRun, style);
 
-    if (style->backgroundColor != nil)
-        ATSU_drawHighlight(renderer, run, style, geometry);
-
     [style->textColor set];
 
     // ATSUI can't draw beyond -32768 to +32767 so we translate the CTM and tell ATSUI to draw at (0, 0).
index ef600f7..cdcb51c 100644 (file)
@@ -473,7 +473,7 @@ const FontPlatformData& Font::platformFont() const
     return m_fontList->platformFont(fontDescription());
 }
 
-IntRect Font::selectionRectForText(const TextRun& textRun, const IntPoint& point, int h, int tabWidth, int xpos, int toAdd, bool rtl, bool visuallyOrdered) const
+FloatRect Font::selectionRectForText(const TextRun& textRun, const IntPoint& point, int h, int tabWidth, int xpos, int toAdd, bool rtl, bool visuallyOrdered) const
 {
     assert(m_fontList);
 
@@ -498,7 +498,7 @@ IntRect Font::selectionRectForText(const TextRun& textRun, const IntPoint& point
     geometry.selectionY = point.y();
     geometry.selectionHeight = h;
     geometry.useFontMetricsForSelectionYAndHeight = false;
-    return enclosingIntRect(m_fontList->primaryFont(fontDescription())->selectionRectForRun(&run, &style, &geometry));
+    return m_fontList->primaryFont(fontDescription())->selectionRectForRun(&run, &style, &geometry);
 }
 
 void Font::drawComplexText(GraphicsContext* graphicsContext, const TextRun& run, const IntPoint& point, int tabWidth, int xpos,
@@ -545,37 +545,6 @@ void Font::drawComplexText(GraphicsContext* graphicsContext, const TextRun& run,
         delete []characters;
 }
 
-void Font::drawHighlightForText(GraphicsContext* context, const TextRun& textRun, const IntPoint& point, int h, int tabWidth, int xpos, 
-                                int toAdd, TextDirection d, bool visuallyOrdered, const Color& backgroundColor) const
-{
-    // Avoid allocations, use stack array to pass font families.  Normally these
-    // css fallback lists are small <= 3.
-    CREATE_FAMILY_ARRAY(*this, families);
-        
-    WebCoreTextRun run;
-    WebCoreInitializeTextRun(&run, textRun.characters(), textRun.length(), textRun.from(), textRun.to());    
-    WebCoreTextStyle style;
-    WebCoreInitializeEmptyTextStyle(&style);
-    style.textColor = nsColor(context->pen().color());
-    style.backgroundColor = backgroundColor.isValid() ? nsColor(backgroundColor) : nil;
-    style.rtl = d == RTL;
-    style.directionalOverride = visuallyOrdered;
-    style.letterSpacing = letterSpacing();
-    style.wordSpacing = wordSpacing();
-    style.smallCaps = isSmallCaps();
-    style.families = families;    
-    style.padding = toAdd;
-    style.tabWidth = tabWidth;
-    style.xpos = xpos;
-    WebCoreTextGeometry geometry;
-    WebCoreInitializeEmptyTextGeometry(&geometry);
-    geometry.point = point;
-    geometry.selectionY = point.y();
-    geometry.selectionHeight = h;
-    geometry.useFontMetricsForSelectionYAndHeight = false;
-    m_fontList->primaryFont(fontDescription())->drawHighlightForRun(&run, &style, &geometry);
-}
-
 void Font::drawLineForText(GraphicsContext* context, const IntPoint& point, int yOffset, int width) const
 {
     m_fontList->primaryFont(fontDescription())->drawLineForCharacters(point, yOffset, width, context->pen().color(), context->pen().width());
index 44da5bd..d523882 100644 (file)
@@ -214,26 +214,7 @@ void Font::drawText(GraphicsContext* context, const TextRun& run, const IntPoint
     // No need to ReleaseDC the HDC borrowed from cairo
 }
 
-void Font::drawHighlightForText(GraphicsContext* context, const TextRun& run, const IntPoint& point, int h, int tabWidth, int xpos,
-                                TextDirection d, bool visuallyOrdered, const Color& backgroundColor) const
-{
-    if (!backgroundColor.isValid())
-        return;
-
-    FontData* font = m_fontList->primaryFont(fontDescription());
-    if (!font)
-        return;
-
-    cairo_surface_t* surface = cairo_get_target(context->platformContext());
-    HDC dc = cairo_win32_surface_get_dc(surface);
-
-    IntSize runSize = hackishExtentForString(dc, font, run, tabWidth, xpos);
-
-    // FIXME: this const_cast should be removed when this code is made real.
-    const_cast<GraphicsContext*>(context)->fillRect(IntRect(point, runSize), backgroundColor);
-}
-
-IntRect Font::selectionRectForText(const TextRun& run, const IntPoint& point, int h, int tabWidth, int xpos,
+FloatRect Font::selectionRectForText(const TextRun& run, const IntPoint& point, int h, int tabWidth, int xpos,
                                    int toAdd, bool rtl, bool visuallyOrdered) const
 {
     FontData* font = m_fontList->primaryFont(fontDescription());
@@ -243,7 +224,7 @@ IntRect Font::selectionRectForText(const TextRun& run, const IntPoint& point, in
     HDC dc = GetDC((HWND)0); // FIXME: Need a way to get to the real HDC.
     IntSize runSize = hackishExtentForString(dc, font, run, tabWidth, xpos);
     ReleaseDC(0, dc);
-    return IntRect(point, runSize);
+    return FloatRect(point, runSize);
 }
 
 int Font::checkSelectionPoint(const TextRun& run, int toAdd, int tabWidth, int xpos, int x,
index f43f8ae..aad10b1 100644 (file)
@@ -117,9 +117,9 @@ IntRect InlineTextBox::selectionRect(int tx, int ty, int startPos, int endPos)
     int selHeight = rootBox->selectionHeight();
     const Font *f = textObj->font(m_firstLine);
 
-    IntRect r = f->selectionRectForText(TextRun(textObj->string(), m_start, sPos, ePos),
+    IntRect r = enclosingIntRect(f->selectionRectForText(TextRun(textObj->string(), m_start, sPos, ePos),
                                         IntPoint(tx + m_x, ty + selTop), selHeight, textObj->tabWidth(), textPos(), 
-                                        m_toAdd, m_reversed, m_dirOverride);
+                                        m_toAdd, m_reversed, m_dirOverride));
     if (r.x() > tx + m_x + m_width)
         r.setWidth(0);
     else if (r.right() - 1 > tx + m_x + m_width)
@@ -699,7 +699,7 @@ int InlineTextBox::positionForOffset(int offset) const
     int from = m_reversed ? offset - m_start : 0;
     int to = m_reversed ? m_len : offset - m_start;
     // FIXME: Do we need to add rightBearing here?
-    return f->selectionRectForText(TextRun(text->string(), m_start, from, to), IntPoint(m_x, 0), 0, text->tabWidth(), textPos(), m_toAdd, m_reversed, m_dirOverride).right();
+    return enclosingIntRect(f->selectionRectForText(TextRun(text->string(), m_start, from, to), IntPoint(m_x, 0), 0, text->tabWidth(), textPos(), m_toAdd, m_reversed, m_dirOverride)).right();
 }
 
 }