1// Copyright 2016 PDFium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6/*
7 * Copyright 2011 ZXing authors
8 *
9 * Licensed under the Apache License, Version 2.0 (the "License");
10 * you may not use this file except in compliance with the License.
11 * You may obtain a copy of the License at
12 *
13 *      http://www.apache.org/licenses/LICENSE-2.0
14 *
15 * Unless required by applicable law or agreed to in writing, software
16 * distributed under the License is distributed on an "AS IS" BASIS,
17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18 * See the License for the specific language governing permissions and
19 * limitations under the License.
20 */
21
22#include "fxbarcode/cbc_codabar.h"
23
24#include <memory>
25
26#include "fxbarcode/oned/BC_OnedCodaBarWriter.h"
27#include "third_party/base/ptr_util.h"
28
29CBC_Codabar::CBC_Codabar()
30    : CBC_OneCode(pdfium::MakeUnique<CBC_OnedCodaBarWriter>()) {}
31
32CBC_Codabar::~CBC_Codabar() {}
33
34bool CBC_Codabar::SetStartChar(char start) {
35  return GetOnedCodaBarWriter()->SetStartChar(start);
36}
37
38bool CBC_Codabar::SetEndChar(char end) {
39  return GetOnedCodaBarWriter()->SetEndChar(end);
40}
41
42bool CBC_Codabar::SetTextLocation(BC_TEXT_LOC location) {
43  return GetOnedCodaBarWriter()->SetTextLocation(location);
44}
45
46bool CBC_Codabar::SetWideNarrowRatio(int8_t ratio) {
47  return GetOnedCodaBarWriter()->SetWideNarrowRatio(ratio);
48}
49
50bool CBC_Codabar::Encode(const WideStringView& contents) {
51  if (contents.IsEmpty())
52    return false;
53
54  BCFORMAT format = BCFORMAT_CODABAR;
55  int32_t outWidth = 0;
56  int32_t outHeight = 0;
57  WideString filtercontents = GetOnedCodaBarWriter()->FilterContents(contents);
58  ByteString byteString = filtercontents.UTF8Encode();
59  m_renderContents = filtercontents;
60  auto* pWriter = GetOnedCodaBarWriter();
61  std::unique_ptr<uint8_t, FxFreeDeleter> data(
62      pWriter->Encode(byteString, format, outWidth, outHeight));
63  if (!data)
64    return false;
65
66  return pWriter->RenderResult(filtercontents.AsStringView(), data.get(),
67                               outWidth);
68}
69
70bool CBC_Codabar::RenderDevice(CFX_RenderDevice* device,
71                               const CFX_Matrix* matrix) {
72  auto* pWriter = GetOnedCodaBarWriter();
73  WideString renderCon =
74      pWriter->encodedContents(m_renderContents.AsStringView());
75  return pWriter->RenderDeviceResult(device, matrix, renderCon.AsStringView());
76}
77
78BC_TYPE CBC_Codabar::GetType() {
79  return BC_CODABAR;
80}
81
82CBC_OnedCodaBarWriter* CBC_Codabar::GetOnedCodaBarWriter() {
83  return static_cast<CBC_OnedCodaBarWriter*>(m_pBCWriter.get());
84}
85