124 lines
3.4 KiB
Go
124 lines
3.4 KiB
Go
package nmslib
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"image"
|
|
"io/ioutil"
|
|
"os"
|
|
"strconv"
|
|
|
|
"github.com/fogleman/gg"
|
|
)
|
|
|
|
/*CreateBanner - Output PNG of Portal Glyphs
|
|
Requires 3 vars and returns 1 err, Outputs a PNG file
|
|
var portalex string
|
|
Portal Glyph hex string
|
|
var savename string
|
|
Output name of PNG file
|
|
var opt int
|
|
00 sets horizontal banner in light mode [ 00 || 0 ]
|
|
01 sets horizontal banner in dark mode [ 01 || 1 ]
|
|
10 sets vertical banner in light mode
|
|
11 sets vertical banner in dark mode
|
|
|
|
* note first of the 2 bits sets the layout, the second bit sets the glyph color
|
|
*/
|
|
func CreateBanner(portalhex string, savename string, opt int) (err error) {
|
|
var GlyphHex [12]int64
|
|
var glyphImg [12]string
|
|
var mode string
|
|
var imgArray [12]image.Image
|
|
|
|
// Setup temp dir
|
|
tempdir, err := ioutil.TempDir("", "nmslib-")
|
|
if err != nil {
|
|
return errors.New("can not create temp directory")
|
|
}
|
|
// don't forget to clean up afterwords
|
|
defer os.RemoveAll(tempdir)
|
|
|
|
//Set light or dark mode glyphs
|
|
if opt == 00 || opt == 10 {
|
|
mode = "light"
|
|
} else if opt == 01 || opt == 11 {
|
|
mode = "dark"
|
|
} else {
|
|
// if opt is an invalid option (ie. not a 2 bit binary number default to classic mode/layout
|
|
opt = 0
|
|
mode = "light"
|
|
}
|
|
|
|
// verify len of portalhex
|
|
if len(portalhex) == 12 {
|
|
// get hex value from each digit in given string and add it to an array of int64
|
|
for i := 0; i < len(portalhex); i++ {
|
|
GlyphHex[i], err = strconv.ParseInt(portalhex[i:int(i+1)], 16, 16)
|
|
if err != nil {
|
|
return errors.New("string provided is not hexadecimal ([0-9][A-F])")
|
|
}
|
|
}
|
|
|
|
// assign image location of its glyph-hex value to an array of strings
|
|
for j := 0; j < len(glyphImg); j++ {
|
|
glyphImg[j] = fmt.Sprintf("assets/glyphs/%s/PORTALSYMBOL.%X.png", mode, GlyphHex[j])
|
|
}
|
|
|
|
// pull images need from assets.go and saved them to the temp directory
|
|
for k := 0; k < len(glyphImg); k++ {
|
|
data, err := Asset(glyphImg[k])
|
|
if err != nil {
|
|
return errors.New("can not load images from assets: " + glyphImg[k])
|
|
}
|
|
_, err2 := os.Stat(tempdir + "/assets/glyphs/" + mode + "/")
|
|
if os.IsNotExist(err2) {
|
|
errDir := os.MkdirAll(tempdir+"/assets/glyphs/"+mode, 0755)
|
|
if errDir != nil {
|
|
return errors.New("can not create temp directory")
|
|
}
|
|
}
|
|
err = ioutil.WriteFile(tempdir+"/"+glyphImg[k], []byte(data), 0644)
|
|
if err != nil {
|
|
return errors.New("can not write file to temp directory")
|
|
}
|
|
}
|
|
|
|
//Load/open images needed
|
|
for iter := 0; iter < 12; iter++ {
|
|
imgArray[iter], err = gg.LoadPNG(tempdir + "/" + glyphImg[iter])
|
|
if err != nil {
|
|
return errors.New("can not read glyph " + glyphImg[iter])
|
|
}
|
|
}
|
|
|
|
//begin concatenating images
|
|
// get image size of first glyph, all glyphs have the same X && Y dimension so we only need to measure one.
|
|
imgDim := imgArray[0].Bounds().Size()
|
|
|
|
//classic horizontal layout
|
|
if opt == 01 || opt == 00 {
|
|
imgWidth := imgDim.X * 12
|
|
imgHeight := imgDim.Y
|
|
concat := gg.NewContext(imgWidth, imgHeight)
|
|
for a := 0; a < 12; a++ {
|
|
concat.DrawImage(imgArray[a], imgDim.X*a, 0)
|
|
}
|
|
concat.SavePNG(savename)
|
|
}
|
|
//Vertical layout
|
|
if opt == 10 || opt == 11 {
|
|
imgWidth := imgDim.X
|
|
imgHeight := imgDim.Y * 12
|
|
concat := gg.NewContext(imgWidth, imgHeight)
|
|
for a := 0; a < 12; a++ {
|
|
concat.DrawImage(imgArray[a], 0, imgDim.Y*a)
|
|
}
|
|
concat.SavePNG(savename)
|
|
}
|
|
} else {
|
|
return errors.New("portalcode must be exactly 12 chars")
|
|
}
|
|
return
|
|
}
|