{ * Copyright 2008 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * Original Authors: dswitkin@google.com (Daniel Switkin), Sean Owen and * alasdair@google.com (Alasdair Mackintosh) * * Delphi Implementation by E. Spelt } unit ZXing.OneD.EAN8Reader; interface uses System.SysUtils, System.Generics.Collections, System.Math, ZXing.OneD.OneDReader, ZXing.Common.BitArray, ZXing.OneD.UPCEANReader, ZXing.ReadResult, ZXing.DecodeHintType, ZXing.ResultPoint, ZXing.BarcodeFormat; type /// ///

Implements decoding of the EAN-8 format.

///
TEAN8Reader = class(TUPCEANReader) private class var DecodeMiddleCounters: TArray; class procedure DoInitialize(); class procedure DoFinalize(); public class function DecodeMiddle(const row: IBitArray; const startRange: TArray; const resultString: TStringBuilder) : Integer; override; function BarcodeFormat: TBarcodeFormat; override; end; implementation function TEAN8Reader.BarcodeFormat: TBarcodeFormat; begin result := TBarcodeFormat.EAN_8; end; class procedure TEAN8Reader.DoFinalize; begin DecodeMiddleCounters := nil; end; class procedure TEAN8Reader.DoInitialize; begin SetLength(DecodeMiddleCounters, 4); end; class function TEAN8Reader.DecodeMiddle(const row: IBitArray; const startRange: TArray; const resultString: TStringBuilder): Integer; var ending, rowOffset, x, bestMatch: Integer; counter: Integer; counters, middleRange: TArray; begin counters := self.DecodeMiddleCounters; counters[0] := 0; counters[1] := 0; counters[2] := 0; counters[3] := 0; ending := row.Size; rowOffset := startRange[1]; x := 0; while (((x < 4) and (rowOffset < ending))) do begin if (not TUPCEANReader.decodeDigit(row, counters, rowOffset, TUPCEANReader.L_PATTERNS, bestMatch)) then begin result := -1; exit end; resultString.Append(IntToStr(bestMatch)); for counter in counters do begin inc(rowOffset, counter) end; inc(x) end; middleRange := TUPCEANReader.findGuardPattern(row, rowOffset, true, TUPCEANReader.MIDDLE_PATTERN); if (middleRange = nil) then begin result := -1; exit end; rowOffset := middleRange[1]; x := 0; while (((x < 4) and (rowOffset < ending))) do begin if (not TUPCEANReader.decodeDigit(row, counters, rowOffset, TUPCEANReader.L_PATTERNS, bestMatch)) then begin result := -1; exit end; resultString.Append(IntToStr(bestMatch)); for counter in counters do begin inc(rowOffset, counter) end; inc(x) end; result := rowOffset; end; initialization TEAN8Reader.DoInitialize; finalization TEAN8Reader.DoFinalize; end.