You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

124 lines
5.0 KiB

// Copyright 2026 Axel Waggershauser
// SPDX-License-Identifier: Apache-2.0
package zxingcpp
/*
#include <stdlib.h>
#include "zxingcgo.h"
*/
import "C"
import (
"unsafe"
)
// Barcode represents a decoded or created barcode symbol and provides access to
// its content, format, position, and metadata. Use ReadBarcodes or CreateBarcode
// to obtain Barcode instances. Convert a Barcode to an image or SVG with ToImage
// or ToSVG.
type Barcode struct {
ptr *C.ZXing_Barcode
}
func (b *Barcode) Close() error {
if b == nil || b.ptr == nil {
return nil
}
C.ZXing_Barcode_delete(b.ptr)
b.ptr = nil
return nil
}
// IsValid reports whether the barcode contains a successfully decoded or created symbol.
func (b *Barcode) IsValid() bool { return b != nil && bool(C.ZXing_Barcode_isValid(b.ptr)) }
// Format returns the BarcodeFormat of the barcode.
func (b *Barcode) Format() BarcodeFormat { return BarcodeFormat(C.ZXing_Barcode_format(b.ptr)) }
// Symbology returns the symbology of the barcode format (e.g. EAN/UPC for EAN13, EAN8, UPCA).
func (b *Barcode) Symbology() BarcodeFormat { return BarcodeFormat(C.ZXing_Barcode_symbology(b.ptr)) }
// ContentType returns a hint to the type of content found (Text/Binary/GS1/etc.).
func (b *Barcode) ContentType() ContentType { return ContentType(C.ZXing_Barcode_contentType(b.ptr)) }
// Text returns the barcode content rendered to UTF-8 according to the ReaderOptions' TextMode.
func (b *Barcode) Text() string { return zxString2Go(C.ZXing_Barcode_text(b.ptr)) }
// Bytes returns the raw content without character set conversions.
func (b *Barcode) Bytes() []byte {
return zxBytes2Go(func(n *C.int) *C.uint8_t { return C.ZXing_Barcode_bytes(b.ptr, n) })
}
// BytesECI returns the raw content following the ECI protocol.
func (b *Barcode) BytesECI() []byte {
return zxBytes2Go(func(n *C.int) *C.uint8_t { return C.ZXing_Barcode_bytesECI(b.ptr, n) })
}
// SymbologyIdentifier returns the symbology identifier "]cm" where "c" is the symbology code and "m" the modifier.
func (b *Barcode) SymbologyIdentifier() string {
return zxString2Go(C.ZXing_Barcode_symbologyIdentifier(b.ptr))
}
// Position returns the barcode position in the image as a quadrilateral of points (topLeft, topRight, bottomRight, bottomLeft).
func (b *Barcode) Position() Position {
p := C.ZXing_Barcode_position(b.ptr)
return Position{
TopLeft: PointI{X: p.topLeft.x, Y: p.topLeft.y},
TopRight: PointI{X: p.topRight.x, Y: p.topRight.y},
BottomRight: PointI{X: p.bottomRight.x, Y: p.bottomRight.y},
BottomLeft: PointI{X: p.bottomLeft.x, Y: p.bottomLeft.y},
}
}
// Orientation returns the orientation of the barcode in degrees.
func (b *Barcode) Orientation() int { return int(C.ZXing_Barcode_orientation(b.ptr)) }
// HasECI reports whether an ECI tag was found.
func (b *Barcode) HasECI() bool { return bool(C.ZXing_Barcode_hasECI(b.ptr)) }
// IsInverted reports whether the symbol is inverted (reversed reflectance).
func (b *Barcode) IsInverted() bool { return bool(C.ZXing_Barcode_isInverted(b.ptr)) }
// IsMirrored reports whether the symbol is mirrored (currently supported for QRCode and DataMatrix).
func (b *Barcode) IsMirrored() bool { return bool(C.ZXing_Barcode_isMirrored(b.ptr)) }
// LineCount returns how many lines have been detected for linear symbologies.
func (b *Barcode) LineCount() int { return int(C.ZXing_Barcode_lineCount(b.ptr)) }
// SequenceIndex returns the 0-based index of this symbol in a structured append sequence.
func (b *Barcode) SequenceIndex() int { return int(C.ZXing_Barcode_sequenceIndex(b.ptr)) }
// SequenceSize returns the number of symbols in a structured append sequence.
//
// If this is not part of a structured append sequence, the returned value is -1.
// If it is a structured append symbol but the total number of symbols is unknown,
// the returned value is 0 (see PDF417 if optional "Segment Count" not given).
func (b *Barcode) SequenceSize() int { return int(C.ZXing_Barcode_sequenceSize(b.ptr)) }
// SequenceID returns the sequence identifier for structured append sequences.
//
// If the symbology does not support this feature, an empty string is returned.
// For QR Code, this is the parity integer converted to a string. For PDF417 and
// DataMatrix, this is the file id.
func (b *Barcode) SequenceID() string { return zxString2Go(C.ZXing_Barcode_sequenceId(b.ptr)) }
// Error returns the error associated with the barcode, if any.
func (b *Barcode) Error() BarcodeError {
return BarcodeError{Type: ErrorType(C.ZXing_Barcode_errorType(b.ptr)), Msg: zxString2Go(C.ZXing_Barcode_errorMsg(b.ptr))}
}
// Extra returns supplementary metadata associated with this barcode.
//
// The returned string contains additional, symbology-specific information serialized
// as a JSON object. If a key is provided, the corresponding value is returned. Keys
// are case-insensitive. If no information exists for the key, an empty string is
// returned.
func (b *Barcode) Extra(key ...string) string {
var ckey *C.char
if len(key) > 0 {
ckey = C.CString(key[0])
defer C.free(unsafe.Pointer(ckey))
}
return zxString2Go(C.ZXing_Barcode_extra(b.ptr, ckey))
}