Clean up CBC_SymbolInfo.

- Remove rectangular ctor param. It can be derived from dimensions.
- Make members private and add accessors.
- Remove exceptions that cannot occur.

Change-Id: Iec113205241562a0559e594fe257f5b9064ed97e
Reviewed-on: https://pdfium-review.googlesource.com/5737
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/fxbarcode/datamatrix/BC_Base256Encoder.cpp b/fxbarcode/datamatrix/BC_Base256Encoder.cpp
index a360f63..c34ff02 100644
--- a/fxbarcode/datamatrix/BC_Base256Encoder.cpp
+++ b/fxbarcode/datamatrix/BC_Base256Encoder.cpp
@@ -59,7 +59,7 @@
   if (e != BCExceptionNO) {
     return;
   }
-  bool mustPad = (context.m_symbolInfo->m_dataCapacity - currentSize) > 0;
+  bool mustPad = (context.m_symbolInfo->dataCapacity() - currentSize) > 0;
   if (context.hasMoreCharacters() || mustPad) {
     if (dataCount <= 249) {
       buffer.SetAt(0, (wchar_t)dataCount);
diff --git a/fxbarcode/datamatrix/BC_C40Encoder.cpp b/fxbarcode/datamatrix/BC_C40Encoder.cpp
index a264482..11d477c 100644
--- a/fxbarcode/datamatrix/BC_C40Encoder.cpp
+++ b/fxbarcode/datamatrix/BC_C40Encoder.cpp
@@ -65,7 +65,7 @@
     if (e != BCExceptionNO) {
       return;
     }
-    int32_t available = context.m_symbolInfo->m_dataCapacity - curCodewordCount;
+    int32_t available = context.m_symbolInfo->dataCapacity() - curCodewordCount;
     if (!context.hasMoreCharacters()) {
       if ((buffer.GetLength() % 3) == 2) {
         if (available < 2 || available > 2) {
@@ -113,7 +113,7 @@
   if (e != BCExceptionNO) {
     return;
   }
-  int32_t available = context.m_symbolInfo->m_dataCapacity - curCodewordCount;
+  int32_t available = context.m_symbolInfo->dataCapacity() - curCodewordCount;
   if (rest == 2) {
     buffer += (wchar_t)'\0';
     while (buffer.GetLength() >= 3) {
diff --git a/fxbarcode/datamatrix/BC_DataMatrixSymbolInfo144.cpp b/fxbarcode/datamatrix/BC_DataMatrixSymbolInfo144.cpp
index d0ccfc2..c0994af 100644
--- a/fxbarcode/datamatrix/BC_DataMatrixSymbolInfo144.cpp
+++ b/fxbarcode/datamatrix/BC_DataMatrixSymbolInfo144.cpp
@@ -26,15 +26,15 @@
 #include "fxbarcode/datamatrix/BC_SymbolShapeHint.h"
 
 CBC_DataMatrixSymbolInfo144::CBC_DataMatrixSymbolInfo144()
-    : CBC_SymbolInfo(false, 1558, 620, 22, 22, 36) {
-  m_rsBlockData = -1;
-  m_rsBlockError = 62;
-}
+    : CBC_SymbolInfo(1558, 620, 22, 22, 36, -1, 62) {}
+
 CBC_DataMatrixSymbolInfo144::~CBC_DataMatrixSymbolInfo144() {}
+
 int32_t CBC_DataMatrixSymbolInfo144::getInterleavedBlockCount() {
   return 10;
 }
+
 int32_t CBC_DataMatrixSymbolInfo144getDataLengthForInterleavedBlock(
     int32_t index) {
-  return (index <= 8) ? 156 : 155;
+  return index <= 8 ? 156 : 155;
 }
diff --git a/fxbarcode/datamatrix/BC_DataMatrixWriter.cpp b/fxbarcode/datamatrix/BC_DataMatrixWriter.cpp
index f45c338..0754493 100644
--- a/fxbarcode/datamatrix/BC_DataMatrixWriter.cpp
+++ b/fxbarcode/datamatrix/BC_DataMatrixWriter.cpp
@@ -50,50 +50,45 @@
 std::unique_ptr<CBC_CommonByteMatrix> encodeLowLevel(
     CBC_DefaultPlacement* placement,
     CBC_SymbolInfo* symbolInfo) {
-  int32_t e = BCExceptionNO;
-  int32_t symbolWidth = symbolInfo->getSymbolDataWidth(e);
-  if (e != BCExceptionNO)
-    return nullptr;
-  int32_t symbolHeight = symbolInfo->getSymbolDataHeight(e);
-  if (e != BCExceptionNO)
-    return nullptr;
-  int32_t width = symbolInfo->getSymbolWidth(e);
-  if (e != BCExceptionNO)
-    return nullptr;
-  int32_t height = symbolInfo->getSymbolHeight(e);
-  if (e != BCExceptionNO)
-    return nullptr;
+  int32_t symbolWidth = symbolInfo->getSymbolDataWidth();
+  ASSERT(symbolWidth);
+  int32_t symbolHeight = symbolInfo->getSymbolDataHeight();
+  ASSERT(symbolHeight);
+  int32_t width = symbolInfo->getSymbolWidth();
+  ASSERT(width);
+  int32_t height = symbolInfo->getSymbolHeight();
+  ASSERT(height);
 
   auto matrix = pdfium::MakeUnique<CBC_CommonByteMatrix>(width, height);
   matrix->Init();
   int32_t matrixY = 0;
   for (int32_t y = 0; y < symbolHeight; y++) {
     int32_t matrixX;
-    if ((y % symbolInfo->m_matrixHeight) == 0) {
+    if ((y % symbolInfo->matrixHeight()) == 0) {
       matrixX = 0;
-      for (int32_t x = 0; x < symbolInfo->getSymbolWidth(e); x++) {
-        matrix->Set(matrixX, matrixY, (x % 2) == 0);
+      for (int32_t x = 0; x < width; x++) {
+        matrix->Set(matrixX, matrixY, x % 2 == 0);
         matrixX++;
       }
       matrixY++;
     }
     matrixX = 0;
     for (int32_t x = 0; x < symbolWidth; x++) {
-      if ((x % symbolInfo->m_matrixWidth) == 0) {
+      if (x % symbolInfo->matrixWidth() == 0) {
         matrix->Set(matrixX, matrixY, true);
         matrixX++;
       }
       matrix->Set(matrixX, matrixY, placement->getBit(x, y));
       matrixX++;
-      if ((x % symbolInfo->m_matrixWidth) == symbolInfo->m_matrixWidth - 1) {
-        matrix->Set(matrixX, matrixY, (y % 2) == 0);
+      if (x % symbolInfo->matrixWidth() == symbolInfo->matrixWidth() - 1) {
+        matrix->Set(matrixX, matrixY, y % 2 == 0);
         matrixX++;
       }
     }
     matrixY++;
-    if ((y % symbolInfo->m_matrixHeight) == symbolInfo->m_matrixHeight - 1) {
+    if (y % symbolInfo->matrixHeight() == symbolInfo->matrixHeight() - 1) {
       matrixX = 0;
-      for (int32_t x = 0; x < symbolInfo->getSymbolWidth(e); x++) {
+      for (int32_t x = 0; x < width; x++) {
         matrix->Set(matrixX, matrixY, true);
         matrixX++;
       }
@@ -106,7 +101,9 @@
 }  // namespace
 
 CBC_DataMatrixWriter::CBC_DataMatrixWriter() {}
+
 CBC_DataMatrixWriter::~CBC_DataMatrixWriter() {}
+
 bool CBC_DataMatrixWriter::SetErrorCorrectionLevel(int32_t level) {
   m_iCorrectLevel = level;
   return true;
@@ -135,13 +132,10 @@
   if (e != BCExceptionNO)
     return nullptr;
 
-  int32_t width = symbolInfo->getSymbolDataWidth(e);
-  if (e != BCExceptionNO)
-    return nullptr;
-
-  int32_t height = symbolInfo->getSymbolDataHeight(e);
-  if (e != BCExceptionNO)
-    return nullptr;
+  int32_t width = symbolInfo->getSymbolDataWidth();
+  ASSERT(width);
+  int32_t height = symbolInfo->getSymbolDataHeight();
+  ASSERT(height);
 
   auto placement =
       pdfium::MakeUnique<CBC_DefaultPlacement>(codewords, width, height);
diff --git a/fxbarcode/datamatrix/BC_EdifactEncoder.cpp b/fxbarcode/datamatrix/BC_EdifactEncoder.cpp
index 9231b1e..cc72a31 100644
--- a/fxbarcode/datamatrix/BC_EdifactEncoder.cpp
+++ b/fxbarcode/datamatrix/BC_EdifactEncoder.cpp
@@ -66,7 +66,7 @@
       return false;
 
     int32_t available =
-        context->m_symbolInfo->m_dataCapacity - context->getCodewordCount();
+        context->m_symbolInfo->dataCapacity() - context->getCodewordCount();
     int32_t remaining = context->getRemainingCharacters();
     if (remaining == 0 && available <= 2)
       return true;
@@ -86,7 +86,7 @@
       return false;
 
     int32_t available =
-        context->m_symbolInfo->m_dataCapacity - context->getCodewordCount();
+        context->m_symbolInfo->dataCapacity() - context->getCodewordCount();
     if (available >= 3) {
       restInAscii = false;
       context->updateSymbolInfo(
diff --git a/fxbarcode/datamatrix/BC_EncoderContext.cpp b/fxbarcode/datamatrix/BC_EncoderContext.cpp
index 0411d03..b471965 100644
--- a/fxbarcode/datamatrix/BC_EncoderContext.cpp
+++ b/fxbarcode/datamatrix/BC_EncoderContext.cpp
@@ -90,7 +90,7 @@
   updateSymbolInfo(getCodewordCount(), e);
 }
 void CBC_EncoderContext::updateSymbolInfo(int32_t len, int32_t& e) {
-  if (!m_symbolInfo || len > m_symbolInfo->m_dataCapacity) {
+  if (!m_symbolInfo || len > m_symbolInfo->dataCapacity()) {
     m_symbolInfo = CBC_SymbolInfo::lookup(len, m_shape, true, e);
     if (e != BCExceptionNO)
       return;
diff --git a/fxbarcode/datamatrix/BC_ErrorCorrection.cpp b/fxbarcode/datamatrix/BC_ErrorCorrection.cpp
index cd2355b..cc6d1b3 100644
--- a/fxbarcode/datamatrix/BC_ErrorCorrection.cpp
+++ b/fxbarcode/datamatrix/BC_ErrorCorrection.cpp
@@ -123,7 +123,7 @@
 CFX_WideString CBC_ErrorCorrection::encodeECC200(CFX_WideString codewords,
                                                  CBC_SymbolInfo* symbolInfo,
                                                  int32_t& e) {
-  if (codewords.GetLength() != symbolInfo->m_dataCapacity) {
+  if (codewords.GetLength() != symbolInfo->dataCapacity()) {
     e = BCExceptionIllegalArgument;
     return CFX_WideString();
   }
@@ -132,7 +132,7 @@
   int32_t blockCount = symbolInfo->getInterleavedBlockCount();
   if (blockCount == 1) {
     CFX_WideString ecc =
-        createECCBlock(codewords, symbolInfo->m_errorCodewords, e);
+        createECCBlock(codewords, symbolInfo->errorCodewords(), e);
     if (e != BCExceptionNO)
       return CFX_WideString();
     sb += ecc;
@@ -150,7 +150,7 @@
     }
     for (int32_t block = 0; block < blockCount; block++) {
       CFX_WideString temp;
-      for (int32_t d = block; d < symbolInfo->m_dataCapacity; d += blockCount) {
+      for (int32_t d = block; d < symbolInfo->dataCapacity(); d += blockCount) {
         temp += (wchar_t)codewords.GetAt(d);
       }
       CFX_WideString ecc = createECCBlock(temp, errorSizes[block], e);
@@ -159,7 +159,7 @@
       int32_t pos = 0;
       for (int32_t l = block; l < errorSizes[block] * blockCount;
            l += blockCount) {
-        sb.SetAt(symbolInfo->m_dataCapacity + l, ecc.GetAt(pos++));
+        sb.SetAt(symbolInfo->dataCapacity() + l, ecc.GetAt(pos++));
       }
     }
   }
diff --git a/fxbarcode/datamatrix/BC_HighLevelEncoder.cpp b/fxbarcode/datamatrix/BC_HighLevelEncoder.cpp
index 93f2030..dd92f5e 100644
--- a/fxbarcode/datamatrix/BC_HighLevelEncoder.cpp
+++ b/fxbarcode/datamatrix/BC_HighLevelEncoder.cpp
@@ -114,7 +114,7 @@
   if (e != BCExceptionNO)
     return L"";
 
-  int32_t capacity = context.m_symbolInfo->m_dataCapacity;
+  int32_t capacity = context.m_symbolInfo->dataCapacity();
   if (len < capacity) {
     if (encodingMode != ASCII_ENCODATION &&
         encodingMode != BASE256_ENCODATION) {
diff --git a/fxbarcode/datamatrix/BC_SymbolInfo.cpp b/fxbarcode/datamatrix/BC_SymbolInfo.cpp
index 5d12f1c..1d5a84f 100644
--- a/fxbarcode/datamatrix/BC_SymbolInfo.cpp
+++ b/fxbarcode/datamatrix/BC_SymbolInfo.cpp
@@ -41,35 +41,35 @@
 }  // namespace
 
 void CBC_SymbolInfo::Initialize() {
-  g_symbols[0] = new CBC_SymbolInfo(false, 3, 5, 8, 8, 1);
-  g_symbols[1] = new CBC_SymbolInfo(false, 5, 7, 10, 10, 1);
-  g_symbols[2] = new CBC_SymbolInfo(true, 5, 7, 16, 6, 1);
-  g_symbols[3] = new CBC_SymbolInfo(false, 8, 10, 12, 12, 1);
-  g_symbols[4] = new CBC_SymbolInfo(true, 10, 11, 14, 6, 2);
-  g_symbols[5] = new CBC_SymbolInfo(false, 12, 12, 14, 14, 1);
-  g_symbols[6] = new CBC_SymbolInfo(true, 16, 14, 24, 10, 1);
-  g_symbols[7] = new CBC_SymbolInfo(false, 18, 14, 16, 16, 1);
-  g_symbols[8] = new CBC_SymbolInfo(false, 22, 18, 18, 18, 1);
-  g_symbols[9] = new CBC_SymbolInfo(true, 22, 18, 16, 10, 2);
-  g_symbols[10] = new CBC_SymbolInfo(false, 30, 20, 20, 20, 1);
-  g_symbols[11] = new CBC_SymbolInfo(true, 32, 24, 16, 14, 2);
-  g_symbols[12] = new CBC_SymbolInfo(false, 36, 24, 22, 22, 1);
-  g_symbols[13] = new CBC_SymbolInfo(false, 44, 28, 24, 24, 1);
-  g_symbols[14] = new CBC_SymbolInfo(true, 49, 28, 22, 14, 2);
-  g_symbols[15] = new CBC_SymbolInfo(false, 62, 36, 14, 14, 4);
-  g_symbols[16] = new CBC_SymbolInfo(false, 86, 42, 16, 16, 4);
-  g_symbols[17] = new CBC_SymbolInfo(false, 114, 48, 18, 18, 4);
-  g_symbols[18] = new CBC_SymbolInfo(false, 144, 56, 20, 20, 4);
-  g_symbols[19] = new CBC_SymbolInfo(false, 174, 68, 22, 22, 4);
-  g_symbols[20] = new CBC_SymbolInfo(false, 204, 84, 24, 24, 4, 102, 42);
-  g_symbols[21] = new CBC_SymbolInfo(false, 280, 112, 14, 14, 16, 140, 56);
-  g_symbols[22] = new CBC_SymbolInfo(false, 368, 144, 16, 16, 16, 92, 36);
-  g_symbols[23] = new CBC_SymbolInfo(false, 456, 192, 18, 18, 16, 114, 48);
-  g_symbols[24] = new CBC_SymbolInfo(false, 576, 224, 20, 20, 16, 144, 56);
-  g_symbols[25] = new CBC_SymbolInfo(false, 696, 272, 22, 22, 16, 174, 68);
-  g_symbols[26] = new CBC_SymbolInfo(false, 816, 336, 24, 24, 16, 136, 56);
-  g_symbols[27] = new CBC_SymbolInfo(false, 1050, 408, 18, 18, 36, 175, 68);
-  g_symbols[28] = new CBC_SymbolInfo(false, 1304, 496, 20, 20, 36, 163, 62);
+  g_symbols[0] = new CBC_SymbolInfo(3, 5, 8, 8, 1);
+  g_symbols[1] = new CBC_SymbolInfo(5, 7, 10, 10, 1);
+  g_symbols[2] = new CBC_SymbolInfo(5, 7, 16, 6, 1);
+  g_symbols[3] = new CBC_SymbolInfo(8, 10, 12, 12, 1);
+  g_symbols[4] = new CBC_SymbolInfo(10, 11, 14, 6, 2);
+  g_symbols[5] = new CBC_SymbolInfo(12, 12, 14, 14, 1);
+  g_symbols[6] = new CBC_SymbolInfo(16, 14, 24, 10, 1);
+  g_symbols[7] = new CBC_SymbolInfo(18, 14, 16, 16, 1);
+  g_symbols[8] = new CBC_SymbolInfo(22, 18, 18, 18, 1);
+  g_symbols[9] = new CBC_SymbolInfo(22, 18, 16, 10, 2);
+  g_symbols[10] = new CBC_SymbolInfo(30, 20, 20, 20, 1);
+  g_symbols[11] = new CBC_SymbolInfo(32, 24, 16, 14, 2);
+  g_symbols[12] = new CBC_SymbolInfo(36, 24, 22, 22, 1);
+  g_symbols[13] = new CBC_SymbolInfo(44, 28, 24, 24, 1);
+  g_symbols[14] = new CBC_SymbolInfo(49, 28, 22, 14, 2);
+  g_symbols[15] = new CBC_SymbolInfo(62, 36, 14, 14, 4);
+  g_symbols[16] = new CBC_SymbolInfo(86, 42, 16, 16, 4);
+  g_symbols[17] = new CBC_SymbolInfo(114, 48, 18, 18, 4);
+  g_symbols[18] = new CBC_SymbolInfo(144, 56, 20, 20, 4);
+  g_symbols[19] = new CBC_SymbolInfo(174, 68, 22, 22, 4);
+  g_symbols[20] = new CBC_SymbolInfo(204, 84, 24, 24, 4, 102, 42);
+  g_symbols[21] = new CBC_SymbolInfo(280, 112, 14, 14, 16, 140, 56);
+  g_symbols[22] = new CBC_SymbolInfo(368, 144, 16, 16, 16, 92, 36);
+  g_symbols[23] = new CBC_SymbolInfo(456, 192, 18, 18, 16, 114, 48);
+  g_symbols[24] = new CBC_SymbolInfo(576, 224, 20, 20, 16, 144, 56);
+  g_symbols[25] = new CBC_SymbolInfo(696, 272, 22, 22, 16, 174, 68);
+  g_symbols[26] = new CBC_SymbolInfo(816, 336, 24, 24, 16, 136, 56);
+  g_symbols[27] = new CBC_SymbolInfo(1050, 408, 18, 18, 36, 175, 68);
+  g_symbols[28] = new CBC_SymbolInfo(1304, 496, 20, 20, 36, 163, 62);
   g_symbols[29] = new CBC_DataMatrixSymbolInfo144();
 }
 
@@ -80,48 +80,47 @@
   }
 }
 
-CBC_SymbolInfo::CBC_SymbolInfo(bool rectangular,
-                               int32_t dataCapacity,
+CBC_SymbolInfo::CBC_SymbolInfo(int32_t dataCapacity,
                                int32_t errorCodewords,
                                int32_t matrixWidth,
                                int32_t matrixHeight,
-                               int32_t dataRegions) {
-  m_rectangular = rectangular;
-  m_dataCapacity = dataCapacity;
-  m_errorCodewords = errorCodewords;
-  m_matrixWidth = matrixWidth;
-  m_matrixHeight = matrixHeight;
-  m_dataRegions = dataRegions;
-  m_rsBlockData = dataCapacity;
-  m_rsBlockError = errorCodewords;
-}
-CBC_SymbolInfo::CBC_SymbolInfo(bool rectangular,
-                               int32_t dataCapacity,
+                               int32_t dataRegions)
+    : CBC_SymbolInfo(dataCapacity,
+                     errorCodewords,
+                     matrixWidth,
+                     matrixHeight,
+                     dataRegions,
+                     dataCapacity,
+                     errorCodewords) {}
+
+CBC_SymbolInfo::CBC_SymbolInfo(int32_t dataCapacity,
                                int32_t errorCodewords,
                                int32_t matrixWidth,
                                int32_t matrixHeight,
                                int32_t dataRegions,
                                int32_t rsBlockData,
-                               int32_t rsBlockError) {
-  m_rectangular = rectangular;
-  m_dataCapacity = dataCapacity;
-  m_errorCodewords = errorCodewords;
-  m_matrixWidth = matrixWidth;
-  m_matrixHeight = matrixHeight;
-  m_dataRegions = dataRegions;
-  m_rsBlockData = rsBlockData;
-  m_rsBlockError = rsBlockError;
-}
+                               int32_t rsBlockError)
+    : m_rectangular(matrixWidth != matrixHeight),
+      m_dataCapacity(dataCapacity),
+      m_errorCodewords(errorCodewords),
+      m_matrixWidth(matrixWidth),
+      m_matrixHeight(matrixHeight),
+      m_dataRegions(dataRegions),
+      m_rsBlockData(rsBlockData),
+      m_rsBlockError(rsBlockError) {}
+
 CBC_SymbolInfo::~CBC_SymbolInfo() {}
 
 CBC_SymbolInfo* CBC_SymbolInfo::lookup(int32_t dataCodewords, int32_t& e) {
   return lookup(dataCodewords, FORCE_NONE, true, e);
 }
+
 CBC_SymbolInfo* CBC_SymbolInfo::lookup(int32_t dataCodewords,
                                        SymbolShapeHint shape,
                                        int32_t& e) {
   return lookup(dataCodewords, shape, true, e);
 }
+
 CBC_SymbolInfo* CBC_SymbolInfo::lookup(int32_t dataCodewords,
                                        bool allowRectangular,
                                        bool fail,
@@ -129,6 +128,7 @@
   SymbolShapeHint shape = allowRectangular ? FORCE_NONE : FORCE_SQUARE;
   return lookup(dataCodewords, shape, fail, e);
 }
+
 CBC_SymbolInfo* CBC_SymbolInfo::lookup(int32_t dataCodewords,
                                        SymbolShapeHint shape,
                                        bool fail,
@@ -139,7 +139,7 @@
         (shape == FORCE_RECTANGLE && !symbol->m_rectangular)) {
       continue;
     }
-    if (dataCodewords <= symbol->m_dataCapacity)
+    if (dataCodewords <= symbol->dataCapacity())
       return symbol;
   }
   if (fail)
@@ -147,7 +147,7 @@
   return nullptr;
 }
 
-int32_t CBC_SymbolInfo::getHorizontalDataRegions(int32_t& e) {
+int32_t CBC_SymbolInfo::getHorizontalDataRegions() const {
   switch (m_dataRegions) {
     case 1:
       return 1;
@@ -160,11 +160,12 @@
     case 36:
       return 6;
     default:
-      e = BCExceptionCannotHandleThisNumberOfDataRegions;
+      NOTREACHED();
       return 0;
   }
 }
-int32_t CBC_SymbolInfo::getVerticalDataRegions(int32_t& e) {
+
+int32_t CBC_SymbolInfo::getVerticalDataRegions() const {
   switch (m_dataRegions) {
     case 1:
       return 1;
@@ -177,31 +178,39 @@
     case 36:
       return 6;
     default:
-      e = BCExceptionCannotHandleThisNumberOfDataRegions;
+      NOTREACHED();
       return 0;
   }
 }
-int32_t CBC_SymbolInfo::getSymbolDataWidth(int32_t& e) {
-  return getHorizontalDataRegions(e) * m_matrixWidth;
+
+int32_t CBC_SymbolInfo::getSymbolDataWidth() const {
+  return getHorizontalDataRegions() * m_matrixWidth;
 }
-int32_t CBC_SymbolInfo::getSymbolDataHeight(int32_t& e) {
-  return getVerticalDataRegions(e) * m_matrixHeight;
+
+int32_t CBC_SymbolInfo::getSymbolDataHeight() const {
+  return getVerticalDataRegions() * m_matrixHeight;
 }
-int32_t CBC_SymbolInfo::getSymbolWidth(int32_t& e) {
-  return getSymbolDataWidth(e) + (getHorizontalDataRegions(e) * 2);
+
+int32_t CBC_SymbolInfo::getSymbolWidth() const {
+  return getSymbolDataWidth() + (getHorizontalDataRegions() * 2);
 }
-int32_t CBC_SymbolInfo::getSymbolHeight(int32_t& e) {
-  return getSymbolDataHeight(e) + (getVerticalDataRegions(e) * 2);
+
+int32_t CBC_SymbolInfo::getSymbolHeight() const {
+  return getSymbolDataHeight() + (getVerticalDataRegions() * 2);
 }
-int32_t CBC_SymbolInfo::getCodewordCount() {
+
+int32_t CBC_SymbolInfo::getCodewordCount() const {
   return m_dataCapacity + m_errorCodewords;
 }
-int32_t CBC_SymbolInfo::getInterleavedBlockCount() {
+
+int32_t CBC_SymbolInfo::getInterleavedBlockCount() const {
   return m_dataCapacity / m_rsBlockData;
 }
-int32_t CBC_SymbolInfo::getDataLengthForInterleavedBlock(int32_t index) {
+
+int32_t CBC_SymbolInfo::getDataLengthForInterleavedBlock(int32_t index) const {
   return m_rsBlockData;
 }
-int32_t CBC_SymbolInfo::getErrorLengthForInterleavedBlock(int32_t index) {
+
+int32_t CBC_SymbolInfo::getErrorLengthForInterleavedBlock(int32_t index) const {
   return m_rsBlockError;
 }
diff --git a/fxbarcode/datamatrix/BC_SymbolInfo.h b/fxbarcode/datamatrix/BC_SymbolInfo.h
index 0a5cd20..18d7b68 100644
--- a/fxbarcode/datamatrix/BC_SymbolInfo.h
+++ b/fxbarcode/datamatrix/BC_SymbolInfo.h
@@ -13,8 +13,7 @@
 
 class CBC_SymbolInfo : public CBC_SymbolShapeHint {
  public:
-  CBC_SymbolInfo(bool rectangular,
-                 int32_t dataCapacity,
+  CBC_SymbolInfo(int32_t dataCapacity,
                  int32_t errorCodewords,
                  int32_t matrixWidth,
                  int32_t matrixHeight,
@@ -36,27 +35,23 @@
                                 SymbolShapeHint shape,
                                 bool fail,
                                 int32_t& e);
-  int32_t getHorizontalDataRegions(int32_t& e);
-  int32_t getVerticalDataRegions(int32_t& e);
-  int32_t getSymbolDataWidth(int32_t& e);
-  int32_t getSymbolDataHeight(int32_t& e);
-  int32_t getSymbolWidth(int32_t& e);
-  int32_t getSymbolHeight(int32_t& e);
-  int32_t getCodewordCount();
-  int32_t getInterleavedBlockCount();
-  int32_t getDataLengthForInterleavedBlock(int32_t index);
-  int32_t getErrorLengthForInterleavedBlock(int32_t index);
 
-  int32_t m_dataCapacity;
-  int32_t m_errorCodewords;
-  int32_t m_matrixWidth;
-  int32_t m_matrixHeight;
-  int32_t m_rsBlockData;
-  int32_t m_rsBlockError;
+  int32_t getSymbolDataWidth() const;
+  int32_t getSymbolDataHeight() const;
+  int32_t getSymbolWidth() const;
+  int32_t getSymbolHeight() const;
+  int32_t getCodewordCount() const;
+  int32_t getInterleavedBlockCount() const;
+  int32_t getDataLengthForInterleavedBlock(int32_t index) const;
+  int32_t getErrorLengthForInterleavedBlock(int32_t index) const;
 
- private:
-  CBC_SymbolInfo(bool rectangular,
-                 int32_t dataCapacity,
+  int32_t dataCapacity() const { return m_dataCapacity; }
+  int32_t errorCodewords() const { return m_errorCodewords; }
+  int32_t matrixWidth() const { return m_matrixWidth; }
+  int32_t matrixHeight() const { return m_matrixHeight; }
+
+ protected:
+  CBC_SymbolInfo(int32_t dataCapacity,
                  int32_t errorCodewords,
                  int32_t matrixWidth,
                  int32_t matrixHeight,
@@ -64,8 +59,18 @@
                  int32_t rsBlockData,
                  int32_t rsBlockError);
 
-  bool m_rectangular;
-  int32_t m_dataRegions;
+ private:
+  int32_t getHorizontalDataRegions() const;
+  int32_t getVerticalDataRegions() const;
+
+  const bool m_rectangular;
+  const int32_t m_dataCapacity;
+  const int32_t m_errorCodewords;
+  const int32_t m_matrixWidth;
+  const int32_t m_matrixHeight;
+  const int32_t m_dataRegions;
+  const int32_t m_rsBlockData;
+  const int32_t m_rsBlockError;
 };
 
 #endif  // FXBARCODE_DATAMATRIX_BC_SYMBOLINFO_H_
diff --git a/fxbarcode/datamatrix/BC_X12Encoder.cpp b/fxbarcode/datamatrix/BC_X12Encoder.cpp
index 04bf958..0d874b0 100644
--- a/fxbarcode/datamatrix/BC_X12Encoder.cpp
+++ b/fxbarcode/datamatrix/BC_X12Encoder.cpp
@@ -66,7 +66,7 @@
     return;
   }
   int32_t available =
-      context.m_symbolInfo->m_dataCapacity - context.getCodewordCount();
+      context.m_symbolInfo->dataCapacity() - context.getCodewordCount();
   int32_t count = buffer.GetLength();
   if (count == 2) {
     context.writeCodeword(CBC_HighLevelEncoder::X12_UNLATCH);
diff --git a/fxbarcode/utils.h b/fxbarcode/utils.h
index e3fd1ac..60a38af 100644
--- a/fxbarcode/utils.h
+++ b/fxbarcode/utils.h
@@ -76,7 +76,6 @@
 #define BCExceptionInvalidateData 77
 #define BCExceptionCharactersOutsideISO88591Encoding 87
 #define BCExceptionIllegalDataCodewords 88
-#define BCExceptionCannotHandleThisNumberOfDataRegions 89
 #define BCExceptionIllegalStateUnexpectedCase 90
 #define BCExceptionIllegalStateMessageLengthInvalid 92
 #define BCExceptionIllegalArgumentNotGigits 93