in shiny/iconvg/upgrade.go [549:648]
func (u *upgrader) emitFill(v1 buffer) (newV1 buffer, retErr error) {
switch c := u.creg[u.fill]; c.typ {
case ColorTypeRGBA:
if validAlphaPremulColor(c.rgba) {
if !u.hasRegsSel7 || (u.regsSel7 != c.rgba) {
u.hasRegsSel7, u.regsSel7 = true, c.rgba
v1 = append(v1, 0x57, // FFV1 Set REGS[SEL+7].hi32.
c.rgba.R, c.rgba.G, c.rgba.B, c.rgba.A)
}
v1 = append(v1, 0x87) // FFV1 Fill (flat color) with REGS[SEL+7].
} else if (c.rgba.A == 0) && (c.rgba.B&0x80 != 0) {
nStops := int(c.rgba.R & 63)
cBase := int(c.rgba.G & 63)
nBase := int(c.rgba.B & 63)
if nStops < 2 {
return nil, errInvalidColor
} else if nStops > 17 {
return nil, errUnsupportedUpgrade
}
v1 = append(v1, 0x70|uint8(nStops-2)) // FFV1 SEL -= N; Set REGS[SEL+1 .. SEL+1+N].
for i := 0; i < nStops; i++ {
if stopOffset := u.nreg[(nBase+i)&63]; stopOffset <= 0 {
v1 = append(v1, 0x00, 0x00, 0x00, 0x00)
} else if stopOffset < 1 {
u := uint32(stopOffset * 0x10000)
v1 = append(v1, uint8(u>>0), uint8(u>>8), uint8(u>>16), uint8(u>>24))
} else {
v1 = append(v1, 0x00, 0x00, 0x01, 0x00)
}
if stopColor := u.creg[(cBase+i)&63]; stopColor.typ != ColorTypeRGBA {
return nil, errUnsupportedUpgrade
} else {
v1 = append(v1,
stopColor.rgba.R,
stopColor.rgba.G,
stopColor.rgba.B,
stopColor.rgba.A,
)
}
}
nMatrixElements := 0
if c.rgba.B&0x40 == 0 {
v1 = append(v1, 0x91, // FFV1 Fill (linear gradient) with REGS[SEL+1 .. SEL+1+N].
(c.rgba.G&0xc0)|uint8(nStops-2))
nMatrixElements = 3
} else {
v1 = append(v1, 0xa1, // FFV1 Fill (radial gradient) with REGS[SEL+1 .. SEL+1+N].
(c.rgba.G&0xc0)|uint8(nStops-2))
nMatrixElements = 6
}
for i := 0; i < nMatrixElements; i++ {
u := math.Float32bits(u.nreg[(nBase+i-6)&63])
v1 = append(v1, uint8(u>>0), uint8(u>>8), uint8(u>>16), uint8(u>>24))
}
v1 = append(v1, 0x36, // FFV1 SEL += N.
uint8(nStops))
} else {
return nil, errInvalidColor
}
case ColorTypePaletteIndex:
if c.paletteIndex < 7 {
v1 = append(v1, 0x88+c.paletteIndex) // FFV1 Fill (flat color) with REGS[SEL+8+N].
} else {
v1 = append(v1, 0x56, // FFV1 Set REGS[SEL+6].hi32.
0x80|c.paletteIndex, 0, 0, 0,
0x86) // FFV1 Fill (flat color) with REGS[SEL+6].
}
case ColorTypeBlend:
if c.color0.typ == ColorTypeRGBA {
v1 = append(v1, 0x53, // FFV1 Set REGS[SEL+3].hi32.
c.color0.rgba.R, c.color0.rgba.G, c.color0.rgba.B, c.color0.rgba.A)
}
if c.color1.typ == ColorTypeRGBA {
v1 = append(v1, 0x54, // FFV1 Set REGS[SEL+4].hi32.
c.color1.rgba.R, c.color1.rgba.G, c.color1.rgba.B, c.color1.rgba.A)
}
v1 = append(v1, 0x55, // FFV1 Set REGS[SEL+5].hi32.
c.blend)
if c.color0.typ == ColorTypeRGBA {
v1 = append(v1, 0xfe)
} else {
v1 = append(v1, 0x80|c.color0.paletteIndex)
}
if c.color1.typ == ColorTypeRGBA {
v1 = append(v1, 0xff)
} else {
v1 = append(v1, 0x80|c.color1.paletteIndex)
}
v1 = append(v1, 0, 0x85) // FFV1 Fill (flat color) with REGS[SEL+5].
}
return v1, nil
}