Added a flag to decoded block to check if it contains any transparent colors. Useful to establish a fast path in transparent rendering if it does not.

This commit is contained in:
Sascha L. Teichmann 2014-10-25 11:20:51 +02:00
parent 1acfd26e80
commit eaa3949b10
2 changed files with 31 additions and 18 deletions

View File

@ -43,12 +43,13 @@ type (
}
DecodedBlock struct {
Version byte
MapContent []byte
AirId int32
IgnoreId int32
AirOnly bool
IndexMap map[int32]int32
Version byte
MapContent []byte
AirId int32
IgnoreId int32
AirOnly bool
Transparent bool
IndexMap map[int32]int32
}
)
@ -138,6 +139,7 @@ func NewDecodedBlock(data []byte, colors *Colors) (db *DecodedBlock, err error)
airId, ignoreId := int32(-1), int32(-1)
indexMap := make(map[int32]int32)
var airOnly bool
var transparent bool
if version >= 22 {
offset++
numMappings := int(binary.BigEndian.Uint16(data[offset:]))
@ -157,6 +159,9 @@ func NewDecodedBlock(data []byte, colors *Colors) (db *DecodedBlock, err error)
default:
if index, found := colors.NameIndex[name]; found {
indexMap[nodeId] = index
if colors.IsTransparent(index) {
transparent = true
}
} else {
log.Printf("Missing color entry for %s.", name)
}
@ -166,12 +171,13 @@ func NewDecodedBlock(data []byte, colors *Colors) (db *DecodedBlock, err error)
}
db = &DecodedBlock{
Version: version,
MapContent: mapContent,
AirId: airId,
IgnoreId: ignoreId,
AirOnly: airOnly,
IndexMap: indexMap}
Version: version,
MapContent: mapContent,
AirId: airId,
IgnoreId: ignoreId,
AirOnly: airOnly,
Transparent: transparent,
IndexMap: indexMap}
return
}

View File

@ -14,9 +14,9 @@ import (
)
type Colors struct {
Colors []color.RGBA
NameIndex map[string]int32
Transparent int
Colors []color.RGBA
NameIndex map[string]int32
NumTransparent int32
}
type namedColor struct {
@ -24,6 +24,10 @@ type namedColor struct {
color color.RGBA
}
func (colors *Colors) IsTransparent(index int32) bool {
return index < colors.NumTransparent
}
type sortByAlpha []namedColor
func (colors sortByAlpha) Less(i, j int) bool {
@ -70,14 +74,17 @@ func ParseColors(filename string) (colors *Colors, err error) {
cs := make([]color.RGBA, len(cols))
nameIndex := make(map[string]int32, len(cols))
transparent := 0
numTransparent := int32(0)
for i, nc := range cols {
if nc.color.A < 0xff {
transparent++
numTransparent++
}
cs[i] = nc.color
nameIndex[nc.name] = int32(i)
}
colors = &Colors{Colors: cs, NameIndex: nameIndex, Transparent: transparent}
colors = &Colors{
Colors: cs,
NameIndex: nameIndex,
NumTransparent: numTransparent}
return
}