////////////////////////////////////////////////////////////////////////////////
// Do not modify!
// Generated by codergen
////////////////////////////////////////////////////////////////////////////////

package image

import (
	"android.googlesource.com/platform/tools/gpu/binary"
	"android.googlesource.com/platform/tools/gpu/binary/registry"
	"android.googlesource.com/platform/tools/gpu/binary/schema"
)

var Namespace = registry.NewNamespace()

func init() {
	registry.Global.AddFallbacks(Namespace)
	Namespace.Add((*fmtATC_RGBA_EXPLICIT_ALPHA_AMD)(nil).Class())
	Namespace.Add((*fmtATC_RGB_AMD)(nil).Class())
	Namespace.Add((*fmtAlpha)(nil).Class())
	Namespace.Add((*fmtETC1_RGB8_OES)(nil).Class())
	Namespace.Add((*fmtFloat32)(nil).Class())
	Namespace.Add((*fmtLuminance)(nil).Class())
	Namespace.Add((*fmtLuminanceAlpha)(nil).Class())
	Namespace.Add((*fmtPNG)(nil).Class())
	Namespace.Add((*fmtRGB)(nil).Class())
	Namespace.Add((*fmtRGBA)(nil).Class())
}

var (
	binaryIDfmtATC_RGBA_EXPLICIT_ALPHA_AMD = binary.ID{0x00, 0x01, 0xf1, 0x3d, 0xda, 0x93, 0xca, 0x32, 0xc1, 0x10, 0x62, 0x0a, 0x34, 0xd2, 0x97, 0xc3, 0x62, 0x03, 0x7e, 0x27}
	binaryIDfmtATC_RGB_AMD                 = binary.ID{0x8b, 0x48, 0x62, 0x86, 0x18, 0xe9, 0x20, 0x62, 0x5f, 0xf5, 0x80, 0xa5, 0xba, 0xb9, 0x5e, 0x69, 0x6b, 0xa5, 0x32, 0xf6}
	binaryIDfmtAlpha                       = binary.ID{0xaa, 0x3d, 0x3b, 0xac, 0x9b, 0x5c, 0x60, 0x12, 0xdd, 0xd9, 0x45, 0x4c, 0xc5, 0xdd, 0xd1, 0x1f, 0xfd, 0x42, 0xf5, 0xdc}
	binaryIDfmtETC1_RGB8_OES               = binary.ID{0xc5, 0x5a, 0x15, 0x42, 0x59, 0x53, 0x5b, 0x92, 0xbc, 0xf7, 0xeb, 0xbd, 0x6b, 0xe9, 0xa7, 0x6a, 0xa4, 0xdc, 0xb6, 0x3e}
	binaryIDfmtFloat32                     = binary.ID{0xe4, 0x1b, 0xb4, 0x3f, 0xd4, 0xbf, 0x3c, 0xa1, 0x94, 0x5f, 0x9a, 0x30, 0x22, 0x43, 0x2c, 0xc0, 0x61, 0xdc, 0x00, 0x5d}
	binaryIDfmtLuminance                   = binary.ID{0x9b, 0xe5, 0x58, 0x28, 0x9c, 0xbc, 0x1a, 0xaa, 0x1d, 0x9c, 0x91, 0xf9, 0x46, 0xa8, 0x9a, 0x79, 0x70, 0xfe, 0xd7, 0x94}
	binaryIDfmtLuminanceAlpha              = binary.ID{0xd7, 0x3c, 0xfd, 0xf8, 0x86, 0x2b, 0x6b, 0xb4, 0xc2, 0x7d, 0xa9, 0xb5, 0xbd, 0xca, 0x62, 0xd7, 0xb3, 0xb4, 0xbb, 0xf3}
	binaryIDfmtPNG                         = binary.ID{0xcd, 0xf0, 0x38, 0xd9, 0x6b, 0x5d, 0x0e, 0xab, 0xd9, 0xcf, 0xd2, 0xe1, 0xbf, 0x4d, 0xcc, 0xad, 0x0f, 0xd1, 0xcb, 0x50}
	binaryIDfmtRGB                         = binary.ID{0x81, 0xe2, 0x40, 0xf8, 0xf3, 0x6f, 0xf2, 0xe6, 0xb1, 0x86, 0x2f, 0xbb, 0xe1, 0xeb, 0xaa, 0xab, 0x93, 0xab, 0xd3, 0x61}
	binaryIDfmtRGBA                        = binary.ID{0x6b, 0x9e, 0x31, 0xab, 0xf7, 0x0c, 0x90, 0x8a, 0xf3, 0xcb, 0x32, 0xaa, 0x9d, 0x98, 0x2d, 0x13, 0xf3, 0x98, 0x0f, 0xab}
)

type binaryClassfmtATC_RGBA_EXPLICIT_ALPHA_AMD struct{}

func (*fmtATC_RGBA_EXPLICIT_ALPHA_AMD) Class() binary.Class {
	return (*binaryClassfmtATC_RGBA_EXPLICIT_ALPHA_AMD)(nil)
}
func doEncodefmtATC_RGBA_EXPLICIT_ALPHA_AMD(e binary.Encoder, o *fmtATC_RGBA_EXPLICIT_ALPHA_AMD) error {
	return nil
}
func doDecodefmtATC_RGBA_EXPLICIT_ALPHA_AMD(d binary.Decoder, o *fmtATC_RGBA_EXPLICIT_ALPHA_AMD) error {
	return nil
}
func doSkipfmtATC_RGBA_EXPLICIT_ALPHA_AMD(d binary.Decoder) error {
	return nil
}
func (*binaryClassfmtATC_RGBA_EXPLICIT_ALPHA_AMD) ID() binary.ID {
	return binaryIDfmtATC_RGBA_EXPLICIT_ALPHA_AMD
}
func (*binaryClassfmtATC_RGBA_EXPLICIT_ALPHA_AMD) New() binary.Object {
	return &fmtATC_RGBA_EXPLICIT_ALPHA_AMD{}
}
func (*binaryClassfmtATC_RGBA_EXPLICIT_ALPHA_AMD) Encode(e binary.Encoder, obj binary.Object) error {
	return doEncodefmtATC_RGBA_EXPLICIT_ALPHA_AMD(e, obj.(*fmtATC_RGBA_EXPLICIT_ALPHA_AMD))
}
func (*binaryClassfmtATC_RGBA_EXPLICIT_ALPHA_AMD) Decode(d binary.Decoder) (binary.Object, error) {
	obj := &fmtATC_RGBA_EXPLICIT_ALPHA_AMD{}
	return obj, doDecodefmtATC_RGBA_EXPLICIT_ALPHA_AMD(d, obj)
}
func (*binaryClassfmtATC_RGBA_EXPLICIT_ALPHA_AMD) DecodeTo(d binary.Decoder, obj binary.Object) error {
	return doDecodefmtATC_RGBA_EXPLICIT_ALPHA_AMD(d, obj.(*fmtATC_RGBA_EXPLICIT_ALPHA_AMD))
}
func (*binaryClassfmtATC_RGBA_EXPLICIT_ALPHA_AMD) Skip(d binary.Decoder) error {
	return doSkipfmtATC_RGBA_EXPLICIT_ALPHA_AMD(d)
}
func (*binaryClassfmtATC_RGBA_EXPLICIT_ALPHA_AMD) Schema() *schema.Class {
	return schemafmtATC_RGBA_EXPLICIT_ALPHA_AMD
}

var schemafmtATC_RGBA_EXPLICIT_ALPHA_AMD = &schema.Class{
	TypeID:  binaryIDfmtATC_RGBA_EXPLICIT_ALPHA_AMD,
	Package: "image",
	Name:    "fmtATC_RGBA_EXPLICIT_ALPHA_AMD",
	Fields:  []schema.Field{},
}

type binaryClassfmtATC_RGB_AMD struct{}

func (*fmtATC_RGB_AMD) Class() binary.Class {
	return (*binaryClassfmtATC_RGB_AMD)(nil)
}
func doEncodefmtATC_RGB_AMD(e binary.Encoder, o *fmtATC_RGB_AMD) error {
	return nil
}
func doDecodefmtATC_RGB_AMD(d binary.Decoder, o *fmtATC_RGB_AMD) error {
	return nil
}
func doSkipfmtATC_RGB_AMD(d binary.Decoder) error {
	return nil
}
func (*binaryClassfmtATC_RGB_AMD) ID() binary.ID      { return binaryIDfmtATC_RGB_AMD }
func (*binaryClassfmtATC_RGB_AMD) New() binary.Object { return &fmtATC_RGB_AMD{} }
func (*binaryClassfmtATC_RGB_AMD) Encode(e binary.Encoder, obj binary.Object) error {
	return doEncodefmtATC_RGB_AMD(e, obj.(*fmtATC_RGB_AMD))
}
func (*binaryClassfmtATC_RGB_AMD) Decode(d binary.Decoder) (binary.Object, error) {
	obj := &fmtATC_RGB_AMD{}
	return obj, doDecodefmtATC_RGB_AMD(d, obj)
}
func (*binaryClassfmtATC_RGB_AMD) DecodeTo(d binary.Decoder, obj binary.Object) error {
	return doDecodefmtATC_RGB_AMD(d, obj.(*fmtATC_RGB_AMD))
}
func (*binaryClassfmtATC_RGB_AMD) Skip(d binary.Decoder) error { return doSkipfmtATC_RGB_AMD(d) }
func (*binaryClassfmtATC_RGB_AMD) Schema() *schema.Class       { return schemafmtATC_RGB_AMD }

var schemafmtATC_RGB_AMD = &schema.Class{
	TypeID:  binaryIDfmtATC_RGB_AMD,
	Package: "image",
	Name:    "fmtATC_RGB_AMD",
	Fields:  []schema.Field{},
}

type binaryClassfmtAlpha struct{}

func (*fmtAlpha) Class() binary.Class {
	return (*binaryClassfmtAlpha)(nil)
}
func doEncodefmtAlpha(e binary.Encoder, o *fmtAlpha) error {
	return nil
}
func doDecodefmtAlpha(d binary.Decoder, o *fmtAlpha) error {
	return nil
}
func doSkipfmtAlpha(d binary.Decoder) error {
	return nil
}
func (*binaryClassfmtAlpha) ID() binary.ID      { return binaryIDfmtAlpha }
func (*binaryClassfmtAlpha) New() binary.Object { return &fmtAlpha{} }
func (*binaryClassfmtAlpha) Encode(e binary.Encoder, obj binary.Object) error {
	return doEncodefmtAlpha(e, obj.(*fmtAlpha))
}
func (*binaryClassfmtAlpha) Decode(d binary.Decoder) (binary.Object, error) {
	obj := &fmtAlpha{}
	return obj, doDecodefmtAlpha(d, obj)
}
func (*binaryClassfmtAlpha) DecodeTo(d binary.Decoder, obj binary.Object) error {
	return doDecodefmtAlpha(d, obj.(*fmtAlpha))
}
func (*binaryClassfmtAlpha) Skip(d binary.Decoder) error { return doSkipfmtAlpha(d) }
func (*binaryClassfmtAlpha) Schema() *schema.Class       { return schemafmtAlpha }

var schemafmtAlpha = &schema.Class{
	TypeID:  binaryIDfmtAlpha,
	Package: "image",
	Name:    "fmtAlpha",
	Fields:  []schema.Field{},
}

type binaryClassfmtETC1_RGB8_OES struct{}

func (*fmtETC1_RGB8_OES) Class() binary.Class {
	return (*binaryClassfmtETC1_RGB8_OES)(nil)
}
func doEncodefmtETC1_RGB8_OES(e binary.Encoder, o *fmtETC1_RGB8_OES) error {
	return nil
}
func doDecodefmtETC1_RGB8_OES(d binary.Decoder, o *fmtETC1_RGB8_OES) error {
	return nil
}
func doSkipfmtETC1_RGB8_OES(d binary.Decoder) error {
	return nil
}
func (*binaryClassfmtETC1_RGB8_OES) ID() binary.ID      { return binaryIDfmtETC1_RGB8_OES }
func (*binaryClassfmtETC1_RGB8_OES) New() binary.Object { return &fmtETC1_RGB8_OES{} }
func (*binaryClassfmtETC1_RGB8_OES) Encode(e binary.Encoder, obj binary.Object) error {
	return doEncodefmtETC1_RGB8_OES(e, obj.(*fmtETC1_RGB8_OES))
}
func (*binaryClassfmtETC1_RGB8_OES) Decode(d binary.Decoder) (binary.Object, error) {
	obj := &fmtETC1_RGB8_OES{}
	return obj, doDecodefmtETC1_RGB8_OES(d, obj)
}
func (*binaryClassfmtETC1_RGB8_OES) DecodeTo(d binary.Decoder, obj binary.Object) error {
	return doDecodefmtETC1_RGB8_OES(d, obj.(*fmtETC1_RGB8_OES))
}
func (*binaryClassfmtETC1_RGB8_OES) Skip(d binary.Decoder) error { return doSkipfmtETC1_RGB8_OES(d) }
func (*binaryClassfmtETC1_RGB8_OES) Schema() *schema.Class       { return schemafmtETC1_RGB8_OES }

var schemafmtETC1_RGB8_OES = &schema.Class{
	TypeID:  binaryIDfmtETC1_RGB8_OES,
	Package: "image",
	Name:    "fmtETC1_RGB8_OES",
	Fields:  []schema.Field{},
}

type binaryClassfmtFloat32 struct{}

func (*fmtFloat32) Class() binary.Class {
	return (*binaryClassfmtFloat32)(nil)
}
func doEncodefmtFloat32(e binary.Encoder, o *fmtFloat32) error {
	return nil
}
func doDecodefmtFloat32(d binary.Decoder, o *fmtFloat32) error {
	return nil
}
func doSkipfmtFloat32(d binary.Decoder) error {
	return nil
}
func (*binaryClassfmtFloat32) ID() binary.ID      { return binaryIDfmtFloat32 }
func (*binaryClassfmtFloat32) New() binary.Object { return &fmtFloat32{} }
func (*binaryClassfmtFloat32) Encode(e binary.Encoder, obj binary.Object) error {
	return doEncodefmtFloat32(e, obj.(*fmtFloat32))
}
func (*binaryClassfmtFloat32) Decode(d binary.Decoder) (binary.Object, error) {
	obj := &fmtFloat32{}
	return obj, doDecodefmtFloat32(d, obj)
}
func (*binaryClassfmtFloat32) DecodeTo(d binary.Decoder, obj binary.Object) error {
	return doDecodefmtFloat32(d, obj.(*fmtFloat32))
}
func (*binaryClassfmtFloat32) Skip(d binary.Decoder) error { return doSkipfmtFloat32(d) }
func (*binaryClassfmtFloat32) Schema() *schema.Class       { return schemafmtFloat32 }

var schemafmtFloat32 = &schema.Class{
	TypeID:  binaryIDfmtFloat32,
	Package: "image",
	Name:    "fmtFloat32",
	Fields:  []schema.Field{},
}

type binaryClassfmtLuminance struct{}

func (*fmtLuminance) Class() binary.Class {
	return (*binaryClassfmtLuminance)(nil)
}
func doEncodefmtLuminance(e binary.Encoder, o *fmtLuminance) error {
	return nil
}
func doDecodefmtLuminance(d binary.Decoder, o *fmtLuminance) error {
	return nil
}
func doSkipfmtLuminance(d binary.Decoder) error {
	return nil
}
func (*binaryClassfmtLuminance) ID() binary.ID      { return binaryIDfmtLuminance }
func (*binaryClassfmtLuminance) New() binary.Object { return &fmtLuminance{} }
func (*binaryClassfmtLuminance) Encode(e binary.Encoder, obj binary.Object) error {
	return doEncodefmtLuminance(e, obj.(*fmtLuminance))
}
func (*binaryClassfmtLuminance) Decode(d binary.Decoder) (binary.Object, error) {
	obj := &fmtLuminance{}
	return obj, doDecodefmtLuminance(d, obj)
}
func (*binaryClassfmtLuminance) DecodeTo(d binary.Decoder, obj binary.Object) error {
	return doDecodefmtLuminance(d, obj.(*fmtLuminance))
}
func (*binaryClassfmtLuminance) Skip(d binary.Decoder) error { return doSkipfmtLuminance(d) }
func (*binaryClassfmtLuminance) Schema() *schema.Class       { return schemafmtLuminance }

var schemafmtLuminance = &schema.Class{
	TypeID:  binaryIDfmtLuminance,
	Package: "image",
	Name:    "fmtLuminance",
	Fields:  []schema.Field{},
}

type binaryClassfmtLuminanceAlpha struct{}

func (*fmtLuminanceAlpha) Class() binary.Class {
	return (*binaryClassfmtLuminanceAlpha)(nil)
}
func doEncodefmtLuminanceAlpha(e binary.Encoder, o *fmtLuminanceAlpha) error {
	return nil
}
func doDecodefmtLuminanceAlpha(d binary.Decoder, o *fmtLuminanceAlpha) error {
	return nil
}
func doSkipfmtLuminanceAlpha(d binary.Decoder) error {
	return nil
}
func (*binaryClassfmtLuminanceAlpha) ID() binary.ID      { return binaryIDfmtLuminanceAlpha }
func (*binaryClassfmtLuminanceAlpha) New() binary.Object { return &fmtLuminanceAlpha{} }
func (*binaryClassfmtLuminanceAlpha) Encode(e binary.Encoder, obj binary.Object) error {
	return doEncodefmtLuminanceAlpha(e, obj.(*fmtLuminanceAlpha))
}
func (*binaryClassfmtLuminanceAlpha) Decode(d binary.Decoder) (binary.Object, error) {
	obj := &fmtLuminanceAlpha{}
	return obj, doDecodefmtLuminanceAlpha(d, obj)
}
func (*binaryClassfmtLuminanceAlpha) DecodeTo(d binary.Decoder, obj binary.Object) error {
	return doDecodefmtLuminanceAlpha(d, obj.(*fmtLuminanceAlpha))
}
func (*binaryClassfmtLuminanceAlpha) Skip(d binary.Decoder) error { return doSkipfmtLuminanceAlpha(d) }
func (*binaryClassfmtLuminanceAlpha) Schema() *schema.Class       { return schemafmtLuminanceAlpha }

var schemafmtLuminanceAlpha = &schema.Class{
	TypeID:  binaryIDfmtLuminanceAlpha,
	Package: "image",
	Name:    "fmtLuminanceAlpha",
	Fields:  []schema.Field{},
}

type binaryClassfmtPNG struct{}

func (*fmtPNG) Class() binary.Class {
	return (*binaryClassfmtPNG)(nil)
}
func doEncodefmtPNG(e binary.Encoder, o *fmtPNG) error {
	return nil
}
func doDecodefmtPNG(d binary.Decoder, o *fmtPNG) error {
	return nil
}
func doSkipfmtPNG(d binary.Decoder) error {
	return nil
}
func (*binaryClassfmtPNG) ID() binary.ID      { return binaryIDfmtPNG }
func (*binaryClassfmtPNG) New() binary.Object { return &fmtPNG{} }
func (*binaryClassfmtPNG) Encode(e binary.Encoder, obj binary.Object) error {
	return doEncodefmtPNG(e, obj.(*fmtPNG))
}
func (*binaryClassfmtPNG) Decode(d binary.Decoder) (binary.Object, error) {
	obj := &fmtPNG{}
	return obj, doDecodefmtPNG(d, obj)
}
func (*binaryClassfmtPNG) DecodeTo(d binary.Decoder, obj binary.Object) error {
	return doDecodefmtPNG(d, obj.(*fmtPNG))
}
func (*binaryClassfmtPNG) Skip(d binary.Decoder) error { return doSkipfmtPNG(d) }
func (*binaryClassfmtPNG) Schema() *schema.Class       { return schemafmtPNG }

var schemafmtPNG = &schema.Class{
	TypeID:  binaryIDfmtPNG,
	Package: "image",
	Name:    "fmtPNG",
	Fields:  []schema.Field{},
}

type binaryClassfmtRGB struct{}

func (*fmtRGB) Class() binary.Class {
	return (*binaryClassfmtRGB)(nil)
}
func doEncodefmtRGB(e binary.Encoder, o *fmtRGB) error {
	return nil
}
func doDecodefmtRGB(d binary.Decoder, o *fmtRGB) error {
	return nil
}
func doSkipfmtRGB(d binary.Decoder) error {
	return nil
}
func (*binaryClassfmtRGB) ID() binary.ID      { return binaryIDfmtRGB }
func (*binaryClassfmtRGB) New() binary.Object { return &fmtRGB{} }
func (*binaryClassfmtRGB) Encode(e binary.Encoder, obj binary.Object) error {
	return doEncodefmtRGB(e, obj.(*fmtRGB))
}
func (*binaryClassfmtRGB) Decode(d binary.Decoder) (binary.Object, error) {
	obj := &fmtRGB{}
	return obj, doDecodefmtRGB(d, obj)
}
func (*binaryClassfmtRGB) DecodeTo(d binary.Decoder, obj binary.Object) error {
	return doDecodefmtRGB(d, obj.(*fmtRGB))
}
func (*binaryClassfmtRGB) Skip(d binary.Decoder) error { return doSkipfmtRGB(d) }
func (*binaryClassfmtRGB) Schema() *schema.Class       { return schemafmtRGB }

var schemafmtRGB = &schema.Class{
	TypeID:  binaryIDfmtRGB,
	Package: "image",
	Name:    "fmtRGB",
	Fields:  []schema.Field{},
}

type binaryClassfmtRGBA struct{}

func (*fmtRGBA) Class() binary.Class {
	return (*binaryClassfmtRGBA)(nil)
}
func doEncodefmtRGBA(e binary.Encoder, o *fmtRGBA) error {
	return nil
}
func doDecodefmtRGBA(d binary.Decoder, o *fmtRGBA) error {
	return nil
}
func doSkipfmtRGBA(d binary.Decoder) error {
	return nil
}
func (*binaryClassfmtRGBA) ID() binary.ID      { return binaryIDfmtRGBA }
func (*binaryClassfmtRGBA) New() binary.Object { return &fmtRGBA{} }
func (*binaryClassfmtRGBA) Encode(e binary.Encoder, obj binary.Object) error {
	return doEncodefmtRGBA(e, obj.(*fmtRGBA))
}
func (*binaryClassfmtRGBA) Decode(d binary.Decoder) (binary.Object, error) {
	obj := &fmtRGBA{}
	return obj, doDecodefmtRGBA(d, obj)
}
func (*binaryClassfmtRGBA) DecodeTo(d binary.Decoder, obj binary.Object) error {
	return doDecodefmtRGBA(d, obj.(*fmtRGBA))
}
func (*binaryClassfmtRGBA) Skip(d binary.Decoder) error { return doSkipfmtRGBA(d) }
func (*binaryClassfmtRGBA) Schema() *schema.Class       { return schemafmtRGBA }

var schemafmtRGBA = &schema.Class{
	TypeID:  binaryIDfmtRGBA,
	Package: "image",
	Name:    "fmtRGBA",
	Fields:  []schema.Field{},
}
