diff --git a/.clang-format b/.clang-format new file mode 100644 index 0000000..965124f --- /dev/null +++ b/.clang-format @@ -0,0 +1,123 @@ +# ClangFormatConfigureSource: 'LLVM' +--- +Language: Cpp +# BasedOnStyle: LLVM +AccessModifierOffset: -4 +AlignAfterOpenBracket: Align +AlignConsecutiveAssignments: false +AlignConsecutiveDeclarations: false +AlignEscapedNewlines: Right +AlignOperands: true +AlignTrailingComments: true +AllowAllParametersOfDeclarationOnNextLine: true +AllowShortBlocksOnASingleLine: false +AllowShortCaseLabelsOnASingleLine: true +AllowShortFunctionsOnASingleLine: All +AllowShortIfStatementsOnASingleLine: Never +AllowShortLoopsOnASingleLine: false +AlwaysBreakAfterDefinitionReturnType: None +AlwaysBreakAfterReturnType: None +AlwaysBreakBeforeMultilineStrings: false +AlwaysBreakTemplateDeclarations: MultiLine +BinPackArguments: true +BinPackParameters: true +BraceWrapping: + AfterClass: false + AfterControlStatement: false + AfterEnum: false + AfterFunction: false + AfterNamespace: false + AfterObjCDeclaration: false + AfterStruct: false + AfterUnion: false + AfterExternBlock: false + BeforeCatch: false + BeforeElse: false + IndentBraces: false + SplitEmptyFunction: true + SplitEmptyRecord: true + SplitEmptyNamespace: true +BreakBeforeBinaryOperators: None +BreakBeforeBraces: Attach +BreakBeforeInheritanceComma: false +BreakInheritanceList: BeforeColon +BreakBeforeTernaryOperators: true +BreakConstructorInitializersBeforeComma: false +BreakConstructorInitializers: BeforeColon +BreakAfterJavaFieldAnnotations: false +BreakStringLiterals: true +ColumnLimit: 120 +CommentPragmas: '^ IWYU pragma:' +CompactNamespaces: false +ConstructorInitializerAllOnOneLineOrOnePerLine: false +ConstructorInitializerIndentWidth: 4 +ContinuationIndentWidth: 4 +Cpp11BracedListStyle: true +DerivePointerAlignment: false +DisableFormat: false +ExperimentalAutoDetectBinPacking: false +FixNamespaceComments: false +ForEachMacros: + - foreach + - Q_FOREACH + - BOOST_FOREACH +IncludeBlocks: Merge +IncludeCategories: + - Regex: '^"(llvm|llvm-c|clang|clang-c)/' + Priority: 2 + - Regex: '^(<|"(gtest|gmock|isl|json)/)' + Priority: 1 + - Regex: '.*' + Priority: 3 +IncludeIsMainRegex: '(Test)?$' +IndentCaseLabels: true +IndentPPDirectives: None +IndentWidth: 4 +IndentWrappedFunctionNames: false +JavaScriptQuotes: Leave +JavaScriptWrapImports: true +KeepEmptyLinesAtTheStartOfBlocks: true +MacroBlockBegin: '' +MacroBlockEnd: '' +MaxEmptyLinesToKeep: 1 +NamespaceIndentation: All +ObjCBinPackProtocolList: Auto +ObjCBlockIndentWidth: 2 +ObjCSpaceAfterProperty: false +ObjCSpaceBeforeProtocolList: true +PenaltyBreakAssignment: 2 +PenaltyBreakBeforeFirstCallParameter: 19 +PenaltyBreakComment: 300 +PenaltyBreakFirstLessLess: 120 +PenaltyBreakString: 1000 +PenaltyBreakTemplateDeclaration: 10 +PenaltyExcessCharacter: 1000000 +PenaltyReturnTypeOnItsOwnLine: 60 +PointerAlignment: Left +ReflowComments: true +SortIncludes: true +SortUsingDeclarations: true +SpaceAfterCStyleCast: false +SpaceAfterTemplateKeyword: true +SpaceBeforeAssignmentOperators: true +SpaceBeforeCpp11BracedList: false +SpaceBeforeCtorInitializerColon: true +SpaceBeforeInheritanceColon: true +SpaceBeforeParens: ControlStatements +SpaceBeforeRangeBasedForLoopColon: true +SpaceInEmptyParentheses: false +SpacesBeforeTrailingComments: 1 +SpacesInAngles: false +SpacesInContainerLiterals: true +SpacesInCStyleCastParentheses: false +SpacesInParentheses: false +SpacesInSquareBrackets: false +Standard: Cpp11 +StatementMacros: + - Q_UNUSED + - QT_REQUIRE_VERSION + - Assert + - AssertNotNull +TabWidth: 8 +UseTab: Never +... diff --git a/.clang-tidy b/.clang-tidy new file mode 100644 index 0000000..884002b --- /dev/null +++ b/.clang-tidy @@ -0,0 +1,11 @@ +Checks: 'readability-*,clang-diagnostic-*,clang-analyzer-*,-clang-analyzer-alpha*,performance-*,cppcoreguidelines-*, +bugprone-*,modernize-*,-modernize-use-trailing-return-type' +HeaderFilterRegex: '' +AnalyzeTemporaryDtors: false +CheckOptions: + - key: readability-identifier-naming.ClassCase + value: CamelCase + - key: readability-identifier-naming.PrivateMemberCase + value: camelBack + - key: readability-identifier-naming.PrivateMemberPrefix + value: '_' \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index ee9c0db..9496856 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -9,6 +9,7 @@ add_compile_options(-Wall -Wextra -Werror) option(WINDOWS "Whether the build target is Windows or not." OFF) option(SHARED "Whether we should build a shared library, instead of a static one." OFF) option(DEMO "Whether or not the demo should be built." OFF) +option(OPENCV "Whether or not opencv should be targeted." OFF) if (NOT WINDOWS) set(CMAKE_POSITION_INDEPENDENT_CODE ON) @@ -44,6 +45,15 @@ if (STATICC) set (CMAKE_SHARED_LINKER_FLAGS "-Wl,--as-needed") set(LINKS -static-libgcc -static-libstdc++ -Wl,-Bstatic -lm -lstdc++ -lpthread -Wl,-Bdynamic ${LINKS}) endif(STATICC) + +if (OPENCV) + find_package( OpenCV REQUIRED ) + include_directories( ${OpenCV_INCLUDE_DIRS} ) + + add_definitions(-D ATOMORPH_OPENCV) + set(LINKS ${LINKS} ${OpenCV_LIBS}) +endif() + target_link_libraries(atomorph ${LINKS}) if (DEMO) diff --git a/README.md b/README.md index 2e0b7b6..2305e7b 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,8 @@ # atomorph Image morphing library that uses fluid dynamics and optimal transport to produce intuitive morphs. +Adapted for use for Epsilon. + http://atomorph.org AtoMorph Library uses the C++11 standard. The included Makefiles diff --git a/src/EpsilonHook.cpp b/src/EpsilonHook.cpp new file mode 100644 index 0000000..77f0d58 --- /dev/null +++ b/src/EpsilonHook.cpp @@ -0,0 +1,50 @@ +#include "morph.h" + +#define export extern "C" [[maybe_unused]] + +export am::morph* create_morph(uint16_t width, uint16_t height, uint8_t img_a[], uint8_t img_b[]) { + auto* morph = new am::morph(); + + morph->set_blob_delimiter (am::HSP); + morph->set_blob_max_size (128); + morph->set_blob_min_size (3); + morph->set_blob_box_grip (16); + morph->set_blob_box_samples(-1); + morph->set_blob_threshold (128); + morph->set_blob_number (1); + morph->set_seed (0); + morph->set_blob_rgba_weight(1); + morph->set_blob_size_weight(0); + morph->set_blob_xy_weight (0); + morph->set_degeneration (10000); + morph->set_density (2); // Higher than 1 sets fluid to 0. + morph->set_motion (am::SPLINE); + morph->set_fading (am::PERLIN); + morph->set_threads (8); + morph->set_cycle_length (100000); + morph->set_feather (0); + morph->set_keep_background (0); + morph->set_finite (1); + morph->set_show_blobs (am::TEXTURE); + morph->set_fluid (0); // Higher than 0 sets density to 1. + + + morph->set_resolution(width, height); + for (int i = 0; i < width * height; i++) { + auto real_index = i * 4; + morph->add_pixel(0, am::create_pixel(i % width, i / width, img_a[real_index], img_a[real_index + 1], + img_a[real_index + 2], img_a[real_index + 3])); + } + for (int i = 0; i < width * height; i++) { + auto real_index = i * 4; + morph->add_pixel(1, am::create_pixel(i % width, i / width, img_b[real_index], img_b[real_index + 1], + img_b[real_index + 2], img_b[real_index + 3])); + } + + morph->compute(); + return morph; +} + + + +export void delete_morph(am::morph* morph) { delete morph; } \ No newline at end of file diff --git a/src/atomorph.h b/src/atomorph.h index 89905aa..02e99d6 100644 --- a/src/atomorph.h +++ b/src/atomorph.h @@ -18,7 +18,7 @@ #include #ifdef ATOMORPH_OPENCV -#include +#include #endif #include "spline.h" diff --git a/src/morph.h b/src/morph.h index 3c1e11b..7dc6085 100644 --- a/src/morph.h +++ b/src/morph.h @@ -1,6 +1,7 @@ /* * See Copyright Notice in atomorph.h - */ + */ +#pragma once #include "atomorph.h"