diff --git a/artist/chisel.go b/artist/chisel.go index 1fd1d3b..742568f 100644 --- a/artist/chisel.go +++ b/artist/chisel.go @@ -10,14 +10,9 @@ type Chiseled struct { // AtWhen satisfies the Pattern interface. func (chiseled Chiseled) AtWhen (x, y, width, height int) (c color.RGBA) { - var highlighted bool - // FIXME: this doesn't work quite right, the - // slope of the line is somewhat off. - // bottomCorner := - // float64(x) < float64(y) * - // (float64(width) / float64(height)) - bottomCorner := false - + var highlighted bool + var bottomCorner bool + if width > height { bottomCorner = y > height / 2 } else { diff --git a/artist/striped.go b/artist/striped.go new file mode 100644 index 0000000..5874cfb --- /dev/null +++ b/artist/striped.go @@ -0,0 +1,47 @@ +package artist + +import "image/color" + +// StripeDirection specifies the direction of stripes. +type StripeDirection int + +const ( + StripeDirectionVertical StripeDirection = iota + StripeDirectionDiagonalRight + StripeDirectionHorizontal + StripeDirectionDiagonalLeft +) + +// Striped is a pattern that produces stripes of two alternating colors. +type Striped struct { + First Pattern + Second Pattern + Direction StripeDirection + Weight int +} + +// AtWhen satisfies the Pattern interface. +func (pattern Striped) AtWhen (x, y, width, height int) (c color.RGBA) { + position := 0 + switch pattern.Direction { + case StripeDirectionVertical: + position = x + case StripeDirectionDiagonalRight: + position = x + y + case StripeDirectionHorizontal: + position = y + case StripeDirectionDiagonalLeft: + position = x - y + } + + position %= pattern.Weight * 2 + if position < 0 { + position += pattern.Weight * 2 + } + + if position < pattern.Weight { + return pattern.First.AtWhen(x, y, width, height) + } else { + return pattern.Second.AtWhen(x, y, width, height) + } +} diff --git a/elements/testing/artist.go b/elements/testing/artist.go index c6d08fe..10554a9 100644 --- a/elements/testing/artist.go +++ b/elements/testing/artist.go @@ -53,6 +53,20 @@ func (element *Artist) Resize (width, height int) { artist.Border { Stroke: uhex(0x0000FFFF), Weight: 5 }, ), element.cellAt(2, 0)) + + // 0, 1 - 0, 3 + for x := 0; x < 4; x ++ { + artist.FillRectangle ( + element, + artist.Striped { + First: uhex(0xFF8800FF), + Second: uhex(0x0088FFFF), + Direction: artist.StripeDirection(x), + Weight: 3, + + }, + element.cellAt(x, 1)) + } } func (element *Artist) cellAt (x, y int) (image.Rectangle) {