Commit 839cb738 authored by santiaago's avatar santiaago
Browse files

/squares now supports numcolors #18

parent c9a9f229
Loading
Loading
Loading
Loading
+14 −6
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@ func Square(w http.ResponseWriter, r *http.Request) {
		log.Println("Unable to get 'key' value: ", err)
		key = ""
	}

	theme := extract.Theme(r)

	h := md5.New()
@@ -44,9 +45,10 @@ func Square(w http.ResponseWriter, r *http.Request) {
		}
	}

	numColors := extract.NumColors(r)
	colorMap := colors.MapOfColorThemes()
	var bg, fg color.RGBA

	var bg, fg color.RGBA
	if bg, err = extract.Background(r); err != nil {
		bg = colorMap["base"][0]
	}
@@ -54,19 +56,25 @@ func Square(w http.ResponseWriter, r *http.Request) {
		fg = colorMap["base"][1]
	}

	if val, ok := colorMap[theme]; ok {
		bg = val[0]
		fg = val[1]
	var colors []color.RGBA
	if theme != "base" {
		if _, ok := colorMap[theme]; ok {
			colors = append(colors, colorMap[theme][0:numColors]...)
		} else {
			colors = append(colors, colorMap["base"]...)
		}
	} else {
		colors = append(colors, bg, fg)
	}

	size := extract.Size(r)
	if f := extract.Format(r); f == format.JPEG {
		m := image.NewRGBA(image.Rect(0, 0, size, size))
		draw.Squares(m, key, bg, fg)
		draw.Squares(m, key, colors)
		var img image.Image = m
		write.ImageJPEG(w, &img)
	} else if f == format.SVG {
		write.ImageSVG(w)
		draw.SquaresSVG(w, key, bg, fg, size)
		draw.SquaresSVG(w, key, colors, size)
	}
}
+6 −5
Original line number Diff line number Diff line
package draw

import (
	"github.com/ajstarks/svgo"
	"image"
	"image/color"
	"math"
	"net/http"

	"github.com/ajstarks/svgo"
)

//Grid6X6 builds an image with 6X6 quadrants of alternate colors.
@@ -152,7 +153,7 @@ func RandomSymetricInXGrid6X6(m *image.RGBA, color1, color2 color.RGBA) {
	}
}

func Squares(m *image.RGBA, key string, color1, color2 color.RGBA) {
func Squares(m *image.RGBA, key string, colors []color.RGBA) {
	size := m.Bounds().Size()
	squares := 6
	quad := size.X / squares
@@ -170,7 +171,7 @@ func Squares(m *image.RGBA, key string, color1, color2 color.RGBA) {
			xQuadrant := x / quad
			if _, ok := colorMap[xQuadrant]; !ok {
				if float64(xQuadrant) < middle {
					colorMap[xQuadrant] = colorFromKey(key, color1, color2, xQuadrant+3*yQuadrant)
					colorMap[xQuadrant] = colorFromKeyAndArray(key, colors, xQuadrant+3*yQuadrant)
				} else if xQuadrant < squares {
					colorMap[xQuadrant] = colorMap[squares-xQuadrant-1]
				} else {
@@ -182,7 +183,7 @@ func Squares(m *image.RGBA, key string, color1, color2 color.RGBA) {
	}
}

func SquaresSVG(w http.ResponseWriter, key string, color1, color2 color.RGBA, size int) {
func SquaresSVG(w http.ResponseWriter, key string, colors []color.RGBA, size int) {
	canvas := svg.New(w)
	canvas.Start(size, size)

@@ -198,7 +199,7 @@ func SquaresSVG(w http.ResponseWriter, key string, color1, color2 color.RGBA, si
			x := xQ * quadrantSize
			if _, ok := colorMap[xQ]; !ok {
				if float64(xQ) < middle {
					colorMap[xQ] = colorFromKey(key, color1, color2, xQ+3*yQ)
					colorMap[xQ] = colorFromKeyAndArray(key, colors, xQ+3*yQ)
				} else if xQ < squares {
					colorMap[xQ] = colorMap[squares-xQ-1]
				} else {
+15 −0
Original line number Diff line number Diff line
@@ -34,3 +34,18 @@ func colorFromKey(key string, color1, color2 color.RGBA, index int) color.RGBA {
	}
	return color1
}

func colorFromKeyAndArray(key string, colors []color.RGBA, index int) color.RGBA {
	n := len(colors)
	s := hex.EncodeToString([]byte{key[index]})
	if r, err := strconv.ParseInt(s, 16, 0); err == nil {
		for i := 0; i < n; i++ {
			if int(r)%n == i {
				return colors[i]
			}
		}
	} else {
		log.Println("Error calling ParseInt(%v, 16, 0)", s, err)
	}
	return colors[0]
}
+14 −0
Original line number Diff line number Diff line
@@ -82,3 +82,17 @@ func Theme(r *http.Request) string {
	}
	return "base"
}

// NumColors returns the number of colors in http request.
// Right now we support numbers between 2 and 4.
func NumColors(r *http.Request) int64 {
	s := strings.ToLower(r.FormValue("numcolors"))
	if len(s) > 0 {
		if n, err := strconv.ParseInt(s, 0, 64); err == nil {
			if n >= 2 && n <= 4 {
				return n
			}
		}
	}
	return 2
}