124 lines
2.6 KiB
Go

/*
Image helpers to transform image.
*/
package epubimage
import (
"fmt"
"image"
)
type Image struct {
Id int
Part int
Raw image.Image
Width int
Height int
IsCover bool
IsBlank bool
DoublePage bool
Path string
Name string
Position string
Format string
OriginalAspectRatio float64
Error error
}
// key name of the blank plage after the image
func (i *Image) SpaceKey() string {
return fmt.Sprintf("space_%d", i.Id)
}
// path of the blank page
func (i *Image) SpacePath() string {
return fmt.Sprintf("Text/%s.xhtml", i.SpaceKey())
}
// path of the blank page into the EPUB
func (i *Image) EPUBSpacePath() string {
return fmt.Sprintf("OEBPS/%s", i.SpacePath())
}
// key for page
func (i *Image) PageKey() string {
return fmt.Sprintf("page_%d_p%d", i.Id, i.Part)
}
// page path linked to the image
func (i *Image) PagePath() string {
return fmt.Sprintf("Text/%s.xhtml", i.PageKey())
}
// page path into the EPUB
func (i *Image) EPUBPagePath() string {
return fmt.Sprintf("OEBPS/%s", i.PagePath())
}
// key for image
func (i *Image) ImgKey() string {
return fmt.Sprintf("img_%d_p%d", i.Id, i.Part)
}
// image path
func (i *Image) ImgPath() string {
return fmt.Sprintf("Images/%s.%s", i.ImgKey(), i.Format)
}
// special path
func (i *Image) ImgSpecialPath(kind string) string {
if kind == "" {
return i.ImgPath()
}
return fmt.Sprintf("Images/%s.%s", kind, i.Format)
}
// image path into the EPUB
func (i *Image) EPUBImgPath() string {
return fmt.Sprintf("OEBPS/%s", i.ImgPath())
}
func (i *Image) RelSize(viewWidth, viewHeight int) (relWidth, relHeight int) {
w, h := viewWidth, viewHeight
srcw, srch := i.Width, i.Height
if w <= 0 || h <= 0 || srcw <= 0 || srch <= 0 {
return
}
wratio := float64(srcw) / float64(w)
hratio := float64(srch) / float64(h)
if wratio > hratio {
relWidth = w
relHeight = int(float64(srch)/wratio + 0.5)
} else {
relHeight = h
relWidth = int(float64(srcw)/hratio + 0.5)
}
return
}
func (i *Image) ImgStyle(kind string, viewWidth, viewHeight int) map[string]any {
align := ""
switch i.Position {
case "rendition:page-spread-right":
align = "left:0"
case "rendition:page-spread-left":
align = "right:0"
}
relWidth, relHeight := i.RelSize(viewWidth, viewHeight)
marginH := float64(viewHeight-relHeight) / 2
top := fmt.Sprintf("%.2f", marginH*100/float64(viewHeight))
return map[string]any{
"Path": i.ImgSpecialPath(kind),
"Width": relWidth,
"Height": relHeight,
"Top": top,
"Align": align,
}
}