diff options
Diffstat (limited to 'main.go')
-rw-r--r-- | main.go | 192 |
1 files changed, 158 insertions, 34 deletions
diff --git a/main.go b/main.go index a5f5503..97de251 100644 --- a/main.go +++ b/main.go @@ -4,9 +4,10 @@ import ( "bytes" "flag" "fmt" + "image" "log" "net" - "time" + "os" ) var ( @@ -14,7 +15,7 @@ var ( port = flag.String("port", "1337", "Server port") address string - imagePath = flag.String("image", "foo.png", "Relative image path") + imagePath = flag.String("image", "", "Relative image path") imageOffsetX = flag.Int("xoffset", 0, "xoffset") imageOffsetY = flag.Int("yoffset", 0, "yoffset") @@ -24,7 +25,7 @@ var ( testConn = flag.Bool("t", false, "test the connection before escalating completely") fill = flag.Bool("fill", true, "fill the complete canvas") - color = flag.String("color", "000000", "define a color") + color = flag.String("col", "000000", "define a color") cores = flag.Int("cores", 1, "Amount of cores to use") ) @@ -79,48 +80,171 @@ func buildSendString(start int, end int, doneChannel chan bool, stripBufferChann stripBufferChannel <- stripBuffer } -func main() { +// openImage opens an image at the given path and returns an image.Image +func openImage(imagePath string) image.Image { + log.Println("AA") + reader, openErr := os.Open(imagePath) + if openErr != nil { + log.Fatal(openErr) + } + log.Println("AB") + + fmt.Println(*reader) + + img, _, imageDecodeErr := image.Decode(reader) + if imageDecodeErr != nil { + log.Fatal(openErr) + } + log.Println("AC") + + return img +} + +func buildSendStringImage(image image.Image, start int, end int, doneChannel chan bool, stripBufferChannel chan bytes.Buffer) { + + var imageHeight = image.Bounds().Max.Y + var stripBuffer bytes.Buffer + + fmt.Printf("ImageHeight: %d", imageHeight) + + for x := start; x < end; x++ { + for y := 0; y < imageHeight; y++ { + r, g, b, _ := image.At(x, y).RGBA() + fmt.Printf("%v %v %v", r, g, b) + command := fmt.Sprintf("PX %d %d %.2x%.2x%.2x", x, y, r, g, b) + stripBuffer.Write([]byte(command)) + } + } + doneChannel <- true + stripBufferChannel <- stripBuffer +} + +func main() { log.Printf("[ ] %s -> %s:%s at (%d, %d)", *imagePath, *host, *port, imageOffsetX, imageOffsetY) parseFlags() testConnection() - doneChannel := make(chan bool) - stripBufferChannel := make(chan bytes.Buffer) - var completeBuffer bytes.Buffer + if *fill == true { + // define channels used to bundle the data generated and get information + doneChannel := make(chan bool) + stripBufferChannel := make(chan bytes.Buffer) + var completeBuffer bytes.Buffer - var stripwidth int = *canvasWidth / *cores - for thread := 0; thread < *cores; thread++ { - log.Printf("Starting thread %d", thread) - go buildSendString(thread * stripwidth, (thread + 1) * stripwidth, doneChannel, stripBufferChannel) - } + // calculate the width of the individual stripes + var stripwidth int = *canvasWidth / *cores - for thread := 0; thread < *cores; thread++ { - log.Printf("Thread %d done!", thread) - _ = <- doneChannel + // create a new buildStringBot generating the stripes + for thread := 0; thread < *cores; thread++ { + log.Printf("Starting thread %d", thread) + go buildSendString(thread * stripwidth, (thread + 1) * stripwidth, doneChannel, stripBufferChannel) + } - stripBufferChannelOutput := <- stripBufferChannel - completeBuffer.Write(stripBufferChannelOutput.Bytes()) - } + // catch all threads + for thread := 0; thread < *cores; thread++ { + // get a "Done" message from each worker + _ = <- doneChannel - // write - connection, netDialError := net.Dial("tcp", address) - if netDialError != nil { - log.Fatal(netDialError) - } + // get the buffer generated and append it to the complete buffer by writing it there + stripBufferChannelOutput := <- stripBufferChannel + completeBuffer.Write(stripBufferChannelOutput.Bytes()) - _, writeErr := connection.Write(completeBuffer.Bytes()) - if writeErr != nil { - log.Fatal(writeErr) - } + log.Printf("Thread %d done!", thread) + } - connectionCloseError := connection.Close() - if connectionCloseError != nil { - log.Fatal(connectionCloseError) + // write the command to the server + connection, netDialError := net.Dial("tcp", address) + if netDialError != nil { + log.Fatal(netDialError) + } + + + i := 0 + for i < 500 { + // actual write + _, writeErr := connection.Write(completeBuffer.Bytes()) + if writeErr != nil { + log.Fatal(writeErr) + } + + fmt.Printf(".") + i++ + } + + fmt.Printf("\n") + + // close the connection + connectionCloseError := connection.Close() + if connectionCloseError != nil { + log.Fatal(connectionCloseError) + } + + // cleanup + fmt.Printf("cleanup: %d -> %d", *cores * stripwidth, *canvasWidth) } - // cleanup - fmt.Printf("cleanup: %d -> %d", *cores * stripwidth, *canvasWidth) + if *imagePath != "" { + log.Println("[ ] Drawing the image!") + + log.Println("A") + + // open the image + var image = openImage(*imagePath) + fmt.Println(image) + log.Println("b") + + // define channels used to bundle the data generated and get informations + doneChannel := make(chan bool) + stripBufferChannel := make(chan bytes.Buffer) + var completeBuffer bytes.Buffer + log.Println("c") + + // calculate the width of the individual stripes + var stripwidth int = image.Bounds().Max.X / *cores + log.Println("d") - time.Sleep(1 * time.Second) -} \ No newline at end of file + // create new buildSendString workers building the string that should be sent to the pixelflut server + for thread := 0; thread < *cores; thread++ { + log.Printf("Staring thread %d", thread) + go buildSendStringImage(image, thread * stripwidth, (thread+1) * stripwidth, doneChannel, stripBufferChannel) + } + log.Println("e") + + // catch all the threads + for thread := 0; thread < *cores; thread++ { + // get a "Done" message from each worker + _ = <- doneChannel + + // get the buffer generated and append it to the complete buffer by writing it there + stripBufferChannelOutput := <- stripBufferChannel + completeBuffer.Write(stripBufferChannelOutput.Bytes()) + + log.Printf("Thread %d done!") + } + log.Println("f") + + // write the command to the server + connection, netDialError := net.Dial("tcp", address) + if netDialError != nil { + log.Fatal(netDialError) + } + log.Println("g") + + // actual write + _, writeErr := connection.Write(completeBuffer.Bytes()) + if writeErr != nil { + log.Fatal(writeErr) + } + log.Println("h") + + // close the connection + connectionCloseError := connection.Close() + if connectionCloseError != nil { + log.Fatal(connectionCloseError) + } + log.Println("i") + + // cleanup + fmt.Printf("cleanup: %d -> %d", *cores * stripwidth, *canvasWidth) + } +} |