mirror of
https://git.sr.ht/~eliasnaur/gio
synced 2026-07-01 07:35:40 +00:00
5197f637a7
The hash of the clipping paths that affect drawing operations are computed and used to quickly determine that two operations are not equal, the most likely outcome of a comparison. However, for paths that are constructed once and cached computing the hash at every frame is wasteful. This is especially true for text, which is both cached and also among the largest paths in a frame. This change moves the hashing to op/clip.Path construction time, and stores the hash in the ops list so it won't be re-computed at every use. Signed-off-by: Elias Naur <mail@eliasnaur.com>
120 lines
2.3 KiB
Go
120 lines
2.3 KiB
Go
// SPDX-License-Identifier: Unlicense OR MIT
|
|
|
|
package opconst
|
|
|
|
type OpType byte
|
|
|
|
// Start at a high number for easier debugging.
|
|
const firstOpIndex = 200
|
|
|
|
const (
|
|
TypeMacro OpType = iota + firstOpIndex
|
|
TypeCall
|
|
TypeDefer
|
|
TypeTransform
|
|
TypeInvalidate
|
|
TypeImage
|
|
TypePaint
|
|
TypeColor
|
|
TypeLinearGradient
|
|
TypeArea
|
|
TypePointerInput
|
|
TypePass
|
|
TypeClipboardRead
|
|
TypeClipboardWrite
|
|
TypeKeyInput
|
|
TypeKeyFocus
|
|
TypeKeySoftKeyboard
|
|
TypeSave
|
|
TypeLoad
|
|
TypeAux
|
|
TypeClip
|
|
TypeProfile
|
|
TypeCursor
|
|
TypePath
|
|
TypeStroke
|
|
)
|
|
|
|
const (
|
|
TypeMacroLen = 1 + 4 + 4
|
|
TypeCallLen = 1 + 4 + 4
|
|
TypeDeferLen = 1
|
|
TypeTransformLen = 1 + 4*6
|
|
TypeRedrawLen = 1 + 8
|
|
TypeImageLen = 1
|
|
TypePaintLen = 1
|
|
TypeColorLen = 1 + 4
|
|
TypeLinearGradientLen = 1 + 8*2 + 4*2
|
|
TypeAreaLen = 1 + 1 + 4*4
|
|
TypePointerInputLen = 1 + 1 + 1 + 2*4 + 2*4
|
|
TypePassLen = 1 + 1
|
|
TypeClipboardReadLen = 1
|
|
TypeClipboardWriteLen = 1
|
|
TypeKeyInputLen = 1 + 1
|
|
TypeKeyFocusLen = 1 + 1
|
|
TypeKeySoftKeyboardLen = 1 + 1
|
|
TypeSaveLen = 1 + 4
|
|
TypeLoadLen = 1 + 1 + 4
|
|
TypeAuxLen = 1
|
|
TypeClipLen = 1 + 4*4 + 1
|
|
TypeProfileLen = 1
|
|
TypeCursorLen = 1 + 1
|
|
TypePathLen = 8 + 1
|
|
TypeStrokeLen = 1 + 4
|
|
)
|
|
|
|
// StateMask is a bitmask of state types a load operation
|
|
// should restore.
|
|
type StateMask uint8
|
|
|
|
const (
|
|
TransformState StateMask = 1 << iota
|
|
|
|
AllState = ^StateMask(0)
|
|
)
|
|
|
|
// InitialStateID is the ID for saving and loading
|
|
// the initial operation state.
|
|
const InitialStateID = 0
|
|
|
|
func (t OpType) Size() int {
|
|
return [...]int{
|
|
TypeMacroLen,
|
|
TypeCallLen,
|
|
TypeDeferLen,
|
|
TypeTransformLen,
|
|
TypeRedrawLen,
|
|
TypeImageLen,
|
|
TypePaintLen,
|
|
TypeColorLen,
|
|
TypeLinearGradientLen,
|
|
TypeAreaLen,
|
|
TypePointerInputLen,
|
|
TypePassLen,
|
|
TypeClipboardReadLen,
|
|
TypeClipboardWriteLen,
|
|
TypeKeyInputLen,
|
|
TypeKeyFocusLen,
|
|
TypeKeySoftKeyboardLen,
|
|
TypeSaveLen,
|
|
TypeLoadLen,
|
|
TypeAuxLen,
|
|
TypeClipLen,
|
|
TypeProfileLen,
|
|
TypeCursorLen,
|
|
TypePathLen,
|
|
TypeStrokeLen,
|
|
}[t-firstOpIndex]
|
|
}
|
|
|
|
func (t OpType) NumRefs() int {
|
|
switch t {
|
|
case TypeKeyInput, TypeKeyFocus, TypePointerInput, TypeProfile, TypeCall, TypeClipboardRead, TypeClipboardWrite, TypeCursor:
|
|
return 1
|
|
case TypeImage:
|
|
return 2
|
|
default:
|
|
return 0
|
|
}
|
|
}
|