Archive for September 2012

Bresenham’s line drawing algorithm implemetations in Go and C.

Couple of Bresenham’s line drawing implementations in C and Go. They will need hacking to suit your application.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
void display_draw_line(int start_x,int start_y,int end_x,int end_y,uint16_t color) {
 
  // Bresenham's
  int cx = start_x;
  int cy = start_y;
 
  int dx = end_x - cx;
  int dy = end_y - cy;
  if(dx<0) dx = 0-dx;
  if(dy<0) dy = 0-dy;
 
  int sx=0; int sy=0;
  if(cx < end_x) sx = 1; else sx = -1;
  if(cy < end_y) sy = 1; else sy = -1;
  int err = dx-dy;
 
  for(int n=0;n<1000;n++) {
    display_draw_point(cx,cy,color);
    if((cx==end_x) && (cy==end_y)) return;
    int e2 = 2*err;
    if(e2 > (0-dy)) { err = err - dy; cx = cx + sx; }
    if(e2 < dx    ) { err = err + dx; cy = cy + sy; }
  }
}

And golang:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
func draw_line(start_x int32,start_y int32,end_x int32,end_y int32,color uint32,screen* sdl.Surface) {
 
  // Bresenham's
  var cx int32 = start_x;
  var cy int32 = start_y;
 
  var dx int32 = end_x - cx;
  var dy int32 = end_y - cy;
  if dx<0 { dx = 0-dx; }
  if dy<0 { dy = 0-dy; }
 
  var sx int32;
  var sy int32;
  if cx < end_x { sx = 1; } else { sx = -1; }
  if cy < end_y { sy = 1; } else { sy = -1; }
  var err int32 = dx-dy;
 
  var n int32;
  for n=0;n<1000;n++ {
    draw_point(cx,cy,color,screen);
    if((cx==end_x) && (cy==end_y)) {return;}
    var e2 int32 = 2*err;
    if e2 > (0-dy) { err = err - dy; cx = cx + sx; }
    if e2 < dx     { err = err + dx; cy = cy + sy; }
  }
}

A Simple Golang SDL example

First install golang, SDL and the golang SDL package. The following is for Ubuntu 12.04:

1
2
3
4
5
6
7
8
9
sudo apt-get install golang-go
 
Install SDL libraries:
 
sudo apt-get install libsdl1.2-dev
sudo apt-get install libsdl-mixer*
sudo apt-get install libsdl-image*
sudo apt-get install libsdl-ttf*
sudo go get -v github.com/0xe2-0x9a-0x9b/Go-SDL/...

Then create the following go program. This write random pixel data to the screen directly. If you save it to main.go you can execute it with:

1
go run main.go

Here’s the code (please note there’s probably a lot wrong with it, it’s my first go program):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package main
 
import (
"github.com/0xe2-0x9a-0x9b/Go-SDL/sdl"
"log"
"unsafe"
"math/rand"
)
 
func draw_point(x int32,y int32,value uint32,screen* sdl.Surface) {
  var pix = uintptr(screen.Pixels);
  pix += (uintptr)((y*screen.W)+x)*unsafe.Sizeof(value);
  var pu = unsafe.Pointer(pix);
  var pp *uint32;
  pp = (*uint32)(pu);
  *pp = value;
}
 
func main() {
 
  var screen = sdl.SetVideoMode(640, 480, 32, sdl.RESIZABLE)
 
  if screen == nil {
    log.Fatal(sdl.GetError())
  }
 
  var n int32;
  for n=0;n<1000000;n++ {
 
    var y int32 =rand.Int31()%480;
    var x int32 =rand.Int31()%640;
    var value uint32 = rand.Uint32();
    draw_point(x,y,value,screen);
 
    screen.Flip();
  }
}

Installing Apache2/Modperl on Ubuntu 12.04

1
2
3
4
5
apt-get install apache2
apt-get install libapache2-mod-perl2
apt-get install perl-debug
apt-get install libapache2-mod-perl2-dev
apt-get install  libapache2-request-perl libdatetime-perl

Edit /etc/apache2/sites-available/default, add:

1
2
3
4
5
6
7
<Location /perl/>
        SetHandler perl-script
        PerlHandler ModPerl::PerlRun
        Options ExecCGI
        PerlSendHeader On
        allow from all
</Location>

Install the CGI module:

1
cpan install CGI

Create a directory /var/www/perl. Add a script, for example:

1
2
3
4
5
6
7
8
#!/usr/bin/perl
 
use CGI;                             # load CGI routines
$q = CGI->new;                        # create new CGI object
print $q->header,                    # create the HTTP header
      $q->start_html('hello world'), # start the HTML
      $q->h1('hello world'),         # level 1 header
      $q->end_html;                  # end the HTML

Call it something like hello.pl. Try to access http://server/perl/hello.pl, everything should work correctly.