// Path: src/main/java/uk/org/okapibarcode/util/Arrays.java
// public static int positionOf(char value, char[] array) {
//     for (int i = 0; i < array.length; i++) {
//         if (value == array[i]) {
//             return i;
//         }
//     }
//     throw new OkapiException("Unable to find character '" + value + "' in character array.");
// }
// 
// Path: src/main/java/uk/org/okapibarcode/util/Strings.java
// public static void binaryAppend(StringBuilder s, int value, int digits) {
//     int start = 0x01 << (digits - 1);
//     for (int i = 0; i < digits; i++) {
//         if ((value & (start >> i)) == 0) {
//             s.append('0');
//         } else {
//             s.append('1');
//         }
//     }
// }
// 
// Path: src/main/java/uk/org/okapibarcode/backend/DataBar14.java
// public enum Mode {
//     /** DataBar-14 */
//     LINEAR,
//     /** DataBar-14 Omnidirectional */
//     OMNI,
//     /** DataBar-14 Omnidirectional Stacked */
//     STACKED
// }


import static uk.org.okapibarcode.util.Arrays.positionOf;
import static uk.org.okapibarcode.util.Strings.binaryAppend;
import java.awt.geom.Rectangle2D;
import java.math.BigInteger;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import uk.org.okapibarcode.backend.DataBar14.Mode;
     * @param columns the number of segments in each row
     */
    public void setPreferredColumns(int columns) {
        if (columns < 1 || columns > 10) {
            throw new IllegalArgumentException("Invalid column count: " + columns);
        }
        this.preferredColumns = columns;
    }

    @Override
    protected void encode() {

        List < Rectangle2D.Double > combine_rect = new ArrayList<>();
        List < TextBox > combine_txt = new ArrayList<>();
        int top_shift = 0; // 2D component x-coordinate shift
        int bottom_shift = 0; // linear component x-coordinate shift
        linearWidth = 0;

        if (linearContent.isEmpty()) {
            throw new OkapiException("No linear data set");
        }

        // Manage composite component encoding first
        encodeComposite();

        // Then encode linear component
        Symbol linear;
        switch (symbology) {
            case UPCA:
                Upc upca = new Upc();
// Path: src/main/java/uk/org/okapibarcode/util/Arrays.java
// public static int positionOf(char value, char[] array) {
//     for (int i = 0; i < array.length; i++) {
//         if (value == array[i]) {
//             return i;
//         }
//     }
//     throw new OkapiException("Unable to find character '" + value + "' in character array.");
// }
// 
// Path: src/main/java/uk/org/okapibarcode/util/Strings.java
// public static void binaryAppend(StringBuilder s, int value, int digits) {
//     int start = 0x01 << (digits - 1);
//     for (int i = 0; i < digits; i++) {
//         if ((value & (start >> i)) == 0) {
//             s.append('0');
//         } else {
//             s.append('1');
//         }
//     }
// }
// 
// Path: src/main/java/uk/org/okapibarcode/backend/DataBar14.java
// public enum Mode {
//     /** DataBar-14 */
//     LINEAR,
//     /** DataBar-14 Omnidirectional */
//     OMNI,
//     /** DataBar-14 Omnidirectional Stacked */
//     STACKED
// }


// Path: src/main/java/uk/org/okapibarcode/backend/Composite.java
import static uk.org.okapibarcode.util.Arrays.positionOf;
import static uk.org.okapibarcode.util.Strings.binaryAppend;
import java.awt.geom.Rectangle2D;
import java.math.BigInteger;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import uk.org.okapibarcode.backend.DataBar14.Mode;

     * @param columns the number of segments in each row
     */
    public void setPreferredColumns(int columns) {
        if (columns < 1 || columns > 10) {
            throw new IllegalArgumentException("Invalid column count: " + columns);
        }
        this.preferredColumns = columns;
    }

    @Override
    protected void encode() {

        List < Rectangle2D.Double > combine_rect = new ArrayList<>();
        List < TextBox > combine_txt = new ArrayList<>();
        int top_shift = 0; // 2D component x-coordinate shift
        int bottom_shift = 0; // linear component x-coordinate shift
        linearWidth = 0;

        if (linearContent.isEmpty()) {
            throw new OkapiException("No linear data set");
        }

        // Manage composite component encoding first
        encodeComposite();

        // Then encode linear component
        Symbol linear;
        switch (symbology) {
            case UPCA:
                Upc upca = new Upc();
                upca.setMode(Upc.Mode.UPCA);