From 046180728706e311afcebb324d0b6413ff67c019 Mon Sep 17 00:00:00 2001 From: lordwelch Date: Tue, 9 Feb 2016 21:55:57 -0800 Subject: [PATCH] add imagick add gl routines fix resizing routine --- magickwand.go | 35 ++++++++------ main.go | 128 ++++++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 129 insertions(+), 34 deletions(-) diff --git a/magickwand.go b/magickwand.go index 9f4e685..762def5 100644 --- a/magickwand.go +++ b/magickwand.go @@ -2,48 +2,53 @@ package main import ( + "fmt" "math" "github.com/gographics/imagick/imagick" ) -func resizeImage(mw *imagick.MagickWand, newWidth, newHeight int, keepExactSize, center bool) (resmw *imagick.MagickWand) { +func resizeImage(mw *imagick.MagickWand, newWidth, newHeight int, keepSpecSize, center bool) (resmw *imagick.MagickWand) { var ( - width, height int + width, height, origHeight, origWidth int ) - origHeight := int(mw.GetImageHeight()) - origWidth := int(mw.GetImageWidth()) + origHeight = int(mw.GetImageHeight()) + fmt.Println("hahahahahah :-P") + origWidth = int(mw.GetImageWidth()) if (origHeight != newHeight) || (origWidth != newWidth) { - if (round((origHeight / origWidth) * newWidth)) <= newHeight { - height = round((float64(origHeight) / float64(origWidth))) * newWidth - width = newWidth - } else { - width = round((float64(origWidth) / float64(origHeight))) * newHeight + if (round((float64(origWidth) / float64(origHeight)) * float64(newHeight))) <= newWidth { + width = round((float64(origWidth) / float64(origHeight)) * float64(newHeight)) height = newHeight + } else { + height = round((float64(origHeight) / float64(origWidth)) * float64(newWidth)) + width = newWidth } } else { height = newHeight width = newWidth } - if !keepExactSize { - resmw.SetSize(width, height) + resmw = imagick.NewMagickWand() + if !keepSpecSize { + resmw.NewImage(uint(width), uint(height), imagick.NewPixelWand()) center = false } else { - resmw.SetSize(newWidth, newHeight) + resmw.NewImage(uint(newWidth), uint(newHeight), imagick.NewPixelWand()) + fmt.Println(resmw.GetImageHeight(), resmw.GetImageWidth()) if center { - err = mw.ResizeImage(width, height, imagick.FILTER_LANCZOS, 1) + err = mw.ResizeImage(uint(width), uint(height), imagick.FILTER_LANCZOS, 1) if err != nil { panic(err) } - resmw.CompositeImage(mw, imagick.COMPOSITE_OP_SRC_OVER, uint((width-newWidth)/2), uint((height-newHeight)/2)) + resmw.CompositeImage(mw, imagick.COMPOSITE_OP_SRC_OVER, round(float64(newWidth-width)/float64(2)), round(float64(newHeight-height)/float64(2))) } else { resmw.CompositeImage(mw, imagick.COMPOSITE_OP_SRC_OVER, 0, 0) } } mw.Destroy() - return + return resmw + } func round(a float64) int { diff --git a/main.go b/main.go index f8afbe5..4e6e438 100644 --- a/main.go +++ b/main.go @@ -5,13 +5,14 @@ import "C" import ( "fmt" - //"image" + "image" "log" "os" "path/filepath" "github.com/go-gl/gl/v2.1/gl" "github.com/go-gl/glfw/v3.1/glfw" + "github.com/gographics/imagick/imagick" "github.com/kardianos/osext" "github.com/lordwelch/qml" ) @@ -25,15 +26,18 @@ type cell struct { type slide []cell var ( - path string - textEdit qml.Object - cellQml qml.Object - window *qml.Window - win *glfw.Window - slides slide - err error - monitors []*glfw.Monitor - drawSlide func() + x, y int + path string + textEdit qml.Object + cellQml qml.Object + window *qml.Window + win *glfw.Window + slides slide + err error + monitors []*glfw.Monitor + mw1 *imagick.MagickWand + tex1 uint32 + //drawSlide func() ) func main() { @@ -54,6 +58,14 @@ func main() { func run() error { var mainQml qml.Object + imagick.Initialize() + defer imagick.Terminate() + mw1 = imagick.NewMagickWand() + + err = mw1.ReadImage("logo:") + if err != nil { + panic(err) + } engine := qml.NewEngine() path, err = osext.ExecutableFolder() @@ -81,15 +93,100 @@ func run() error { }) window.Wait() + mw1.Destroy() return nil } +func setupScene() { + + gl.ClearColor(0.1, 0.5, 0.9, 0.0) + mw2 := resizeImage(mw1, x, y, true, true) + + tex1 = newTexture(*mw2) + + gl.MatrixMode(gl.PROJECTION) + gl.LoadIdentity() + gl.Ortho(-1, 1, -1, 1, 1.0, 10.0) + gl.MatrixMode(gl.MODELVIEW) + gl.LoadIdentity() +} + +func drawSlide() { + gl.Clear(gl.COLOR_BUFFER_BIT) + + gl.MatrixMode(gl.MODELVIEW) + gl.LoadIdentity() + gl.Translatef(0, 0, -3.0) + + gl.Begin(gl.QUADS) + + gl.TexCoord2f(0, 0) + gl.Vertex3f(-1, 1, 0) + + gl.TexCoord2f(1, 0) + gl.Vertex3f(1, 1, 0) + + gl.TexCoord2f(1, 1) + gl.Vertex3f(1, -1, 0) + + gl.TexCoord2f(0, 1) + gl.Vertex3f(-1, -1, 0) + + gl.End() + +} + +func newTexture(mw imagick.MagickWand) uint32 { + x1 := mw.GetImageWidth() + y1 := mw.GetImageHeight() + rgba := image.NewRGBA(image.Rect(0, 0, int(x1), int(y1))) + if rgba.Stride != rgba.Rect.Size().X*4 { + panic("unsupported stride") + } + TPix, _ := mw.ExportImagePixels(0, 0, x1, y1, "RGBA", imagick.PIXEL_CHAR) + rgba.Pix = TPix.([]uint8) + + var texture1 uint32 + gl.Enable(gl.TEXTURE_2D) + gl.GenTextures(1, &texture1) + gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR) + gl.TexImage2D( + gl.TEXTURE_2D, + 0, + gl.RGBA, + int32(rgba.Rect.Size().X), + int32(rgba.Rect.Size().Y), + 0, + gl.RGBA, + gl.UNSIGNED_BYTE, + gl.Ptr(rgba.Pix)) + + return texture1 +} + func checkMon() { monitors = glfw.GetMonitors() + glfw.WindowHint(glfw.ContextVersionMajor, 2) + glfw.WindowHint(glfw.ContextVersionMinor, 1) + glfw.WindowHint(glfw.AutoIconify, glfw.False) + glfw.WindowHint(glfw.Decorated, glfw.False) if i := len(monitors); i < 2 { fmt.Println("You only have 1 monitor!!!!!!!!!!! :-P") + win, err = glfw.CreateWindow(600, 800, "Cube", nil, nil) + if err != nil { + panic(err) + } } else { fmt.Printf("You have %d monitors\n", i) + x = monitors[1].GetVideoMode().Width + y = monitors[1].GetVideoMode().Height + win, err = glfw.CreateWindow(x, y, "Cube", nil, nil) + fmt.Println(win.GetPos()) + win.SetPos(monitors[1].GetPos()) + fmt.Println(x, y) + if err != nil { + panic(err) + } } monitorInfo() @@ -109,24 +206,17 @@ func glInit() { log.Fatalln("failed to initialize glfw:", err) } checkMon() - glfw.WindowHint(glfw.ContextVersionMajor, 2) - glfw.WindowHint(glfw.ContextVersionMinor, 1) - - win, err = glfw.CreateWindow(800, 600, "Cube", nil, nil) - if err != nil { - panic(err) - } win.MakeContextCurrent() if err := gl.Init(); err != nil { panic(err) } + setupScene() + win.SetPos(monitors[1].GetPos()) - gl.ClearColor(0.1, 0.5, 0.9, 0.0) qml.Func1 = func() int { if !win.ShouldClose() { - gl.Clear(gl.COLOR_BUFFER_BIT) drawSlide() win.SwapBuffers() glfw.PollEvents()