*/}}

ourmorphic.cxx 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. #include <opencv2/opencv.hpp>
  2. #include <la_5.h>
  3. #define MO_DESQUEESE_100 0
  4. #define MO_DESQUEESE_125 1
  5. #define MO_DESQUEESE_133 2
  6. #define MO_DESQUEESE_150 3
  7. #define MO_DESQUEESE_160 4
  8. #define MO_DESQUEESE_200 5
  9. const float MO_DESQUEEZE_FACTOR[]={ 1.00, 1.25, 1.33, 1.50, 1.60, 2.00 };
  10. #define LEN(arr) ((int) (sizeof (arr) / sizeof (arr)[0]))
  11. const char* MO_ACCEPT_FORMATS[5]={"jpg","jpeg","png","dng","tga"};
  12. STRUCTURE(OurMorphic){
  13. laSafeString* Directory;
  14. int DesqueezeFactor;
  15. };
  16. OurMorphic* Mo;
  17. extern "C" LA MAIN;
  18. int moinv_SelectDirectory(laOperator* a, laEvent* e){
  19. laInvoke(a, "LA_file_dialog", e, 0, "select=folder;", 0);
  20. return LA_RUNNING;
  21. }
  22. int momod_SelectDirectory(laOperator* a, laEvent* e){
  23. if (a->ConfirmData){
  24. if (a->ConfirmData->StrData){
  25. strSafeSet(&Mo->Directory,a->ConfirmData->StrData);
  26. laNotifyUsers("mo.directory");
  27. return LA_FINISHED_PASS;
  28. }
  29. return LA_FINISHED_PASS;
  30. }
  31. return LA_RUNNING;
  32. }
  33. int mo_AcceptImageFormat(char* fmt){
  34. char format[10]; strncpy(format,fmt,9); strToLower(format);
  35. const int count=LEN(MO_ACCEPT_FORMATS);
  36. for(int i=0;i<count;i++){
  37. if(strSame(format,MO_ACCEPT_FORMATS[i])) return 1;
  38. }
  39. return 0;
  40. }
  41. int moinv_DesqueezeSingle(char* file, char* output_file){ float fac=MO_DESQUEEZE_FACTOR[Mo->DesqueezeFactor];
  42. cv::Mat image = cv::imread(file, cv::IMREAD_ANYCOLOR);
  43. cv::Mat out_image;
  44. cv::resize(image,out_image,cv::Size(),fac,1.0,cv::INTER_LANCZOS4);
  45. cv::imwrite(output_file,out_image,{cv::IMWRITE_JPEG_QUALITY,100});
  46. }
  47. int mo_RunConversion(){
  48. logClear();
  49. if(Mo->DesqueezeFactor==0){
  50. logPrintNew("No need to desqueeze.\n"); return;
  51. }
  52. char Dir[2048];
  53. char Final[4096];
  54. char FinalOut[4096];
  55. strcpy(Dir,SSTR(Mo->Directory));
  56. #ifdef __linux__
  57. #ifdef LAGUI_ANDROID
  58. #define versionsort alphasort
  59. #endif
  60. int len=strlen(Dir);
  61. if (Dir[len - 1] != U'/') strcat(Dir, "/");
  62. struct dirent **NameList=0;
  63. int NumFiles=scandir(Dir,&NameList,0,versionsort);
  64. sprintf(FinalOut, "%sOurMorphicOut",Dir); mkdir(FinalOut,S_IRWXU | S_IRWXG | S_IRWXO); printf("%d\n",errno);
  65. for(int i=0;i<NumFiles;i++){
  66. struct dirent* d = NameList[i];
  67. if(!strcmp(d->d_name, ".") || !strcmp(d->d_name, "..")){ continue; }
  68. struct stat s;
  69. sprintf(Final, "%s%s",Dir,d->d_name);
  70. stat(Final, &s);
  71. if (!S_ISDIR(s.st_mode)){
  72. char *format = strGetLastSegment(d->d_name, '.');
  73. if(!mo_AcceptImageFormat(format)){ continue; }
  74. sprintf(FinalOut, "%sOurMorphicOut/%s",Dir,d->d_name);
  75. moinv_DesqueezeSingle(Final,FinalOut);
  76. logPrintNew("Done with %s\n",d->d_name);
  77. }
  78. }
  79. for (int i = 0; i < NumFiles; i++) { free(NameList[i]); } free(NameList);
  80. #endif
  81. #ifdef _WIN32
  82. WIN32_FIND_DATA FindFileData;
  83. HANDLE hFind;
  84. SYSTEMTIME stUTC, stLocal;
  85. if (Dir[len - 1] != U'\\') strcat(Dir, "\\*.*"); else strcat(Dir, "*.*");
  86. hFind = FindFirstFile(Dir, &FindFileData);
  87. sprintf(FinalOut, "%sOurMorphicOut",Dir); _mkdir(FinalOut);
  88. if (hFind == INVALID_HANDLE_VALUE){ logPrintNew("Error opening directory.\n"); return; }
  89. while (1) {
  90. if (!(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)){
  91. char* format = strGetLastSegment(FindFileData.cFileName, '.');
  92. if(!mo_AcceptImageFormat(format)){ goto findnext; }
  93. sprintf(Final, "%s%s",Dir,FindFileData.cFileName);
  94. sprintf(FinalOut, "%sOurMorphicOut/%s",Dir,FindFileData.cFileName);
  95. moinv_DesqueezeSingle(Final,FinalOut);
  96. logPrintNew("Done with %s\n",FindFileData.cFileName);
  97. }
  98. findnext:
  99. if (!FindNextFile(hFind, &FindFileData)) break;
  100. }
  101. #endif
  102. return 1;
  103. }
  104. int moinv_RunConversion(laOperator* a, laEvent* e){
  105. mo_RunConversion();
  106. logPrintNew("All done.\n");
  107. return LA_FINISHED;
  108. }
  109. void moui_MainPanel(laUiList *uil, laPropPack *This, laPropPack *DetachedProps, laColumn *UNUSED, int context){
  110. laColumn* c=laFirstColumn(uil);
  111. laShowItemFull(uil,c,0,"mo.desqueeze_factor",0,0,0,0)->Flags|=LA_UI_FLAGS_EXPAND;
  112. laShowSeparator(uil,c);
  113. laUiItem* b=laBeginRow(uil,c,0,0);
  114. laShowItem(uil,c,0,"MO_select_directory");
  115. laShowSeparator(uil,c)->Expand=1;
  116. laShowItem(uil,c,0,"MO_run_conversion");
  117. laEndRow(uil,b);
  118. laShowItemFull(uil,c,0,"mo.directory",LA_WIDGET_STRING_MONO_PLAIN,0,0,0)->Flags|=LA_TEXT_LINE_WRAP|LA_TEXT_USE_NEWLINE;
  119. laShowSeparator(uil,c);
  120. laUiItem* g=laMakeGroup(uil,c,"123",0);{ g->State=LA_UI_ACTIVE; g->Flags|=LA_UI_FLAGS_PREFER_BOTTOM;
  121. laUiList* gu=g->Page; laColumn* gc=laFirstColumn(gu); gu->HeightCoeff=-1;
  122. laShowItem(gu,gc,0,"la.logs")->Flags|=LA_UI_FLAGS_NO_DECAL;
  123. }
  124. }
  125. void* moget_mo(void* unused,void* unused1){
  126. return Mo;
  127. }
  128. void moRegisterEverything(){
  129. laPropContainer* pc; laProp* p;
  130. laRegisterUiTemplate("MO_PANEL_morphic","Morphic",moui_MainPanel,0,0,"Tools",0,0,0);
  131. laCreateOperatorType("MO_select_directory","Select Directory","Select directory to operate on",0,0,0,moinv_SelectDirectory,momod_SelectDirectory,0,0);
  132. laCreateOperatorType("MO_run_conversion","Run Conversion","Run image conversion",0,0,0,moinv_RunConversion,0,0,0);
  133. pc=laDefineRoot();
  134. laAddSubGroup(pc,"mo","Morphic","Morphic","mo",0,0,0,-1,moget_mo,0,0,0,0,0,0,LA_UDF_SINGLE);
  135. pc=laAddPropertyContainer("mo","Morphic","Morphic",0,0,sizeof(OurMorphic),0,0,1);
  136. laAddStringProperty(pc,"directory","Directory","Opeartion directory",0,0,0,0,1,offsetof(OurMorphic,Directory),0,0,0,0,0);
  137. p=laAddEnumProperty(pc,"desqueeze_factor","Desqueeze Factor","Desqueeze factor",0,0,0,0,0,offsetof(OurMorphic,DesqueezeFactor),0,0,0,0,0,0,0,0,0,0);
  138. laAddEnumItemAs(p,"100","-","Don't do desqueeze",MO_DESQUEESE_100,0);
  139. laAddEnumItemAs(p,"125","1.25","Desqueeze 1.25 times",MO_DESQUEESE_125,0);
  140. laAddEnumItemAs(p,"133","1.33","Desqueeze 1.33 times",MO_DESQUEESE_133,0);
  141. laAddEnumItemAs(p,"150","1.50","Desqueeze 1.50 times",MO_DESQUEESE_150,0);
  142. laAddEnumItemAs(p,"160","1.60","Desqueeze 1.60 times",MO_DESQUEESE_160,0);
  143. laAddEnumItemAs(p,"200","2.00","Desqueeze 2.00 times",MO_DESQUEESE_200,0);
  144. }
  145. void moInit(){
  146. Mo=memAcquire(sizeof(OurMorphic));
  147. }
  148. int main(int argc, char** argv )
  149. {
  150. laInitArguments ia;
  151. laSetDefaultInitArguments(&ia);
  152. laGetReadyWith(&ia);
  153. moInit();
  154. moRegisterEverything();
  155. laEnsureUserPreferences();
  156. if(!MAIN.Windows.pFirst){
  157. laWindow* w=laDesignWindow(0,0,400,700);
  158. laLayout* l=laDesignLayout(w,"Default");
  159. laBlock* b=l->FirstBlock;
  160. laCreatePanel(b,"MO_PANEL_morphic");
  161. laStartWindow(w);
  162. }
  163. laMainLoop();
  164. return 0;
  165. }