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
