2
0
mirror of https://github.com/42wim/matterbridge synced 2024-11-07 09:20:23 +00:00
matterbridge/vendor/github.com/sizeofint/webpanimation/capi.go
Benau 53cafa9f3d
Convert .tgs with go libraries (and cgo) (telegram) (#1569)
This commit adds support for go/cgo tgs conversion when building with the -tags `cgo`
The default binaries are still "pure" go and uses the old way of converting.

* Move lottie_convert.py conversion code to its own file

* Add optional libtgsconverter

* Update vendor

* Apply suggestions from code review

* Update bridge/helper/libtgsconverter.go

Co-authored-by: Wim <wim@42.be>
2021-08-24 22:32:50 +02:00

363 lines
9.6 KiB
Go

package webpanimation
/*
#cgo CFLAGS: -Wno-pointer-sign -DHAVE_CONFIG_H
#cgo !windows LDFLAGS: -lm
#include "webp_encode.h"
#include "webp_mux.h"
*/
import "C"
import (
"errors"
"unsafe"
)
type WebPMuxError int
const (
WebpMuxAbiVersion = 0x0108
WebpEncoderAbiVersion = 0x020f
)
const (
WebpMuxOk = WebPMuxError(C.WEBP_MUX_OK)
WebpMuxNotFound = WebPMuxError(C.WEBP_MUX_NOT_FOUND)
WebpMuxInvalidArgument = WebPMuxError(C.WEBP_MUX_INVALID_ARGUMENT)
WebpMuxBadData = WebPMuxError(C.WEBP_MUX_BAD_DATA)
WebpMuxMemoryError = WebPMuxError(C.WEBP_MUX_MEMORY_ERROR)
WebpMuxNotEnoughData = WebPMuxError(C.WEBP_MUX_NOT_ENOUGH_DATA)
)
type WebPPicture C.WebPPicture
type WebPAnimEncoder C.WebPAnimEncoder
type WebPAnimEncoderOptions C.WebPAnimEncoderOptions
type WebPData C.WebPData
type WebPMux C.WebPMux
type WebPMuxAnimParams C.WebPMuxAnimParams
type webPConfig struct {
webpConfig *C.WebPConfig
}
type WebPConfig interface {
getRawPointer() *C.WebPConfig
SetLossless(v int)
GetLossless() int
SetMethod(v int)
SetImageHint(v int)
SetTargetSize(v int)
SetTargetPSNR(v float32)
SetSegments(v int)
SetSnsStrength(v int)
SetFilterStrength(v int)
SetFilterSharpness(v int)
SetAutofilter(v int)
SetAlphaCompression(v int)
SetAlphaFiltering(v int)
SetPass(v int)
SetShowCompressed(v int)
SetPreprocessing(v int)
SetPartitions(v int)
SetPartitionLimit(v int)
SetEmulateJpegSize(v int)
SetThreadLevel(v int)
SetLowMemory(v int)
SetNearLossless(v int)
SetExact(v int)
SetUseDeltaPalette(v int)
SetUseSharpYuv(v int)
SetAlphaQuality(v int)
SetFilterType(v int)
SetQuality(v float32)
}
func WebPDataClear(webPData *WebPData) {
C.WebPDataClear((*C.WebPData)(unsafe.Pointer(webPData)))
}
func WebPMuxDelete(webPMux *WebPMux) {
C.WebPMuxDelete((*C.WebPMux)(unsafe.Pointer(webPMux)))
}
func WebPPictureFree(webPPicture *WebPPicture) {
C.WebPPictureFree((*C.WebPPicture)(unsafe.Pointer(webPPicture)))
}
func WebPAnimEncoderDelete(webPAnimEncoder *WebPAnimEncoder) {
C.WebPAnimEncoderDelete((*C.WebPAnimEncoder)(unsafe.Pointer(webPAnimEncoder)))
}
func (wmap *WebPMuxAnimParams) SetBgcolor(v uint32) {
((*C.WebPMuxAnimParams)(wmap)).bgcolor = (C.uint32_t)(v)
}
func (wmap *WebPMuxAnimParams) SetLoopCount(v int) {
(*C.WebPMuxAnimParams)(wmap).loop_count = (C.int)(v)
}
func WebPPictureInit(webPPicture *WebPPicture) int {
return int(C.WebPPictureInit((*C.WebPPicture)(unsafe.Pointer(webPPicture))))
}
func (wpp *WebPPicture) SetWidth(v int) {
((*C.WebPPicture)(wpp)).width = (C.int)(v)
}
func (wpp *WebPPicture) SetHeight(v int) {
((*C.WebPPicture)(wpp)).height = (C.int)(v)
}
func (wpp WebPPicture) GetWidth() int {
return int(((C.WebPPicture)(wpp)).width)
}
func (wpp WebPPicture) GetHeight() int {
return int(((C.WebPPicture)(wpp)).height)
}
func (wpp *WebPPicture) SetUseArgb(v int) {
((*C.WebPPicture)(wpp)).use_argb = (C.int)(v)
}
func (wpd WebPData) GetBytes() []byte {
return C.GoBytes(unsafe.Pointer(((C.WebPData)(wpd)).bytes), (C.int)(((C.WebPData)(wpd)).size))
}
func WebPDataInit(webPData *WebPData) {
C.WebPDataInit((*C.WebPData)(unsafe.Pointer(webPData)))
}
// NewWebpConfig create webpconfig instance
func NewWebpConfig() WebPConfig {
webpcfg := &webPConfig{}
webpcfg.webpConfig = &C.WebPConfig{}
WebPConfigInitInternal(webpcfg)
return webpcfg
}
func WebPConfigInitInternal(config WebPConfig) int {
return int(C.WebPConfigInitInternal(
config.getRawPointer(),
(C.WebPPreset)(0),
(C.float)(75.0),
(C.int)(WebpEncoderAbiVersion),
))
}
func (webpCfg *webPConfig) getRawPointer() *C.WebPConfig {
return webpCfg.webpConfig
}
func (webpCfg *webPConfig) SetLossless(v int) {
webpCfg.webpConfig.lossless = (C.int)(v)
}
func (webpCfg *webPConfig) GetLossless() int {
return int(webpCfg.webpConfig.lossless)
}
func (webpCfg *webPConfig) SetMethod(v int) {
webpCfg.webpConfig.method = (C.int)(v)
}
func (webpCfg *webPConfig) SetImageHint(v int) {
webpCfg.webpConfig.image_hint = (C.WebPImageHint)(v)
}
func (webpCfg *webPConfig) SetTargetSize(v int) {
webpCfg.webpConfig.target_size = (C.int)(v)
}
func (webpCfg *webPConfig) SetTargetPSNR(v float32) {
webpCfg.webpConfig.target_PSNR = (C.float)(v)
}
func (webpCfg *webPConfig) SetSegments(v int) {
webpCfg.webpConfig.segments = (C.int)(v)
}
func (webpCfg *webPConfig) SetSnsStrength(v int) {
webpCfg.webpConfig.sns_strength = (C.int)(v)
}
func (webpCfg *webPConfig) SetFilterStrength(v int) {
webpCfg.webpConfig.filter_strength = (C.int)(v)
}
func (webpCfg *webPConfig) SetFilterSharpness(v int) {
webpCfg.webpConfig.filter_sharpness = (C.int)(v)
}
func (webpCfg *webPConfig) SetAutofilter(v int) {
webpCfg.webpConfig.autofilter = (C.int)(v)
}
func (webpCfg *webPConfig) SetAlphaCompression(v int) {
webpCfg.webpConfig.alpha_compression = (C.int)(v)
}
func (webpCfg *webPConfig) SetAlphaFiltering(v int) {
webpCfg.webpConfig.alpha_filtering = (C.int)(v)
}
func (webpCfg *webPConfig) SetPass(v int) {
webpCfg.webpConfig.pass = (C.int)(v)
}
func (webpCfg *webPConfig) SetShowCompressed(v int) {
webpCfg.webpConfig.show_compressed = (C.int)(v)
}
func (webpCfg *webPConfig) SetPreprocessing(v int) {
webpCfg.webpConfig.preprocessing = (C.int)(v)
}
func (webpCfg *webPConfig) SetPartitions(v int) {
webpCfg.webpConfig.partitions = (C.int)(v)
}
func (webpCfg *webPConfig) SetPartitionLimit(v int) {
webpCfg.webpConfig.partition_limit = (C.int)(v)
}
func (webpCfg *webPConfig) SetEmulateJpegSize(v int) {
webpCfg.webpConfig.emulate_jpeg_size = (C.int)(v)
}
func (webpCfg *webPConfig) SetThreadLevel(v int) {
webpCfg.webpConfig.thread_level = (C.int)(v)
}
func (webpCfg *webPConfig) SetLowMemory(v int) {
webpCfg.webpConfig.low_memory = (C.int)(v)
}
func (webpCfg *webPConfig) SetNearLossless(v int) {
webpCfg.webpConfig.near_lossless = (C.int)(v)
}
func (webpCfg *webPConfig) SetExact(v int) {
webpCfg.webpConfig.exact = (C.int)(v)
}
func (webpCfg *webPConfig) SetUseDeltaPalette(v int) {
webpCfg.webpConfig.use_delta_palette = (C.int)(v)
}
func (webpCfg *webPConfig) SetUseSharpYuv(v int) {
webpCfg.webpConfig.use_sharp_yuv = (C.int)(v)
}
func (webpCfg *webPConfig) SetAlphaQuality(v int) {
webpCfg.webpConfig.alpha_quality = (C.int)(v)
}
func (webpCfg *webPConfig) SetFilterType(v int) {
webpCfg.webpConfig.filter_type = (C.int)(v)
}
func (webpCfg *webPConfig) SetQuality(v float32) {
webpCfg.webpConfig.quality = (C.float)(v)
}
func (encOptions *WebPAnimEncoderOptions) GetAnimParams() WebPMuxAnimParams {
return WebPMuxAnimParams(((*C.WebPAnimEncoderOptions)(encOptions)).anim_params)
}
func (encOptions *WebPAnimEncoderOptions) SetAnimParams(v WebPMuxAnimParams) {
((*C.WebPAnimEncoderOptions)(encOptions)).anim_params = (C.WebPMuxAnimParams)(v)
}
func (encOptions *WebPAnimEncoderOptions) SetMinimizeSize(v int) {
((*C.WebPAnimEncoderOptions)(encOptions)).minimize_size = (C.int)(v)
}
func (encOptions *WebPAnimEncoderOptions) SetKmin(v int) {
((*C.WebPAnimEncoderOptions)(encOptions)).kmin = (C.int)(v)
}
func (encOptions *WebPAnimEncoderOptions) SetKmax(v int) {
((*C.WebPAnimEncoderOptions)(encOptions)).kmax = (C.int)(v)
}
func (encOptions *WebPAnimEncoderOptions) SetAllowMixed(v int) {
((*C.WebPAnimEncoderOptions)(encOptions)).allow_mixed = (C.int)(v)
}
func (encOptions *WebPAnimEncoderOptions) SetVerbose(v int) {
((*C.WebPAnimEncoderOptions)(encOptions)).verbose = (C.int)(v)
}
func WebPAnimEncoderOptionsInitInternal(webPAnimEncoderOptions *WebPAnimEncoderOptions) int {
return int(C.WebPAnimEncoderOptionsInitInternal(
(*C.WebPAnimEncoderOptions)(unsafe.Pointer(webPAnimEncoderOptions)),
(C.int)(WebpMuxAbiVersion),
))
}
func WebPPictureImportRGBA(data []byte, stride int, webPPicture *WebPPicture) error {
res := int(C.WebPPictureImportRGBA(
(*C.WebPPicture)(unsafe.Pointer(webPPicture)),
(*C.uint8_t)(unsafe.Pointer(&data[0])),
(C.int)(stride),
))
if res == 0 {
return errors.New("error: WebPPictureImportBGRA")
}
return nil
}
func WebPAnimEncoderNewInternal(width, height int, webPAnimEncoderOptions *WebPAnimEncoderOptions) *WebPAnimEncoder {
return (*WebPAnimEncoder)(C.WebPAnimEncoderNewInternal(
(C.int)(width),
(C.int)(height),
(*C.WebPAnimEncoderOptions)(unsafe.Pointer(webPAnimEncoderOptions)),
(C.int)(WebpMuxAbiVersion),
))
}
func WebPAnimEncoderAdd(webPAnimEncoder *WebPAnimEncoder, webPPicture *WebPPicture, timestamp int, webpcfg WebPConfig) int {
return int(C.WebPAnimEncoderAdd(
(*C.WebPAnimEncoder)(unsafe.Pointer(webPAnimEncoder)),
(*C.WebPPicture)(unsafe.Pointer(webPPicture)),
(C.int)(timestamp),
webpcfg.getRawPointer(),
))
}
func WebPAnimEncoderAssemble(webPAnimEncoder *WebPAnimEncoder, webPData *WebPData) int {
return int(C.WebPAnimEncoderAssemble(
(*C.WebPAnimEncoder)(unsafe.Pointer(webPAnimEncoder)),
(*C.WebPData)(unsafe.Pointer(webPData)),
))
}
func WebPMuxCreateInternal(webPData *WebPData, copyData int) *WebPMux {
return (*WebPMux)(C.WebPMuxCreateInternal(
(*C.WebPData)(unsafe.Pointer(webPData)),
(C.int)(copyData),
(C.int)(WebpMuxAbiVersion),
))
}
func WebPMuxSetAnimationParams(webPMux *WebPMux, webPMuxAnimParams *WebPMuxAnimParams) WebPMuxError {
return (WebPMuxError)(C.WebPMuxSetAnimationParams(
(*C.WebPMux)(unsafe.Pointer(webPMux)),
(*C.WebPMuxAnimParams)(unsafe.Pointer(webPMuxAnimParams)),
))
}
func WebPMuxGetAnimationParams(webPMux *WebPMux, webPMuxAnimParams *WebPMuxAnimParams) WebPMuxError {
return (WebPMuxError)(C.WebPMuxGetAnimationParams(
(*C.WebPMux)(unsafe.Pointer(webPMux)),
(*C.WebPMuxAnimParams)(unsafe.Pointer(webPMuxAnimParams)),
))
}
func WebPMuxAssemble(webPMux *WebPMux, webPData *WebPData) WebPMuxError {
return (WebPMuxError)(C.WebPMuxAssemble(
(*C.WebPMux)(unsafe.Pointer(webPMux)),
(*C.WebPData)(unsafe.Pointer(webPData)),
))
}