summaryrefslogtreecommitdiff
path: root/vendor/github.com/dsoprea/go-exif/v3/undefined/exif_8828_oecf.go
diff options
context:
space:
mode:
authorLibravatar kim <89579420+NyaaaWhatsUpDoc@users.noreply.github.com>2022-02-12 18:27:58 +0000
committerLibravatar GitHub <noreply@github.com>2022-02-12 18:27:58 +0000
commit31935ee206107f077878d3cdb6a26b82436b6893 (patch)
tree2d522bf98013dc5a4539133561b645fd7457eb06 /vendor/github.com/dsoprea/go-exif/v3/undefined/exif_8828_oecf.go
parent[chore] Add nightly mirror to Codeberg.org (#392) (diff)
parentGo mod tidy (diff)
downloadgotosocial-31935ee206107f077878d3cdb6a26b82436b6893.tar.xz
Merge pull request #361 from superseriousbusiness/media_refactorv0.2.0
Refactor media handler to allow async media resolution
Diffstat (limited to 'vendor/github.com/dsoprea/go-exif/v3/undefined/exif_8828_oecf.go')
-rw-r--r--vendor/github.com/dsoprea/go-exif/v3/undefined/exif_8828_oecf.go148
1 files changed, 148 insertions, 0 deletions
diff --git a/vendor/github.com/dsoprea/go-exif/v3/undefined/exif_8828_oecf.go b/vendor/github.com/dsoprea/go-exif/v3/undefined/exif_8828_oecf.go
new file mode 100644
index 000000000..26f3675ab
--- /dev/null
+++ b/vendor/github.com/dsoprea/go-exif/v3/undefined/exif_8828_oecf.go
@@ -0,0 +1,148 @@
+package exifundefined
+
+import (
+ "bytes"
+ "fmt"
+
+ "encoding/binary"
+
+ "github.com/dsoprea/go-logging"
+
+ "github.com/dsoprea/go-exif/v3/common"
+)
+
+type Tag8828Oecf struct {
+ Columns uint16
+ Rows uint16
+ ColumnNames []string
+ Values []exifcommon.SignedRational
+}
+
+func (oecf Tag8828Oecf) String() string {
+ return fmt.Sprintf("Tag8828Oecf<COLUMNS=(%d) ROWS=(%d)>", oecf.Columns, oecf.Rows)
+}
+
+func (oecf Tag8828Oecf) EncoderName() string {
+ return "Codec8828Oecf"
+}
+
+type Codec8828Oecf struct {
+}
+
+func (Codec8828Oecf) Encode(value interface{}, byteOrder binary.ByteOrder) (encoded []byte, unitCount uint32, err error) {
+ defer func() {
+ if state := recover(); state != nil {
+ err = log.Wrap(state.(error))
+ }
+ }()
+
+ // TODO(dustin): Add test
+
+ oecf, ok := value.(Tag8828Oecf)
+ if ok == false {
+ log.Panicf("can only encode a Tag8828Oecf")
+ }
+
+ b := new(bytes.Buffer)
+
+ err = binary.Write(b, byteOrder, oecf.Columns)
+ log.PanicIf(err)
+
+ err = binary.Write(b, byteOrder, oecf.Rows)
+ log.PanicIf(err)
+
+ for _, name := range oecf.ColumnNames {
+ _, err := b.Write([]byte(name))
+ log.PanicIf(err)
+
+ _, err = b.Write([]byte{0})
+ log.PanicIf(err)
+ }
+
+ ve := exifcommon.NewValueEncoder(byteOrder)
+
+ ed, err := ve.Encode(oecf.Values)
+ log.PanicIf(err)
+
+ _, err = b.Write(ed.Encoded)
+ log.PanicIf(err)
+
+ return b.Bytes(), uint32(b.Len()), nil
+}
+
+func (Codec8828Oecf) Decode(valueContext *exifcommon.ValueContext) (value EncodeableValue, err error) {
+ defer func() {
+ if state := recover(); state != nil {
+ err = log.Wrap(state.(error))
+ }
+ }()
+
+ // TODO(dustin): Add test using known good data.
+
+ valueContext.SetUndefinedValueType(exifcommon.TypeByte)
+
+ valueBytes, err := valueContext.ReadBytes()
+ log.PanicIf(err)
+
+ oecf := Tag8828Oecf{}
+
+ oecf.Columns = valueContext.ByteOrder().Uint16(valueBytes[0:2])
+ oecf.Rows = valueContext.ByteOrder().Uint16(valueBytes[2:4])
+
+ columnNames := make([]string, oecf.Columns)
+
+ // startAt is where the current column name starts.
+ startAt := 4
+
+ // offset is our current position.
+ offset := startAt
+
+ currentColumnNumber := uint16(0)
+
+ for currentColumnNumber < oecf.Columns {
+ if valueBytes[offset] == 0 {
+ columnName := string(valueBytes[startAt:offset])
+ if len(columnName) == 0 {
+ log.Panicf("SFR column (%d) has zero length", currentColumnNumber)
+ }
+
+ columnNames[currentColumnNumber] = columnName
+ currentColumnNumber++
+
+ offset++
+ startAt = offset
+ continue
+ }
+
+ offset++
+ }
+
+ oecf.ColumnNames = columnNames
+
+ rawRationalBytes := valueBytes[offset:]
+
+ rationalSize := exifcommon.TypeSignedRational.Size()
+ if len(rawRationalBytes)%rationalSize > 0 {
+ log.Panicf("OECF signed-rationals not aligned: (%d) %% (%d) > 0", len(rawRationalBytes), rationalSize)
+ }
+
+ rationalCount := len(rawRationalBytes) / rationalSize
+
+ parser := new(exifcommon.Parser)
+
+ byteOrder := valueContext.ByteOrder()
+
+ items, err := parser.ParseSignedRationals(rawRationalBytes, uint32(rationalCount), byteOrder)
+ log.PanicIf(err)
+
+ oecf.Values = items
+
+ return oecf, nil
+}
+
+func init() {
+ registerDecoder(
+ exifcommon.IfdExifStandardIfdIdentity.UnindexedString(),
+ 0x8828,
+ Codec8828Oecf{})
+}