Browse Source

Split out imgutil

master
Přemysl Janouch 8 months ago
parent
commit
b287ba5500
Signed by: Přemysl Janouch <p@janouch.name> GPG Key ID: A0420B94F92B9493
2 changed files with 60 additions and 56 deletions
  1. +57
    -0
      imgutil/imgutil.go
  2. +3
    -56
      label-tool/main.go

+ 57
- 0
imgutil/imgutil.go View File

@@ -0,0 +1,57 @@
package imgutil

import (
"image"
"image/color"
)

// Scale is a scaling image.Image wrapper.
type Scale struct {
Image image.Image
Scale int
}

// ColorModel implements image.Image.
func (s *Scale) ColorModel() color.Model {
return s.Image.ColorModel()
}

// Bounds implements image.Image.
func (s *Scale) Bounds() image.Rectangle {
r := s.Image.Bounds()
return image.Rect(r.Min.X*s.Scale, r.Min.Y*s.Scale,
r.Max.X*s.Scale, r.Max.Y*s.Scale)
}

// At implements image.Image.
func (s *Scale) At(x, y int) color.Color {
if x < 0 {
x = x - s.Scale + 1
}
if y < 0 {
y = y - s.Scale + 1
}
return s.Image.At(x/s.Scale, y/s.Scale)
}

// LeftRotate is a 90 degree rotating image.Image wrapper.
type LeftRotate struct {
Image image.Image
}

// ColorModel implements image.Image.
func (lr *LeftRotate) ColorModel() color.Model {
return lr.Image.ColorModel()
}

// Bounds implements image.Image.
func (lr *LeftRotate) Bounds() image.Rectangle {
r := lr.Image.Bounds()
// Min is inclusive, Max is exclusive.
return image.Rect(r.Min.Y, -(r.Max.X - 1), r.Max.Y, -(r.Min.X - 1))
}

// At implements image.Image.
func (lr *LeftRotate) At(x, y int) color.Color {
return lr.Image.At(-y, x)
}

+ 3
- 56
label-tool/main.go View File

@@ -4,7 +4,6 @@ import (
"errors"
"html/template"
"image"
"image/color"
"image/draw"
"image/png"
"log"
@@ -16,62 +15,10 @@ import (
"github.com/boombuler/barcode/qr"

"janouch.name/sklad/bdf"
"janouch.name/sklad/imgutil"
"janouch.name/sklad/ql"
)

// scaler is a scaling image.Image wrapper.
type scaler struct {
image image.Image
scale int
}

// ColorModel implements image.Image.
func (s *scaler) ColorModel() color.Model {
return s.image.ColorModel()
}

// Bounds implements image.Image.
func (s *scaler) Bounds() image.Rectangle {
r := s.image.Bounds()
return image.Rect(r.Min.X*s.scale, r.Min.Y*s.scale,
r.Max.X*s.scale, r.Max.Y*s.scale)
}

// At implements image.Image.
func (s *scaler) At(x, y int) color.Color {
if x < 0 {
x = x - s.scale + 1
}
if y < 0 {
y = y - s.scale + 1
}
return s.image.At(x/s.scale, y/s.scale)
}

// leftRotate is a 90 degree rotating image.Image wrapper.
type leftRotate struct {
image image.Image
}

// ColorModel implements image.Image.
func (lr *leftRotate) ColorModel() color.Model {
return lr.image.ColorModel()
}

// Bounds implements image.Image.
func (lr *leftRotate) Bounds() image.Rectangle {
r := lr.image.Bounds()
// Min is inclusive, Max is exclusive.
return image.Rect(r.Min.Y, -(r.Max.X - 1), r.Max.Y, -(r.Min.X - 1))
}

// At implements image.Image.
func (lr *leftRotate) At(x, y int) color.Color {
return lr.image.At(-y, x)
}

// -----------------------------------------------------------------------------

var font *bdf.Font

func genLabelForHeight(text string, height, scale int) image.Image {
@@ -81,7 +28,7 @@ func genLabelForHeight(text string, height, scale int) image.Image {
draw.Draw(textImg, textRect, image.White, image.ZP, draw.Src)
font.DrawString(textImg, image.ZP, text)

scaledTextImg := scaler{image: textImg, scale: scale}
scaledTextImg := imgutil.Scale{Image: textImg, Scale: scale}
scaledTextRect := scaledTextImg.Bounds()

remains := height - scaledTextRect.Dy() - 20
@@ -238,7 +185,7 @@ func handle(w http.ResponseWriter, r *http.Request) {

var label image.Image
if mediaInfo != nil {
label = &leftRotate{image: genLabelForHeight(
label = &imgutil.LeftRotate{Image: genLabelForHeight(
params.Text, mediaInfo.PrintAreaPins, params.Scale)}
if r.FormValue("print") != "" {
if err := printer.Print(label); err != nil {

Loading…
Cancel
Save