1package drawing
2
3import (
4	"image/color"
5
6	"github.com/golang/freetype/truetype"
7)
8
9// FillRule defines the type for fill rules
10type FillRule int
11
12const (
13	// FillRuleEvenOdd determines the "insideness" of a point in the shape
14	// by drawing a ray from that point to infinity in any direction
15	// and counting the number of path segments from the given shape that the ray crosses.
16	// If this number is odd, the point is inside; if even, the point is outside.
17	FillRuleEvenOdd FillRule = iota
18	// FillRuleWinding determines the "insideness" of a point in the shape
19	// by drawing a ray from that point to infinity in any direction
20	// and then examining the places where a segment of the shape crosses the ray.
21	// Starting with a count of zero, add one each time a path segment crosses
22	// the ray from left to right and subtract one each time
23	// a path segment crosses the ray from right to left. After counting the crossings,
24	// if the result is zero then the point is outside the path. Otherwise, it is inside.
25	FillRuleWinding
26)
27
28// LineCap is the style of line extremities
29type LineCap int
30
31const (
32	// RoundCap defines a rounded shape at the end of the line
33	RoundCap LineCap = iota
34	// ButtCap defines a squared shape exactly at the end of the line
35	ButtCap
36	// SquareCap defines a squared shape at the end of the line
37	SquareCap
38)
39
40// LineJoin is the style of segments joint
41type LineJoin int
42
43const (
44	// BevelJoin represents cut segments joint
45	BevelJoin LineJoin = iota
46	// RoundJoin represents rounded segments joint
47	RoundJoin
48	// MiterJoin represents peaker segments joint
49	MiterJoin
50)
51
52// StrokeStyle keeps stroke style attributes
53// that is used by the Stroke method of a Drawer
54type StrokeStyle struct {
55	// Color defines the color of stroke
56	Color color.Color
57	// Line width
58	Width float64
59	// Line cap style rounded, butt or square
60	LineCap LineCap
61	// Line join style bevel, round or miter
62	LineJoin LineJoin
63	// offset of the first dash
64	DashOffset float64
65	// array represented dash length pair values are plain dash and impair are space between dash
66	// if empty display plain line
67	Dash []float64
68}
69
70// SolidFillStyle define style attributes for a solid fill style
71type SolidFillStyle struct {
72	// Color defines the line color
73	Color color.Color
74	// FillRule defines the file rule to used
75	FillRule FillRule
76}
77
78// Valign Vertical Alignment of the text
79type Valign int
80
81const (
82	// ValignTop top align text
83	ValignTop Valign = iota
84	// ValignCenter centered text
85	ValignCenter
86	// ValignBottom bottom aligned text
87	ValignBottom
88	// ValignBaseline align text with the baseline of the font
89	ValignBaseline
90)
91
92// Halign Horizontal Alignment of the text
93type Halign int
94
95const (
96	// HalignLeft Horizontally align to left
97	HalignLeft = iota
98	// HalignCenter Horizontally align to center
99	HalignCenter
100	// HalignRight Horizontally align to right
101	HalignRight
102)
103
104// TextStyle describe text property
105type TextStyle struct {
106	// Color defines the color of text
107	Color color.Color
108	// Size font size
109	Size float64
110	// The font to use
111	Font *truetype.Font
112	// Horizontal Alignment of the text
113	Halign Halign
114	// Vertical Alignment of the text
115	Valign Valign
116}
117
118// ScalingPolicy is a constant to define how to scale an image
119type ScalingPolicy int
120
121const (
122	// ScalingNone no scaling applied
123	ScalingNone ScalingPolicy = iota
124	// ScalingStretch the image is stretched so that its width and height are exactly the given width and height
125	ScalingStretch
126	// ScalingWidth the image is scaled so that its width is exactly the given width
127	ScalingWidth
128	// ScalingHeight the image is scaled so that its height is exactly the given height
129	ScalingHeight
130	// ScalingFit the image is scaled to the largest scale that allow the image to fit within a rectangle width x height
131	ScalingFit
132	// ScalingSameArea the image is scaled so that its area is exactly the area of the given rectangle width x height
133	ScalingSameArea
134	// ScalingFill the image is scaled to the smallest scale that allow the image to fully cover a rectangle width x height
135	ScalingFill
136)
137
138// ImageScaling style attributes used to display the image
139type ImageScaling struct {
140	// Horizontal Alignment of the image
141	Halign Halign
142	// Vertical Alignment of the image
143	Valign Valign
144	// Width Height used by scaling policy
145	Width, Height float64
146	// ScalingPolicy defines the scaling policy to applied to the image
147	ScalingPolicy ScalingPolicy
148}
149