Skip to content

Commit

Permalink
Merge branch 'BeeHam-master'
Browse files Browse the repository at this point in the history
  • Loading branch information
jung-kurt committed Aug 12, 2019
2 parents 4e47058 + 0d44f4b commit f6bb638
Show file tree
Hide file tree
Showing 2 changed files with 101 additions and 0 deletions.
52 changes: 52 additions & 0 deletions fpdf.go
Original file line number Diff line number Diff line change
Expand Up @@ -1103,6 +1103,58 @@ 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 is a
// string that includes "1" to round the upper left corner, "2" to round the
// upper right corner, "3" to round the lower right corner, and "4" to round
// the lower left corner. The RoundedRect example demonstrates this method.
func (f *Fpdf) RoundedRect(x, y, w, h, r float64, corners string, stylestr string) {
// This routine was adapted by Brigham Thompson from a script by Christophe Prugnaud
k := f.k
hp := f.h
myArc := r * (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+myArc, yc-r, xc+r, yc-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+myArc, xc+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-myArc, yc+r, xc-r, yc+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-myArc, xc-myArc, yc-r, xc, yc-r)
}
f.out(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
Expand Down
49 changes: 49 additions & 0 deletions fpdf_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2639,3 +2639,52 @@ func ExampleUTF8CutFont() {
// Output:
// Successfully generated pdf/Fpdf_UTF8CutFont.pdf
}

func ExampleFpdf_RoundedRect() {
const (
wd = 40.0
hgap = 10.0
radius = 10.0
ht = 60.0
vgap = 10.0
)
corner := func(b1, b2, b3, b4 bool) (cstr string) {
if b1 {
cstr = "1"
}
if b2 {
cstr += "2"
}
if b3 {
cstr += "3"
}
if b4 {
cstr += "4"
}
return
}
pdf := gofpdf.New("P", "mm", "A4", "") // 210 x 297
pdf.AddPage()
pdf.SetLineWidth(0.5)
y := vgap
r := 40
g := 30
b := 20
for row := 0; row < 4; row++ {
x := hgap
for col := 0; col < 4; col++ {
pdf.SetFillColor(r, g, b)
pdf.RoundedRect(x, y, wd, ht, radius, corner(row&1 == 1, row&2 == 2, col&1 == 1, col&2 == 2), "FD")
r += 8
g += 10
b += 12
x += wd + hgap
}
y += ht + vgap
}
fileStr := example.Filename("Fpdf_RoundedRect")
err := pdf.OutputFileAndClose(fileStr)
example.Summary(err, fileStr)
// Output:
// Successfully generated pdf/Fpdf_RoundedRect.pdf
}

0 comments on commit f6bb638

Please sign in to comment.