b=368247 (and others, see bug), rewrite border rendering for thebes, r=dbaron

This commit is contained in:
vladimir@pobox.com 2007-04-30 20:31:25 -07:00
parent 463084360e
commit 02374fc781
8 changed files with 1534 additions and 1689 deletions

View File

@ -140,6 +140,12 @@ public:
*/
void MoveTo(const gfxPoint& pt);
/**
* Creates a new subpath starting at the current point.
* Equivalent to MoveTo(CurrentPoint()).
*/
void NewSubPath();
/**
* Returns the current point in the current path.
*/

View File

@ -67,7 +67,6 @@ struct THEBES_API gfxRect {
return gfxRect(pos + aPt, size);
}
const gfxPoint& TopLeft() const { return pos; }
gfxFloat Width() const { return size.width; }
gfxFloat Height() const { return size.height; }
gfxFloat X() const { return pos.x; }
@ -79,6 +78,14 @@ struct THEBES_API gfxRect {
gfxRect Intersect(const gfxRect& aRect) const;
gfxRect Union(const gfxRect& aRect) const;
// XXX figure out what methods (intersect, union, etc) we use and add them.
void Round();
// grabbing specific points
gfxPoint TopLeft() const { return gfxPoint(pos); }
gfxPoint TopRight() const { return pos + gfxSize(size.width, 0.0); }
gfxPoint BottomLeft() const { return pos + gfxSize(0.0, size.height); }
gfxPoint BottomRight() const { return pos + size; }
};
#endif /* GFX_RECT_H */

View File

@ -140,6 +140,12 @@ gfxContext::MoveTo(const gfxPoint& pt)
cairo_move_to(mCairo, pt.x, pt.y);
}
void
gfxContext::NewSubPath()
{
cairo_new_sub_path(mCairo);
}
void
gfxContext::LineTo(const gfxPoint& pt)
{

View File

@ -37,7 +37,10 @@
#include "gfxRect.h"
gfxRect gfxRect::Intersect(const gfxRect& aRect) const
#include <math.h>
gfxRect
gfxRect::Intersect(const gfxRect& aRect) const
{
gfxRect result(0,0,0,0);
@ -55,7 +58,8 @@ gfxRect gfxRect::Intersect(const gfxRect& aRect) const
return result;
}
gfxRect gfxRect::Union(const gfxRect& aRect) const
gfxRect
gfxRect::Union(const gfxRect& aRect) const
{
if (IsEmpty())
return aRect;
@ -68,3 +72,18 @@ gfxRect gfxRect::Union(const gfxRect& aRect) const
gfxFloat ymost = PR_MAX(aRect.YMost(), YMost());
return gfxRect(x, y, xmost - x, ymost - y);
}
void
gfxRect::Round()
{
gfxFloat x0 = floor(X() + 0.5);
gfxFloat y0 = floor(Y() + 0.5);
gfxFloat x1 = floor(XMost() + 0.5);
gfxFloat y1 = floor(YMost() + 0.5);
pos.x = x0;
pos.y = y0;
size.width = x1 - x0;
size.height = y1 - y0;
}

File diff suppressed because it is too large Load Diff

View File

@ -93,31 +93,8 @@ public:
const nsStyleBorder& aBorderStyle,
const nsStyleOutline& aOutlineStyle,
nsStyleContext* aStyleContext,
PRIntn aSkipSides,
nsRect* aGap = 0);
/**
* Just like PaintBorder, but takes as input a list of border segments
* rather than a single border style. Useful for any object that needs to
* draw a border where an edge is not necessarily homogenous.
* Render the border for an element using css rendering rules
* for borders. aSkipSides is a bitmask of the sides to skip
* when rendering. If 0 then no sides are skipped.
*
* Both aDirtyRect and aBorderArea are in the local coordinate space
* of aForFrame
*/
static void PaintBorderEdges(nsPresContext* aPresContext,
nsIRenderingContext& aRenderingContext,
nsIFrame* aForFrame,
const nsRect& aDirtyRect,
const nsRect& aBorderArea,
nsBorderEdges * aBorderEdges,
nsStyleContext* aStyleContext,
PRIntn aSkipSides,
nsRect* aGap = 0);
/**
* Fill in an nsStyleBackground to be used to paint the background for
* an element. The nsStyleBackground should first be initialized
@ -202,15 +179,6 @@ public:
PRIntn aSkipSides,
nsRect* aGap);
/** draw the dashed segements of a segmented border */
//XXX: boy is it annoying that we have 3 methods to draw dashed sides!
// they clearly can be factored.
static void DrawDashedSegments(nsIRenderingContext& aContext,
const nsRect& aBounds,
nsBorderEdges * aBorderEdges,
PRIntn aSkipSides,
nsRect* aGap);
// Draw a border segment in the table collapsing border model without beveling corners
static void DrawTableBorderSegment(nsIRenderingContext& aContext,
PRUint8 aBorderStyle,
@ -231,29 +199,6 @@ public:
static nscolor TransformColor(nscolor aMapColor,PRBool aNoBackGround);
protected:
/**
* Render the border for an element using css rendering rules
* for borders. aSkipSides is a bitmask of the sides to skip
* when rendering. If 0 then no sides are skipped.
* Both aDirtyRect and aBorderArea are in the local coordinate space
* of aForFrame
*/
static void PaintRoundedBorder(nsPresContext* aPresContext,
nsIRenderingContext& aRenderingContext,
nsIFrame* aForFrame,
const nsRect& aDirtyRect,
const nsRect& aBorderArea,
const nsStyleBorder* aBorderStyle,
const nsStyleOutline* aOutlineStyle,
nsStyleContext* aStyleContext,
PRIntn aSkipSides,
PRInt16 aBorderRadius[4],nsRect* aGap = 0,
PRBool aIsOutline=PR_FALSE);
static void RenderSide(nsFloatPoint aPoints[],nsIRenderingContext& aRenderingContext,
const nsStyleBorder* aBorderStyle,const nsStyleOutline* aOutlineStyle,nsStyleContext* aStyleContext,
PRUint8 aSide,nsMargin &aBorThick,nscoord aTwipsPerPixel,
PRBool aIsOutline=PR_FALSE);
static void PaintBackgroundColor(nsPresContext* aPresContext,
nsIRenderingContext& aRenderingContext,
@ -277,35 +222,6 @@ protected:
nscolor aBackgroundColor,
nscolor aBorderColor);
static PRIntn MakeSide(nsPoint aPoints[],
nsIRenderingContext& aContext,
PRIntn whichSide,
const nsRect& outside, const nsRect& inside,
PRIntn aSkipSides,
PRIntn borderPart, float borderFrac,
nscoord twipsPerPixel);
static void DrawSide(nsIRenderingContext& aContext,
PRIntn whichSide,
const PRUint8 borderStyle,
const nscolor borderColor,
const nscolor aBackgroundColor,
const nsRect& borderOutside,
const nsRect& borderInside,
PRIntn aSkipSides,
nscoord twipsPerPixel,
nsRect* aGap = 0);
static void DrawCompositeSide(nsIRenderingContext& aContext,
PRIntn aWhichSide,
nsBorderColors* aCompositeColors,
const nsRect& aOuterRect,
const nsRect& aInnerRect,
PRInt16* aBorderRadii,
nscoord aTwipsPerPixel,
nsRect* aGap);
static void DrawLine (nsIRenderingContext& aContext,
nscoord aX1, nscoord aY1, nscoord aX2, nscoord aY2,
nsRect* aGap);

View File

@ -33,7 +33,7 @@ div { background: green; }
<div style="left: 351px"></div>
<div style="left: 371px"></div>
<div style="top: 30px; left: 11px; width: 31px; height: 30px">
<div style="top: 30px; left: 11px; width: 30px; height: 30px">
<div style="background:white; top: 10px; left: 10px"></div>
</div>

View File

@ -32,22 +32,23 @@ random == check-image.html check-image-ref.html # bug 371232
== background-color-width-left-6.html background-color-width-6.html
# The cocoa failures are due to bug 379317
!= border-base-ref.html border-height-10-ref.html
fails-if(MOZ_WIDGET_TOOLKIT=="cocoa") == border-height-4.html border-base-ref.html # bug 361523
fails-if(MOZ_WIDGET_TOOLKIT=="cocoa") == border-height-5.html border-height-10-ref.html # bug 361523
fails-if(MOZ_WIDGET_TOOLKIT=="cocoa") == border-height-6.html border-height-10-ref.html # bug 361523
fails-if(MOZ_WIDGET_TOOLKIT=="cocoa") == border-height-4.html border-base-ref.html
fails-if(MOZ_WIDGET_TOOLKIT=="cocoa") == border-height-5.html border-height-10-ref.html
fails-if(MOZ_WIDGET_TOOLKIT=="cocoa") == border-height-6.html border-height-10-ref.html
!= border-base-ref.html border-width-10-ref.html
fails-if(MOZ_WIDGET_TOOLKIT=="cocoa") == border-width-4.html border-base-ref.html # bug 361523
fails == border-width-5.html border-width-10-ref.html # bug 363220; bug 361523 on Mac
fails == border-width-6.html border-width-10-ref.html # bug 363220; bug 361523 on Mac
fails-if(MOZ_WIDGET_TOOLKIT=="cocoa") == border-width-4.html border-base-ref.html
fails-if(MOZ_WIDGET_TOOLKIT=="cocoa") == border-width-5.html border-width-10-ref.html
fails-if(MOZ_WIDGET_TOOLKIT=="cocoa") == border-width-6.html border-width-10-ref.html
!= border-base-ref.html border-left-10-ref.html
fails-if(MOZ_WIDGET_TOOLKIT=="cocoa") == border-left-4.html border-base-ref.html # bug 361523
fails == border-left-5.html border-left-10-ref.html # bug 363220; bug 361523 on Mac
fails == border-left-6.html border-left-10-ref.html # bug 363220; bug 361523 on Mac
fails-if(MOZ_WIDGET_TOOLKIT=="cocoa") == border-left-4.html border-base-ref.html
fails-if(MOZ_WIDGET_TOOLKIT=="cocoa") == border-left-5.html border-left-10-ref.html
fails-if(MOZ_WIDGET_TOOLKIT=="cocoa") == border-left-6.html border-left-10-ref.html
!= border-base-ref.html border-top-10-ref.html
fails-if(MOZ_WIDGET_TOOLKIT=="cocoa") == border-top-4.html border-base-ref.html # bug 361523
fails-if(MOZ_WIDGET_TOOLKIT=="cocoa") == border-top-5.html border-top-10-ref.html # bug 361523
fails-if(MOZ_WIDGET_TOOLKIT=="cocoa") == border-top-6.html border-top-10-ref.html # bug 361523
fails-if(MOZ_WIDGET_TOOLKIT=="cocoa") == border-top-4.html border-base-ref.html
fails-if(MOZ_WIDGET_TOOLKIT=="cocoa") == border-top-5.html border-top-10-ref.html
fails-if(MOZ_WIDGET_TOOLKIT=="cocoa") == border-top-6.html border-top-10-ref.html
!= background-image-base.html background-image-height-10-ref.html