Bug 931915, part 2 - Make gfxContext::RoundedRectangle use Moz2D's AppendRoundedRectToPath helper. r=Bas

--HG--
extra : rebase_source : e42577c112c2154b13e7e91cb4d7e54a30a411ce
This commit is contained in:
Jonathan Watt 2013-11-01 13:29:53 +00:00
parent 4878fb43fb
commit 8131d3fc10

View File

@ -22,6 +22,7 @@
#include "gfxTeeSurface.h"
#include "GeckoProfiler.h"
#include "gfx2DGlue.h"
#include "mozilla/gfx/PathHelpers.h"
#include <algorithm>
#if CAIRO_HAS_DWRITE_FONT
@ -1911,62 +1912,11 @@ gfxContext::RoundedRectangle(const gfxRect& rect,
cairo_close_path (mCairo);
} else {
EnsurePathBuilder();
const gfxFloat alpha = 0.55191497064665766025;
typedef struct { gfxFloat a, b; } twoFloats;
twoFloats cwCornerMults[4] = { { -1, 0 },
{ 0, -1 },
{ +1, 0 },
{ 0, +1 } };
twoFloats ccwCornerMults[4] = { { +1, 0 },
{ 0, -1 },
{ -1, 0 },
{ 0, +1 } };
twoFloats *cornerMults = draw_clockwise ? cwCornerMults : ccwCornerMults;
gfxPoint pc, p0, p1, p2, p3;
if (draw_clockwise)
mPathBuilder->MoveTo(Point(Float(rect.X() + corners[NS_CORNER_TOP_LEFT].width), Float(rect.Y())));
else
mPathBuilder->MoveTo(Point(Float(rect.X() + rect.Width() - corners[NS_CORNER_TOP_RIGHT].width), Float(rect.Y())));
NS_FOR_CSS_CORNERS(i) {
// the corner index -- either 1 2 3 0 (cw) or 0 3 2 1 (ccw)
mozilla::css::Corner c = mozilla::css::Corner(draw_clockwise ? ((i+1) % 4) : ((4-i) % 4));
// i+2 and i+3 respectively. These are used to index into the corner
// multiplier table, and were deduced by calculating out the long form
// of each corner and finding a pattern in the signs and values.
int i2 = (i+2) % 4;
int i3 = (i+3) % 4;
pc = rect.AtCorner(c);
if (corners[c].width > 0.0 && corners[c].height > 0.0) {
p0.x = pc.x + cornerMults[i].a * corners[c].width;
p0.y = pc.y + cornerMults[i].b * corners[c].height;
p3.x = pc.x + cornerMults[i3].a * corners[c].width;
p3.y = pc.y + cornerMults[i3].b * corners[c].height;
p1.x = p0.x + alpha * cornerMults[i2].a * corners[c].width;
p1.y = p0.y + alpha * cornerMults[i2].b * corners[c].height;
p2.x = p3.x - alpha * cornerMults[i3].a * corners[c].width;
p2.y = p3.y - alpha * cornerMults[i3].b * corners[c].height;
mPathBuilder->LineTo(ToPoint(p0));
mPathBuilder->BezierTo(ToPoint(p1), ToPoint(p2), ToPoint(p3));
} else {
mPathBuilder->LineTo(ToPoint(pc));
}
}
mPathBuilder->Close();
Size radii[] = { ToSize(corners[NS_CORNER_TOP_LEFT]),
ToSize(corners[NS_CORNER_TOP_RIGHT]),
ToSize(corners[NS_CORNER_BOTTOM_RIGHT]),
ToSize(corners[NS_CORNER_BOTTOM_LEFT]) };
AppendRoundedRectToPath(mPathBuilder, ToRect(rect), radii, draw_clockwise);
}
}