mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Bug 931915, part 2 - Make gfxContext::RoundedRectangle use Moz2D's AppendRoundedRectToPath helper. r=Bas
--HG-- extra : rebase_source : e42577c112c2154b13e7e91cb4d7e54a30a411ce
This commit is contained in:
parent
4878fb43fb
commit
8131d3fc10
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user