| OLD | NEW |
| (Empty) |
| 1 // Copyright 2014 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 // Original code is licensed as follows: | |
| 7 /* | |
| 8 * Copyright 2012 ZXing authors | |
| 9 * | |
| 10 * Licensed under the Apache License, Version 2.0 (the "License"); | |
| 11 * you may not use this file except in compliance with the License. | |
| 12 * You may obtain a copy of the License at | |
| 13 * | |
| 14 * http://www.apache.org/licenses/LICENSE-2.0 | |
| 15 * | |
| 16 * Unless required by applicable law or agreed to in writing, software | |
| 17 * distributed under the License is distributed on an "AS IS" BASIS, | |
| 18 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 19 * See the License for the specific language governing permissions and | |
| 20 * limitations under the License. | |
| 21 */ | |
| 22 | |
| 23 #include "xfa/src/fxbarcode/BC_TwoDimWriter.h" | |
| 24 #include "xfa/src/fxbarcode/common/BC_CommonBitArray.h" | |
| 25 #include "xfa/src/fxbarcode/common/BC_CommonBitMatrix.h" | |
| 26 #include "xfa/src/fxbarcode/pdf417/BC_PDF417.h" | |
| 27 #include "xfa/src/fxbarcode/pdf417/BC_PDF417BarcodeMatrix.h" | |
| 28 #include "xfa/src/fxbarcode/pdf417/BC_PDF417Compaction.h" | |
| 29 #include "xfa/src/fxbarcode/pdf417/BC_PDF417Writer.h" | |
| 30 | |
| 31 CBC_PDF417Writer::CBC_PDF417Writer() { | |
| 32 m_bFixedSize = FALSE; | |
| 33 } | |
| 34 CBC_PDF417Writer::~CBC_PDF417Writer() { | |
| 35 m_bTruncated = TRUE; | |
| 36 } | |
| 37 FX_BOOL CBC_PDF417Writer::SetErrorCorrectionLevel(int32_t level) { | |
| 38 if (level < 0 || level > 8) { | |
| 39 return FALSE; | |
| 40 } | |
| 41 m_iCorrectLevel = level; | |
| 42 return TRUE; | |
| 43 } | |
| 44 void CBC_PDF417Writer::SetTruncated(FX_BOOL truncated) { | |
| 45 m_bTruncated = truncated; | |
| 46 } | |
| 47 uint8_t* CBC_PDF417Writer::Encode(const CFX_WideString& contents, | |
| 48 int32_t& outWidth, | |
| 49 int32_t& outHeight, | |
| 50 int32_t& e) { | |
| 51 CBC_PDF417 encoder; | |
| 52 int32_t col = (m_Width / m_ModuleWidth - 69) / 17; | |
| 53 int32_t row = m_Height / (m_ModuleWidth * 20); | |
| 54 if (row >= 3 && row <= 90 && col >= 1 && col <= 30) { | |
| 55 encoder.setDimensions(col, col, row, row); | |
| 56 } else if (col >= 1 && col <= 30) { | |
| 57 encoder.setDimensions(col, col, 90, 3); | |
| 58 } else if (row >= 3 && row <= 90) { | |
| 59 encoder.setDimensions(30, 1, row, row); | |
| 60 } | |
| 61 encoder.generateBarcodeLogic(contents, m_iCorrectLevel, e); | |
| 62 BC_EXCEPTION_CHECK_ReturnValue(e, NULL); | |
| 63 int32_t lineThickness = 2; | |
| 64 int32_t aspectRatio = 4; | |
| 65 CBC_BarcodeMatrix* barcodeMatrix = encoder.getBarcodeMatrix(); | |
| 66 CFX_ByteArray originalScale; | |
| 67 originalScale.Copy(barcodeMatrix->getScaledMatrix( | |
| 68 lineThickness, aspectRatio * lineThickness)); | |
| 69 int32_t width = outWidth; | |
| 70 int32_t height = outHeight; | |
| 71 outWidth = barcodeMatrix->getWidth(); | |
| 72 outHeight = barcodeMatrix->getHeight(); | |
| 73 FX_BOOL rotated = FALSE; | |
| 74 if ((height > width) ^ (outWidth < outHeight)) { | |
| 75 rotateArray(originalScale, outHeight, outWidth); | |
| 76 rotated = TRUE; | |
| 77 int32_t temp = outHeight; | |
| 78 outHeight = outWidth; | |
| 79 outWidth = temp; | |
| 80 } | |
| 81 int32_t scaleX = width / outWidth; | |
| 82 int32_t scaleY = height / outHeight; | |
| 83 int32_t scale; | |
| 84 if (scaleX < scaleY) { | |
| 85 scale = scaleX; | |
| 86 } else { | |
| 87 scale = scaleY; | |
| 88 } | |
| 89 if (scale > 1) { | |
| 90 originalScale.RemoveAll(); | |
| 91 originalScale.Copy(barcodeMatrix->getScaledMatrix( | |
| 92 scale * lineThickness, scale * aspectRatio * lineThickness)); | |
| 93 if (rotated) { | |
| 94 rotateArray(originalScale, outHeight, outWidth); | |
| 95 int32_t temp = outHeight; | |
| 96 outHeight = outWidth; | |
| 97 outWidth = temp; | |
| 98 } | |
| 99 } | |
| 100 uint8_t* result = FX_Alloc2D(uint8_t, outHeight, outWidth); | |
| 101 FXSYS_memcpy(result, originalScale.GetData(), outHeight * outWidth); | |
| 102 return result; | |
| 103 } | |
| 104 void CBC_PDF417Writer::rotateArray(CFX_ByteArray& bitarray, | |
| 105 int32_t height, | |
| 106 int32_t width) { | |
| 107 CFX_ByteArray temp; | |
| 108 temp.Copy(bitarray); | |
| 109 for (int32_t ii = 0; ii < height; ii++) { | |
| 110 int32_t inverseii = height - ii - 1; | |
| 111 for (int32_t jj = 0; jj < width; jj++) { | |
| 112 bitarray[jj * height + inverseii] = temp[ii * width + jj]; | |
| 113 } | |
| 114 } | |
| 115 } | |
| OLD | NEW |