internal/affine: avoid heap allocations by casting a variable to a concrete type

This is a dirty hack but seems efficient.

Closes #2119
This commit is contained in:
Hajime Hoshi 2022-06-04 13:18:11 +09:00
parent f69c550992
commit ecaa25faba

View File

@ -520,10 +520,21 @@ func (c colorMImplScale) Equals(other ColorM) bool {
func (c *colorMImplBodyTranslate) Equals(other ColorM) bool { func (c *colorMImplBodyTranslate) Equals(other ColorM) bool {
var lhsb [16]float32 var lhsb [16]float32
var lhst [4]float32 var lhst [4]float32
// Calling a method of an interface type escapes arguments to heap (#2119).
// Instead, cast `other` to a concrete type and call `Elements` functions of it.
switch other := other.(type) {
case ColorMIdentity:
other.Elements(&lhsb, &lhst) other.Elements(&lhsb, &lhst)
rhsb := &c.body case colorMImplScale:
rhst := &c.translate other.Elements(&lhsb, &lhst)
return lhsb == *rhsb && lhst == *rhst case *colorMImplBodyTranslate:
other.Elements(&lhsb, &lhst)
default:
panic("affine: unexpected ColorM implementation")
}
return lhsb == c.body && lhst == c.translate
} }
func (c ColorMIdentity) Concat(other ColorM) ColorM { func (c ColorMIdentity) Concat(other ColorM) ColorM {