Add new definitions for coloring barcodes 22/64922/4
authorTae-Young Chung <ty83.chung@samsung.com>
Wed, 6 Apr 2016 08:33:08 +0000 (17:33 +0900)
committerTae-Young Chung <ty83.chung@samsung.com>
Mon, 18 Apr 2016 23:59:24 +0000 (08:59 +0900)
Change-Id: Ie25ef74b097c5cdcf291f28de9e92321ffc6a808
Signed-off-by: Tae-Young Chung <ty83.chung@samsung.com>
include/mv_barcode_generate.h
media-vision-config.json
mv_barcode/barcode_generator/include/BarcodeGenerator.h
mv_barcode/barcode_generator/src/BarcodeGenerator.cpp
mv_barcode/barcode_generator/src/mv_barcode_generate_open.cpp
packaging/capi-media-vision.spec
test/testsuites/barcode/barcode_test_suite.c

index 134c824..bb078ff 100644 (file)
@@ -48,6 +48,24 @@ extern "C" {
                                                                     1-visible */
 
 /**
+ * @brief Defines MV_BARCODE_GENERATE_ATTR_COLOR_FRONT to set
+                 Barcode's foreground color attribute of the engine configuration.
+ *
+ * @since_tizen 3.0
+ * @remarks This attribute represents RGB color as a hex triplet with six digits.
+ */
+#define MV_BARCODE_GENERATE_ATTR_COLOR_FRONT "MV_BARCODE_GENERATE_ATTR_COLOR_FRONT"
+
+/**
+ * @brief Defines MV_BARCODE_GENERATE_ATTR_COLOR_BACK to set
+                 Barcode's background color attribute of the engine configuration.
+ *
+ * @since_tizen 3.0
+ * @remarks This attribute represents RGB color as a hex triplet with six digits.
+ */
+#define MV_BARCODE_GENERATE_ATTR_COLOR_BACK "MV_BARCODE_GENERATE_ATTR_COLOR_BACK"
+
+/**
  * @brief Enumeration to text attribute
  *
  * @since_tizen @if MOBILE 2.4 @else 3.0 @endif
index 2830a12..8a97a64 100644 (file)
              "value" : 0
         },
         {
+             "name"  : "MV_BARCODE_GENERATE_ATTR_COLOR_FRONT",
+             "type"  : "string",
+             "value" : "000000"
+        },
+        {
+             "name"  : "MV_BARCODE_GENERATE_ATTR_COLOR_BACK",
+             "type"  : "string",
+             "value" : "ffffff"
+        },
+        {
             "name" : "MV_BARCODE_DETECT_ATTR_TARGET",
             "type" : "integer",
             "value" : 0
index 7e13532..1625dd6 100644 (file)
@@ -50,6 +50,8 @@ public:
         * @param [in] correctionLevel  Error correction level (for QR codes only)
         * @param [in] qrVersion        QR code version (1 ~ 40, 0 for 1D barcodes)
         * @param [in] showText         Show text or not
+        * @param [in] fgcolour         Foreground colour of barcode
+        * @param [in] bgcolour         Background colour of barcode
         * @return BARCODE_ERROR_NONE from BarcodeError which is 0 if success,
         *         BarcodeError value otherwise
         */
@@ -63,7 +65,9 @@ public:
                BarcodeQREncodingMode encodingMode = BARCODE_QR_MODE_UNAVAILABLE,
                BarcodeQRErrorCorrectionLevel correctionLevel = BARCODE_QR_ECC_UNAVAILABLE,
                int qrVersion = 0,
-               int showText = 0);
+               int showText = 0,
+               char *fgcolour = NULL,
+               char *bgcolur = NULL);
 
        /**
         * @brief This method generates Barcodes image buffer according to options.
@@ -79,6 +83,8 @@ public:
         * @param [in] correctionLevel     Error correction level (for QR codes only)
         * @param [in] qrVersion           QR code version (1 ~ 40, 0 for 1D barcodes)
         * @param [in] showText            Show text or not
+        * @param [in] fgcolour         Foreground colour of barcode
+        * @param [in] bgcolour         Background colour of barcode
         * @return BARCODE_ERROR_NONE from BarcodeError which is 0 if success,
         *         BarcodeError value otherwise
         */
@@ -92,7 +98,9 @@ public:
                BarcodeQREncodingMode encodingMode = BARCODE_QR_MODE_UNAVAILABLE,
                BarcodeQRErrorCorrectionLevel correctionLevel = BARCODE_QR_ECC_UNAVAILABLE,
                int qrVersion = 0,
-               int showText = 0);
+               int showText = 0,
+               char *fgcolour = NULL,
+               char *bgcolur = NULL);
 };
 
 } /* Barcode */
index 522f65f..09d33a3 100644 (file)
@@ -70,6 +70,8 @@ int createBarcode(
                BarcodeQRErrorCorrectionLevel correctionLevel,
                int qrVersion,
                int showText,
+               char *fgcolour,
+               char *bgcolour,
                zint_symbol *symbol)
 {
        /* set input values */
@@ -81,8 +83,26 @@ int createBarcode(
        symbol->show_hrt = showText;
 
        /* set default values */
-       std::strncpy(symbol->fgcolour, "000000", 10);
-       std::strncpy(symbol->bgcolour, "ffffff", 10);
+       if (fgcolour) {
+               std::strncpy(symbol->fgcolour, fgcolour, 10);
+               if (strlen(fgcolour) > 9) {
+                       symbol->fgcolour[9] = '\0';
+               }
+       } else {
+               std::strncpy(symbol->fgcolour, "000000", 10);
+       }
+
+       if (bgcolour) {
+               std::strncpy(symbol->bgcolour, bgcolour, 10);
+               if (strlen(fgcolour) > 9) {
+                       symbol->fgcolour[9] = '\0';
+               }
+       } else {
+               std::strncpy(symbol->bgcolour, "ffffff", 10);
+       }
+
+       LOGI("Check colors: front %s, back %s", symbol->fgcolour, symbol->bgcolour);
+
        symbol->border_width = 1;
        symbol->height = 50;
 
@@ -190,7 +210,9 @@ int BarcodeGenerator::generateBarcodeToImage(
                BarcodeQREncodingMode encodingMode,
                BarcodeQRErrorCorrectionLevel correctionLevel,
                int qrVersion,
-               int showText)
+               int showText,
+               char *fgcolour,
+               char *bgcolour)
 {
        zint_symbol *symbol = ZBarcode_Create();
 
@@ -206,6 +228,8 @@ int BarcodeGenerator::generateBarcodeToImage(
                                        correctionLevel,
                                        qrVersion,
                                        showText,
+                                       fgcolour,
+                                       bgcolour,
                                        symbol);
 
        if (error != BARCODE_ERROR_NONE) {
@@ -241,7 +265,9 @@ int BarcodeGenerator::generateBarcodeToBuffer(
                BarcodeQREncodingMode encodingMode,
                BarcodeQRErrorCorrectionLevel correctionLevel,
                int qrVersion,
-               int showText)
+               int showText,
+               char *fgcolour,
+               char *bgcolour)
 {
        zint_symbol *symbol = ZBarcode_Create();
 
@@ -258,6 +284,8 @@ int BarcodeGenerator::generateBarcodeToBuffer(
                                        correctionLevel,
                                        qrVersion,
                                        showText,
+                                       fgcolour,
+                                       bgcolour,
                                        symbol);
 
        if (error != BARCODE_ERROR_NONE) {
index 444ceb3..558300b 100644 (file)
@@ -221,17 +221,71 @@ int mv_barcode_generate_source_open(
        unsigned int imageChannels = 0u;
 
        int showText = 0;
-       error = mv_engine_config_get_int_attribute(engine_cfg, "MV_BARCODE_GENERATE_ATTR_TEXT", &showText);
-       if (error != MEDIA_VISION_ERROR_NONE) {
-               LOGW("mv_engine_config_get_int_attribute failed");
-               return error;
-       }
+       char value;
+       char *fgcolour = NULL;
+       char *bgcolour = NULL;
+
+       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) {
+                       LOGW("mv_engine_config_get_int_attribute failed");
+                       return error;
+               }
+
+               if (showText == BARCODE_GEN_TEXT_VISIBLE && type == MV_BARCODE_QR) {
+                       LOGW("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) {
+                       if (fgcolour) {
+                               delete [] fgcolour;
+                               fgcolour = NULL;
+                       }
 
-       if (showText == BARCODE_GEN_TEXT_VISIBLE && type == MV_BARCODE_QR) {
-               LOGW("QR code generation with visible text is not supported");
-               return MEDIA_VISION_ERROR_INVALID_OPERATION;
+                       LOGW("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) {
+                       if (bgcolour) {
+                               delete [] bgcolour;
+                               bgcolour = NULL;
+                       }
+
+                       if (fgcolour) {
+                               delete [] fgcolour;
+                               fgcolour = NULL;
+                       }
+
+                       LOGW("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 = BarcodeGenerator::generateBarcodeToBuffer(
                                        &imageBuffer,
                                        &imageWidth,
@@ -242,7 +296,19 @@ int mv_barcode_generate_source_open(
                                        convertEncodingMode(qr_enc_mode),
                                        convertECC(qr_ecc),
                                        qr_version,
-                                       showText);
+                                       showText,
+                                       fgcolour,
+                                       bgcolour);
+
+       if (fgcolour != NULL) {
+               delete [] fgcolour;
+               fgcolour = NULL;
+       }
+
+       if (bgcolour != NULL) {
+               delete [] bgcolour;
+               bgcolour = NULL;
+       }
 
        if (error != BARCODE_ERROR_NONE) {
                LOGE("Barcode generation to the buffer failed");
@@ -316,8 +382,12 @@ int mv_barcode_generate_image_open(
        }
 
        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) {
                        LOGW("mv_engine_config_get_int_attribute failed");
@@ -328,8 +398,56 @@ int mv_barcode_generate_image_open(
                        LOGW("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) {
+                       if (fgcolour) {
+                               delete [] fgcolour;
+                               fgcolour = NULL;
+                       }
+
+                       LOGW("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) {
+                       if (bgcolour) {
+                               delete [] bgcolour;
+                               bgcolour = NULL;
+                       }
+
+                       if (fgcolour) {
+                               delete [] fgcolour;
+                               fgcolour = NULL;
+                       }
+
+                       LOGW("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 = BarcodeGenerator::generateBarcodeToImage(
                                                        std::string(image_path),
                                                        convertImageFormat(image_format),
@@ -340,7 +458,19 @@ int mv_barcode_generate_image_open(
                                                        convertEncodingMode(qr_enc_mode),
                                                        convertECC(qr_ecc),
                                                        qr_version,
-                                                       showText);
+                                                       showText,
+                                                       fgcolour,
+                                                       bgcolour);
+
+       if (fgcolour != NULL) {
+               delete [] fgcolour;
+               fgcolour = NULL;
+       }
+
+       if (bgcolour != NULL) {
+               delete [] bgcolour;
+               bgcolour = NULL;
+       }
 
        if (error != BARCODE_ERROR_NONE) {
                LOGE("Barcode generation to the image file failed");
index dab5a12..b659303 100644 (file)
@@ -1,6 +1,6 @@
 Name:        capi-media-vision
 Summary:     Media Vision library for Tizen Native API
-Version:     0.3.12
+Version:     0.3.13
 Release:     0
 Group:       Multimedia/Framework
 License:     Apache-2.0 and BSD-2.0
index 1304806..9dacb10 100644 (file)
@@ -32,6 +32,7 @@ typedef struct {
        mv_barcode_type_e type;
        mv_barcode_qr_ecc_e ecc;
        mv_barcode_qr_mode_e mode;
+       int is_hrt;
        int version;
        size_t width;
        size_t height;
@@ -41,6 +42,8 @@ typedef struct {
        char *file_name;
        char *out_file_name;
        unsigned char *out_buffer_ptr;
+       char *front_color;
+       char *back_color;
 } barcode_model_s;
 
 typedef enum {
@@ -400,13 +403,49 @@ int generate_barcode_to_image(barcode_model_s model)
        if (model.message   == NULL ||
                model.file_name == NULL) {
                MEDIA_VISION_FUNCTION_LEAVE();
+
                return MEDIA_VISION_ERROR_INVALID_PARAMETER;
        }
 
        LOGI("Call the mv_barcode_generate_image() function");
 
-       const int err = mv_barcode_generate_image(
-                               NULL,
+       mv_engine_config_h mv_engine_config;
+       int err = mv_create_engine_config(&mv_engine_config);
+
+       if (MEDIA_VISION_ERROR_NONE != err) {
+               printf("ERROR: Errors were occurred during creating the media engine "
+                               "config: %i\n", err);
+               MEDIA_VISION_FUNCTION_LEAVE();
+
+               return err;
+       }
+
+       err = mv_engine_config_set_int_attribute(mv_engine_config,
+                                                                                       MV_BARCODE_GENERATE_ATTR_TEXT,
+                                                                                       model.is_hrt);
+       if (MEDIA_VISION_ERROR_NONE != err) {
+               printf("ERROR: Errors were occured during set integer attribute to "
+                               "media engine config: %i\n", err);
+       }
+
+       err = mv_engine_config_set_string_attribute(mv_engine_config,
+                                                                                       MV_BARCODE_GENERATE_ATTR_COLOR_FRONT,
+                                                                                       model.front_color);
+       if (MEDIA_VISION_ERROR_NONE != err) {
+               printf("ERROR: Errors were occured during set string attribute to "
+                               "media engine config: %i\n", err);
+       }
+
+       err = mv_engine_config_set_string_attribute(mv_engine_config,
+                                                                                       MV_BARCODE_GENERATE_ATTR_COLOR_BACK,
+                                                                                       model.back_color);
+       if (MEDIA_VISION_ERROR_NONE != err) {
+               printf("ERROR: Errors were occured during set string attribute to "
+                               "media engine config: %i\n", err);
+       }
+
+       err = mv_barcode_generate_image(
+                               mv_engine_config,
                                model.message,
                                model.width,
                                model.height,
@@ -419,6 +458,12 @@ int generate_barcode_to_image(barcode_model_s model)
 
        MEDIA_VISION_FUNCTION_LEAVE();
 
+       int err2 = mv_destroy_engine_config(mv_engine_config);
+       if (MEDIA_VISION_ERROR_NONE != err2) {
+               printf("ERROR: Errors were occurred during destroying the media engine "
+                                       "config: %i\n", err2);
+       }
+
        return err;
 }
 
@@ -441,9 +486,9 @@ int generate_barcode_to_source(barcode_model_s model)
                printf("ERROR: Error occurred when trying to create Media Vision "
                                "source. Error code: %i\n", err);
 
-                       MEDIA_VISION_FUNCTION_LEAVE();
+               MEDIA_VISION_FUNCTION_LEAVE();
 
-                       return err;
+               return err;
        }
 
        LOGI("mv_source_h creation finished");
@@ -457,6 +502,22 @@ int generate_barcode_to_source(barcode_model_s model)
                                "config: %i\n", err);
        }
 
+       err = mv_engine_config_set_string_attribute(mv_engine_config,
+                                                                                       MV_BARCODE_GENERATE_ATTR_COLOR_FRONT,
+                                                                                       model.front_color);
+       if (MEDIA_VISION_ERROR_NONE != err) {
+               printf("ERROR: Errors were occured during set string attribute to "
+                               "media engine config: %i\n", err);
+       }
+
+       err = mv_engine_config_set_string_attribute(mv_engine_config,
+                                                                                       MV_BARCODE_GENERATE_ATTR_COLOR_BACK,
+                                                                                       model.back_color);
+       if (MEDIA_VISION_ERROR_NONE != err) {
+               printf("ERROR: Errors were occured during set string attribute to "
+                               "media engine config: %i\n", err);
+       }
+
        err = mv_barcode_generate_source(
                        mv_engine_config,
                        model.message,
@@ -912,6 +973,35 @@ mv_barcode_qr_ecc_e select_ecc(void)
        return selected_ecc;
 }
 
+int select_attribute_text(void)
+{
+       MEDIA_VISION_FUNCTION_ENTER();
+
+       int sel_opt = 0;
+       int selected_attr = 0;
+       const int options[2] = { 1, 2 };
+       const char *names[2] = { "Invisible", "Visible" };
+
+       while (sel_opt == 0) {
+               sel_opt = show_menu("Select attribute text", options, names, 2);
+               switch (sel_opt) {
+               case 1:
+                       selected_attr = 0;
+                       break;
+               case 2:
+                       selected_attr = 1;
+                       break;
+               default:
+                       sel_opt = 0;
+                       break;
+               }
+       }
+
+       MEDIA_VISION_FUNCTION_LEAVE();
+
+       return selected_attr;
+}
+
 int select_version(void)
 {
        MEDIA_VISION_FUNCTION_ENTER();
@@ -999,10 +1089,11 @@ int perform_detect()
                MV_BARCODE_UNDEFINED,
                MV_BARCODE_QR_ECC_UNAVAILABLE,
                MV_BARCODE_QR_MODE_UNAVAILABLE,
+               0,
                0, 0, 0,
                MV_BARCODE_IMAGE_FORMAT_PNG,
                MEDIA_VISION_COLORSPACE_INVALID,
-               NULL, NULL, NULL, NULL };
+               NULL, NULL, NULL, NULL, NULL, NULL };
 
        while (input_string("Input file name to be analyzed:", 1024, &(detect_model.file_name)) == -1)
                printf("Incorrect input! Try again.\n");
@@ -1080,10 +1171,11 @@ int perform_generate(void)
                        MV_BARCODE_UNDEFINED,
                        MV_BARCODE_QR_ECC_UNAVAILABLE,
                        MV_BARCODE_QR_MODE_UNAVAILABLE,
+                       0,
                        0, 0, 0,
                        MV_BARCODE_IMAGE_FORMAT_PNG,
                        MEDIA_VISION_COLORSPACE_INVALID,
-                       NULL, NULL, NULL, NULL };
+                       NULL, NULL, NULL, NULL, NULL, NULL };
 
        generation_fcn_e gen_fcn = select_gen_function();
        generate_model.type = select_type();
@@ -1098,6 +1190,11 @@ int perform_generate(void)
                LOGI("Barcode version has been selected");
        }
 
+       if (generate_model.type != MV_BARCODE_QR) {
+               generate_model.is_hrt = select_attribute_text();
+               LOGI("Barcode readable text attribute has been selected");
+       }
+
        if (gen_fcn == MV_TS_GENERATE_TO_IMAGE_FCN) {
                generate_model.out_image_format = select_file_format();
                LOGI("Barcode output image format has been selected");
@@ -1113,6 +1210,16 @@ int perform_generate(void)
 
        LOGI("Barcode output file name has been specified");
 
+       while (input_string("Input foreground color (ex:black is 000000):", 1024, &generate_model.front_color) == -1)
+               printf("Incorrect input! Try again.\n");
+
+       LOGI("Foreground color is %s", generate_model.front_color);
+
+       while (input_string("Input background color (ex:white is ffffff):", 1024, &generate_model.back_color) == -1)
+               printf("Incorrect input! Try again.\n");
+
+       LOGI("Background color is %s", generate_model.back_color);
+
        if (gen_fcn == MV_TS_GENERATE_TO_IMAGE_FCN) {
                while (input_size("Input image width:", 10000, &generate_model.width) == -1)
                        printf("Incorrect input! Try again.\n");
@@ -1136,6 +1243,12 @@ int perform_generate(void)
        if (generate_model.file_name != NULL)
                free(generate_model.file_name);
 
+       if (generate_model.front_color != NULL)
+               free(generate_model.front_color);
+
+       if (generate_model.back_color != NULL)
+               free(generate_model.back_color);
+
        if (err != MEDIA_VISION_ERROR_NONE) {
                LOGE("Barcode generation failed with error code (0x%08x)", err);
                printf("ERROR: Errors were occurred during barcode generation!!!\n");