[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    branches/work/khtml-svg/rendering
From:       Nikolas Zimmermann <wildfox () kde ! org>
Date:       2006-04-06 22:49:16
Message-ID: 1144363756.607193.7085.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 527127 by wildfox:

Revert my last commit and "hack around it for real".

As we don't participate in layouting yet, all text is placed at
x/y 0, so in a paint event which is ie. clipped to 0x0-504x128
we need to be able to paint ouside that area. I'm aware this
is a hack, but it works for now, until the real solutions is
discussed with the WebKit guys.

CCMAIL: buis@kde.org


 M  +32 -14    render_svg_text.cpp  
 M  +2 -1      render_svg_text.h  


--- branches/work/khtml-svg/rendering/render_svg_text.cpp #527126:527127
@@ -22,13 +22,14 @@
  */
 
 #include "rendering/kcanvas/KCanvasMatrix.h"
-
 #include "rendering/kcanvas/device/KRenderingDevice.h"
 
 #include "svg/KSVGPainterFactory.h"
 #include "svg/SVGTextElementImpl.h"
 #include "svg/SVGAnimatedLengthListImpl.h"
 
+#include "khtmlview.h"
+#include "render_canvas.h"
 #include "render_svg_text.h"
 
 using namespace khtml;
@@ -44,6 +45,16 @@
     return QMatrix().translate(0, -offset);
 }
 
+QMatrix RenderSVGText::translationForAttributes()
+{
+    KSVG::SVGTextElementImpl *text = static_cast<KSVG::SVGTextElementImpl \
*>(element()); +
+    float xOffset = text->x()->baseVal()->getFirst() ? \
text->x()->baseVal()->getFirst()->value() : 0; +    float yOffset = \
text->y()->baseVal()->getFirst() ? text->y()->baseVal()->getFirst()->value() : 0; +
+    return QMatrix().translate(xOffset, yOffset);
+}
+
 void RenderSVGText::paint(PaintInfo &paintInfo, int parentX, int parentY)
 {
     KRenderingDevice *device = KRenderingDevice::self();
@@ -60,24 +71,27 @@
     else
         paintInfo.p->save();
 
-    // Get our rendering location...
-    KSVG::SVGTextElementImpl *text = static_cast<KSVG::SVGTextElementImpl \
                *>(element());
-
-    float xOffset = text->x()->baseVal()->getFirst() ? \
                text->x()->baseVal()->getFirst()->value() : 0;
-    float yOffset = text->y()->baseVal()->getFirst() ? \
                text->y()->baseVal()->getFirst()->value() : 0;
-
-    xOffset += parentX;
-    yOffset += parentY;
-    
     context->concatCTM(localTransform());
+    context->concatCTM(QMatrix().translate(parentX, parentY));
+    context->concatCTM(translationForAttributes());
     context->concatCTM(translationTopToBaseline());
-   
+    
     QRectF boundingBox(0, 0, width(), height());
     const KSVG::SVGRenderStyle *svgStyle = style()->svgStyle();
 
     if(KCanvasClipper *clipper = getClipperById(document(), \
svgStyle->clipPath().mid(1)))  clipper->applyClip(boundingBox);
 
+    // Replace current paint info rect with a rect representing
+    // the currently visible canvas area. This is because we don't
+    // yet participate in layouting, so we need to allow painting
+    // to be happen _outside_ the area contained in 'paintInfo.r'
+    // It's quite hacky, we're aware of that - needs to changed :-)
+    QRect savedRect = paintInfo.r;
+    KHTMLView *view = canvas()->view();
+    if(view)
+        paintInfo.r = QRect(0, 0, view->visibleWidth(), view->visibleHeight());
+
     KRenderingPaintServer *fillPaintServer = \
KSVG::KSVGPainterFactory::fillPaintServer(style(), this);  if(fillPaintServer)
     {
@@ -86,7 +100,7 @@
 
         if(fillPaintServer->setup(context, this, APPLY_TO_FILL))
         {
-            RenderBlock::paint(paintInfo, xOffset, yOffset);
+            RenderBlock::paint(paintInfo, 0, 0);
             fillPaintServer->teardown(context, this, APPLY_TO_FILL);
         }
 
@@ -101,13 +115,16 @@
 
         if(strokePaintServer->setup(context, this, APPLY_TO_STROKE))
         {
-            RenderBlock::paint(paintInfo, xOffset, yOffset);
+            RenderBlock::paint(paintInfo, 0, 0);
             strokePaintServer->teardown(context, this, APPLY_TO_STROKE);
         }
 
         strokePaintServer->setPaintingText(false);
     }
 
+    // Restore paint info rect...
+    paintInfo.r = savedRect;
+
     // restore drawing state
     if(shouldPopContext)
     {
@@ -120,7 +137,8 @@
 
 bool RenderSVGText::nodeAtPoint(NodeInfo &info, int _x, int _y, int _tx, int _ty, \
HitTestAction hitTestAction, bool inBox)  {
-    QMatrix totalTransform = translationTopToBaseline();
+    QMatrix totalTransform = translationForAttributes();
+    totalTransform *= translationTopToBaseline();
     totalTransform *= absoluteTransform();
 
     double localX, localY;
--- branches/work/khtml-svg/rendering/render_svg_text.h #527126:527127
@@ -44,11 +44,12 @@
         
         virtual QMatrix localTransform() const { return m_transform; }
         virtual void setLocalTransform(const QMatrix &transform) { m_transform = \
                transform; }
-
+        
         virtual bool nodeAtPoint(NodeInfo &info, int _x, int _y, int _tx, int _ty, \
HitTestAction hitTestAction, bool inBox);  
      private:
         QMatrix translationTopToBaseline();
+        QMatrix translationForAttributes();
 
         QMatrix m_transform;
     };    


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic