124 lines
2.2 KiB
Go
124 lines
2.2 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"image"
|
|
|
|
"github.com/mineatar-io/skin-render"
|
|
)
|
|
|
|
var (
|
|
RenderTypeFullBody = "fullbody"
|
|
RenderTypeFrontBody = "frontbody"
|
|
RenderTypeBackBody = "backbody"
|
|
RenderTypeLeftBody = "leftbody"
|
|
RenderTypeRightBody = "rightbody"
|
|
RenderTypeFace = "face"
|
|
RenderTypeHead = "head"
|
|
)
|
|
|
|
// Render will render the image using the specified details and return the result.
|
|
func Render(renderType, uuid string, rawSkin *image.NRGBA, isSlim bool, opts *QueryParams) ([]byte, bool, error) {
|
|
if config.Cache.EnableLocks {
|
|
mutex := r.NewMutex(fmt.Sprintf("render-lock:%s-%d-%t-%s", renderType, opts.Scale, opts.Overlay, uuid))
|
|
mutex.Lock()
|
|
|
|
defer mutex.Unlock()
|
|
}
|
|
|
|
// Fetch the existing render from cache if it exists
|
|
{
|
|
cache, err := GetCachedRenderResult(renderType, uuid, opts)
|
|
|
|
if err != nil {
|
|
return nil, false, err
|
|
}
|
|
|
|
if cache != nil {
|
|
return cache, true, nil
|
|
}
|
|
}
|
|
|
|
var (
|
|
result *image.NRGBA
|
|
renderOpts skin.Options = skin.Options{
|
|
Overlay: opts.Overlay,
|
|
Slim: isSlim,
|
|
Scale: opts.Scale,
|
|
}
|
|
)
|
|
|
|
// Render the image based on the type provided
|
|
{
|
|
switch renderType {
|
|
case RenderTypeFullBody:
|
|
{
|
|
result = skin.RenderBody(rawSkin, renderOpts)
|
|
|
|
break
|
|
}
|
|
case RenderTypeFrontBody:
|
|
{
|
|
result = skin.RenderFrontBody(rawSkin, renderOpts)
|
|
|
|
break
|
|
}
|
|
case RenderTypeBackBody:
|
|
{
|
|
result = skin.RenderBackBody(rawSkin, renderOpts)
|
|
|
|
break
|
|
}
|
|
case RenderTypeLeftBody:
|
|
{
|
|
result = skin.RenderLeftBody(rawSkin, renderOpts)
|
|
|
|
break
|
|
}
|
|
case RenderTypeRightBody:
|
|
{
|
|
result = skin.RenderRightBody(rawSkin, renderOpts)
|
|
|
|
break
|
|
}
|
|
case RenderTypeHead:
|
|
{
|
|
result = skin.RenderHead(rawSkin, renderOpts)
|
|
|
|
break
|
|
}
|
|
case RenderTypeFace:
|
|
{
|
|
result = skin.RenderFace(rawSkin, renderOpts)
|
|
|
|
break
|
|
}
|
|
default:
|
|
panic(fmt.Errorf("unknown render type: %s", renderType))
|
|
}
|
|
}
|
|
|
|
var (
|
|
data []byte
|
|
err error
|
|
)
|
|
|
|
// Encode the image into a PNG in byte-array format
|
|
{
|
|
data, err = EncodePNG(result)
|
|
|
|
if err != nil {
|
|
return nil, false, err
|
|
}
|
|
}
|
|
|
|
// Put the result into the cache for later use
|
|
{
|
|
if err = SetCachedRenderResult(renderType, uuid, opts, data); err != nil {
|
|
return nil, false, err
|
|
}
|
|
}
|
|
|
|
return data, false, nil
|
|
}
|