mv_barcode: clean duplicate code
authorKwanghoon Son <k.son@samsung.com>
Fri, 6 Jan 2023 10:15:40 +0000 (19:15 +0900)
committerKwanghoon Son <k.son@samsung.com>
Mon, 13 Feb 2023 02:31:48 +0000 (11:31 +0900)
mv_barcode_generate_{source,image}_open share duplicate code

Change-Id: Icf22352e4225de141d54c1a677f52dff958cbc23
Signed-off-by: Kwanghoon Son <k.son@samsung.com>
mv_barcode/barcode_generator/src/mv_barcode_generate_open.cpp
test/testsuites/barcode/test_barcode.cpp

index 32657d4..d7e77c5 100644 (file)
@@ -217,83 +217,104 @@ BarcodeImageFormat convertImageFormat(mv_barcode_image_format_e format)
 
 } /* anonymous namespace */
 
-int mv_barcode_generate_source_open(mv_engine_config_h engine_cfg, const char *message, mv_barcode_type_e type,
-                                                                       mv_barcode_qr_mode_e qr_enc_mode, mv_barcode_qr_ecc_e qr_ecc, int qr_version,
-                                                                       mv_source_h image)
+static int prepareMessageToGenerate(const char *message, mv_barcode_type_e type, mv_barcode_qr_mode_e qr_enc_mode,
+                                                                       std::string &messageStr)
+{
+       messageStr = message;
+       switch (qr_enc_mode) {
+       case MV_BARCODE_QR_MODE_NUMERIC:
+               if (messageStr.find_first_not_of("0123456789") != std::string::npos) {
+                       LOGE("Barcode message can't be used according to support "
+                                "numeric (0..9) mode: %s",
+                                messageStr.c_str());
+                       return MEDIA_VISION_ERROR_INVALID_PARAMETER;
+               }
+               break;
+       case MV_BARCODE_QR_MODE_ALPHANUMERIC:
+               if (type == MV_BARCODE_QR) {
+                       int error = alphanumToUpper(messageStr);
+                       if (error != BARCODE_ERROR_NONE)
+                               return convertBarcodeError(error);
+               }
+               break;
+       default:
+               break;
+       }
+       return MEDIA_VISION_ERROR_NONE;
+}
+
+/*
+The input colorspace is RGB but the generators' is BGR.
+Replace the value of R with that of B
+*/
+static void swapBR(uint16_t *color)
 {
-       std::string messageStr = std::string(message);
+       std::swap(color[0], color[2]);
+}
+
+static int getColorFromEngine(mv_engine_config_h engine_cfg, mv_barcode_type_e type, int &showText, char **fgcolour,
+                                                         char **bgcolour)
+{
+       if (!engine_cfg)
+               return MEDIA_VISION_ERROR_NONE;
 
-       if (qr_enc_mode == MV_BARCODE_QR_MODE_NUMERIC && messageStr.find_first_not_of("0123456789") != std::string::npos) {
-               LOGE("Barcode message can't be used according to support "
-                        "numeric (0..9) mode: %s",
-                        messageStr.c_str());
-               return MEDIA_VISION_ERROR_INVALID_DATA;
+       int error = mv_engine_config_get_int_attribute(engine_cfg, MV_BARCODE_GENERATE_ATTR_TEXT, &showText);
+       if (error != MEDIA_VISION_ERROR_NONE) {
+               LOGE("mv_engine_config_get_int_attribute failed");
+               return error;
        }
 
-       int error = BARCODE_ERROR_NONE;
-       if (MV_BARCODE_QR == type && MV_BARCODE_QR_MODE_ALPHANUMERIC == qr_enc_mode) {
-               error = alphanumToUpper(messageStr);
-               if (BARCODE_ERROR_NONE != error)
-                       return convertBarcodeError(error);
+       if (showText == BARCODE_GEN_TEXT_VISIBLE && type == MV_BARCODE_QR) {
+               LOGE("QR code generation with visible text is not supported");
+               return MEDIA_VISION_ERROR_INVALID_OPERATION;
        }
 
-       unsigned char *imageBuffer = NULL;
-       unsigned int imageWidth = 0u;
-       unsigned int imageHeight = 0u;
-       unsigned int imageChannels = 0u;
+       /* get color value */
+       error = mv_engine_config_get_string_attribute(engine_cfg, MV_BARCODE_GENERATE_ATTR_COLOR_FRONT, fgcolour);
+       if (error != MEDIA_VISION_ERROR_NONE) {
+               LOGE("mv_engine_config_get_string_attribute failed");
+               return error;
+       }
 
-       int showText = 0;
-       char value;
-       char *fgcolour = NULL;
-       char *bgcolour = NULL;
+       error = mv_engine_config_get_string_attribute(engine_cfg, MV_BARCODE_GENERATE_ATTR_COLOR_BACK, bgcolour);
+       if (error != MEDIA_VISION_ERROR_NONE) {
+               free(*fgcolour);
+               LOGE("mv_engine_config_get_string_attribute failed");
+               return error;
+       }
 
-       if (engine_cfg != NULL) {
-               error = mv_engine_config_get_int_attribute(engine_cfg, "MV_BARCODE_GENERATE_ATTR_TEXT", &showText);
-               if (error != MEDIA_VISION_ERROR_NONE) {
-                       LOGE("mv_engine_config_get_int_attribute failed");
-                       return error;
-               }
+       swapBR((uint16_t *) *fgcolour);
+       swapBR((uint16_t *) *bgcolour);
 
-               if (showText == BARCODE_GEN_TEXT_VISIBLE && type == MV_BARCODE_QR) {
-                       LOGE("QR code generation with visible text is not supported");
-                       return MEDIA_VISION_ERROR_INVALID_OPERATION;
-               }
+       return MEDIA_VISION_ERROR_NONE;
+}
 
-               /* set color value */
-               error = mv_engine_config_get_string_attribute(engine_cfg, "MV_BARCODE_GENERATE_ATTR_COLOR_FRONT", &fgcolour);
-               if (error != MEDIA_VISION_ERROR_NONE) {
-                       LOGE("mv_engine_config_get_string_attribute failed");
-                       return error;
-               }
+int mv_barcode_generate_source_open(mv_engine_config_h engine_cfg, const char *message, mv_barcode_type_e type,
+                                                                       mv_barcode_qr_mode_e qr_enc_mode, mv_barcode_qr_ecc_e qr_ecc, int qr_version,
+                                                                       mv_source_h image)
+{
+       std::string messageStr;
+       int error = prepareMessageToGenerate(message, type, qr_enc_mode, messageStr);
+       if (error != MEDIA_VISION_ERROR_NONE) {
+               LOGE("prepareMessageToGenerate failed");
+               return error;
+       }
 
-               error = mv_engine_config_get_string_attribute(engine_cfg, "MV_BARCODE_GENERATE_ATTR_COLOR_BACK", &bgcolour);
-               if (error != MEDIA_VISION_ERROR_NONE) {
-                       free(fgcolour);
-                       LOGE("mv_engine_config_get_string_attribute failed");
-                       return error;
-               }
+       int showText = 0;
+       char *fgcolour = NULL;
+       char *bgcolour = NULL;
 
-               /*
-               The input colorspace is RGB but the generators' is BGR.
-               Replace the value of R with that of B
-               */
-               value = fgcolour[0];
-               fgcolour[0] = fgcolour[4];
-               fgcolour[4] = value;
-
-               value = fgcolour[1];
-               fgcolour[1] = fgcolour[5];
-               fgcolour[5] = value;
-
-               value = bgcolour[0];
-               bgcolour[0] = bgcolour[4];
-               bgcolour[4] = value;
-
-               value = bgcolour[1];
-               bgcolour[1] = bgcolour[5];
-               bgcolour[5] = value;
+       error = getColorFromEngine(engine_cfg, type, showText, &fgcolour, &bgcolour);
+       if (error != MEDIA_VISION_ERROR_NONE) {
+               LOGE("getColorFromEngine failed");
+               return error;
        }
 
+       unsigned char *imageBuffer = NULL;
+       unsigned int imageWidth = 0u;
+       unsigned int imageHeight = 0u;
+       unsigned int imageChannels = 0u;
+
        error = BarcodeGenerator::generateBarcodeToBuffer(&imageBuffer, &imageWidth, &imageHeight, &imageChannels,
                                                                                                          messageStr, convertBarcodeType(type),
                                                                                                          convertEncodingMode(qr_enc_mode), convertECC(qr_ecc), qr_version,
@@ -330,79 +351,26 @@ int mv_barcode_generate_image_open(mv_engine_config_h engine_cfg, const char *me
                                                                   mv_barcode_qr_ecc_e qr_ecc, int qr_version, const char *image_path,
                                                                   mv_barcode_image_format_e image_format)
 {
-       std::string messageStr = std::string(message);
-
-       if (qr_enc_mode == MV_BARCODE_QR_MODE_NUMERIC && messageStr.find_first_not_of("0123456789") != std::string::npos) {
-               LOGE("Barcode message can't be used according to support "
-                        "numeric (0..9) mode: %s",
-                        messageStr.c_str());
-               return MEDIA_VISION_ERROR_INVALID_DATA;
-       }
-
-       if (NULL == image_path) {
+       if (!image_path) {
                LOGE("Can't save barcode image to the path[%p]. The path has to be specified", image_path);
                return MEDIA_VISION_ERROR_INVALID_PATH;
        }
 
-       int error = BARCODE_ERROR_NONE;
-       if (MV_BARCODE_QR == type && MV_BARCODE_QR_MODE_ALPHANUMERIC == qr_enc_mode) {
-               error = alphanumToUpper(messageStr);
-               if (BARCODE_ERROR_NONE != error) {
-                       return convertBarcodeError(error);
-               }
+       std::string messageStr;
+       int error = prepareMessageToGenerate(message, type, qr_enc_mode, messageStr);
+       if (error != MEDIA_VISION_ERROR_NONE) {
+               LOGE("prepareMessageToGenerate failed");
+               return error;
        }
 
        int showText = 0;
-       char value;
        char *fgcolour = NULL;
        char *bgcolour = NULL;
 
-       if (engine_cfg != NULL) {
-               /* set visible text attribute */
-               error = mv_engine_config_get_int_attribute(engine_cfg, "MV_BARCODE_GENERATE_ATTR_TEXT", &showText);
-               if (error != MEDIA_VISION_ERROR_NONE) {
-                       LOGE("mv_engine_config_get_int_attribute failed");
-                       return error;
-               }
-
-               if (showText == BARCODE_GEN_TEXT_VISIBLE && type == MV_BARCODE_QR) {
-                       LOGE("QR code generation with visible text is not supported");
-                       return MEDIA_VISION_ERROR_INVALID_OPERATION;
-               }
-
-               /* set color value */
-               error = mv_engine_config_get_string_attribute(engine_cfg, "MV_BARCODE_GENERATE_ATTR_COLOR_FRONT", &fgcolour);
-               if (error != MEDIA_VISION_ERROR_NONE) {
-                       LOGE("mv_engine_config_get_string_attribute failed");
-                       return error;
-               }
-
-               error = mv_engine_config_get_string_attribute(engine_cfg, "MV_BARCODE_GENERATE_ATTR_COLOR_BACK", &bgcolour);
-               if (error != MEDIA_VISION_ERROR_NONE) {
-                       free(fgcolour);
-                       LOGE("mv_engine_config_get_string_attribute failed");
-                       return error;
-               }
-
-               /*
-               The input colorspace is RGB but the generators' is BGR.
-               Replace the value of R with that of B
-               */
-               value = fgcolour[0];
-               fgcolour[0] = fgcolour[4];
-               fgcolour[4] = value;
-
-               value = fgcolour[1];
-               fgcolour[1] = fgcolour[5];
-               fgcolour[5] = value;
-
-               value = bgcolour[0];
-               bgcolour[0] = bgcolour[4];
-               bgcolour[4] = value;
-
-               value = bgcolour[1];
-               bgcolour[1] = bgcolour[5];
-               bgcolour[5] = value;
+       error = getColorFromEngine(engine_cfg, type, showText, &fgcolour, &bgcolour);
+       if (error != MEDIA_VISION_ERROR_NONE) {
+               LOGE("getColorFromEngine failed");
+               return error;
        }
 
        error = BarcodeGenerator::generateBarcodeToImage(std::string(image_path), convertImageFormat(image_format),
index 6d123eb..92b0bc1 100644 (file)
@@ -136,9 +136,9 @@ TEST_F(TestBarcodeGen, SimpleNegativeQR)
 TEST_F(TestBarcodeGen, ColorPositiveQR)
 {
        ASSERT_EQ(mv_create_engine_config(&engine_cfg), MEDIA_VISION_ERROR_NONE);
-       ASSERT_EQ(mv_engine_config_set_string_attribute(engine_cfg, "MV_BARCODE_GENERATE_ATTR_COLOR_FRONT", "3366ff"),
+       ASSERT_EQ(mv_engine_config_set_string_attribute(engine_cfg, MV_BARCODE_GENERATE_ATTR_COLOR_FRONT, "3366ff"),
                          MEDIA_VISION_ERROR_NONE);
-       ASSERT_EQ(mv_engine_config_set_string_attribute(engine_cfg, "MV_BARCODE_GENERATE_ATTR_COLOR_BACK", "ff9966"),
+       ASSERT_EQ(mv_engine_config_set_string_attribute(engine_cfg, MV_BARCODE_GENERATE_ATTR_COLOR_BACK, "ff9966"),
                          MEDIA_VISION_ERROR_NONE);
        ASSERT_EQ(mv_barcode_generate_image(engine_cfg, "1239592https://test.com", 100, 100, type, qr_enc_mode, qr_ecc,
                                                                                qr_version, test_file.c_str(), image_format),