It is now possible to draw a filled ellipse
This commit is contained in:
		
							parent
							
								
									6967c40143
								
							
						
					
					
						commit
						775e7bd4ca
					
				
							
								
								
									
										34
									
								
								artist/ellipse.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								artist/ellipse.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,34 @@
 | 
				
			|||||||
 | 
					package artist
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import "math"
 | 
				
			||||||
 | 
					import "image"
 | 
				
			||||||
 | 
					import "git.tebibyte.media/sashakoshka/tomo"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// FillEllipse draws a filled ellipse with the specified pattern.
 | 
				
			||||||
 | 
					func FillEllipse (
 | 
				
			||||||
 | 
						destination tomo.Canvas,
 | 
				
			||||||
 | 
						source Pattern,
 | 
				
			||||||
 | 
						bounds image.Rectangle,
 | 
				
			||||||
 | 
					) (
 | 
				
			||||||
 | 
						updatedRegion image.Rectangle,
 | 
				
			||||||
 | 
					) {
 | 
				
			||||||
 | 
						data, stride := destination.Buffer()
 | 
				
			||||||
 | 
						realWidth, realHeight := bounds.Dx(), bounds.Dy()
 | 
				
			||||||
 | 
						bounds = bounds.Canon().Intersect(destination.Bounds()).Canon()
 | 
				
			||||||
 | 
						if bounds.Empty() { return }
 | 
				
			||||||
 | 
						updatedRegion = bounds
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						width,  height := bounds.Dx(), bounds.Dy()
 | 
				
			||||||
 | 
						for y := 0; y < height; y ++ {
 | 
				
			||||||
 | 
						for x := 0; x < width;  x ++ {
 | 
				
			||||||
 | 
							xf := float64(x) / float64(width)  - 0.5
 | 
				
			||||||
 | 
							yf := float64(y) / float64(height) - 0.5
 | 
				
			||||||
 | 
							if math.Sqrt(xf * xf + yf * yf) <= 0.5 {
 | 
				
			||||||
 | 
								data[x + bounds.Min.X + (y + bounds.Min.Y) * stride] =
 | 
				
			||||||
 | 
									source.AtWhen(x, y, realWidth, realHeight)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}}
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// TODO: StrokeEllipse
 | 
				
			||||||
@ -129,8 +129,8 @@ func squareAround (
 | 
				
			|||||||
	source Pattern,
 | 
						source Pattern,
 | 
				
			||||||
	x, y, patternWidth, patternHeight, diameter int,
 | 
						x, y, patternWidth, patternHeight, diameter int,
 | 
				
			||||||
) {
 | 
					) {
 | 
				
			||||||
	minY := y - diameter
 | 
						minY := y - diameter + 1
 | 
				
			||||||
	minX := x - diameter
 | 
						minX := x - diameter + 1
 | 
				
			||||||
	maxY := y + diameter
 | 
						maxY := y + diameter
 | 
				
			||||||
	maxX := x + diameter
 | 
						maxX := x + diameter
 | 
				
			||||||
	for y = minY; y < maxY; y ++ {
 | 
						for y = minY; y < maxY; y ++ {
 | 
				
			||||||
 | 
				
			|||||||
@ -88,7 +88,3 @@ func StrokeRectangle (
 | 
				
			|||||||
		insetBounds.Max.X, insetBounds.Min.Y,
 | 
							insetBounds.Max.X, insetBounds.Min.Y,
 | 
				
			||||||
		bounds.Max.X, insetBounds.Max.Y))
 | 
							bounds.Max.X, insetBounds.Max.Y))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					 | 
				
			||||||
// TODO: FillEllipse
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// TODO: StrokeEllipse
 | 
					 | 
				
			||||||
 | 
				
			|||||||
@ -28,7 +28,7 @@ func (element *Artist) Resize (width, height int) {
 | 
				
			|||||||
	element.core.AllocateCanvas(width, height)
 | 
						element.core.AllocateCanvas(width, height)
 | 
				
			||||||
	bounds := element.Bounds()
 | 
						bounds := element.Bounds()
 | 
				
			||||||
	element.cellBounds.Max.X = bounds.Dx() / 4
 | 
						element.cellBounds.Max.X = bounds.Dx() / 4
 | 
				
			||||||
	element.cellBounds.Max.Y = (bounds.Dy() - 64) / 4
 | 
						element.cellBounds.Max.Y = (bounds.Dy() - 48) / 4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	drawStart := time.Now()
 | 
						drawStart := time.Now()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -86,6 +86,9 @@ func (element *Artist) Resize (width, height int) {
 | 
				
			|||||||
		element.lines(x + 1, element.cellAt(x, 2))
 | 
							element.lines(x + 1, element.cellAt(x, 2))
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 0, 3
 | 
				
			||||||
 | 
						artist.FillEllipse(element, uhex(0x00FF00FF), element.cellAt(0, 3))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	drawTime := time.Since(drawStart)
 | 
						drawTime := time.Since(drawStart)
 | 
				
			||||||
	textDrawer := artist.TextDrawer { }
 | 
						textDrawer := artist.TextDrawer { }
 | 
				
			||||||
	textDrawer.SetFace(defaultfont.FaceRegular)
 | 
						textDrawer.SetFace(defaultfont.FaceRegular)
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user