| /* |
| * Copyright 2013 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. |
| */ |
| |
| package com.google.zxing.aztec; |
| |
| import com.google.zxing.BarcodeFormat; |
| import com.google.zxing.EncodeHintType; |
| import com.google.zxing.Writer; |
| import com.google.zxing.aztec.encoder.AztecCode; |
| import com.google.zxing.aztec.encoder.Encoder; |
| import com.google.zxing.common.BitMatrix; |
| |
| import java.nio.charset.Charset; |
| import java.nio.charset.StandardCharsets; |
| import java.util.Map; |
| |
| /** |
| * Renders an Aztec code as a {@link BitMatrix}. |
| */ |
| public final class AztecWriter implements Writer { |
| |
| @Override |
| public BitMatrix encode(String contents, BarcodeFormat format, int width, int height) { |
| return encode(contents, format, width, height, null); |
| } |
| |
| @Override |
| public BitMatrix encode(String contents, BarcodeFormat format, int width, int height, Map<EncodeHintType,?> hints) { |
| Charset charset = StandardCharsets.ISO_8859_1; |
| int eccPercent = Encoder.DEFAULT_EC_PERCENT; |
| int layers = Encoder.DEFAULT_AZTEC_LAYERS; |
| if (hints != null) { |
| if (hints.containsKey(EncodeHintType.CHARACTER_SET)) { |
| charset = Charset.forName(hints.get(EncodeHintType.CHARACTER_SET).toString()); |
| } |
| if (hints.containsKey(EncodeHintType.ERROR_CORRECTION)) { |
| eccPercent = Integer.parseInt(hints.get(EncodeHintType.ERROR_CORRECTION).toString()); |
| } |
| if (hints.containsKey(EncodeHintType.AZTEC_LAYERS)) { |
| layers = Integer.parseInt(hints.get(EncodeHintType.AZTEC_LAYERS).toString()); |
| } |
| } |
| return encode(contents, format, width, height, charset, eccPercent, layers); |
| } |
| |
| private static BitMatrix encode(String contents, BarcodeFormat format, |
| int width, int height, |
| Charset charset, int eccPercent, int layers) { |
| if (format != BarcodeFormat.AZTEC) { |
| throw new IllegalArgumentException("Can only encode AZTEC, but got " + format); |
| } |
| AztecCode aztec = Encoder.encode(contents.getBytes(charset), eccPercent, layers); |
| return renderResult(aztec, width, height); |
| } |
| |
| private static BitMatrix renderResult(AztecCode code, int width, int height) { |
| BitMatrix input = code.getMatrix(); |
| if (input == null) { |
| throw new IllegalStateException(); |
| } |
| int inputWidth = input.getWidth(); |
| int inputHeight = input.getHeight(); |
| int outputWidth = Math.max(width, inputWidth); |
| int outputHeight = Math.max(height, inputHeight); |
| |
| int multiple = Math.min(outputWidth / inputWidth, outputHeight / inputHeight); |
| int leftPadding = (outputWidth - (inputWidth * multiple)) / 2; |
| int topPadding = (outputHeight - (inputHeight * multiple)) / 2; |
| |
| BitMatrix output = new BitMatrix(outputWidth, outputHeight); |
| |
| for (int inputY = 0, outputY = topPadding; inputY < inputHeight; inputY++, outputY += multiple) { |
| // Write the contents of this row of the barcode |
| for (int inputX = 0, outputX = leftPadding; inputX < inputWidth; inputX++, outputX += multiple) { |
| if (input.get(inputX, inputY)) { |
| output.setRegion(outputX, outputY, multiple, multiple); |
| } |
| } |
| } |
| return output; |
| } |
| } |