Signed-off-by: oppiliappan me@oppi.li
+56
appview/ogcard/card.go
+56
appview/ogcard/card.go
···
257
257
return textWidth, err
258
258
}
259
259
260
+
func (c *Card) FontHeight(sizePt float64) int {
261
+
ft := freetype.NewContext()
262
+
ft.SetDPI(72)
263
+
ft.SetFont(c.Font)
264
+
ft.SetFontSize(sizePt)
265
+
return ft.PointToFixed(sizePt).Ceil()
266
+
}
267
+
268
+
func (c *Card) TextWidth(text string, sizePt float64) int {
269
+
face := truetype.NewFace(c.Font, &truetype.Options{Size: sizePt, DPI: 72})
270
+
lineWidth := font.MeasureString(face, text)
271
+
textWidth := lineWidth.Ceil()
272
+
return textWidth
273
+
}
274
+
260
275
// DrawBoldText draws bold text by rendering multiple times with slight offsets
261
276
func (c *Card) DrawBoldText(text string, x, y int, textColor color.Color, sizePt float64, valign VAlign, halign HAlign) (int, error) {
262
277
// Draw the text multiple times with slight offsets to create bold effect
···
582
597
func (c *Card) DrawRect(startX, startY, endX, endY int, color color.Color) {
583
598
draw.Draw(c.Img, image.Rect(startX, startY, endX, endY), &image.Uniform{color}, image.Point{}, draw.Src)
584
599
}
600
+
601
+
// drawRoundedRect draws a filled rounded rectangle on the given card
602
+
func (card *Card) DrawRoundedRect(x, y, width, height, cornerRadius int, fillColor color.RGBA) {
603
+
cardBounds := card.Img.Bounds()
604
+
for py := y; py < y+height; py++ {
605
+
for px := x; px < x+width; px++ {
606
+
// calculate distance from corners
607
+
dx := 0
608
+
dy := 0
609
+
610
+
// check which corner region we're in
611
+
if px < x+cornerRadius && py < y+cornerRadius {
612
+
// top-left corner
613
+
dx = x + cornerRadius - px
614
+
dy = y + cornerRadius - py
615
+
} else if px >= x+width-cornerRadius && py < y+cornerRadius {
616
+
// top-right corner
617
+
dx = px - (x + width - cornerRadius - 1)
618
+
dy = y + cornerRadius - py
619
+
} else if px < x+cornerRadius && py >= y+height-cornerRadius {
620
+
// bottom-left corner
621
+
dx = x + cornerRadius - px
622
+
dy = py - (y + height - cornerRadius - 1)
623
+
} else if px >= x+width-cornerRadius && py >= y+height-cornerRadius {
624
+
// Bottom-right corner
625
+
dx = px - (x + width - cornerRadius - 1)
626
+
dy = py - (y + height - cornerRadius - 1)
627
+
}
628
+
629
+
// if we're in a corner, check if we're within the radius
630
+
inCorner := (dx > 0 || dy > 0)
631
+
withinRadius := dx*dx+dy*dy <= cornerRadius*cornerRadius
632
+
633
+
// draw pixel if not in corner, or in corner and within radius
634
+
// check bounds relative to the card's image bounds
635
+
if (!inCorner || withinRadius) && px >= 0 && px < cardBounds.Dx() && py >= 0 && py < cardBounds.Dy() {
636
+
card.Img.Set(px+cardBounds.Min.X, py+cardBounds.Min.Y, fillColor)
637
+
}
638
+
}
639
+
}
640
+
}
History
1 round
0 comments
oppi.li
submitted
#0
1 commit
expand
collapse
appview/ogcard: add utility to draw rounded rectangles
Signed-off-by: oppiliappan <me@oppi.li>
2/3 timeout, 1/3 success
expand
collapse
expand 0 comments
pull request successfully merged