1package fillomino23import (4 "strconv"56 "codeberg.org/go-pdf/fpdf"7 "github.com/FelineStateMachine/puzzletea/pdfexport"8)910type printAdapter struct{}1112var PDFPrintAdapter = printAdapter{}1314func (printAdapter) CanonicalGameType() string { return "Fillomino" }15func (printAdapter) Aliases() []string { return []string{"fillomino", "polyomino", "regions"} }1617func (printAdapter) BuildPDFPayload(save []byte) (any, error) {18 return pdfexport.ParseFillominoPrintData(save)19}2021func (printAdapter) RenderPDFBody(pdf *fpdf.Fpdf, payload any) error {22 switch data := payload.(type) {23 case *pdfexport.FillominoData:24 renderFillominoPage(pdf, data)25 }26 return nil27}2829func renderFillominoPage(pdf *fpdf.Fpdf, data *pdfexport.FillominoData) {30 if data == nil || data.Width <= 0 || data.Height <= 0 {31 return32 }3334 pageW, pageH := pdf.GetPageSize()35 pageNo := pdf.PageNo()36 body := pdfexport.PuzzleBodyRect(pageW, pageH, pageNo)37 rules := []string{"Each connected region must contain exactly the number shown in its cells."}38 ruleLines := pdfexport.InstructionLineCount(pdf, body.W, rules)39 area := pdfexport.PuzzleBoardRect(pageW, pageH, pageNo, ruleLines)40 cellSize := pdfexport.FitCompactCellSize(data.Width, data.Height, area)41 if cellSize <= 0 {42 return43 }4445 blockW := float64(data.Width) * cellSize46 blockH := float64(data.Height) * cellSize47 startX, startY := pdfexport.CenteredOrigin(area, data.Width, data.Height, cellSize)4849 pdf.SetDrawColor(60, 60, 60)50 pdf.SetLineWidth(pdfexport.ThinGridLineMM)51 for y := 0; y < data.Height; y++ {52 for x := 0; x < data.Width; x++ {53 cellX := startX + float64(x)*cellSize54 cellY := startY + float64(y)*cellSize55 pdf.Rect(cellX, cellY, cellSize, cellSize, "D")56 if data.Givens[y][x] == 0 {57 continue58 }59 drawFillominoGiven(pdf, cellX, cellY, cellSize, strconv.Itoa(data.Givens[y][x]))60 }61 }6263 pdf.SetDrawColor(35, 35, 35)64 pdf.SetLineWidth(pdfexport.OuterBorderLineMM)65 pdf.Rect(startX, startY, blockW, blockH, "D")6667 ruleY := pdfexport.InstructionY(startY+blockH, pageH, ruleLines)68 pdfexport.RenderInstructions(pdf, body.X, ruleY, body.W, rules)69}7071func drawFillominoGiven(pdf *fpdf.Fpdf, x, y, cellSize float64, text string) {72 fontSize := pdfexport.ClampStandardCellFontSize(pdfexport.StandardCellFontSize(cellSize, 0.58))73 pdf.SetTextColor(pdfexport.PrimaryTextGray, pdfexport.PrimaryTextGray, pdfexport.PrimaryTextGray)74 pdf.SetFont(pdfexport.SansFontFamily, "B", fontSize)75 lineH := fontSize * 0.976 pdf.SetXY(x, y+(cellSize-lineH)/2)77 pdf.CellFormat(cellSize, lineH, text, "", 0, "C", false, 0, "")78}