summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrigham Thompson <brigham.thompson@gmail.com>2019-08-11 20:52:54 -0700
committerBrigham Thompson <brigham.thompson@gmail.com>2019-08-11 20:52:54 -0700
commit7c5006543b654248bb1fb640703faf0a53f59f71 (patch)
treefaaa9fedf9409273d10d8a819abfdbdf5e160c71
parent4e47058871098a8e32dff39b461760b280bccff0 (diff)
adds RoundedRect per Issue #272
-rw-r--r--fpdf.go49
-rw-r--r--fpdf_test.go13
2 files changed, 62 insertions, 0 deletions
diff --git a/fpdf.go b/fpdf.go
index ca48fb5..46d57df 100644
--- a/fpdf.go
+++ b/fpdf.go
@@ -1103,6 +1103,55 @@ func (f *Fpdf) Rect(x, y, w, h float64, styleStr string) {
f.outf("%.2f %.2f %.2f %.2f re %s", x*f.k, (f.h-y)*f.k, w*f.k, -h*f.k, fillDrawOp(styleStr))
}
+// RoundedRect outputs a rectangle of width w and height h with the upper left
+// corner positioned at point (x, y). It can be drawn (border only), filled
+// (with no border) or both. styleStr can be "F" for filled, "D" for outlined
+// only, or "DF" or "FD" for outlined and filled. An empty string will be replaced
+// with "D". Drawing uses the current draw color and line width centered on the
+// rectangle's perimeter. Filling uses the current fill color. The rounded corners
+// of the rectangle are specified by radius r. corners runs clockwise with 1 at the
+// top left corner.
+func (f *Fpdf) RoundedRect(x, y, w, h, r float64, corners string, stylestr string) {
+ k := f.k
+ hp := f.h
+ myArc := (4.0 / 3.0) * (math.Sqrt2 - 1.0)
+ f.outf("q %.5f %.5f m", (x+r)*k, (hp-y)*k)
+ xc := x + w - r
+ yc := y + r
+ f.outf("%.5f %.5f l", xc*k, (hp-y)*k)
+ if strings.Contains(corners, "2") == false {
+ f.outf("%.5f %.5f l", (x+w)*k, (hp-y)*k)
+ } else {
+ f.clipArc(xc+r*myArc, yc-r, xc+r, yc-r*myArc, xc+r, yc)
+ }
+ xc = x + w - r
+ yc = y + h - r
+ f.outf("%.5f %.5f l", (x+w)*k, (hp-yc)*k)
+ if strings.Contains(corners, "3") == false {
+ f.outf("%.5f %.5f l", (x+w)*k, (hp-(y + h))*k)
+ } else {
+ f.clipArc(xc+r, yc+r*myArc, xc+r*myArc, yc+r, xc, yc+r)
+ }
+ xc = x + r
+ yc = y + h - r
+ f.outf("%.5f %.5f l", xc*k, (hp-(y+h))*k)
+ if strings.Contains(corners, "4") == false {
+ f.outf("%.5f %.5f l", x*k, (hp-(y+h))*k)
+ } else {
+ f.clipArc(xc-r*myArc, yc+r, xc-r, yc+r*myArc, xc-r, yc)
+ }
+ xc = x + r
+ yc = y + r
+ f.outf("%.5f %.5f l", x*k, (hp-yc)*k)
+ if strings.Contains(corners, "1") == false {
+ f.outf("%.5f %.5f l", x*k, (hp-y)*k)
+ f.outf("%.5f %.5f l", (x+r)*k, (hp-y)*k)
+ } else {
+ f.clipArc(xc-r, yc-r*myArc, xc-r*myArc, yc-r, xc, yc-r)
+ f.outf(" re %s", fillDrawOp(stylestr))
+ }
+}
+
// Circle draws a circle centered on point (x, y) with radius r.
//
// styleStr can be "F" for filled, "D" for outlined only, or "DF" or "FD" for
diff --git a/fpdf_test.go b/fpdf_test.go
index 63c28c5..08814e0 100644
--- a/fpdf_test.go
+++ b/fpdf_test.go
@@ -2639,3 +2639,16 @@ func ExampleUTF8CutFont() {
// Output:
// Successfully generated pdf/Fpdf_UTF8CutFont.pdf
}
+
+func ExampleFpdf_RoundedRect() {
+ pdf := gofpdf.New("P", "mm", "A4", "")
+ pdf.AddPage()
+ pdf.SetFillColor(160, 160, 160)
+ pdf.SetLineWidth(0.5)
+ pdf.RoundedRect(70, 30, 68, 46, 20, "1234", "FD")
+ fileStr := example.Filename("Fpdf_RoundedRect")
+ err := pdf.OutputFileAndClose(fileStr)
+ example.Summary(err, fileStr)
+ // Output:
+ // Successfully generated pdf/Fpdf_RoundedRect.pdf
+}