#include #include #define MO_DESQUEESE_100 0 #define MO_DESQUEESE_125 1 #define MO_DESQUEESE_133 2 #define MO_DESQUEESE_150 3 #define MO_DESQUEESE_160 4 #define MO_DESQUEESE_200 5 const float MO_DESQUEEZE_FACTOR[]={ 1.00, 1.25, 1.33, 1.50, 1.60, 2.00 }; #define LEN(arr) ((int) (sizeof (arr) / sizeof (arr)[0])) const char* MO_ACCEPT_FORMATS[5]={"jpg","jpeg","png","dng","tga"}; STRUCTURE(OurMorphic){ laSafeString* Directory; int DesqueezeFactor; }; OurMorphic* Mo; extern "C" LA MAIN; int moinv_SelectDirectory(laOperator* a, laEvent* e){ laInvoke(a, "LA_file_dialog", e, 0, "select=folder;", 0); return LA_RUNNING; } int momod_SelectDirectory(laOperator* a, laEvent* e){ if (a->ConfirmData){ if (a->ConfirmData->StrData){ strSafeSet(&Mo->Directory,a->ConfirmData->StrData); laNotifyUsers("mo.directory"); return LA_FINISHED_PASS; } return LA_FINISHED_PASS; } return LA_RUNNING; } int mo_AcceptImageFormat(char* fmt){ char format[10]; strncpy(format,fmt,9); strToLower(format); const int count=LEN(MO_ACCEPT_FORMATS); for(int i=0;iDesqueezeFactor]; cv::Mat image = cv::imread(file, cv::IMREAD_ANYCOLOR); cv::Mat out_image; cv::resize(image,out_image,cv::Size(),fac,1.0,cv::INTER_LANCZOS4); cv::imwrite(output_file,out_image,{cv::IMWRITE_JPEG_QUALITY,100}); } int mo_RunConversion(){ logClear(); if(Mo->DesqueezeFactor==0){ logPrintNew("No need to desqueeze.\n"); return; } char Dir[2048]; char Final[4096]; char FinalOut[4096]; strcpy(Dir,SSTR(Mo->Directory)); #ifdef __linux__ #ifdef LAGUI_ANDROID #define versionsort alphasort #endif int len=strlen(Dir); if (Dir[len - 1] != U'/') strcat(Dir, "/"); struct dirent **NameList=0; int NumFiles=scandir(Dir,&NameList,0,versionsort); sprintf(FinalOut, "%sOurMorphicOut",Dir); mkdir(FinalOut,S_IRWXU | S_IRWXG | S_IRWXO); printf("%d\n",errno); for(int i=0;id_name, ".") || !strcmp(d->d_name, "..")){ continue; } struct stat s; sprintf(Final, "%s%s",Dir,d->d_name); stat(Final, &s); if (!S_ISDIR(s.st_mode)){ char *format = strGetLastSegment(d->d_name, '.'); if(!mo_AcceptImageFormat(format)){ continue; } sprintf(FinalOut, "%sOurMorphicOut/%s",Dir,d->d_name); moinv_DesqueezeSingle(Final,FinalOut); logPrintNew("Done with %s\n",d->d_name); } } for (int i = 0; i < NumFiles; i++) { free(NameList[i]); } free(NameList); #endif #ifdef _WIN32 WIN32_FIND_DATA FindFileData; HANDLE hFind; SYSTEMTIME stUTC, stLocal; if (Dir[len - 1] != U'\\') strcat(Dir, "\\*.*"); else strcat(Dir, "*.*"); hFind = FindFirstFile(Dir, &FindFileData); sprintf(FinalOut, "%sOurMorphicOut",Dir); _mkdir(FinalOut); if (hFind == INVALID_HANDLE_VALUE){ logPrintNew("Error opening directory.\n"); return; } while (1) { if (!(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)){ char* format = strGetLastSegment(FindFileData.cFileName, '.'); if(!mo_AcceptImageFormat(format)){ goto findnext; } sprintf(Final, "%s%s",Dir,FindFileData.cFileName); sprintf(FinalOut, "%sOurMorphicOut/%s",Dir,FindFileData.cFileName); moinv_DesqueezeSingle(Final,FinalOut); logPrintNew("Done with %s\n",FindFileData.cFileName); } findnext: if (!FindNextFile(hFind, &FindFileData)) break; } #endif return 1; } int moinv_RunConversion(laOperator* a, laEvent* e){ mo_RunConversion(); logPrintNew("All done.\n"); return LA_FINISHED; } void moui_MainPanel(laUiList *uil, laPropPack *This, laPropPack *DetachedProps, laColumn *UNUSED, int context){ laColumn* c=laFirstColumn(uil); laShowItemFull(uil,c,0,"mo.desqueeze_factor",0,0,0,0)->Flags|=LA_UI_FLAGS_EXPAND; laShowSeparator(uil,c); laUiItem* b=laBeginRow(uil,c,0,0); laShowItem(uil,c,0,"MO_select_directory"); laShowSeparator(uil,c)->Expand=1; laShowItem(uil,c,0,"MO_run_conversion"); laEndRow(uil,b); laShowItemFull(uil,c,0,"mo.directory",LA_WIDGET_STRING_MONO_PLAIN,0,0,0)->Flags|=LA_TEXT_LINE_WRAP|LA_TEXT_USE_NEWLINE; laShowSeparator(uil,c); laUiItem* g=laMakeGroup(uil,c,"123",0);{ g->State=LA_UI_ACTIVE; g->Flags|=LA_UI_FLAGS_PREFER_BOTTOM; laUiList* gu=g->Page; laColumn* gc=laFirstColumn(gu); gu->HeightCoeff=-1; laShowItem(gu,gc,0,"la.logs")->Flags|=LA_UI_FLAGS_NO_DECAL; } } void* moget_mo(void* unused,void* unused1){ return Mo; } void moRegisterEverything(){ laPropContainer* pc; laProp* p; laRegisterUiTemplate("MO_PANEL_morphic","Morphic",moui_MainPanel,0,0,"Tools",0,0,0); laCreateOperatorType("MO_select_directory","Select Directory","Select directory to operate on",0,0,0,moinv_SelectDirectory,momod_SelectDirectory,0,0); laCreateOperatorType("MO_run_conversion","Run Conversion","Run image conversion",0,0,0,moinv_RunConversion,0,0,0); pc=laDefineRoot(); laAddSubGroup(pc,"mo","Morphic","Morphic","mo",0,0,0,-1,moget_mo,0,0,0,0,0,0,LA_UDF_SINGLE); pc=laAddPropertyContainer("mo","Morphic","Morphic",0,0,sizeof(OurMorphic),0,0,1); laAddStringProperty(pc,"directory","Directory","Opeartion directory",0,0,0,0,1,offsetof(OurMorphic,Directory),0,0,0,0,0); 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); laAddEnumItemAs(p,"100","-","Don't do desqueeze",MO_DESQUEESE_100,0); laAddEnumItemAs(p,"125","1.25","Desqueeze 1.25 times",MO_DESQUEESE_125,0); laAddEnumItemAs(p,"133","1.33","Desqueeze 1.33 times",MO_DESQUEESE_133,0); laAddEnumItemAs(p,"150","1.50","Desqueeze 1.50 times",MO_DESQUEESE_150,0); laAddEnumItemAs(p,"160","1.60","Desqueeze 1.60 times",MO_DESQUEESE_160,0); laAddEnumItemAs(p,"200","2.00","Desqueeze 2.00 times",MO_DESQUEESE_200,0); } void moInit(){ Mo=memAcquire(sizeof(OurMorphic)); } int main(int argc, char** argv ) { laInitArguments ia; laSetDefaultInitArguments(&ia); laGetReadyWith(&ia); moInit(); moRegisterEverything(); laEnsureUserPreferences(); if(!MAIN.Windows.pFirst){ laWindow* w=laDesignWindow(0,0,400,700); laLayout* l=laDesignLayout(w,"Default"); laBlock* b=l->FirstBlock; laCreatePanel(b,"MO_PANEL_morphic"); laStartWindow(w); } laMainLoop(); return 0; }