2016-07-09 02:57:14 +02:00
|
|
|
package drawing
|
|
|
|
|
|
|
|
import (
|
|
|
|
"math"
|
|
|
|
|
|
|
|
"golang.org/x/image/math/fixed"
|
|
|
|
|
|
|
|
"github.com/golang/freetype/raster"
|
|
|
|
"github.com/golang/freetype/truetype"
|
|
|
|
)
|
|
|
|
|
2016-07-09 18:04:30 +02:00
|
|
|
// PixelsToPoints returns the points for a given number of pixels at a DPI.
|
|
|
|
func PixelsToPoints(dpi, pixels float64) (points float64) {
|
|
|
|
points = (pixels * 72.0) / dpi
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// PointsToPixels returns the pixels for a given number of points at a DPI.
|
|
|
|
func PointsToPixels(dpi, points float64) (pixels float64) {
|
|
|
|
pixels = (points * dpi) / 72.0
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2016-07-09 02:57:14 +02:00
|
|
|
func abs(i int) int {
|
|
|
|
if i < 0 {
|
|
|
|
return -i
|
|
|
|
}
|
|
|
|
return i
|
|
|
|
}
|
|
|
|
|
|
|
|
func distance(x1, y1, x2, y2 float64) float64 {
|
|
|
|
return vectorDistance(x2-x1, y2-y1)
|
|
|
|
}
|
|
|
|
|
|
|
|
func vectorDistance(dx, dy float64) float64 {
|
|
|
|
return float64(math.Sqrt(dx*dx + dy*dy))
|
|
|
|
}
|
|
|
|
|
|
|
|
func toFtCap(c LineCap) raster.Capper {
|
|
|
|
switch c {
|
|
|
|
case RoundCap:
|
|
|
|
return raster.RoundCapper
|
|
|
|
case ButtCap:
|
|
|
|
return raster.ButtCapper
|
|
|
|
case SquareCap:
|
|
|
|
return raster.SquareCapper
|
|
|
|
}
|
|
|
|
return raster.RoundCapper
|
|
|
|
}
|
|
|
|
|
|
|
|
func toFtJoin(j LineJoin) raster.Joiner {
|
|
|
|
switch j {
|
|
|
|
case RoundJoin:
|
|
|
|
return raster.RoundJoiner
|
|
|
|
case BevelJoin:
|
|
|
|
return raster.BevelJoiner
|
|
|
|
}
|
|
|
|
return raster.RoundJoiner
|
|
|
|
}
|
|
|
|
|
|
|
|
func pointToF64Point(p truetype.Point) (x, y float64) {
|
|
|
|
return fUnitsToFloat64(p.X), -fUnitsToFloat64(p.Y)
|
|
|
|
}
|
|
|
|
|
|
|
|
func fUnitsToFloat64(x fixed.Int26_6) float64 {
|
|
|
|
scaled := x << 2
|
|
|
|
return float64(scaled/256) + float64(scaled%256)/256.0
|
|
|
|
}
|