public override Result decodeRow(int rowNumber, BitArray row, System.Collections.Hashtable hints) { // Compute this location once and reuse it on multiple implementations int[] startGuardPattern = UPCEANReader.findStartGuardPattern(row); int size = readers.Count; for (int i = 0; i < size; i++) { UPCEANReader reader = (UPCEANReader)readers[i]; Result result; try { result = reader.decodeRow(rowNumber, row, startGuardPattern, hints); } catch (ReaderException) { continue; } // Special case: a 12-digit code encoded in UPC-A is identical to a "0" // followed by those 12 digits encoded as EAN-13. Each will recognize such a code, // UPC-A as a 12-digit string and EAN-13 as a 13-digit string starting with "0". // Individually these are correct and their readers will both read such a code // and correctly call it EAN-13, or UPC-A, respectively. // // In this case, if we've been looking for both types, we'd like to call it // a UPC-A code. But for efficiency we only run the EAN-13 decoder to also read // UPC-A. So we special case it here, and convert an EAN-13 result to a UPC-A // result if appropriate. if (result.BarcodeFormat.Equals(BarcodeFormat.EAN_13) && result.Text[0] == '0') { return(new Result(result.Text.Substring(1), null, result.ResultPoints, BarcodeFormat.UPC_A)); } return(result); } throw ReaderException.Instance; }