1ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann// Copyright 2014 PDFium Authors. All rights reserved.
2ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann// Use of this source code is governed by a BSD-style license that can be
3ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann// found in the LICENSE file.
4ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
5ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann// Original code is licensed as follows:
7ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann/*
8ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * Copyright 2007 ZXing authors
9ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann *
10ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * Licensed under the Apache License, Version 2.0 (the "License");
11ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * you may not use this file except in compliance with the License.
12ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * You may obtain a copy of the License at
13ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann *
14ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann *      http://www.apache.org/licenses/LICENSE-2.0
15ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann *
16ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * Unless required by applicable law or agreed to in writing, software
17ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * distributed under the License is distributed on an "AS IS" BASIS,
18ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
19ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * See the License for the specific language governing permissions and
20ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann * limitations under the License.
21ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann */
22ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
23ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "xfa/src/fxbarcode/barcode.h"
24ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "xfa/src/fxbarcode/BC_Reader.h"
25ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "xfa/src/fxbarcode/BC_LuminanceSource.h"
26ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "xfa/src/fxbarcode/BC_BufferedImageLuminanceSource.h"
27ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "xfa/src/fxbarcode/BC_Binarizer.h"
28ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "xfa/src/fxbarcode/BC_BinaryBitmap.h"
29ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "xfa/src/fxbarcode/BC_ResultPoint.h"
30ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "xfa/src/fxbarcode/common/BC_GlobalHistogramBinarizer.h"
31ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "xfa/src/fxbarcode/common/BC_CommonDecoderResult.h"
32ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "xfa/src/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256.h"
33ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "BC_QRCodeReader.h"
34ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "BC_QRCodeReader.h"
35ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "BC_QRCoderMode.h"
36ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "BC_QRCoderDecoder.h"
37ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "BC_QRDetector.h"
38ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "BC_QRDetectorResult.h"
39ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "BC_QRCoderErrorCorrectionLevel.h"
40ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "BC_QRDataMask.h"
41ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "BC_QRCodeReader.h"
42ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "BC_QRCoderVersion.h"
43ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCBC_QRCodeReader::CBC_QRCodeReader() : m_decoder(NULL) {}
44ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CBC_QRCodeReader::Init() {
45ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_decoder = new CBC_QRCoderDecoder;
46ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_decoder->Init();
47ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
48ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCBC_QRCodeReader::~CBC_QRCodeReader() {
49ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_decoder != NULL) {
50ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    delete m_decoder;
51ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
52ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_decoder = NULL;
53ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
54ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_ByteString CBC_QRCodeReader::Decode(CBC_BinaryBitmap* image,
55ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                        int32_t hints,
56ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                        int32_t& e) {
57ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CBC_CommonBitMatrix* matrix = image->GetMatrix(e);
58ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  BC_EXCEPTION_CHECK_ReturnValue(e, "");
59ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CBC_QRDetector detector(matrix);
60ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CBC_QRDetectorResult* qdr = detector.Detect(hints, e);
61ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  BC_EXCEPTION_CHECK_ReturnValue(e, "");
62ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CBC_AutoPtr<CBC_QRDetectorResult> detectorResult(qdr);
63ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CBC_CommonDecoderResult* qdr2 =
64ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_decoder->Decode(detectorResult->GetBits(), 0, e);
65ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  BC_EXCEPTION_CHECK_ReturnValue(e, "");
66ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CBC_AutoPtr<CBC_CommonDecoderResult> decodeResult(qdr2);
67ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return (decodeResult->GetText());
68ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
69ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_ByteString CBC_QRCodeReader::Decode(const CFX_WideString& filename,
70ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                        int32_t hints,
71ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                        int32_t byteModeDecode,
72ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                        int32_t& e) {
73ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CBC_BufferedImageLuminanceSource source(filename);
74ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  source.Init(e);
75ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  BC_EXCEPTION_CHECK_ReturnValue(e, "");
76ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CBC_GlobalHistogramBinarizer binarizer(&source);
77ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CBC_BinaryBitmap bitmap(&binarizer);
78ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_ByteString bs = Decode(&bitmap, hints, e);
79ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  BC_EXCEPTION_CHECK_ReturnValue(e, "");
80ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return bs;
81ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
82ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_ByteString CBC_QRCodeReader::Decode(CFX_DIBitmap* pBitmap,
83ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                        int32_t hints,
84ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                        int32_t byteModeDecode,
85ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                        int32_t& e) {
86ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CBC_BufferedImageLuminanceSource source(pBitmap);
87ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CBC_GlobalHistogramBinarizer binarizer(&source);
88ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CBC_BinaryBitmap bitmap(&binarizer);
89ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_ByteString bs = Decode(&bitmap, hints, e);
90ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  BC_EXCEPTION_CHECK_ReturnValue(e, "");
91ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return bs;
92ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
93ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_ByteString CBC_QRCodeReader::Decode(CBC_BinaryBitmap* image, int32_t& e) {
94ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_ByteString bs = Decode(image, 0, e);
95ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  BC_EXCEPTION_CHECK_ReturnValue(e, "");
96ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return bs;
97ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
98ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CBC_QRCodeReader::ReleaseAll() {
99ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (CBC_ReedSolomonGF256::QRCodeFild) {
100ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    delete CBC_ReedSolomonGF256::QRCodeFild;
101ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CBC_ReedSolomonGF256::QRCodeFild = NULL;
102ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
103ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (CBC_ReedSolomonGF256::DataMatrixField) {
104ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    delete CBC_ReedSolomonGF256::DataMatrixField;
105ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CBC_ReedSolomonGF256::DataMatrixField = NULL;
106ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
107ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CBC_QRCoderMode::Destroy();
108ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CBC_QRCoderErrorCorrectionLevel::Destroy();
109ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CBC_QRDataMask::Destroy();
110ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CBC_QRCoderVersion::Destroy();
111ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
112