git.sr.ht/~pingoo/stdx@v0.0.0-20240218134121-094174641f6e/barcode/qr/blocks.go (about)

     1  package qr
     2  
     3  type block struct {
     4  	data []byte
     5  	ecc  []byte
     6  }
     7  type blockList []*block
     8  
     9  func splitToBlocks(data <-chan byte, vi *versionInfo) blockList {
    10  	result := make(blockList, vi.NumberOfBlocksInGroup1+vi.NumberOfBlocksInGroup2)
    11  
    12  	for b := 0; b < int(vi.NumberOfBlocksInGroup1); b++ {
    13  		blk := new(block)
    14  		blk.data = make([]byte, vi.DataCodeWordsPerBlockInGroup1)
    15  		for cw := 0; cw < int(vi.DataCodeWordsPerBlockInGroup1); cw++ {
    16  			blk.data[cw] = <-data
    17  		}
    18  		blk.ecc = ec.calcECC(blk.data, vi.ErrorCorrectionCodewordsPerBlock)
    19  		result[b] = blk
    20  	}
    21  
    22  	for b := 0; b < int(vi.NumberOfBlocksInGroup2); b++ {
    23  		blk := new(block)
    24  		blk.data = make([]byte, vi.DataCodeWordsPerBlockInGroup2)
    25  		for cw := 0; cw < int(vi.DataCodeWordsPerBlockInGroup2); cw++ {
    26  			blk.data[cw] = <-data
    27  		}
    28  		blk.ecc = ec.calcECC(blk.data, vi.ErrorCorrectionCodewordsPerBlock)
    29  		result[int(vi.NumberOfBlocksInGroup1)+b] = blk
    30  	}
    31  
    32  	return result
    33  }
    34  
    35  func (bl blockList) interleave(vi *versionInfo) []byte {
    36  	var maxCodewordCount int
    37  	if vi.DataCodeWordsPerBlockInGroup1 > vi.DataCodeWordsPerBlockInGroup2 {
    38  		maxCodewordCount = int(vi.DataCodeWordsPerBlockInGroup1)
    39  	} else {
    40  		maxCodewordCount = int(vi.DataCodeWordsPerBlockInGroup2)
    41  	}
    42  	resultLen := (vi.DataCodeWordsPerBlockInGroup1+vi.ErrorCorrectionCodewordsPerBlock)*vi.NumberOfBlocksInGroup1 +
    43  		(vi.DataCodeWordsPerBlockInGroup2+vi.ErrorCorrectionCodewordsPerBlock)*vi.NumberOfBlocksInGroup2
    44  
    45  	result := make([]byte, 0, resultLen)
    46  	for i := 0; i < maxCodewordCount; i++ {
    47  		for b := 0; b < len(bl); b++ {
    48  			if len(bl[b].data) > i {
    49  				result = append(result, bl[b].data[i])
    50  			}
    51  		}
    52  	}
    53  	for i := 0; i < int(vi.ErrorCorrectionCodewordsPerBlock); i++ {
    54  		for b := 0; b < len(bl); b++ {
    55  			result = append(result, bl[b].ecc[i])
    56  		}
    57  	}
    58  	return result
    59  }