2018-06-06 23:33:22 +08:00

97 lines
2.2 KiB
Go

package draw
import (
// "fmt"
// "math"
"github.com/veandco/go-sdl2/sdl"
"github.com/veandco/go-sdl2/gfx"
"../color"
"../rect"
)
func _aa_render_region(image *sdl.Renderer, _rect *sdl.Rect, col color.Color, rad int) {
corners := rect.Inflate(_rect,-2*rad-1, -2*rad-1)
topleft := []int{ int(corners.X),int(corners.Y)}
topright := []int{int(corners.X+corners.W-1), int(corners.Y)}
bottomleft := []int{int(corners.X), int(corners.Y+corners.H-1)}
bottomright := []int{int(corners.X+corners.W -1), int(corners.Y+corners.H-1)}
attributes :=[][]int{topleft, topright, bottomleft, bottomright }
r,g,b,a := col.RGBA()
image.SetDrawColor( uint8(r),uint8(g),uint8(b),uint8(a) )
for i:=0; i< len(attributes);i++ {
x,y := attributes[i][0],attributes[i][1]
gfx.AACircleRGBA(image,int32(x),int32(y),int32(rad),uint8(r),uint8(g),uint8(b),uint8(a))
gfx.FilledCircleRGBA(image,int32(x),int32(y), int32(rad),uint8(r),uint8(g),uint8(b),uint8(a))
}
r1 := rect.Inflate(_rect,-2*rad,0)
r2 := rect.Inflate(_rect,0,-2*rad)
image.FillRect( &r1 ) // main body except four circles in corners
image.FillRect( &r2 ) // fix gap between circles of up and down vertical
}
//alpha of color should be 255
func AARoundRect(surf *sdl.Surface,_rect *sdl.Rect,col color.Color,rad,border int, inside color.Color) {
image,_ := sdl.CreateSoftwareRenderer(surf)
/*
image.SetDrawColor(233,100,200,0)
image.DrawLine(10,20,100,200)
*/
// image.Clear()
_aa_render_region(image,_rect,col,rad)
if border > 0 {
rect.InflateIp(_rect,-2*border,-2*border)
_aa_render_region(image,_rect,inside,rad)
}
//image.Present()
}
func Point(surf *sdl.Surface, c color.Color, x,y int) {
pixels := surf.Pixels()
bytes_per_pixel := surf.BytesPerPixel()
addr := y * int(surf.Pitch) + x*bytes_per_pixel // 1 2 3 4
color_bytes := c.ToBytes()
surf.Lock()
if bytes_per_pixel == 1 {
pixels[addr] = color_bytes[0]
}
if bytes_per_pixel == 2 {
for i :=0; i < bytes_per_pixel; i++ {
pixels[addr+i] = color_bytes[i]
}
}
if bytes_per_pixel == 3 {
for i :=0; i < bytes_per_pixel; i++ {
pixels[addr+i] = color_bytes[i]
}
}
if bytes_per_pixel == 4 {
for i :=0; i < bytes_per_pixel; i++ {
pixels[addr+i] = color_bytes[i]
}
}
surf.Unlock()
}