Ejemplo n.º 1
0
CBC_CommonDecoderResult* CBC_QRCoderDecoder::Decode(FX_BOOL* image,
                                                    int32_t width,
                                                    int32_t height,
                                                    int32_t& e) {
  CBC_CommonBitMatrix bits;
  bits.Init(width);
  for (int32_t i = 0; i < width; i++) {
    for (int32_t j = 0; j < height; j++) {
      if (image[i * width + j]) {
        bits.Set(j, i);
      }
    }
  }
  CBC_CommonDecoderResult* cdr = Decode(&bits, height, e);
  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
  return cdr;
}
CBC_CommonBitMatrix* CBC_DataMatrixBitMatrixParser::ExtractDataRegion(
    CBC_CommonBitMatrix* bitMatrix,
    int32_t& e) {
  int32_t symbolSizeRows = m_version->GetSymbolSizeRows();
  int32_t symbolSizeColumns = m_version->GetSymbolSizeColumns();
  if (bitMatrix->GetHeight() != symbolSizeRows) {
    e = BCExceptionCanNotCallGetDimensionOnNonSquareMatrix;
    return NULL;
  }
  int32_t dataRegionSizeRows = m_version->GetDataRegionSizeRows();
  int32_t dataRegionSizeColumns = m_version->GetDataRegionSizeColumns();
  int32_t numDataRegionsRow = symbolSizeRows / dataRegionSizeRows;
  int32_t numDataRegionsColumn = symbolSizeColumns / dataRegionSizeColumns;
  int32_t sizeDataRegionRow = numDataRegionsRow * dataRegionSizeRows;
  int32_t sizeDataRegionColumn = numDataRegionsColumn * dataRegionSizeColumns;
  CBC_CommonBitMatrix* bitMatrixWithoutAlignment = new CBC_CommonBitMatrix();
  bitMatrixWithoutAlignment->Init(sizeDataRegionColumn, sizeDataRegionRow);
  int32_t dataRegionRow;
  for (dataRegionRow = 0; dataRegionRow < numDataRegionsRow; ++dataRegionRow) {
    int32_t dataRegionRowOffset = dataRegionRow * dataRegionSizeRows;
    int32_t dataRegionColumn;
    for (dataRegionColumn = 0; dataRegionColumn < numDataRegionsColumn;
         ++dataRegionColumn) {
      int32_t dataRegionColumnOffset = dataRegionColumn * dataRegionSizeColumns;
      int32_t i;
      for (i = 0; i < dataRegionSizeRows; ++i) {
        int32_t readRowOffset =
            dataRegionRow * (dataRegionSizeRows + 2) + 1 + i;
        int32_t writeRowOffset = dataRegionRowOffset + i;
        int32_t j;
        for (j = 0; j < dataRegionSizeColumns; ++j) {
          int32_t readColumnOffset =
              dataRegionColumn * (dataRegionSizeColumns + 2) + 1 + j;
          if (bitMatrix->Get(readColumnOffset, readRowOffset)) {
            int32_t writeColumnOffset = dataRegionColumnOffset + j;
            bitMatrixWithoutAlignment->Set(writeColumnOffset, writeRowOffset);
          }
        }
      }
    }
  }
  return bitMatrixWithoutAlignment;
}