+ opj_cparameters_t parameters; /* compression parameters */\r
+ opj_event_mgr_t event_mgr; /* event manager */\r
+ opj_image_t *oimage = NULL;\r
+ opj_image_cmptparm_t *cmptparm; \r
+ opj_cio_t *cio = NULL;\r
+ int codestream_length;\r
+ bool bSuccess;\r
+ int i;\r
+\r
+ /*\r
+ configure the event callbacks (not required)\r
+ setting of each callback is optionnal\r
+ */\r
+ memset(&event_mgr, 0, sizeof(opj_event_mgr_t));\r
+ event_mgr.error_handler = j2k_error_callback;\r
+ event_mgr.warning_handler = j2k_warning_callback;\r
+ event_mgr.info_handler = j2k_info_callback;\r
+\r
+ /* set encoding parameters to default values */\r
+ opj_set_default_encoder_parameters(¶meters);\r
+\r
+ /* load parameters */\r
+\r
+ /* subsampling */\r
+ if (sscanf(m_subsampling.c_str(), wxT("%d,%d"), &(parameters.subsampling_dx), &(parameters.subsampling_dy)) != 2) {\r
+ wxLogError(wxT("Wrong sub-sampling encoder setting: dx,dy"));\r
+ return false;\r
+ }\r
+\r
+ /* compression rates */\r
+ if (m_rates != wxT("")) {\r
+ char *s1 = (char *) m_rates.c_str();\r
+ wxLogMessage("rates %s", s1);\r
+ while (sscanf(s1, "%f", &(parameters.tcp_rates[parameters.tcp_numlayers])) == 1) {\r
+ parameters.tcp_numlayers++;\r
+ while (*s1 && *s1 != ',') {\r
+ s1++;\r
+ }\r
+ if (!*s1)\r
+ break;\r
+ s1++;\r
+ }\r
+ wxLogMessage("%d layers", parameters.tcp_numlayers);\r
+ parameters.cp_disto_alloc = 1;\r
+ }\r
+\r
+ /* image quality, dB */\r
+ if (m_rates == wxT("")) {\r
+ char *s2 = (char *) m_quality.c_str();\r
+ wxLogMessage("qualities %s", s2);\r
+ while (sscanf(s2, "%f", ¶meters.tcp_distoratio[parameters.tcp_numlayers]) == 1) {\r
+ parameters.tcp_numlayers++;\r
+ while (*s2 && *s2 != ',') {\r
+ s2++;\r
+ }\r
+ if (!*s2)\r
+ break;\r
+ s2++;\r
+ }\r
+ wxLogMessage("%d layers", parameters.tcp_numlayers);\r
+ parameters.cp_fixed_quality = 1;\r
+ }\r
+\r
+ /* image origin */\r
+ if (sscanf(m_origin.c_str(), "%d,%d", ¶meters.image_offset_x0, ¶meters.image_offset_y0) != 2) {\r
+ wxLogError(wxT("bad coordinate of the image origin: x0,y0"));\r
+ return false;\r
+ }\r
+ \r
+ /* Create comment for codestream */\r
+ if(m_enablecomm) {\r
+ parameters.cp_comment = (char *) malloc(strlen(m_comment.c_str()) + 1);\r
+ if(parameters.cp_comment) {\r
+ strcpy(parameters.cp_comment, m_comment.c_str());\r
+ }\r
+ } else {\r
+ parameters.cp_comment = NULL;\r
+ }\r
+\r
+ /* indexing file */\r
+ if (m_enableidx) {\r
+ strncpy(parameters.index, m_index.c_str(), m_index.Len());\r
+ wxLogMessage("index file is %s", parameters.index);\r
+ parameters.index_on = 1;\r
+ } else {\r
+ parameters.index_on = 0;\r
+ }\r
+\r
+ /* if no rate entered, lossless by default */\r
+ if (parameters.tcp_numlayers == 0) {\r
+ parameters.tcp_rates[0] = 0; /* MOD antonin : losslessbug */\r
+ parameters.tcp_numlayers++;\r
+ parameters.cp_disto_alloc = 1;\r
+ }\r
+\r
+ /* irreversible transform */\r
+ parameters.irreversible = (m_irreversible == true) ? 1 : 0;\r
+\r
+ /* resolutions */\r
+ parameters.numresolution = m_resolutions;\r
+\r
+ /* codeblocks size */\r
+ if (m_cbsize != wxT("")) {\r
+ int cblockw_init = 0, cblockh_init = 0;\r
+ sscanf(m_cbsize.c_str(), "%d,%d", &cblockw_init, &cblockh_init);\r
+ if (cblockw_init * cblockh_init > 4096 || cblockw_init > 1024 || cblockw_init < 4 || cblockh_init > 1024 || cblockh_init < 4) {\r
+ wxLogError("!! Size of code_block error !! Restrictions:\n width*height<=4096\n 4<=width,height<= 1024");\r
+ return false;\r
+ }\r
+ parameters.cblockw_init = cblockw_init;\r
+ parameters.cblockh_init = cblockh_init;\r
+ }\r
+\r
+ /* precincts size */\r
+ if (m_prsize != wxT("")) {\r
+ char sep;\r
+ int res_spec = 0;\r
+ char *s = (char *) m_prsize.c_str();\r
+ do {\r
+ sep = 0;\r
+ sscanf(s, "[%d,%d]%c", ¶meters.prcw_init[res_spec], ¶meters.prch_init[res_spec], &sep);\r
+ parameters.csty |= 0x01;\r
+ res_spec++;\r
+ s = strpbrk(s, "]") + 2;\r
+ } while (sep == ',');\r
+ parameters.res_spec = res_spec;\r
+ }\r
+\r
+ /* tiles */\r
+ if (m_tsize != wxT("")) {\r
+ sscanf(m_tsize.c_str(), "%d,%d", ¶meters.cp_tdx, ¶meters.cp_tdy);\r
+ parameters.tile_size_on = true;\r
+ }\r
+\r
+ /* tile origin */\r
+ if (sscanf(m_torigin.c_str(), "%d,%d", ¶meters.cp_tx0, ¶meters.cp_ty0) != 2) {\r
+ wxLogError("tile offset setting error: X0,Y0");\r
+ return false;\r
+ }\r
+\r
+ /* use SOP */\r
+ if (m_enablesop)\r
+ parameters.csty |= 0x02;\r
+\r
+ /* use EPH */\r
+ if (m_enableeph)\r
+ parameters.csty |= 0x04;\r
+\r
+\r
+\r
+ /* compression settings */\r
+ //parameters.tcp_numlayers = 1;\r
+ //parameters.tcp_rates[0] = 10.0;\r
+ //parameters.cp_disto_alloc = 1;\r
+ //parameters.irreversible = 1;\r
+ parameters.tcp_mct = 1;\r
+\r
+ /* convert wx image into opj image */\r
+ cmptparm = (opj_image_cmptparm_t*) malloc(3 * sizeof(opj_image_cmptparm_t));\r
+\r
+ /* initialize opj image components */ \r
+ memset(&cmptparm[0], 0, 3 * sizeof(opj_image_cmptparm_t));\r
+ for(i = 0; i < 3; i++) { \r
+ cmptparm[i].prec = 8;\r
+ cmptparm[i].bpp = 8;\r
+ cmptparm[i].sgnd = false;\r
+ cmptparm[i].dx = parameters.subsampling_dx;\r
+ cmptparm[i].dy = parameters.subsampling_dy;\r
+ cmptparm[i].w = wimage->GetWidth();\r
+ cmptparm[i].h = wimage->GetHeight();\r
+ }\r
+\r
+ /* create the image */\r
+ oimage = opj_image_create(3, &cmptparm[0], CLRSPC_SRGB);\r
+ if(!oimage) {\r
+ if (cmptparm)\r
+ free(cmptparm);\r
+ return false;\r
+ }\r
+\r
+ /* set image offset and reference grid */\r
+ oimage->x0 = parameters.image_offset_x0;\r
+ oimage->y0 = parameters.image_offset_y0;\r
+ oimage->x1 = parameters.image_offset_x0 + (wimage->GetWidth() - 1) * 1 + 1;\r
+ oimage->y1 = parameters.image_offset_y0 + (wimage->GetHeight() - 1) * 1 + 1;\r
+\r
+ /* load image data */\r
+ unsigned char *value = wimage->GetData(); \r
+ int area = wimage->GetWidth() * wimage->GetHeight();\r
+ for (i = 0; i < area; i++) {\r
+ oimage->comps[0].data[i] = *(value++);\r
+ oimage->comps[1].data[i] = *(value++);\r
+ oimage->comps[2].data[i] = *(value++);\r
+ }\r
+\r
+ /* get a J2K compressor handle */\r
+ opj_cinfo_t* cinfo = opj_create_compress(CODEC_J2K);\r
+\r
+ /* catch events using our callbacks and give a local context */\r
+ opj_set_event_mgr((opj_common_ptr)cinfo, &event_mgr, stderr);\r
+\r
+ /* setup the encoder parameters using the current image and user parameters */\r
+ opj_setup_encoder(cinfo, ¶meters, oimage);\r
+\r
+ /* open a byte stream for writing */\r
+ /* allocate memory for all tiles */\r
+ cio = opj_cio_open((opj_common_ptr)cinfo, NULL, 0);\r
+\r
+ /* encode the image */\r
+ bSuccess = opj_encode(cinfo, cio, oimage, parameters.index);\r
+ if (!bSuccess) {\r
+\r
+ opj_cio_close(cio);\r
+ opj_destroy_compress(cinfo);\r
+ opj_image_destroy(oimage);\r
+ if (cmptparm)\r
+ free(cmptparm);\r
+ if(parameters.cp_comment)\r
+ free(parameters.cp_comment);\r
+ if(parameters.cp_matrice)\r
+ free(parameters.cp_matrice);\r
+\r