From 76dbd3f09366910f918201e7efb42b9da1aaffe4 Mon Sep 17 00:00:00 2001
From: Wilk <flibustenet@users.noreply.github.com>
Date: Fri, 16 Nov 2018 12:21:38 +0100
Subject: Make SplitLines and MultiCell split at the same place (#210)

* Make SplitLines and MultiCell split at the same place

* Use integer math for SplitLines and MultiCell
---
 fpdf.go      | 10 +++++-----
 fpdf_test.go | 38 ++++++++++++++++++++++++++++++++++++++
 2 files changed, 43 insertions(+), 5 deletions(-)

diff --git a/fpdf.go b/fpdf.go
index 1e324b1..fbe980b 100644
--- a/fpdf.go
+++ b/fpdf.go
@@ -2180,7 +2180,7 @@ func (f *Fpdf) MultiCell(w, h float64, txtStr, borderStr, alignStr string, fill
 	if w == 0 {
 		w = f.w - f.rMargin - f.x
 	}
-	wmax := (w - 2*f.cMargin) * 1000 / f.fontSize
+	wmax := int(math.Ceil((w - 2*f.cMargin) * 1000 / f.fontSize))
 	s := strings.Replace(txtStr, "\r", "", -1)
 	nb := len(s)
 	// if nb > 0 && s[nb-1:nb] == "\n" {
@@ -2214,8 +2214,8 @@ func (f *Fpdf) MultiCell(w, h float64, txtStr, borderStr, alignStr string, fill
 	sep := -1
 	i := 0
 	j := 0
-	l := 0.0
-	ls := 0.0
+	l := 0
+	ls := 0
 	ns := 0
 	nl := 1
 	for i < nb {
@@ -2244,7 +2244,7 @@ func (f *Fpdf) MultiCell(w, h float64, txtStr, borderStr, alignStr string, fill
 			ls = l
 			ns++
 		}
-		l += float64(cw[c])
+		l += cw[c]
 		if l > wmax {
 			// Automatic line break
 			if sep == -1 {
@@ -2259,7 +2259,7 @@ func (f *Fpdf) MultiCell(w, h float64, txtStr, borderStr, alignStr string, fill
 			} else {
 				if alignStr == "J" {
 					if ns > 1 {
-						f.ws = (wmax - ls) / 1000 * f.fontSize / float64(ns-1)
+						f.ws = float64((wmax-ls)/1000) * f.fontSize / float64(ns-1)
 					} else {
 						f.ws = 0
 					}
diff --git a/fpdf_test.go b/fpdf_test.go
index 89c90b6..8f1f700 100644
--- a/fpdf_test.go
+++ b/fpdf_test.go
@@ -100,6 +100,44 @@ func TestIssue0193(t *testing.T) {
 
 }
 
+// TestIssue0209 addresses issue 209
+// make SplitLines and MultiCell split at the same place
+func TestIssue0209SplitLinesEqualMultiCell(t *testing.T) {
+	var pdf *gofpdf.Fpdf
+
+	pdf = gofpdf.New("P", "mm", "A4", "")
+	pdf.AddPage()
+	pdf.SetFont("Arial", "", 8)
+	// this sentence should not be splited
+	str := "Guochin Amandine"
+	lines := pdf.SplitLines([]byte(str), 26)
+	_, FontSize := pdf.GetFontSize()
+	y_start := pdf.GetY()
+	pdf.MultiCell(26, FontSize, str, "", "L", false)
+	y_end := pdf.GetY()
+
+	if len(lines) != 1 {
+		t.Fatalf("expect SplitLines split in one line")
+	}
+	if int(y_end-y_start) != int(FontSize) {
+		t.Fatalf("expect MultiCell split in one line %.2f != %.2f", y_end-y_start, FontSize)
+	}
+
+	// this sentence should be splited in two lines
+	str = "Guiochini Amandine"
+	lines = pdf.SplitLines([]byte(str), 26)
+	y_start = pdf.GetY()
+	pdf.MultiCell(26, FontSize, str, "", "L", false)
+	y_end = pdf.GetY()
+
+	if len(lines) != 2 {
+		t.Fatalf("expect SplitLines split in two lines")
+	}
+	if int(y_end-y_start) != int(FontSize*2) {
+		t.Fatalf("expect MultiCell split in two lines %.2f != %.2f", y_end-y_start, FontSize*2)
+	}
+}
+
 // Test to make sure the footer is not call twice and SetFooterFuncLpi can work
 // without SetFooterFunc.
 func TestFooterFuncLpi(t *testing.T) {
-- 
cgit v1.2.1-24-ge1ad