tested draw.Line

This commit is contained in:
cuu 2018-06-06 10:16:09 +08:00
parent 26f18da0d8
commit 2a2e793bc9
5 changed files with 118 additions and 16 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
test

View File

@ -5,7 +5,7 @@ import (
"math"
"github.com/veandco/go-sdl2/sdl"
"../color"
"../rect"
)
const (
@ -15,8 +15,55 @@ const (
TOP_EDGE=0x8
)
func Line(surf *sdl.Surface, col color.Color,x1,y1,x2,y2 ,width int) {
func Line(surf *sdl.Surface, col color.Color,x1,y1,x2,y2 ,width int) sdl.Rect {
pts := make([]int,4)
pts[0] = x1
pts[1] = y1
pts[2] = x2
pts[3] = y2
if width < 1 {
return rect.Rect(x1,y1,0,0)
}
err := surf.Lock()
if err != nil {
return rect.Rect(0,0,0,0)
}
anydraw := clip_and_draw_line_width(surf,&surf.ClipRect, col, width,pts)
surf.Unlock()
if anydraw == 0 {
return rect.Rect(x1,y1,0,0)
}
rleft := 0
rtop := 0
if x1 < x2 {
rleft = x1
}else {
rleft = x2
}
if y1 < y2 {
rtop = y1
}else {
rtop = y2
}
dx := abs(x1-x2)
dy := abs(y1-y2)
rwidth := 0
rheight := 0
if dx > dy {
rwidth = dx +1
rheight = dy + width
}else {
rwidth = dx + width
rheight = dy + 1
}
return rect.Rect(rleft,rtop,rwidth,rheight)
}
func Rect(surf *sdl.Surface,color color.Color, _rect *sdl.Rect, border_width uint32) {
@ -26,6 +73,7 @@ func Rect(surf *sdl.Surface,color color.Color, _rect *sdl.Rect, border_width uin
}
func clip_and_draw_line(surf *sdl.Surface, rect *sdl.Rect, col color.Color, pts []int) int {
if clipline(pts, int(rect.X),int(rect.Y),int(rect.X+ rect.W-1), int(rect.Y+rect.H-1) ) == 0 {
return 0
}
@ -33,7 +81,7 @@ func clip_and_draw_line(surf *sdl.Surface, rect *sdl.Rect, col color.Color, pts
if pts[1] == pts[3] {
drawhorzline(surf, col, pts[0],pts[1],pts[2])
}else if pts[0] == pts[2] {
drawvertline(surf,col, pts[0],pts[1],pts[2])
drawvertline(surf,col, pts[0],pts[1],pts[3])
}else {
drawline(surf, col, pts[0],pts[1],pts[2],pts[3])
}
@ -251,7 +299,7 @@ func drawline(surf *sdl.Surface, col color.Color, x1,y1,x2,y2 int) {
pixx := int(bytes_per_pixel)
pixy := int(surf.Pitch)
addr := int(pixy) * y1 + x1 * bytes_per_pixel
addr := pixy* y1 + x1 * bytes_per_pixel
pixx *= int(signx)
pixy *= int(signy)
@ -275,18 +323,17 @@ func drawline(surf *sdl.Surface, col color.Color, x1,y1,x2,y2 int) {
switch bytes_per_pixel {
case 1:
for ; x < deltax; x++ {
addr += pixx
pixels[addr] = color_bytes[0]
y += deltay
if y >= deltax {
y -= deltax
addr += pixy
}
addr +=pixx
}
break
case 2:
for ; x < deltax;x++ {
addr += pixx
pixels[addr] = color_bytes[0]
pixels[addr+1] = color_bytes[1]
y+= deltay
@ -294,11 +341,12 @@ func drawline(surf *sdl.Surface, col color.Color, x1,y1,x2,y2 int) {
y -= deltax
addr += pixy
}
addr+=pixx
}
break
case 3:
for ; x < deltax; x++ {
addr+= pixx
pixels[addr] = color_bytes[0]
pixels[addr+1] = color_bytes[1]
pixels[addr+2] = color_bytes[2]
@ -307,11 +355,11 @@ func drawline(surf *sdl.Surface, col color.Color, x1,y1,x2,y2 int) {
y-=deltax
addr += pixy
}
addr+=pixx
}
break
case 4:
for ; x < deltax; x++ {
addr+= pixx
pixels[addr] = color_bytes[0]
pixels[addr+1] = color_bytes[1]
pixels[addr+2] = color_bytes[2]
@ -321,6 +369,7 @@ func drawline(surf *sdl.Surface, col color.Color, x1,y1,x2,y2 int) {
y-=deltax
addr += pixy
}
addr+=pixx
}
break
}
@ -342,10 +391,10 @@ func drawhorzline(surf *sdl.Surface, col color.Color, x1,y1,x2 int) {
start := 0
if x1 < x2 {
end = addr + x2*bytes_per_pixel
start = x1 *bytes_per_pixel
start = addr+x1 *bytes_per_pixel
}else {
end = addr + x1 *bytes_per_pixel
start = x2 * bytes_per_pixel
start = addr + x2 * bytes_per_pixel
}
switch bytes_per_pixel {
@ -376,10 +425,53 @@ func drawhorzline(surf *sdl.Surface, col color.Color, x1,y1,x2 int) {
}
func drawvertline(surf *sdl.Surface, col color.Color, x1,y1,y2 int) {
if y1 == y2 {
pixel(surf,col, x1,y1)
}
bytes_per_pixel := surf.BytesPerPixel()
color_bytes := col.ToBytes()
pixels := surf.Pixels()
pitch := int(surf.Pitch)
addr := x1 * bytes_per_pixel
end := 0
start := 0
if y1 < y2 {
end = addr + y2* pitch
start = addr + y1*pitch
}else {
end = addr + y1*pitch
start = addr + y2*pitch
}
switch bytes_per_pixel {
case 1:
for ; start <=end; start+=pitch {
pixels[start] = color_bytes[0]
}
case 2:
for ; start <= end; start+=pitch {
pixels[start] = color_bytes[0]
pixels[start+1] = color_bytes[1]
}
case 3:
for ; start <= end; start+=pitch {
pixels[start] = color_bytes[0]
pixels[start+1] = color_bytes[1]
pixels[start+2] = color_bytes[2]
}
case 4:
for ; start <= end; start +=pitch {
pixels[start] = color_bytes[0]
pixels[start+1] = color_bytes[1]
pixels[start+2] = color_bytes[2]
pixels[start+3] = color_bytes[3]
}
}
}
func pixel(surf *sdl.Surface, c color.Color, x,y int) {
func pixel(surf *sdl.Surface, c color.Color, x,y int) int {
pixels := surf.Pixels()
bytes_per_pixel := surf.BytesPerPixel()
@ -387,7 +479,10 @@ func pixel(surf *sdl.Surface, c color.Color, x,y int) {
color_bytes := c.ToBytes()
surf.Lock()
if x < int(surf.ClipRect.X) || x >= int(surf.ClipRect.X + surf.ClipRect.W) ||
y < int(surf.ClipRect.Y) || y >= int(surf.ClipRect.Y + surf.ClipRect.H) {
return 0
}
if bytes_per_pixel == 1 {
pixels[addr] = color_bytes[0]
@ -410,8 +505,8 @@ func pixel(surf *sdl.Surface, c color.Color, x,y int) {
pixels[addr+i] = color_bytes[i]
}
}
surf.Unlock()
return 1
}
func Point(surf *sdl.Surface, c color.Color, x,y int) {

View File

@ -4,6 +4,6 @@ import (
"github.com/veandco/go-sdl2/sdl"
)
func Rect(top ,left, width,height int32) sdl.Rect {
return sdl.Rect{top,left,width,height}
func Rect(top ,left, width,height int) sdl.Rect {
return sdl.Rect{int32(top),int32(left),int32(width),int32(height)}
}

BIN
test

Binary file not shown.

View File

@ -35,9 +35,15 @@ func run() int {
fmt.Println(screen.Pitch)
fmt.Println( screen.BytesPerPixel() )
/*
for i:=1; i<319;i++ {
draw.Point(screen, color.Color{255,44,255,0}, i,20)
}
*/
draw.Line(screen,color.Color{255,44,255,0}, 0,100, 320,100,3)
draw.Line(screen,color.Color{255,44,255,0}, 10, 0, 10,250,4)
display.Flip()