Copy disabled (too large)
Download .txt
Showing preview only (24,762K chars total). Download the full file to get everything.
Repository: T8RIN/ImageResizer
Branch: master
Commit: f34bd3109fe6
Files: 3013
Total size: 21.2 MB
Directory structure:
gitextract_9qydnqng/
├── .github/
│ ├── FUNDING.yml
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug_report.yml
│ │ └── feature_request.yml
│ ├── dependabot.yml
│ └── workflows/
│ ├── android.yml
│ ├── android_foss.yml
│ ├── android_market.yml
│ └── tb_release.yml
├── .gitignore
├── ARCHITECTURE.md
├── ARCHITECTURE_2
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── app/
│ ├── .gitignore
│ ├── build.gradle.kts
│ ├── proguard-rules.pro
│ └── src/
│ ├── main/
│ │ ├── AndroidManifest.xml
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── t8rin/
│ │ │ └── imagetoolbox/
│ │ │ └── app/
│ │ │ └── presentation/
│ │ │ ├── AppActivity.kt
│ │ │ └── components/
│ │ │ ├── ImageToolboxApplication.kt
│ │ │ ├── functions/
│ │ │ │ ├── AttachLogWriter.kt
│ │ │ │ ├── InitCollages.kt
│ │ │ │ ├── InitColorNames.kt
│ │ │ │ ├── InitNeuralTool.kt
│ │ │ │ ├── InitOpenCV.kt
│ │ │ │ ├── InitPdfBox.kt
│ │ │ │ ├── InitQrScanner.kt
│ │ │ │ ├── InjectBaseComponent.kt
│ │ │ │ ├── RegisterSecurityProviders.kt
│ │ │ │ └── SetupFlags.kt
│ │ │ └── utils/
│ │ │ └── GetProcessName.kt
│ │ └── res/
│ │ └── resources.properties
│ └── market/
│ ├── debug/
│ │ └── google-services.json
│ └── release/
│ └── google-services.json
├── benchmark/
│ ├── .gitignore
│ ├── build.gradle.kts
│ └── src/
│ └── main/
│ ├── AndroidManifest.xml
│ └── java/
│ └── com/
│ └── t8rin/
│ └── imagetoolbox/
│ └── benchmark/
│ └── BaselineProfileGenerator.kt
├── build-logic/
│ ├── .gitignore
│ ├── convention/
│ │ ├── .gitignore
│ │ ├── build.gradle.kts
│ │ └── src/
│ │ └── main/
│ │ └── kotlin/
│ │ ├── ImageToolboxApplicationPlugin.kt
│ │ ├── ImageToolboxHiltPlugin.kt
│ │ ├── ImageToolboxLibraryComposePlugin.kt
│ │ ├── ImageToolboxLibraryFeaturePlugin.kt
│ │ ├── ImageToolboxLibraryPlugin.kt
│ │ └── com/
│ │ └── t8rin/
│ │ └── imagetoolbox/
│ │ ├── ConfigureCompose.kt
│ │ ├── ConfigureDetekt.kt
│ │ ├── ConfigureKotlinAndroid.kt
│ │ └── ProjectExtensions.kt
│ └── settings.gradle.kts
├── build.gradle.kts
├── compose_compiler_config.conf
├── core/
│ ├── crash/
│ │ ├── .gitignore
│ │ ├── build.gradle.kts
│ │ └── src/
│ │ ├── foss/
│ │ │ └── java/
│ │ │ └── com/
│ │ │ └── t8rin/
│ │ │ └── imagetoolbox/
│ │ │ └── core/
│ │ │ └── crash/
│ │ │ └── data/
│ │ │ └── AnalyticsManagerImpl.kt
│ │ ├── main/
│ │ │ ├── AndroidManifest.xml
│ │ │ └── java/
│ │ │ └── com/
│ │ │ └── t8rin/
│ │ │ └── imagetoolbox/
│ │ │ └── core/
│ │ │ └── crash/
│ │ │ ├── di/
│ │ │ │ └── CrashModule.kt
│ │ │ └── presentation/
│ │ │ ├── CrashActivity.kt
│ │ │ ├── components/
│ │ │ │ ├── CrashActionButtons.kt
│ │ │ │ ├── CrashAttentionCard.kt
│ │ │ │ ├── CrashBottomButtons.kt
│ │ │ │ ├── CrashHandler.kt
│ │ │ │ ├── CrashInfoCard.kt
│ │ │ │ ├── CrashRootContent.kt
│ │ │ │ └── GlobalExceptionHandler.kt
│ │ │ └── screenLogic/
│ │ │ └── CrashComponent.kt
│ │ └── market/
│ │ └── java/
│ │ └── com/
│ │ └── t8rin/
│ │ └── imagetoolbox/
│ │ └── core/
│ │ └── crash/
│ │ └── data/
│ │ └── AnalyticsManagerImpl.kt
│ ├── data/
│ │ ├── .gitignore
│ │ ├── build.gradle.kts
│ │ └── src/
│ │ └── main/
│ │ ├── AndroidManifest.xml
│ │ └── java/
│ │ └── com/
│ │ └── t8rin/
│ │ └── imagetoolbox/
│ │ └── core/
│ │ └── data/
│ │ ├── coil/
│ │ │ ├── Base64Fetcher.kt
│ │ │ ├── CoilLogger.kt
│ │ │ ├── MemoryCache.kt
│ │ │ ├── PdfDecoder.kt
│ │ │ ├── TiffDecoder.kt
│ │ │ ├── TimeMeasureInterceptor.kt
│ │ │ └── UpscaleSvgDecoder.kt
│ │ ├── coroutines/
│ │ │ ├── AndroidDispatchersHolder.kt
│ │ │ └── AppScopeImpl.kt
│ │ ├── di/
│ │ │ ├── CoroutinesModule.kt
│ │ │ ├── ImageLoaderModule.kt
│ │ │ ├── ImageModule.kt
│ │ │ ├── JsonModule.kt
│ │ │ ├── LocalModule.kt
│ │ │ ├── RemoteModule.kt
│ │ │ ├── ResourcesModule.kt
│ │ │ └── SavingModule.kt
│ │ ├── image/
│ │ │ ├── AndroidImageCompressor.kt
│ │ │ ├── AndroidImageGetter.kt
│ │ │ ├── AndroidImagePreviewCreator.kt
│ │ │ ├── AndroidImageScaler.kt
│ │ │ ├── AndroidImageTransformer.kt
│ │ │ ├── AndroidMetadata.kt
│ │ │ ├── AndroidShareProvider.kt
│ │ │ └── utils/
│ │ │ ├── BlendingModeExt.kt
│ │ │ ├── CanvasUtils.kt
│ │ │ ├── ColorUtils.kt
│ │ │ ├── ImageCompressorBackend.kt
│ │ │ ├── StaticOptions.kt
│ │ │ └── compressor/
│ │ │ ├── AvifBackend.kt
│ │ │ ├── BmpBackend.kt
│ │ │ ├── HeicBackend.kt
│ │ │ ├── IcoBackend.kt
│ │ │ ├── Jpeg2000Backend.kt
│ │ │ ├── JpegliBackend.kt
│ │ │ ├── JpgBackend.kt
│ │ │ ├── JxlBackend.kt
│ │ │ ├── MozJpegBackend.kt
│ │ │ ├── OxiPngBackend.kt
│ │ │ ├── PngLosslessBackend.kt
│ │ │ ├── PngLossyBackend.kt
│ │ │ ├── QoiBackend.kt
│ │ │ ├── StaticGifBackend.kt
│ │ │ ├── TiffBackend.kt
│ │ │ └── WebpBackend.kt
│ │ ├── json/
│ │ │ └── MoshiParser.kt
│ │ ├── remote/
│ │ │ ├── AndroidDownloadManager.kt
│ │ │ └── AndroidRemoteResourcesStore.kt
│ │ ├── resource/
│ │ │ └── AndroidResourceManager.kt
│ │ ├── saving/
│ │ │ ├── AndroidFileController.kt
│ │ │ ├── AndroidFilenameCreator.kt
│ │ │ ├── AndroidKeepAliveService.kt
│ │ │ ├── KeepAliveForegroundService.kt
│ │ │ ├── SaveException.kt
│ │ │ ├── SavingFolder.kt
│ │ │ └── io/
│ │ │ ├── FileWriteable.kt
│ │ │ ├── StreamWriteable.kt
│ │ │ └── UriReadable.kt
│ │ └── utils/
│ │ ├── BitmapUtils.kt
│ │ ├── ChecksumUtils.kt
│ │ ├── CoilUtils.kt
│ │ ├── ContextUtils.kt
│ │ ├── CoroutinesUtils.kt
│ │ ├── FileUtils.kt
│ │ ├── HttpClientUtils.kt
│ │ └── WriteableUtils.kt
│ ├── di/
│ │ ├── .gitignore
│ │ ├── build.gradle.kts
│ │ └── src/
│ │ └── main/
│ │ ├── AndroidManifest.xml
│ │ └── java/
│ │ └── com/
│ │ └── t8rin/
│ │ └── imagetoolbox/
│ │ └── core/
│ │ └── di/
│ │ ├── EntryPointUtils.kt
│ │ └── Qualifiers.kt
│ ├── domain/
│ │ ├── .gitignore
│ │ ├── build.gradle.kts
│ │ └── src/
│ │ └── main/
│ │ ├── AndroidManifest.xml
│ │ └── kotlin/
│ │ └── com/
│ │ └── t8rin/
│ │ └── imagetoolbox/
│ │ └── core/
│ │ └── domain/
│ │ ├── Constants.kt
│ │ ├── coroutines/
│ │ │ ├── AppScope.kt
│ │ │ └── DispatchersHolder.kt
│ │ ├── image/
│ │ │ ├── ImageCompressor.kt
│ │ │ ├── ImageGetter.kt
│ │ │ ├── ImagePreviewCreator.kt
│ │ │ ├── ImageScaler.kt
│ │ │ ├── ImageShareProvider.kt
│ │ │ ├── ImageTransformer.kt
│ │ │ ├── Metadata.kt
│ │ │ ├── ShareProvider.kt
│ │ │ └── model/
│ │ │ ├── BlendingMode.kt
│ │ │ ├── ImageData.kt
│ │ │ ├── ImageFormat.kt
│ │ │ ├── ImageFormatGroup.kt
│ │ │ ├── ImageFrames.kt
│ │ │ ├── ImageInfo.kt
│ │ │ ├── ImageScaleMode.kt
│ │ │ ├── ImageWithSize.kt
│ │ │ ├── MetadataTag.kt
│ │ │ ├── Preset.kt
│ │ │ ├── Quality.kt
│ │ │ ├── ResizeAnchor.kt
│ │ │ ├── ResizeType.kt
│ │ │ └── TiffCompressionScheme.kt
│ │ ├── json/
│ │ │ └── JsonParser.kt
│ │ ├── model/
│ │ │ ├── CipherType.kt
│ │ │ ├── ColorModel.kt
│ │ │ ├── DomainAspectRatio.kt
│ │ │ ├── ExtraDataType.kt
│ │ │ ├── FileModel.kt
│ │ │ ├── FloatSize.kt
│ │ │ ├── HashingType.kt
│ │ │ ├── ImageModel.kt
│ │ │ ├── IntegerSize.kt
│ │ │ ├── MimeType.kt
│ │ │ ├── OffsetModel.kt
│ │ │ ├── Outline.kt
│ │ │ ├── PerformanceClass.kt
│ │ │ ├── Position.kt
│ │ │ ├── Pt.kt
│ │ │ ├── QrType.kt
│ │ │ ├── RectModel.kt
│ │ │ ├── SecureAlgorithmsMapping.kt
│ │ │ ├── SortType.kt
│ │ │ ├── SystemBarsVisibility.kt
│ │ │ └── VisibilityOwner.kt
│ │ ├── remote/
│ │ │ ├── AnalyticsManager.kt
│ │ │ ├── Cache.kt
│ │ │ ├── DownloadManager.kt
│ │ │ ├── DownloadProgress.kt
│ │ │ ├── RemoteResources.kt
│ │ │ └── RemoteResourcesStore.kt
│ │ ├── resource/
│ │ │ └── ResourceManager.kt
│ │ ├── saving/
│ │ │ ├── FileController.kt
│ │ │ ├── FilenameCreator.kt
│ │ │ ├── KeepAliveService.kt
│ │ │ ├── ObjectSaver.kt
│ │ │ ├── RandomStringGenerator.kt
│ │ │ ├── io/
│ │ │ │ ├── IoCloseable.kt
│ │ │ │ ├── Readable.kt
│ │ │ │ └── Writeable.kt
│ │ │ └── model/
│ │ │ ├── FileSaveTarget.kt
│ │ │ ├── FilenamePattern.kt
│ │ │ ├── ImageSaveTarget.kt
│ │ │ ├── SaveResult.kt
│ │ │ └── SaveTarget.kt
│ │ ├── transformation/
│ │ │ ├── ChainTransformation.kt
│ │ │ ├── GenericTransformation.kt
│ │ │ └── Transformation.kt
│ │ └── utils/
│ │ ├── ByteUtils.kt
│ │ ├── Delegates.kt
│ │ ├── FileMode.kt
│ │ ├── Flavor.kt
│ │ ├── IntUtils.kt
│ │ ├── KotlinUtils.kt
│ │ ├── ListUtils.kt
│ │ ├── ProgressInputStream.kt
│ │ ├── Quad.kt
│ │ ├── Rounding.kt
│ │ ├── SmartJob.kt
│ │ ├── StringUtils.kt
│ │ └── TimeUtils.kt
│ ├── filters/
│ │ ├── .gitignore
│ │ ├── build.gradle.kts
│ │ └── src/
│ │ └── main/
│ │ ├── AndroidManifest.xml
│ │ └── java/
│ │ └── com/
│ │ └── t8rin/
│ │ └── imagetoolbox/
│ │ └── core/
│ │ └── filters/
│ │ ├── data/
│ │ │ └── SideFadePaint.kt
│ │ ├── domain/
│ │ │ ├── FilterParamsInteractor.kt
│ │ │ ├── FilterProvider.kt
│ │ │ └── model/
│ │ │ ├── Filter.kt
│ │ │ ├── FilterParam.kt
│ │ │ ├── FilterUtils.kt
│ │ │ ├── FilterValueWrapper.kt
│ │ │ ├── TemplateFilter.kt
│ │ │ ├── enums/
│ │ │ │ ├── BlurEdgeMode.kt
│ │ │ │ ├── ColorMapType.kt
│ │ │ │ ├── FadeSide.kt
│ │ │ │ ├── MirrorSide.kt
│ │ │ │ ├── PaletteTransferSpace.kt
│ │ │ │ ├── PolarCoordinatesType.kt
│ │ │ │ ├── PopArtBlendingMode.kt
│ │ │ │ ├── SpotHealMode.kt
│ │ │ │ └── TransferFunc.kt
│ │ │ └── params/
│ │ │ ├── ArcParams.kt
│ │ │ ├── AsciiParams.kt
│ │ │ ├── BilaterialBlurParams.kt
│ │ │ ├── BloomParams.kt
│ │ │ ├── ChannelMixParams.kt
│ │ │ ├── ClaheParams.kt
│ │ │ ├── CropOrPerspectiveParams.kt
│ │ │ ├── EnhancedZoomBlurParams.kt
│ │ │ ├── GlitchParams.kt
│ │ │ ├── KaleidoscopeParams.kt
│ │ │ ├── LinearGaussianParams.kt
│ │ │ ├── LinearTiltShiftParams.kt
│ │ │ ├── PinchParams.kt
│ │ │ ├── RadialTiltShiftParams.kt
│ │ │ ├── RubberStampParams.kt
│ │ │ ├── SideFadeParams.kt
│ │ │ ├── SmearParams.kt
│ │ │ ├── SparkleParams.kt
│ │ │ ├── ToneCurvesParams.kt
│ │ │ ├── VoronoiCrystallizeParams.kt
│ │ │ └── WaterParams.kt
│ │ └── presentation/
│ │ ├── model/
│ │ │ ├── UiAcesFilmicToneMappingFilter.kt
│ │ │ ├── UiAcesHillToneMappingFilter.kt
│ │ │ ├── UiAchromatomalyFilter.kt
│ │ │ ├── UiAchromatopsiaFilter.kt
│ │ │ ├── UiAldridgeFilter.kt
│ │ │ ├── UiAmatorkaFilter.kt
│ │ │ ├── UiAnaglyphFilter.kt
│ │ │ ├── UiAnisotropicDiffusionFilter.kt
│ │ │ ├── UiArcFilter.kt
│ │ │ ├── UiAsciiFilter.kt
│ │ │ ├── UiAtkinsonDitheringFilter.kt
│ │ │ ├── UiAutoCropFilter.kt
│ │ │ ├── UiAutoPerspectiveFilter.kt
│ │ │ ├── UiAutoRemoveRedEyesFilter.kt
│ │ │ ├── UiAutumnTonesFilter.kt
│ │ │ ├── UiAverageDistanceFilter.kt
│ │ │ ├── UiBayerEightDitheringFilter.kt
│ │ │ ├── UiBayerFourDitheringFilter.kt
│ │ │ ├── UiBayerThreeDitheringFilter.kt
│ │ │ ├── UiBayerTwoDitheringFilter.kt
│ │ │ ├── UiBilaterialBlurFilter.kt
│ │ │ ├── UiBlackAndWhiteFilter.kt
│ │ │ ├── UiBlackHatFilter.kt
│ │ │ ├── UiBleachBypassFilter.kt
│ │ │ ├── UiBlockGlitchFilter.kt
│ │ │ ├── UiBloomFilter.kt
│ │ │ ├── UiBokehFilter.kt
│ │ │ ├── UiBorderFrameFilter.kt
│ │ │ ├── UiBoxBlurFilter.kt
│ │ │ ├── UiBrightnessFilter.kt
│ │ │ ├── UiBrowniFilter.kt
│ │ │ ├── UiBulgeDistortionFilter.kt
│ │ │ ├── UiBurkesDitheringFilter.kt
│ │ │ ├── UiCGAColorSpaceFilter.kt
│ │ │ ├── UiCandlelightFilter.kt
│ │ │ ├── UiCannyFilter.kt
│ │ │ ├── UiCaramelDarknessFilter.kt
│ │ │ ├── UiCelluloidFilter.kt
│ │ │ ├── UiChannelMixFilter.kt
│ │ │ ├── UiCircleBlurFilter.kt
│ │ │ ├── UiCirclePixelationFilter.kt
│ │ │ ├── UiClaheFilter.kt
│ │ │ ├── UiClaheHSLFilter.kt
│ │ │ ├── UiClaheHSVFilter.kt
│ │ │ ├── UiClaheJzazbzFilter.kt
│ │ │ ├── UiClaheLABFilter.kt
│ │ │ ├── UiClaheLUVFilter.kt
│ │ │ ├── UiClaheOklabFilter.kt
│ │ │ ├── UiClaheOklchFilter.kt
│ │ │ ├── UiClosingFilter.kt
│ │ │ ├── UiClustered2x2DitheringFilter.kt
│ │ │ ├── UiClustered4x4DitheringFilter.kt
│ │ │ ├── UiClustered8x8DitheringFilter.kt
│ │ │ ├── UiCodaChromeFilter.kt
│ │ │ ├── UiCoffeeFilter.kt
│ │ │ ├── UiColorAnomalyFilter.kt
│ │ │ ├── UiColorBalanceFilter.kt
│ │ │ ├── UiColorExplosionFilter.kt
│ │ │ ├── UiColorHalftoneFilter.kt
│ │ │ ├── UiColorMapFilter.kt
│ │ │ ├── UiColorMatrix3x3Filter.kt
│ │ │ ├── UiColorMatrix4x4Filter.kt
│ │ │ ├── UiColorOverlayFilter.kt
│ │ │ ├── UiColorPosterFilter.kt
│ │ │ ├── UiColorfulSwirlFilter.kt
│ │ │ ├── UiContourFilter.kt
│ │ │ ├── UiContrastFilter.kt
│ │ │ ├── UiConvexFilter.kt
│ │ │ ├── UiConvolution3x3Filter.kt
│ │ │ ├── UiCoolFilter.kt
│ │ │ ├── UiCopyMoveDetectionFilter.kt
│ │ │ ├── UiCropOrPerspectiveFilter.kt
│ │ │ ├── UiCropToContentFilter.kt
│ │ │ ├── UiCrossBlurFilter.kt
│ │ │ ├── UiCrossPixelizationFilter.kt
│ │ │ ├── UiCrosshatchFilter.kt
│ │ │ ├── UiCrtCurvatureFilter.kt
│ │ │ ├── UiCrystallizeFilter.kt
│ │ │ ├── UiCubeLutFilter.kt
│ │ │ ├── UiCyberpunkFilter.kt
│ │ │ ├── UiDeepPurpleFilter.kt
│ │ │ ├── UiDehazeFilter.kt
│ │ │ ├── UiDeskewFilter.kt
│ │ │ ├── UiDespeckleFilter.kt
│ │ │ ├── UiDeutaromalyFilter.kt
│ │ │ ├── UiDeutaronotopiaFilter.kt
│ │ │ ├── UiDiamondPixelationFilter.kt
│ │ │ ├── UiDiffuseFilter.kt
│ │ │ ├── UiDigitalCodeFilter.kt
│ │ │ ├── UiDilationFilter.kt
│ │ │ ├── UiDoGFilter.kt
│ │ │ ├── UiDragoFilter.kt
│ │ │ ├── UiDropBluesFilter.kt
│ │ │ ├── UiEdgyAmberFilter.kt
│ │ │ ├── UiElectricGradientFilter.kt
│ │ │ ├── UiEmbossFilter.kt
│ │ │ ├── UiEnhancedCirclePixelationFilter.kt
│ │ │ ├── UiEnhancedDiamondPixelationFilter.kt
│ │ │ ├── UiEnhancedGlitchFilter.kt
│ │ │ ├── UiEnhancedOilFilter.kt
│ │ │ ├── UiEnhancedPixelationFilter.kt
│ │ │ ├── UiEnhancedZoomBlurFilter.kt
│ │ │ ├── UiEqualizeFilter.kt
│ │ │ ├── UiEqualizeHistogramAdaptiveFilter.kt
│ │ │ ├── UiEqualizeHistogramAdaptiveHSLFilter.kt
│ │ │ ├── UiEqualizeHistogramAdaptiveHSVFilter.kt
│ │ │ ├── UiEqualizeHistogramAdaptiveLABFilter.kt
│ │ │ ├── UiEqualizeHistogramAdaptiveLUVFilter.kt
│ │ │ ├── UiEqualizeHistogramFilter.kt
│ │ │ ├── UiEqualizeHistogramHSVFilter.kt
│ │ │ ├── UiEqualizeHistogramPixelationFilter.kt
│ │ │ ├── UiErodeFilter.kt
│ │ │ ├── UiErrorLevelAnalysisFilter.kt
│ │ │ ├── UiExposureFilter.kt
│ │ │ ├── UiFallColorsFilter.kt
│ │ │ ├── UiFalseColorFilter.kt
│ │ │ ├── UiFalseFloydSteinbergDitheringFilter.kt
│ │ │ ├── UiFantasyLandscapeFilter.kt
│ │ │ ├── UiFastBilaterialBlurFilter.kt
│ │ │ ├── UiFastBlurFilter.kt
│ │ │ ├── UiFastGaussianBlur2DFilter.kt
│ │ │ ├── UiFastGaussianBlur3DFilter.kt
│ │ │ ├── UiFastGaussianBlur4DFilter.kt
│ │ │ ├── UiFilmStock50Filter.kt
│ │ │ ├── UiFilter.kt
│ │ │ ├── UiFloydSteinbergDitheringFilter.kt
│ │ │ ├── UiFoggyNightFilter.kt
│ │ │ ├── UiFractalGlassFilter.kt
│ │ │ ├── UiFuturisticGradientFilter.kt
│ │ │ ├── UiGammaFilter.kt
│ │ │ ├── UiGaussianBlurFilter.kt
│ │ │ ├── UiGaussianBoxBlurFilter.kt
│ │ │ ├── UiGlassSphereRefractionFilter.kt
│ │ │ ├── UiGlitchFilter.kt
│ │ │ ├── UiGlitchVariantFilter.kt
│ │ │ ├── UiGlowFilter.kt
│ │ │ ├── UiGoldenForestFilter.kt
│ │ │ ├── UiGoldenHourFilter.kt
│ │ │ ├── UiGothamFilter.kt
│ │ │ ├── UiGrainFilter.kt
│ │ │ ├── UiGrayscaleFilter.kt
│ │ │ ├── UiGreenSunFilter.kt
│ │ │ ├── UiGreenishFilter.kt
│ │ │ ├── UiHDRFilter.kt
│ │ │ ├── UiHableFilmicToneMappingFilter.kt
│ │ │ ├── UiHalftoneFilter.kt
│ │ │ ├── UiHazeFilter.kt
│ │ │ ├── UiHejlBurgessToneMappingFilter.kt
│ │ │ ├── UiHighlightsAndShadowsFilter.kt
│ │ │ ├── UiHorizontalWindStaggerFilter.kt
│ │ │ ├── UiHotSummerFilter.kt
│ │ │ ├── UiHueFilter.kt
│ │ │ ├── UiJarvisJudiceNinkeDitheringFilter.kt
│ │ │ ├── UiKaleidoscopeFilter.kt
│ │ │ ├── UiKodakFilter.kt
│ │ │ ├── UiKuwaharaFilter.kt
│ │ │ ├── UiLUT512x512Filter.kt
│ │ │ ├── UiLaplacianFilter.kt
│ │ │ ├── UiLaplacianSimpleFilter.kt
│ │ │ ├── UiLavenderDreamFilter.kt
│ │ │ ├── UiLeftToRightDitheringFilter.kt
│ │ │ ├── UiLemonadeLightFilter.kt
│ │ │ ├── UiLensCorrectionFilter.kt
│ │ │ ├── UiLinearBoxBlurFilter.kt
│ │ │ ├── UiLinearFastGaussianBlurFilter.kt
│ │ │ ├── UiLinearFastGaussianBlurNextFilter.kt
│ │ │ ├── UiLinearGaussianBlurFilter.kt
│ │ │ ├── UiLinearGaussianBoxBlurFilter.kt
│ │ │ ├── UiLinearStackBlurFilter.kt
│ │ │ ├── UiLinearTentBlurFilter.kt
│ │ │ ├── UiLinearTiltShiftFilter.kt
│ │ │ ├── UiLogarithmicToneMappingFilter.kt
│ │ │ ├── UiLookupFilter.kt
│ │ │ ├── UiLowPolyFilter.kt
│ │ │ ├── UiLuminanceGradientFilter.kt
│ │ │ ├── UiMarbleFilter.kt
│ │ │ ├── UiMedianBlurFilter.kt
│ │ │ ├── UiMicroMacroPixelizationFilter.kt
│ │ │ ├── UiMirrorFilter.kt
│ │ │ ├── UiMissEtikateFilter.kt
│ │ │ ├── UiMobiusFilter.kt
│ │ │ ├── UiMoireFilter.kt
│ │ │ ├── UiMonochromeFilter.kt
│ │ │ ├── UiMorphologicalGradientFilter.kt
│ │ │ ├── UiMotionBlurFilter.kt
│ │ │ ├── UiNativeStackBlurFilter.kt
│ │ │ ├── UiNegativeFilter.kt
│ │ │ ├── UiNeonFilter.kt
│ │ │ ├── UiNightMagicFilter.kt
│ │ │ ├── UiNightVisionFilter.kt
│ │ │ ├── UiNoiseFilter.kt
│ │ │ ├── UiNonMaximumSuppressionFilter.kt
│ │ │ ├── UiNucleusPixelizationFilter.kt
│ │ │ ├── UiOffsetFilter.kt
│ │ │ ├── UiOilFilter.kt
│ │ │ ├── UiOldTvFilter.kt
│ │ │ ├── UiOpacityFilter.kt
│ │ │ ├── UiOpeningFilter.kt
│ │ │ ├── UiOrangeHazeFilter.kt
│ │ │ ├── UiOrbitalPixelizationFilter.kt
│ │ │ ├── UiPaletteTransferFilter.kt
│ │ │ ├── UiPaletteTransferVariantFilter.kt
│ │ │ ├── UiPastelFilter.kt
│ │ │ ├── UiPerlinDistortionFilter.kt
│ │ │ ├── UiPinchFilter.kt
│ │ │ ├── UiPinkDreamFilter.kt
│ │ │ ├── UiPixelMeltFilter.kt
│ │ │ ├── UiPixelationFilter.kt
│ │ │ ├── UiPointillizeFilter.kt
│ │ │ ├── UiPoissonBlurFilter.kt
│ │ │ ├── UiPolarCoordinatesFilter.kt
│ │ │ ├── UiPolaroidFilter.kt
│ │ │ ├── UiPolkaDotFilter.kt
│ │ │ ├── UiPopArtFilter.kt
│ │ │ ├── UiPosterizeFilter.kt
│ │ │ ├── UiProtanopiaFilter.kt
│ │ │ ├── UiProtonomalyFilter.kt
│ │ │ ├── UiPulseGridPixelizationFilter.kt
│ │ │ ├── UiPurpleMistFilter.kt
│ │ │ ├── UiQuantizierFilter.kt
│ │ │ ├── UiRGBFilter.kt
│ │ │ ├── UiRadialTiltShiftFilter.kt
│ │ │ ├── UiRadialWeavePixelizationFilter.kt
│ │ │ ├── UiRainbowWorldFilter.kt
│ │ │ ├── UiRandomDitheringFilter.kt
│ │ │ ├── UiRedSwirlFilter.kt
│ │ │ ├── UiReduceNoiseFilter.kt
│ │ │ ├── UiRemoveColorFilter.kt
│ │ │ ├── UiReplaceColorFilter.kt
│ │ │ ├── UiRetroYellowFilter.kt
│ │ │ ├── UiRingBlurFilter.kt
│ │ │ ├── UiRubberStampFilter.kt
│ │ │ ├── UiSandPaintingFilter.kt
│ │ │ ├── UiSaturationFilter.kt
│ │ │ ├── UiSeamCarvingFilter.kt
│ │ │ ├── UiSepiaFilter.kt
│ │ │ ├── UiSharpenFilter.kt
│ │ │ ├── UiShuffleBlurFilter.kt
│ │ │ ├── UiSideFadeFilter.kt
│ │ │ ├── UiSierraDitheringFilter.kt
│ │ │ ├── UiSierraLiteDitheringFilter.kt
│ │ │ ├── UiSimpleOldTvFilter.kt
│ │ │ ├── UiSimpleSketchFilter.kt
│ │ │ ├── UiSimpleSolarizeFilter.kt
│ │ │ ├── UiSimpleThresholdDitheringFilter.kt
│ │ │ ├── UiSimpleWeavePixelationFilter.kt
│ │ │ ├── UiSketchFilter.kt
│ │ │ ├── UiSmearFilter.kt
│ │ │ ├── UiSmoothToonFilter.kt
│ │ │ ├── UiSobelEdgeDetectionFilter.kt
│ │ │ ├── UiSobelSimpleFilter.kt
│ │ │ ├── UiSoftEleganceFilter.kt
│ │ │ ├── UiSoftEleganceVariantFilter.kt
│ │ │ ├── UiSoftSpringLightFilter.kt
│ │ │ ├── UiSolarizeFilter.kt
│ │ │ ├── UiSpacePortalFilter.kt
│ │ │ ├── UiSparkleFilter.kt
│ │ │ ├── UiSpectralFireFilter.kt
│ │ │ ├── UiSphereLensDistortionFilter.kt
│ │ │ ├── UiSphereRefractionFilter.kt
│ │ │ ├── UiStackBlurFilter.kt
│ │ │ ├── UiStaggeredPixelizationFilter.kt
│ │ │ ├── UiStarBlurFilter.kt
│ │ │ ├── UiStrokePixelationFilter.kt
│ │ │ ├── UiStuckiDitheringFilter.kt
│ │ │ ├── UiSunriseFilter.kt
│ │ │ ├── UiSwirlDistortionFilter.kt
│ │ │ ├── UiTentBlurFilter.kt
│ │ │ ├── UiThresholdFilter.kt
│ │ │ ├── UiToneCurvesFilter.kt
│ │ │ ├── UiToonFilter.kt
│ │ │ ├── UiTopHatFilter.kt
│ │ │ ├── UiTriToneFilter.kt
│ │ │ ├── UiTritanopiaFilter.kt
│ │ │ ├── UiTritonomalyFilter.kt
│ │ │ ├── UiTwirlFilter.kt
│ │ │ ├── UiTwoRowSierraDitheringFilter.kt
│ │ │ ├── UiUchimuraFilter.kt
│ │ │ ├── UiUnsharpFilter.kt
│ │ │ ├── UiVHSFilter.kt
│ │ │ ├── UiVibranceFilter.kt
│ │ │ ├── UiVignetteFilter.kt
│ │ │ ├── UiVintageFilter.kt
│ │ │ ├── UiVoronoiCrystallizeFilter.kt
│ │ │ ├── UiVortexPixelizationFilter.kt
│ │ │ ├── UiWarmFilter.kt
│ │ │ ├── UiWaterEffectFilter.kt
│ │ │ ├── UiWeakPixelFilter.kt
│ │ │ ├── UiWeaveFilter.kt
│ │ │ ├── UiWhiteBalanceFilter.kt
│ │ │ ├── UiYililomaDitheringFilter.kt
│ │ │ └── UiZoomBlurFilter.kt
│ │ ├── utils/
│ │ │ ├── CollectAsUiState.kt
│ │ │ ├── LamaLoader.kt
│ │ │ └── Mappings.kt
│ │ └── widget/
│ │ ├── AddFilterButton.kt
│ │ ├── CalculateBrightnessEstimate.kt
│ │ ├── CubeLutDownloadDialog.kt
│ │ ├── FilterItem.kt
│ │ ├── FilterItemContent.kt
│ │ ├── FilterPreviewSheet.kt
│ │ ├── FilterReorderSheet.kt
│ │ ├── FilterSelectionCubeLutBottomContent.kt
│ │ ├── FilterSelectionItem.kt
│ │ ├── FilterTemplateAddingGroup.kt
│ │ ├── FilterTemplateCreationSheet.kt
│ │ ├── FilterTemplateInfoSheet.kt
│ │ ├── TemplateFilterSelectionItem.kt
│ │ ├── addFilters/
│ │ │ ├── AddFiltersSheet.kt
│ │ │ ├── AddFiltersSheetComponent.kt
│ │ │ ├── FavoritesContent.kt
│ │ │ ├── OtherContent.kt
│ │ │ └── TemplatesContent.kt
│ │ └── filterItem/
│ │ ├── ArcParamsItem.kt
│ │ ├── AsciiParamsItem.kt
│ │ ├── BilaterialBlurParamsItem.kt
│ │ ├── BloomParamsItem.kt
│ │ ├── BooleanItem.kt
│ │ ├── ChannelMixParamsItem.kt
│ │ ├── ClaheParamsItem.kt
│ │ ├── CropOrPerspectiveParamsItem.kt
│ │ ├── EdgeModeSelector.kt
│ │ ├── EnhancedZoomBlurParamsItem.kt
│ │ ├── FilterValueWrapperItem.kt
│ │ ├── FloatArrayItem.kt
│ │ ├── FloatItem.kt
│ │ ├── GlitchParamsItem.kt
│ │ ├── IntegerSizeParamsItem.kt
│ │ ├── KaleidoscopeParamsItem.kt
│ │ ├── LinearGaussianParamsItem.kt
│ │ ├── LinearTiltShiftParamsItem.kt
│ │ ├── MirrorSideSelector.kt
│ │ ├── PairItem.kt
│ │ ├── PinchParamsItem.kt
│ │ ├── QuadItem.kt
│ │ ├── RadialTiltShiftParamsItem.kt
│ │ ├── RubberStampParamsItem.kt
│ │ ├── SideFadeRelativeItem.kt
│ │ ├── SmearParamsItem.kt
│ │ ├── SparkleParamsItem.kt
│ │ ├── ToneCurvesParamsItem.kt
│ │ ├── TransferFuncSelector.kt
│ │ ├── TripleItem.kt
│ │ ├── VoronoiCrystallizeParamsItem.kt
│ │ ├── WaterParamsItem.kt
│ │ ├── pair_components/
│ │ │ ├── ColorModelPairItem.kt
│ │ │ ├── FloatColorModelPairItem.kt
│ │ │ ├── FloatFileModelPairItem.kt
│ │ │ ├── FloatImageModelPairItem.kt
│ │ │ ├── NumberBlurEdgeModePairItem.kt
│ │ │ ├── NumberBooleanPairItem.kt
│ │ │ ├── NumberMirrorSidePairItem.kt
│ │ │ ├── NumberPairItem.kt
│ │ │ └── NumberTransferFuncPairItem.kt
│ │ ├── quad_components/
│ │ │ ├── NumberColorModelQuadItem.kt
│ │ │ └── NumberQuadItem.kt
│ │ └── triple_components/
│ │ ├── ColorModelTripleItem.kt
│ │ ├── FloatPaletteImageModelTripleItem.kt
│ │ ├── NumberColorModelColorModelTripleItem.kt
│ │ ├── NumberColorModelPopArtTripleItem.kt
│ │ ├── NumberNumberBlurEdgeModeTripleItem.kt
│ │ ├── NumberNumberColorModelTripleItem.kt
│ │ ├── NumberTransferFuncBlurEdgeModeTripleItem.kt
│ │ └── NumberTripleItem.kt
│ ├── ksp/
│ │ ├── .gitignore
│ │ ├── build.gradle.kts
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── t8rin/
│ │ │ └── imagetoolbox/
│ │ │ └── core/
│ │ │ └── ksp/
│ │ │ ├── annotations/
│ │ │ │ ├── FilterInject.kt
│ │ │ │ └── UiFilterInject.kt
│ │ │ └── processor/
│ │ │ ├── FilterInjectProcessor.kt
│ │ │ └── UiFilterInjectProcessor.kt
│ │ └── resources/
│ │ └── META-INF/
│ │ └── services/
│ │ └── com.google.devtools.ksp.processing.SymbolProcessorProvider
│ ├── resources/
│ │ ├── .gitignore
│ │ ├── build.gradle.kts
│ │ └── src/
│ │ ├── debug/
│ │ │ └── res/
│ │ │ ├── drawable/
│ │ │ │ ├── ic_launcher_foreground.xml
│ │ │ │ ├── ic_logo_animated.xml
│ │ │ │ └── ic_notification_icon.xml
│ │ │ ├── drawable-v31/
│ │ │ │ └── ic_logo_animated.xml
│ │ │ ├── mipmap-anydpi-v26/
│ │ │ │ ├── ic_launcher.xml
│ │ │ │ └── ic_launcher_round.xml
│ │ │ ├── values/
│ │ │ │ ├── colors.xml
│ │ │ │ └── ic_launcher_background.xml
│ │ │ ├── values-night/
│ │ │ │ └── colors.xml
│ │ │ ├── values-night-v31/
│ │ │ │ └── colors.xml
│ │ │ └── values-v31/
│ │ │ └── colors.xml
│ │ └── main/
│ │ ├── AndroidManifest.xml
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── t8rin/
│ │ │ └── imagetoolbox/
│ │ │ └── core/
│ │ │ └── resources/
│ │ │ ├── emoji/
│ │ │ │ ├── Emoji.kt
│ │ │ │ └── EmojiData.kt
│ │ │ ├── icons/
│ │ │ │ ├── AddPhotoAlt.kt
│ │ │ │ ├── AddSticky.kt
│ │ │ │ ├── Analogous.kt
│ │ │ │ ├── AnalogousComplementary.kt
│ │ │ │ ├── Analytics.kt
│ │ │ │ ├── Animation.kt
│ │ │ │ ├── Apng.kt
│ │ │ │ ├── ApngBox.kt
│ │ │ │ ├── AppShortcut.kt
│ │ │ │ ├── Apps.kt
│ │ │ │ ├── Archive.kt
│ │ │ │ ├── AreaChart.kt
│ │ │ │ ├── ArtTrack.kt
│ │ │ │ ├── Ascii.kt
│ │ │ │ ├── AutoDelete.kt
│ │ │ │ ├── BackgroundColor.kt
│ │ │ │ ├── BarcodeScanner.kt
│ │ │ │ ├── Base64.kt
│ │ │ │ ├── BatchPrediction.kt
│ │ │ │ ├── Beta.kt
│ │ │ │ ├── Bitcoin.kt
│ │ │ │ ├── Block.kt
│ │ │ │ ├── BlurCircular.kt
│ │ │ │ ├── BoldLine.kt
│ │ │ │ ├── Bolt.kt
│ │ │ │ ├── BookmarkOff.kt
│ │ │ │ ├── BookmarkRemove.kt
│ │ │ │ ├── Boosty.kt
│ │ │ │ ├── BorderColor.kt
│ │ │ │ ├── BrokenImageAlt.kt
│ │ │ │ ├── BrushColor.kt
│ │ │ │ ├── BubbleDelete.kt
│ │ │ │ ├── Build.kt
│ │ │ │ ├── CancelSmall.kt
│ │ │ │ ├── ClipboardFile.kt
│ │ │ │ ├── Collage.kt
│ │ │ │ ├── Communication.kt
│ │ │ │ ├── Compare.kt
│ │ │ │ ├── CompareArrows.kt
│ │ │ │ ├── Complementary.kt
│ │ │ │ ├── ContractEdit.kt
│ │ │ │ ├── ContractImage.kt
│ │ │ │ ├── Cool.kt
│ │ │ │ ├── Counter.kt
│ │ │ │ ├── Crashlytics.kt
│ │ │ │ ├── CropSmall.kt
│ │ │ │ ├── Cube.kt
│ │ │ │ ├── Curve.kt
│ │ │ │ ├── DashedLine.kt
│ │ │ │ ├── Database.kt
│ │ │ │ ├── Delete.kt
│ │ │ │ ├── DeleteSweep.kt
│ │ │ │ ├── Deselect.kt
│ │ │ │ ├── DesignServices.kt
│ │ │ │ ├── DocumentScanner.kt
│ │ │ │ ├── DotDashedLine.kt
│ │ │ │ ├── Dots.kt
│ │ │ │ ├── DownloadFile.kt
│ │ │ │ ├── Draw.kt
│ │ │ │ ├── EditAlt.kt
│ │ │ │ ├── EmojiMultiple.kt
│ │ │ │ ├── EmojiSticky.kt
│ │ │ │ ├── Encrypted.kt
│ │ │ │ ├── Eraser.kt
│ │ │ │ ├── Exercise.kt
│ │ │ │ ├── Exif.kt
│ │ │ │ ├── ExifEdit.kt
│ │ │ │ ├── Eyedropper.kt
│ │ │ │ ├── FabCorner.kt
│ │ │ │ ├── FileExport.kt
│ │ │ │ ├── FileImage.kt
│ │ │ │ ├── FileImport.kt
│ │ │ │ ├── FileReplace.kt
│ │ │ │ ├── FindInPage.kt
│ │ │ │ ├── FingerprintOff.kt
│ │ │ │ ├── Firebase.kt
│ │ │ │ ├── Flip.kt
│ │ │ │ ├── FlipVertical.kt
│ │ │ │ ├── FloatingActionButton.kt
│ │ │ │ ├── FloodFill.kt
│ │ │ │ ├── FolderCompare.kt
│ │ │ │ ├── FolderImage.kt
│ │ │ │ ├── FolderImageAlt.kt
│ │ │ │ ├── FolderMatch.kt
│ │ │ │ ├── FolderOpened.kt
│ │ │ │ ├── FontFamily.kt
│ │ │ │ ├── FormatPaintVariant.kt
│ │ │ │ ├── Forum.kt
│ │ │ │ ├── FreeArrow.kt
│ │ │ │ ├── FreeDoubleArrow.kt
│ │ │ │ ├── FreeDraw.kt
│ │ │ │ ├── Github.kt
│ │ │ │ ├── Glyphs.kt
│ │ │ │ ├── GooglePlay.kt
│ │ │ │ ├── Gradient.kt
│ │ │ │ ├── Group.kt
│ │ │ │ ├── HandshakeAlt.kt
│ │ │ │ ├── HardDrive.kt
│ │ │ │ ├── HighRes.kt
│ │ │ │ ├── Highlighter.kt
│ │ │ │ ├── HistoryCreate.kt
│ │ │ │ ├── HyperOS.kt
│ │ │ │ ├── IOS.kt
│ │ │ │ ├── ImageCombine.kt
│ │ │ │ ├── ImageConvert.kt
│ │ │ │ ├── ImageDownload.kt
│ │ │ │ ├── ImageEdit.kt
│ │ │ │ ├── ImageEmbedded.kt
│ │ │ │ ├── ImageLimit.kt
│ │ │ │ ├── ImageOverlay.kt
│ │ │ │ ├── ImageReset.kt
│ │ │ │ ├── ImageResize.kt
│ │ │ │ ├── ImageSaw.kt
│ │ │ │ ├── ImageSearch.kt
│ │ │ │ ├── ImageSticky.kt
│ │ │ │ ├── ImageSync.kt
│ │ │ │ ├── ImageText.kt
│ │ │ │ ├── ImageToText.kt
│ │ │ │ ├── ImageToolboxBroken.kt
│ │ │ │ ├── ImageTooltip.kt
│ │ │ │ ├── ImageWeight.kt
│ │ │ │ ├── ImagesMode.kt
│ │ │ │ ├── ImagesearchRoller.kt
│ │ │ │ ├── Interface.kt
│ │ │ │ ├── Jpg.kt
│ │ │ │ ├── Jxl.kt
│ │ │ │ ├── KeyVariant.kt
│ │ │ │ ├── KeyVertical.kt
│ │ │ │ ├── LabelPercent.kt
│ │ │ │ ├── Landscape.kt
│ │ │ │ ├── Landscape2.kt
│ │ │ │ ├── Lasso.kt
│ │ │ │ ├── Latitude.kt
│ │ │ │ ├── Layers.kt
│ │ │ │ ├── LayersSearchOutline.kt
│ │ │ │ ├── LetterO.kt
│ │ │ │ ├── LetterS.kt
│ │ │ │ ├── License.kt
│ │ │ │ ├── Line.kt
│ │ │ │ ├── LineArrow.kt
│ │ │ │ ├── LineDoubleArrow.kt
│ │ │ │ ├── Longitude.kt
│ │ │ │ ├── Manga.kt
│ │ │ │ ├── MaterialDesign.kt
│ │ │ │ ├── MeshDownload.kt
│ │ │ │ ├── MeshGradient.kt
│ │ │ │ ├── MiniEdit.kt
│ │ │ │ ├── MiniEditLarge.kt
│ │ │ │ ├── Mobile.kt
│ │ │ │ ├── MobileArrowDown.kt
│ │ │ │ ├── MobileArrowUpRight.kt
│ │ │ │ ├── MobileCast.kt
│ │ │ │ ├── MobileLandscape.kt
│ │ │ │ ├── MobileLayout.kt
│ │ │ │ ├── MobileRotateLock.kt
│ │ │ │ ├── MobileShare.kt
│ │ │ │ ├── MobileVibrate.kt
│ │ │ │ ├── Mop.kt
│ │ │ │ ├── MultipleImageEdit.kt
│ │ │ │ ├── MusicAdd.kt
│ │ │ │ ├── NeonBrush.kt
│ │ │ │ ├── Neurology.kt
│ │ │ │ ├── NextPlan.kt
│ │ │ │ ├── Noise.kt
│ │ │ │ ├── NoiseAlt.kt
│ │ │ │ ├── Numeric.kt
│ │ │ │ ├── OverlayAbove.kt
│ │ │ │ ├── PaletteBox.kt
│ │ │ │ ├── PaletteSwatch.kt
│ │ │ │ ├── Panorama.kt
│ │ │ │ ├── Pdf.kt
│ │ │ │ ├── Pen.kt
│ │ │ │ ├── Perspective.kt
│ │ │ │ ├── PhotoPicker.kt
│ │ │ │ ├── PhotoPickerMobile.kt
│ │ │ │ ├── PhotoPrints.kt
│ │ │ │ ├── PhotoSizeSelectSmall.kt
│ │ │ │ ├── PictureInPictureCenter.kt
│ │ │ │ ├── Png.kt
│ │ │ │ ├── Polygon.kt
│ │ │ │ ├── Prefix.kt
│ │ │ │ ├── Preview.kt
│ │ │ │ ├── Print.kt
│ │ │ │ ├── Psychology.kt
│ │ │ │ ├── Puzzle.kt
│ │ │ │ ├── QrCode.kt
│ │ │ │ ├── QualityHigh.kt
│ │ │ │ ├── QualityLow.kt
│ │ │ │ ├── QualityMedium.kt
│ │ │ │ ├── Rabbit.kt
│ │ │ │ ├── Resize.kt
│ │ │ │ ├── ResponsiveLayout.kt
│ │ │ │ ├── Robot.kt
│ │ │ │ ├── RobotExcited.kt
│ │ │ │ ├── Rotate90Cw.kt
│ │ │ │ ├── Routine.kt
│ │ │ │ ├── SamsungLetter.kt
│ │ │ │ ├── SaveConfirm.kt
│ │ │ │ ├── ScaleUnbalanced.kt
│ │ │ │ ├── Scanner.kt
│ │ │ │ ├── Scissors.kt
│ │ │ │ ├── ScissorsSmall.kt
│ │ │ │ ├── SelectAll.kt
│ │ │ │ ├── SelectInverse.kt
│ │ │ │ ├── ServiceToolbox.kt
│ │ │ │ ├── SettingsTimelapse.kt
│ │ │ │ ├── Shadow.kt
│ │ │ │ ├── ShareOff.kt
│ │ │ │ ├── ShieldKey.kt
│ │ │ │ ├── ShieldLock.kt
│ │ │ │ ├── ShieldOpen.kt
│ │ │ │ ├── ShineDiamond.kt
│ │ │ │ ├── Signature.kt
│ │ │ │ ├── SkewMore.kt
│ │ │ │ ├── Slider.kt
│ │ │ │ ├── Snail.kt
│ │ │ │ ├── Snowflake.kt
│ │ │ │ ├── Speed.kt
│ │ │ │ ├── SplitAlt.kt
│ │ │ │ ├── SplitComplementary.kt
│ │ │ │ ├── Spray.kt
│ │ │ │ ├── Square.kt
│ │ │ │ ├── SquareEdit.kt
│ │ │ │ ├── SquareFoot.kt
│ │ │ │ ├── SquareHarmony.kt
│ │ │ │ ├── Stack.kt
│ │ │ │ ├── StackSticky.kt
│ │ │ │ ├── StackStickyOff.kt
│ │ │ │ ├── Stacks.kt
│ │ │ │ ├── StampedLine.kt
│ │ │ │ ├── StarSticky.kt
│ │ │ │ ├── StickerEmoji.kt
│ │ │ │ ├── Stylus.kt
│ │ │ │ ├── Suffix.kt
│ │ │ │ ├── Svg.kt
│ │ │ │ ├── SwapVerticalCircle.kt
│ │ │ │ ├── Swatch.kt
│ │ │ │ ├── Symbol.kt
│ │ │ │ ├── SyncArrowDown.kt
│ │ │ │ ├── TableEye.kt
│ │ │ │ ├── TagText.kt
│ │ │ │ ├── Telegram.kt
│ │ │ │ ├── TelevisionAmbientLight.kt
│ │ │ │ ├── Tetradic.kt
│ │ │ │ ├── TextFields.kt
│ │ │ │ ├── TextSearch.kt
│ │ │ │ ├── TextSticky.kt
│ │ │ │ ├── Theme.kt
│ │ │ │ ├── TimerEdit.kt
│ │ │ │ ├── Titlecase.kt
│ │ │ │ ├── Ton.kt
│ │ │ │ ├── Tonality.kt
│ │ │ │ ├── Toolbox.kt
│ │ │ │ ├── TopLeft.kt
│ │ │ │ ├── Tortoise.kt
│ │ │ │ ├── Transparency.kt
│ │ │ │ ├── Triadic.kt
│ │ │ │ ├── Triangle.kt
│ │ │ │ ├── USDT.kt
│ │ │ │ ├── Unarchive.kt
│ │ │ │ ├── Ungroup.kt
│ │ │ │ ├── VectorPolyline.kt
│ │ │ │ ├── VolunteerActivism.kt
│ │ │ │ ├── WallpaperAlt.kt
│ │ │ │ ├── WandShine.kt
│ │ │ │ ├── WandStars.kt
│ │ │ │ ├── Watermark.kt
│ │ │ │ ├── Webp.kt
│ │ │ │ ├── WebpBox.kt
│ │ │ │ ├── Windows.kt
│ │ │ │ └── ZigzagLine.kt
│ │ │ └── shapes/
│ │ │ ├── ArrowShape.kt
│ │ │ ├── BookmarkShape.kt
│ │ │ ├── BurgerShape.kt
│ │ │ ├── CloverShape.kt
│ │ │ ├── DropletShape.kt
│ │ │ ├── EggShape.kt
│ │ │ ├── ExplosionShape.kt
│ │ │ ├── HeartShape.kt
│ │ │ ├── KotlinShape.kt
│ │ │ ├── MapShape.kt
│ │ │ ├── MaterialStarShape.kt
│ │ │ ├── MorphShape.kt
│ │ │ ├── OctagonShape.kt
│ │ │ ├── OvalShape.kt
│ │ │ ├── PathShape.kt
│ │ │ ├── PentagonShape.kt
│ │ │ ├── PillShape.kt
│ │ │ ├── ShieldShape.kt
│ │ │ ├── ShurikenShape.kt
│ │ │ ├── SimpleHeartShape.kt
│ │ │ ├── SmallMaterialStarShape.kt
│ │ │ └── SquircleShape.kt
│ │ └── res/
│ │ ├── drawable/
│ │ │ ├── app_registration_24px.xml
│ │ │ ├── ic_24_barcode_scanner.xml
│ │ │ ├── ic_launcher_foreground.xml
│ │ │ ├── ic_launcher_monochrome_24.xml
│ │ │ ├── ic_logo_animated.xml
│ │ │ ├── ic_notification_icon.xml
│ │ │ ├── image_to_text_outlined.xml
│ │ │ ├── mobile_screenshot.xml
│ │ │ ├── multiple_image_edit.xml
│ │ │ ├── outline_colorize_24.xml
│ │ │ ├── outline_drag_handle_24.xml
│ │ │ ├── palette_swatch_outlined.xml
│ │ │ ├── rounded_document_scanner_24.xml
│ │ │ ├── rounded_qr_code_scanner_24.xml
│ │ │ └── shape_find_in_file.xml
│ │ ├── drawable-v31/
│ │ │ └── ic_logo_animated.xml
│ │ ├── mipmap-anydpi-v26/
│ │ │ ├── ic_launcher.xml
│ │ │ └── ic_launcher_round.xml
│ │ ├── raw/
│ │ │ └── keep.xml
│ │ ├── values/
│ │ │ ├── arrays.xml
│ │ │ ├── bools.xml
│ │ │ ├── colors.xml
│ │ │ ├── ic_launcher_background.xml
│ │ │ ├── strings.xml
│ │ │ └── themes.xml
│ │ ├── values-ar/
│ │ │ └── strings.xml
│ │ ├── values-be/
│ │ │ └── strings.xml
│ │ ├── values-bn/
│ │ │ └── strings.xml
│ │ ├── values-ca/
│ │ │ └── strings.xml
│ │ ├── values-cs/
│ │ │ └── strings.xml
│ │ ├── values-da/
│ │ │ └── strings.xml
│ │ ├── values-de/
│ │ │ └── strings.xml
│ │ ├── values-es/
│ │ │ └── strings.xml
│ │ ├── values-et/
│ │ │ └── strings.xml
│ │ ├── values-eu/
│ │ │ └── strings.xml
│ │ ├── values-fa/
│ │ │ └── strings.xml
│ │ ├── values-fi/
│ │ │ └── strings.xml
│ │ ├── values-fil/
│ │ │ └── strings.xml
│ │ ├── values-fr/
│ │ │ └── strings.xml
│ │ ├── values-hi/
│ │ │ └── strings.xml
│ │ ├── values-hu/
│ │ │ └── strings.xml
│ │ ├── values-in/
│ │ │ └── strings.xml
│ │ ├── values-it/
│ │ │ └── strings.xml
│ │ ├── values-iw/
│ │ │ └── strings.xml
│ │ ├── values-ja/
│ │ │ └── strings.xml
│ │ ├── values-kk/
│ │ │ └── strings.xml
│ │ ├── values-ko/
│ │ │ └── strings.xml
│ │ ├── values-lt/
│ │ │ └── strings.xml
│ │ ├── values-mr/
│ │ │ └── strings.xml
│ │ ├── values-night/
│ │ │ └── colors.xml
│ │ ├── values-night-v31/
│ │ │ └── colors.xml
│ │ ├── values-nl/
│ │ │ └── strings.xml
│ │ ├── values-pa/
│ │ │ └── strings.xml
│ │ ├── values-pl/
│ │ │ └── strings.xml
│ │ ├── values-pt-rBR/
│ │ │ └── strings.xml
│ │ ├── values-ro/
│ │ │ └── strings.xml
│ │ ├── values-ru/
│ │ │ └── strings.xml
│ │ ├── values-si/
│ │ │ └── strings.xml
│ │ ├── values-sk/
│ │ │ └── strings.xml
│ │ ├── values-sr/
│ │ │ └── strings.xml
│ │ ├── values-sv/
│ │ │ └── strings.xml
│ │ ├── values-ta/
│ │ │ └── strings.xml
│ │ ├── values-te/
│ │ │ └── strings.xml
│ │ ├── values-th/
│ │ │ └── strings.xml
│ │ ├── values-tr/
│ │ │ └── strings.xml
│ │ ├── values-ug/
│ │ │ └── strings.xml
│ │ ├── values-uk/
│ │ │ └── strings.xml
│ │ ├── values-v26/
│ │ │ └── bools.xml
│ │ ├── values-v31/
│ │ │ └── colors.xml
│ │ ├── values-vi/
│ │ │ └── strings.xml
│ │ ├── values-zh-rCN/
│ │ │ └── strings.xml
│ │ ├── values-zh-rTW/
│ │ │ └── strings.xml
│ │ └── xml/
│ │ ├── backup_rules.xml
│ │ ├── data_extraction_rules.xml
│ │ └── file_paths.xml
│ ├── settings/
│ │ ├── .gitignore
│ │ ├── build.gradle.kts
│ │ └── src/
│ │ └── main/
│ │ ├── AndroidManifest.xml
│ │ └── java/
│ │ └── com/
│ │ └── t8rin/
│ │ └── imagetoolbox/
│ │ └── core/
│ │ └── settings/
│ │ ├── di/
│ │ │ └── SettingsStateEntryPoint.kt
│ │ ├── domain/
│ │ │ ├── SettingsInteractor.kt
│ │ │ ├── SettingsManager.kt
│ │ │ ├── SettingsProvider.kt
│ │ │ ├── SimpleSettingsInteractor.kt
│ │ │ └── model/
│ │ │ ├── ColorHarmonizer.kt
│ │ │ ├── CopyToClipboardMode.kt
│ │ │ ├── DomainFontFamily.kt
│ │ │ ├── FastSettingsSide.kt
│ │ │ ├── FilenameBehavior.kt
│ │ │ ├── FlingType.kt
│ │ │ ├── NightMode.kt
│ │ │ ├── OneTimeSaveLocation.kt
│ │ │ ├── SettingsState.kt
│ │ │ ├── ShapeType.kt
│ │ │ ├── SliderType.kt
│ │ │ ├── SnowfallMode.kt
│ │ │ └── SwitchType.kt
│ │ └── presentation/
│ │ ├── model/
│ │ │ ├── EditPresetsController.kt
│ │ │ ├── IconShape.kt
│ │ │ ├── PicturePickerMode.kt
│ │ │ ├── Setting.kt
│ │ │ ├── SettingsGroup.kt
│ │ │ ├── UiFontFamily.kt
│ │ │ └── UiSettingsState.kt
│ │ ├── provider/
│ │ │ └── LocalSettingsState.kt
│ │ └── utils/
│ │ └── RoundedPolygonUtils.kt
│ ├── ui/
│ │ ├── .gitignore
│ │ ├── build.gradle.kts
│ │ └── src/
│ │ ├── foss/
│ │ │ └── java/
│ │ │ └── com/
│ │ │ └── t8rin/
│ │ │ └── imagetoolbox/
│ │ │ └── core/
│ │ │ └── ui/
│ │ │ ├── utils/
│ │ │ │ ├── content_pickers/
│ │ │ │ │ └── DocumentScannerImpl.kt
│ │ │ │ └── helper/
│ │ │ │ └── ReviewHandlerImpl.kt
│ │ │ └── widget/
│ │ │ └── sheets/
│ │ │ └── UpdateSheetImpl.kt
│ │ ├── main/
│ │ │ ├── AndroidManifest.xml
│ │ │ └── kotlin/
│ │ │ └── com/
│ │ │ └── t8rin/
│ │ │ └── imagetoolbox/
│ │ │ └── core/
│ │ │ └── ui/
│ │ │ ├── theme/
│ │ │ │ ├── Color.kt
│ │ │ │ ├── Motion.kt
│ │ │ │ ├── Theme.kt
│ │ │ │ ├── ThemePreview.kt
│ │ │ │ └── Type.kt
│ │ │ ├── transformation/
│ │ │ │ └── ImageInfoTransformation.kt
│ │ │ ├── utils/
│ │ │ │ ├── BaseComponent.kt
│ │ │ │ ├── ComposeActivity.kt
│ │ │ │ ├── ComposeApplication.kt
│ │ │ │ ├── animation/
│ │ │ │ │ ├── Animate.kt
│ │ │ │ │ ├── Animations.kt
│ │ │ │ │ ├── CombinedMutableInteractionSource.kt
│ │ │ │ │ └── Easing.kt
│ │ │ │ ├── capturable/
│ │ │ │ │ ├── Capturable.kt
│ │ │ │ │ ├── CaptureController.kt
│ │ │ │ │ └── impl/
│ │ │ │ │ ├── CapturableNew.kt
│ │ │ │ │ └── CapturableOld.kt
│ │ │ │ ├── confetti/
│ │ │ │ │ ├── ConfettiHostState.kt
│ │ │ │ │ └── Particles.kt
│ │ │ │ ├── content_pickers/
│ │ │ │ │ ├── BarcodeScanner.kt
│ │ │ │ │ ├── ContactPicker.kt
│ │ │ │ │ ├── DocumentScanner.kt
│ │ │ │ │ ├── FileMaker.kt
│ │ │ │ │ ├── FilePicker.kt
│ │ │ │ │ ├── FolderPicker.kt
│ │ │ │ │ ├── ImagePicker.kt
│ │ │ │ │ ├── ResultLauncher.kt
│ │ │ │ │ └── Scanner.kt
│ │ │ │ ├── helper/
│ │ │ │ │ ├── ActivityUtils.kt
│ │ │ │ │ ├── AppToastHost.kt
│ │ │ │ │ ├── BlendingModeExt.kt
│ │ │ │ │ ├── Clipboard.kt
│ │ │ │ │ ├── ClipboardUtils.kt
│ │ │ │ │ ├── CoilUtils.kt
│ │ │ │ │ ├── ColorUtils.kt
│ │ │ │ │ ├── CompositionLocalUtils.kt
│ │ │ │ │ ├── ContextUtils.kt
│ │ │ │ │ ├── DensityUtils.kt
│ │ │ │ │ ├── DeviceInfo.kt
│ │ │ │ │ ├── DrawUtils.kt
│ │ │ │ │ ├── HandleDeeplinks.kt
│ │ │ │ │ ├── HandlerUtils.kt
│ │ │ │ │ ├── ImageUtils.kt
│ │ │ │ │ ├── IntentUtils.kt
│ │ │ │ │ ├── LazyUtils.kt
│ │ │ │ │ ├── LinkUtils.kt
│ │ │ │ │ ├── LocalFilterPreviewModel.kt
│ │ │ │ │ ├── LocaleConfigCompat.kt
│ │ │ │ │ ├── PaddingUtils.kt
│ │ │ │ │ ├── PredictiveBackObserver.kt
│ │ │ │ │ ├── Preview.kt
│ │ │ │ │ ├── Rect.kt
│ │ │ │ │ ├── ReviewHandler.kt
│ │ │ │ │ ├── Ripple.kt
│ │ │ │ │ ├── SafeUriHandler.kt
│ │ │ │ │ ├── SaveResultHandler.kt
│ │ │ │ │ ├── ScanResult.kt
│ │ │ │ │ └── image_vector/
│ │ │ │ │ ├── DrawCache.kt
│ │ │ │ │ ├── GroupComponent.kt
│ │ │ │ │ ├── ImageVectorUtils.kt
│ │ │ │ │ ├── PathComponent.kt
│ │ │ │ │ ├── VNode.kt
│ │ │ │ │ ├── VectorComponent.kt
│ │ │ │ │ └── VectorPainter.kt
│ │ │ │ ├── navigation/
│ │ │ │ │ ├── Decompose.kt
│ │ │ │ │ ├── Screen.kt
│ │ │ │ │ └── ScreenUtils.kt
│ │ │ │ ├── painter/
│ │ │ │ │ ├── CenterCropPainter.kt
│ │ │ │ │ └── RoundCornersPainter.kt
│ │ │ │ ├── permission/
│ │ │ │ │ ├── PermissionResult.kt
│ │ │ │ │ ├── PermissionStatus.kt
│ │ │ │ │ └── PermissionUtils.kt
│ │ │ │ ├── provider/
│ │ │ │ │ ├── ImageToolboxCompositionLocals.kt
│ │ │ │ │ ├── LocalComponentActivity.kt
│ │ │ │ │ ├── LocalContainerShape.kt
│ │ │ │ │ ├── LocalKeepAliveService.kt
│ │ │ │ │ ├── LocalMetadataProvider.kt
│ │ │ │ │ ├── LocalResourceManager.kt
│ │ │ │ │ ├── LocalScreenSize.kt
│ │ │ │ │ └── LocalWindowSizeClass.kt
│ │ │ │ └── state/
│ │ │ │ ├── ObjectSaverDelegate.kt
│ │ │ │ └── Update.kt
│ │ │ └── widget/
│ │ │ ├── AdaptiveBottomScaffoldLayoutScreen.kt
│ │ │ ├── AdaptiveLayoutScreen.kt
│ │ │ ├── buttons/
│ │ │ │ ├── BottomButtonsBlock.kt
│ │ │ │ ├── CompareButton.kt
│ │ │ │ ├── EraseModeButton.kt
│ │ │ │ ├── MediaCheckBox.kt
│ │ │ │ ├── PagerScrollPanel.kt
│ │ │ │ ├── PanModeButton.kt
│ │ │ │ ├── ShareButton.kt
│ │ │ │ ├── ShowOriginalButton.kt
│ │ │ │ ├── SupportingButton.kt
│ │ │ │ └── ZoomButton.kt
│ │ │ ├── color_picker/
│ │ │ │ ├── AvailableColorTuplesSheet.kt
│ │ │ │ ├── ColorInfo.kt
│ │ │ │ ├── ColorPicker.kt
│ │ │ │ ├── ColorPickerSheet.kt
│ │ │ │ ├── ColorSelection.kt
│ │ │ │ ├── ColorSelectionRow.kt
│ │ │ │ ├── ColorTupleDefaults.kt
│ │ │ │ ├── ColorTuplePicker.kt
│ │ │ │ ├── ColorTuplePreview.kt
│ │ │ │ └── RecentAndFavoriteColorsCard.kt
│ │ │ ├── controls/
│ │ │ │ ├── FileReorderVerticalList.kt
│ │ │ │ ├── FormatExifWarning.kt
│ │ │ │ ├── IcoSizeWarning.kt
│ │ │ │ ├── ImageReorderCarousel.kt
│ │ │ │ ├── ImageTransformBar.kt
│ │ │ │ ├── OOMWarning.kt
│ │ │ │ ├── ResizeImageField.kt
│ │ │ │ ├── SaveExifWidget.kt
│ │ │ │ ├── ScaleSmallImagesToLargeToggle.kt
│ │ │ │ ├── SortButton.kt
│ │ │ │ ├── page/
│ │ │ │ │ ├── PageInputDialog.kt
│ │ │ │ │ ├── PageInputField.kt
│ │ │ │ │ ├── PageSelectionItem.kt
│ │ │ │ │ └── PagesSelectionParser.kt
│ │ │ │ ├── resize_group/
│ │ │ │ │ ├── ResizeTypeSelector.kt
│ │ │ │ │ └── components/
│ │ │ │ │ ├── BlurRadiusSelector.kt
│ │ │ │ │ └── UseBlurredBackgroundToggle.kt
│ │ │ │ └── selection/
│ │ │ │ ├── AlphaSelector.kt
│ │ │ │ ├── BlendingModeSelector.kt
│ │ │ │ ├── ColorRowSelector.kt
│ │ │ │ ├── DataSelector.kt
│ │ │ │ ├── FontSelector.kt
│ │ │ │ ├── HelperGridParamsSelector.kt
│ │ │ │ ├── ImageFormatSelector.kt
│ │ │ │ ├── ImageSelector.kt
│ │ │ │ ├── MagnifierEnabledSelector.kt
│ │ │ │ ├── PositionSelector.kt
│ │ │ │ ├── PresetSelector.kt
│ │ │ │ ├── QualitySelector.kt
│ │ │ │ └── ScaleModeSelector.kt
│ │ │ ├── dialogs/
│ │ │ │ ├── CalculatorDialog.kt
│ │ │ │ ├── ExitWithoutSavingDialog.kt
│ │ │ │ ├── LoadingDialog.kt
│ │ │ │ ├── OneTimeImagePickingDialog.kt
│ │ │ │ ├── OneTimeSaveLocationSelectionDialog.kt
│ │ │ │ ├── PasswordRequestDialog.kt
│ │ │ │ ├── ResetDialog.kt
│ │ │ │ └── WantCancelLoadingDialog.kt
│ │ │ ├── enhanced/
│ │ │ │ ├── EnhancedAlertDialog.kt
│ │ │ │ ├── EnhancedBadge.kt
│ │ │ │ ├── EnhancedButton.kt
│ │ │ │ ├── EnhancedButtonGroup.kt
│ │ │ │ ├── EnhancedCheckbox.kt
│ │ │ │ ├── EnhancedChip.kt
│ │ │ │ ├── EnhancedCircularProgressIndicator.kt
│ │ │ │ ├── EnhancedDatePickerDialog.kt
│ │ │ │ ├── EnhancedDropdownMenu.kt
│ │ │ │ ├── EnhancedFlingBehavior.kt
│ │ │ │ ├── EnhancedFloatingActionButton.kt
│ │ │ │ ├── EnhancedHapticFeedback.kt
│ │ │ │ ├── EnhancedIconButton.kt
│ │ │ │ ├── EnhancedLoadingIndicator.kt
│ │ │ │ ├── EnhancedModalBottomSheet.kt
│ │ │ │ ├── EnhancedModalSheetDragHandle.kt
│ │ │ │ ├── EnhancedNavigationBarItem.kt
│ │ │ │ ├── EnhancedNavigationRailItem.kt
│ │ │ │ ├── EnhancedRadioButton.kt
│ │ │ │ ├── EnhancedRangeSliderItem.kt
│ │ │ │ ├── EnhancedSlider.kt
│ │ │ │ ├── EnhancedSliderItem.kt
│ │ │ │ ├── EnhancedSwitch.kt
│ │ │ │ ├── EnhancedToggleButton.kt
│ │ │ │ ├── EnhancedTopAppBar.kt
│ │ │ │ └── derivative/
│ │ │ │ └── OnlyAllowedSliderItem.kt
│ │ │ ├── icon_shape/
│ │ │ │ └── IconShapeContainer.kt
│ │ │ ├── image/
│ │ │ │ ├── AspectRatioSelector.kt
│ │ │ │ ├── AspectRatios.kt
│ │ │ │ ├── AutoFilePicker.kt
│ │ │ │ ├── BadImageWidget.kt
│ │ │ │ ├── HistogramChart.kt
│ │ │ │ ├── ImageContainer.kt
│ │ │ │ ├── ImageCounter.kt
│ │ │ │ ├── ImageHeaderState.kt
│ │ │ │ ├── ImageNotPickedWidget.kt
│ │ │ │ ├── ImagePager.kt
│ │ │ │ ├── ImagePreviewGrid.kt
│ │ │ │ ├── ImageStickyHeader.kt
│ │ │ │ ├── ImagesPreviewWithSelection.kt
│ │ │ │ ├── MetadataPreviewButton.kt
│ │ │ │ ├── Picture.kt
│ │ │ │ ├── SimplePicture.kt
│ │ │ │ ├── UrisCarousel.kt
│ │ │ │ └── UrisPreview.kt
│ │ │ ├── modifier/
│ │ │ │ ├── AdvancedShadow.kt
│ │ │ │ ├── AlertDialogBorder.kt
│ │ │ │ ├── AnimateContentSizeNoClip.kt
│ │ │ │ ├── AutoCornersShape.kt
│ │ │ │ ├── AutoElevatedBorder.kt
│ │ │ │ ├── Blink.kt
│ │ │ │ ├── Container.kt
│ │ │ │ ├── ContiniousRoundedRectangle.kt
│ │ │ │ ├── DetectSwipe.kt
│ │ │ │ ├── DragHandler.kt
│ │ │ │ ├── DrawHorizontalStroke.kt
│ │ │ │ ├── FadingEdges.kt
│ │ │ │ ├── HelperGrid.kt
│ │ │ │ ├── LayoutCorners.kt
│ │ │ │ ├── Line.kt
│ │ │ │ ├── MaterialShadow.kt
│ │ │ │ ├── MeshGradient.kt
│ │ │ │ ├── NegativePadding.kt
│ │ │ │ ├── ObservePointersCount.kt
│ │ │ │ ├── Placholder.kt
│ │ │ │ ├── PointerInput.kt
│ │ │ │ ├── Pulsate.kt
│ │ │ │ ├── RealisticSnowfall.kt
│ │ │ │ ├── RotateAnimation.kt
│ │ │ │ ├── ScaleOnTap.kt
│ │ │ │ ├── ShapeDefaults.kt
│ │ │ │ ├── Shimmer.kt
│ │ │ │ ├── Tappable.kt
│ │ │ │ ├── TransparencyChecker.kt
│ │ │ │ └── WithModifier.kt
│ │ │ ├── other/
│ │ │ │ ├── AnimatedBorder.kt
│ │ │ │ ├── BoxAnimatedVisibility.kt
│ │ │ │ ├── ColorWithNameItem.kt
│ │ │ │ ├── DrawLockScreenOrientation.kt
│ │ │ │ ├── EmojiItem.kt
│ │ │ │ ├── ExpandableItem.kt
│ │ │ │ ├── FeatureNotAvailableContent.kt
│ │ │ │ ├── FontSelectionItem.kt
│ │ │ │ ├── GradientEdge.kt
│ │ │ │ ├── InfoContainer.kt
│ │ │ │ ├── LinkPreviewCard.kt
│ │ │ │ ├── LinkPreviewList.kt
│ │ │ │ ├── QrPainter.kt
│ │ │ │ ├── SearchBar.kt
│ │ │ │ ├── SwipeToReveal.kt
│ │ │ │ ├── ToastHost.kt
│ │ │ │ └── TopAppBarEmoji.kt
│ │ │ ├── palette_selection/
│ │ │ │ ├── PaletteMappings.kt
│ │ │ │ ├── PaletteStyleSelection.kt
│ │ │ │ └── PaletteStyleSelectionItem.kt
│ │ │ ├── preferences/
│ │ │ │ ├── PreferenceItem.kt
│ │ │ │ ├── PreferenceItemOverload.kt
│ │ │ │ ├── PreferenceRow.kt
│ │ │ │ ├── PreferenceRowSwitch.kt
│ │ │ │ └── ScreenPreference.kt
│ │ │ ├── saver/
│ │ │ │ ├── OneTimeEffect.kt
│ │ │ │ └── Savers.kt
│ │ │ ├── sheets/
│ │ │ │ ├── AddExifSheet.kt
│ │ │ │ ├── DefaultUpdateSheet.kt
│ │ │ │ ├── EditExifSheet.kt
│ │ │ │ ├── EmojiSelectionSheet.kt
│ │ │ │ ├── PickImageFromUrisSheet.kt
│ │ │ │ ├── ProcessImagesPreferenceSheet.kt
│ │ │ │ ├── UpdateSheet.kt
│ │ │ │ └── ZoomModalSheet.kt
│ │ │ ├── sliders/
│ │ │ │ ├── FancySlider.kt
│ │ │ │ ├── HyperOSSlider.kt
│ │ │ │ ├── M2Slider.kt
│ │ │ │ ├── M3Slider.kt
│ │ │ │ └── custom_slider/
│ │ │ │ ├── CustomRangeSlider.kt
│ │ │ │ ├── CustomRangeSliderState.kt
│ │ │ │ ├── CustomRangeSliderUtils.kt
│ │ │ │ ├── CustomSlider.kt
│ │ │ │ ├── CustomSliderColors.kt
│ │ │ │ ├── CustomSliderDefaults.kt
│ │ │ │ ├── CustomSliderRange.kt
│ │ │ │ ├── CustomSliderState.kt
│ │ │ │ └── CustomSliderUtils.kt
│ │ │ ├── switches/
│ │ │ │ ├── CupertinoSwitch.kt
│ │ │ │ ├── FluentSwitch.kt
│ │ │ │ ├── HyperOSSwitch.kt
│ │ │ │ ├── LiquidToggle.kt
│ │ │ │ ├── M3Switch.kt
│ │ │ │ ├── OneUISwitch.kt
│ │ │ │ └── PixelSwitch.kt
│ │ │ ├── text/
│ │ │ │ ├── AutoSizeText.kt
│ │ │ │ ├── HtmlText.kt
│ │ │ │ ├── IsKeyboardVisibleAsState.kt
│ │ │ │ ├── Linkify.kt
│ │ │ │ ├── Marquee.kt
│ │ │ │ ├── OutlinedText.kt
│ │ │ │ ├── PatternHighlightTransformation.kt
│ │ │ │ ├── RoundedTextField.kt
│ │ │ │ ├── TitleItem.kt
│ │ │ │ └── TopAppBarTitle.kt
│ │ │ ├── utils/
│ │ │ │ ├── AutoContentBasedColors.kt
│ │ │ │ ├── AvailableHeight.kt
│ │ │ │ ├── RememberRetainedLazyListState.kt
│ │ │ │ └── ScreenList.kt
│ │ │ └── value/
│ │ │ ├── ValueDialog.kt
│ │ │ └── ValueText.kt
│ │ └── market/
│ │ └── java/
│ │ └── com/
│ │ └── t8rin/
│ │ └── imagetoolbox/
│ │ └── core/
│ │ └── ui/
│ │ ├── utils/
│ │ │ ├── content_pickers/
│ │ │ │ └── DocumentScannerImpl.kt
│ │ │ └── helper/
│ │ │ └── ReviewHandlerImpl.kt
│ │ └── widget/
│ │ └── sheets/
│ │ └── UpdateSheetImpl.kt
│ └── utils/
│ ├── .gitignore
│ ├── build.gradle.kts
│ └── src/
│ └── main/
│ ├── AndroidManifest.xml
│ └── java/
│ └── com/
│ └── t8rin/
│ └── imagetoolbox/
│ └── core/
│ └── utils/
│ ├── AppContext.kt
│ ├── QrType.kt
│ ├── Typeface.kt
│ ├── Update.kt
│ ├── UriUtils.kt
│ └── Zip.kt
├── fastlane/
│ └── metadata/
│ └── android/
│ ├── en-US/
│ │ ├── changelogs/
│ │ │ ├── 13.txt
│ │ │ └── 16.txt
│ │ ├── full_description.txt
│ │ └── short_description.txt
│ └── ru/
│ ├── full_description.txt
│ └── short_description.txt
├── feature/
│ ├── ai-tools/
│ │ ├── .gitignore
│ │ ├── build.gradle.kts
│ │ └── src/
│ │ └── main/
│ │ ├── AndroidManifest.xml
│ │ └── java/
│ │ └── com/
│ │ └── t8rin/
│ │ └── imagetoolbox/
│ │ └── feature/
│ │ └── ai_tools/
│ │ ├── data/
│ │ │ ├── AiProcessor.kt
│ │ │ ├── AndroidAiToolsRepository.kt
│ │ │ └── model/
│ │ │ ├── ChunkInfo.kt
│ │ │ └── ModelInfo.kt
│ │ ├── di/
│ │ │ └── AiToolsModule.kt
│ │ ├── domain/
│ │ │ ├── AiProgressListener.kt
│ │ │ ├── AiToolsRepository.kt
│ │ │ └── model/
│ │ │ ├── NeuralConstants.kt
│ │ │ ├── NeuralModel.kt
│ │ │ └── NeuralParams.kt
│ │ └── presentation/
│ │ ├── AiToolsContent.kt
│ │ ├── components/
│ │ │ ├── AiToolsControls.kt
│ │ │ ├── DeleteModelDialog.kt
│ │ │ ├── FilteredModels.kt
│ │ │ ├── NeuralModelFilterSheet.kt
│ │ │ ├── NeuralModelSelectionSheet.kt
│ │ │ ├── NeuralModelSelector.kt
│ │ │ ├── NeuralModelTypeResources.kt
│ │ │ ├── NeuralModelsColumn.kt
│ │ │ ├── NeuralSaveProgress.kt
│ │ │ ├── NeuralSaveProgressDialog.kt
│ │ │ └── Savers.kt
│ │ └── screenLogic/
│ │ └── AiToolsComponent.kt
│ ├── apng-tools/
│ │ ├── .gitignore
│ │ ├── build.gradle.kts
│ │ └── src/
│ │ └── main/
│ │ ├── AndroidManifest.xml
│ │ └── java/
│ │ └── com/
│ │ └── t8rin/
│ │ └── imagetoolbox/
│ │ └── feature/
│ │ └── apng_tools/
│ │ ├── data/
│ │ │ └── AndroidApngConverter.kt
│ │ ├── di/
│ │ │ └── ApngToolsModule.kt
│ │ ├── domain/
│ │ │ ├── ApngConverter.kt
│ │ │ └── ApngParams.kt
│ │ └── presentation/
│ │ ├── ApngToolsContent.kt
│ │ ├── components/
│ │ │ └── ApngParamsSelector.kt
│ │ └── screenLogic/
│ │ └── ApngToolsComponent.kt
│ ├── ascii-art/
│ │ ├── .gitignore
│ │ ├── build.gradle.kts
│ │ └── src/
│ │ └── main/
│ │ ├── AndroidManifest.xml
│ │ └── java/
│ │ └── com/
│ │ └── t8rin/
│ │ └── imagetoolbox/
│ │ └── feature/
│ │ └── ascii_art/
│ │ ├── data/
│ │ │ └── AndroidAsciiConverter.kt
│ │ ├── di/
│ │ │ └── AsciiArtModule.kt
│ │ ├── domain/
│ │ │ └── AsciiConverter.kt
│ │ └── presentation/
│ │ ├── AsciiArtContent.kt
│ │ ├── components/
│ │ │ └── AsciiArtControls.kt
│ │ └── screenLogic/
│ │ └── AsciiArtComponent.kt
│ ├── audio-cover-extractor/
│ │ ├── .gitignore
│ │ ├── build.gradle.kts
│ │ └── src/
│ │ └── main/
│ │ ├── AndroidManifest.xml
│ │ └── java/
│ │ └── com/
│ │ └── t8rin/
│ │ └── imagetoolbox/
│ │ └── feature/
│ │ └── audio_cover_extractor/
│ │ ├── data/
│ │ │ └── AndroidAudioCoverRetriever.kt
│ │ ├── di/
│ │ │ └── AudioCoverExtractorModule.kt
│ │ ├── domain/
│ │ │ ├── AudioCoverRetriever.kt
│ │ │ └── model/
│ │ │ └── AudioCoverResult.kt
│ │ └── ui/
│ │ ├── AudioCoverExtractorContent.kt
│ │ ├── components/
│ │ │ └── AudioWithCover.kt
│ │ └── screenLogic/
│ │ └── AudioCoverExtractorComponent.kt
│ ├── base64-tools/
│ │ ├── .gitignore
│ │ ├── build.gradle.kts
│ │ └── src/
│ │ └── main/
│ │ ├── AndroidManifest.xml
│ │ └── java/
│ │ └── com/
│ │ └── t8rin/
│ │ └── imagetoolbox/
│ │ └── feature/
│ │ └── base64_tools/
│ │ ├── data/
│ │ │ └── AndroidBase64Converter.kt
│ │ ├── di/
│ │ │ └── Base64ToolsModule.kt
│ │ ├── domain/
│ │ │ └── Base64Converter.kt
│ │ └── presentation/
│ │ ├── Base64ToolsContent.kt
│ │ ├── components/
│ │ │ └── Base64ToolsTiles.kt
│ │ └── screenLogic/
│ │ └── Base64ToolsComponent.kt
│ ├── checksum-tools/
│ │ ├── .gitignore
│ │ ├── build.gradle.kts
│ │ └── src/
│ │ └── main/
│ │ ├── AndroidManifest.xml
│ │ └── java/
│ │ └── com/
│ │ └── t8rin/
│ │ └── imagetoolbox/
│ │ └── feature/
│ │ └── checksum_tools/
│ │ ├── data/
│ │ │ └── AndroidChecksumManager.kt
│ │ ├── di/
│ │ │ └── ChecksumToolsModule.kt
│ │ ├── domain/
│ │ │ ├── ChecksumManager.kt
│ │ │ └── ChecksumSource.kt
│ │ └── presentation/
│ │ ├── ChecksumToolsContent.kt
│ │ ├── components/
│ │ │ ├── ChecksumEnterField.kt
│ │ │ ├── ChecksumPage.kt
│ │ │ ├── ChecksumPreviewField.kt
│ │ │ ├── ChecksumResultCard.kt
│ │ │ ├── ChecksumToolsTabs.kt
│ │ │ ├── UriWithHashItem.kt
│ │ │ └── pages/
│ │ │ ├── CalculateFromTextPage.kt
│ │ │ ├── CalculateFromUriPage.kt
│ │ │ ├── CompareWithUriPage.kt
│ │ │ └── CompareWithUrisPage.kt
│ │ └── screenLogic/
│ │ └── ChecksumToolsComponent.kt
│ ├── cipher/
│ │ ├── .gitignore
│ │ ├── build.gradle.kts
│ │ └── src/
│ │ └── main/
│ │ ├── AndroidManifest.xml
│ │ └── java/
│ │ └── com/
│ │ └── t8rin/
│ │ └── imagetoolbox/
│ │ └── feature/
│ │ └── cipher/
│ │ ├── data/
│ │ │ ├── AndroidCryptographyManager.kt
│ │ │ └── AndroidRandomStringGenerator.kt
│ │ ├── di/
│ │ │ └── CipherModule.kt
│ │ ├── domain/
│ │ │ ├── CryptographyManager.kt
│ │ │ └── WrongKeyException.kt
│ │ └── presentation/
│ │ ├── CipherContent.kt
│ │ ├── components/
│ │ │ ├── CipherControls.kt
│ │ │ └── CipherTipSheet.kt
│ │ └── screenLogic/
│ │ └── CipherComponent.kt
│ ├── collage-maker/
│ │ ├── .gitignore
│ │ ├── build.gradle.kts
│ │ └── src/
│ │ └── main/
│ │ ├── AndroidManifest.xml
│ │ └── java/
│ │ └── com/
│ │ └── t8rin/
│ │ └── imagetoolbox/
│ │ └── collage_maker/
│ │ └── presentation/
│ │ ├── CollageMakerContent.kt
│ │ ├── components/
│ │ │ └── CollageParams.kt
│ │ └── screenLogic/
│ │ └── CollageMakerComponent.kt
│ ├── color-library/
│ │ ├── .gitignore
│ │ ├── build.gradle.kts
│ │ └── src/
│ │ └── main/
│ │ ├── AndroidManifest.xml
│ │ └── java/
│ │ └── com/
│ │ └── t8rin/
│ │ └── imagetoolbox/
│ │ └── color_library/
│ │ └── presentation/
│ │ ├── ColorLibraryContent.kt
│ │ ├── components/
│ │ │ └── FavoriteColors.kt
│ │ └── screenLogic/
│ │ └── ColorLibraryComponent.kt
│ ├── color-tools/
│ │ ├── .gitignore
│ │ ├── build.gradle.kts
│ │ └── src/
│ │ └── main/
│ │ ├── AndroidManifest.xml
│ │ └── java/
│ │ └── com/
│ │ └── t8rin/
│ │ └── imagetoolbox/
│ │ └── color_tools/
│ │ └── presentation/
│ │ ├── ColorToolsContent.kt
│ │ ├── components/
│ │ │ ├── ColorHarmonies.kt
│ │ │ ├── ColorHarmoniesUtils.kt
│ │ │ ├── ColorHistogram.kt
│ │ │ ├── ColorInfo.kt
│ │ │ ├── ColorInfoDisplay.kt
│ │ │ ├── ColorMixing.kt
│ │ │ ├── ColorMixingUtils.kt
│ │ │ └── ColorShading.kt
│ │ └── screenLogic/
│ │ └── ColorToolsComponent.kt
│ ├── compare/
│ │ ├── .gitignore
│ │ ├── build.gradle.kts
│ │ └── src/
│ │ └── main/
│ │ ├── AndroidManifest.xml
│ │ └── java/
│ │ └── com/
│ │ └── t8rin/
│ │ └── imagetoolbox/
│ │ └── feature/
│ │ └── compare/
│ │ └── presentation/
│ │ ├── CompareContent.kt
│ │ ├── components/
│ │ │ ├── CompareLabel.kt
│ │ │ ├── CompareScreenContent.kt
│ │ │ ├── CompareScreenContentImpl.kt
│ │ │ ├── CompareScreenTopAppBar.kt
│ │ │ ├── CompareSelectionButtons.kt
│ │ │ ├── CompareShareSheet.kt
│ │ │ ├── CompareSheet.kt
│ │ │ ├── CompareType.kt
│ │ │ ├── PixelByPixelCompareState.kt
│ │ │ ├── beforeafter/
│ │ │ │ ├── BeforeAfterLayout.kt
│ │ │ │ ├── BeforeAfterLayoutImpl.kt
│ │ │ │ ├── ContentOrder.kt
│ │ │ │ ├── DefaultOverlay.kt
│ │ │ │ ├── DimensionSubcomposeLayout.kt
│ │ │ │ ├── DimensionUtil.kt
│ │ │ │ ├── Label.kt
│ │ │ │ └── SlotsEnum.kt
│ │ │ └── model/
│ │ │ └── CompareData.kt
│ │ └── screenLogic/
│ │ └── CompareComponent.kt
│ ├── crop/
│ │ ├── .gitignore
│ │ ├── build.gradle.kts
│ │ └── src/
│ │ └── main/
│ │ ├── AndroidManifest.xml
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── t8rin/
│ │ │ └── imagetoolbox/
│ │ │ └── feature/
│ │ │ └── crop/
│ │ │ └── presentation/
│ │ │ ├── CropContent.kt
│ │ │ ├── components/
│ │ │ │ ├── CoercePointsToImageBoundsToggle.kt
│ │ │ │ ├── CropMaskSelection.kt
│ │ │ │ ├── CropRotationSelector.kt
│ │ │ │ ├── CropType.kt
│ │ │ │ ├── Cropper.kt
│ │ │ │ ├── DefaultOutlineProperties.kt
│ │ │ │ └── FreeCornersCropToggle.kt
│ │ │ └── screenLogic/
│ │ │ └── CropComponent.kt
│ │ └── res/
│ │ └── values/
│ │ └── dimens.xml
│ ├── delete-exif/
│ │ ├── .gitignore
│ │ ├── build.gradle.kts
│ │ └── src/
│ │ └── main/
│ │ ├── AndroidManifest.xml
│ │ └── java/
│ │ └── com/
│ │ └── t8rin/
│ │ └── imagetoolbox/
│ │ └── feature/
│ │ └── delete_exif/
│ │ └── presentation/
│ │ ├── DeleteExifContent.kt
│ │ └── screenLogic/
│ │ └── DeleteExifComponent.kt
│ ├── document-scanner/
│ │ ├── .gitignore
│ │ ├── build.gradle.kts
│ │ └── src/
│ │ └── main/
│ │ ├── AndroidManifest.xml
│ │ └── java/
│ │ └── com/
│ │ └── t8rin/
│ │ └── imagetoolbox/
│ │ └── feature/
│ │ └── document_scanner/
│ │ └── presentation/
│ │ ├── DocumentScannerContent.kt
│ │ └── screenLogic/
│ │ └── DocumentScannerComponent.kt
│ ├── draw/
│ │ ├── .gitignore
│ │ ├── build.gradle.kts
│ │ └── src/
│ │ └── main/
│ │ ├── AndroidManifest.xml
│ │ └── java/
│ │ └── com/
│ │ └── t8rin/
│ │ └── imagetoolbox/
│ │ └── feature/
│ │ └── draw/
│ │ ├── data/
│ │ │ ├── AndroidImageDrawApplier.kt
│ │ │ └── utils/
│ │ │ └── DrawRepeatedPath.kt
│ │ ├── di/
│ │ │ └── DrawModule.kt
│ │ ├── domain/
│ │ │ ├── DrawBehavior.kt
│ │ │ ├── DrawLineStyle.kt
│ │ │ ├── DrawMode.kt
│ │ │ ├── DrawOnBackgroundParams.kt
│ │ │ ├── DrawPathMode.kt
│ │ │ ├── ImageDrawApplier.kt
│ │ │ ├── PathPaint.kt
│ │ │ └── Warp.kt
│ │ └── presentation/
│ │ ├── DrawContent.kt
│ │ ├── components/
│ │ │ ├── BitmapDrawer.kt
│ │ │ ├── BrushSoftnessSelector.kt
│ │ │ ├── DrawColorSelector.kt
│ │ │ ├── DrawLineStyleSelector.kt
│ │ │ ├── DrawModeSelector.kt
│ │ │ ├── DrawPathModeSelector.kt
│ │ │ ├── LineWidthSelector.kt
│ │ │ ├── OpenColorPickerCard.kt
│ │ │ ├── PixelSizeSelector.kt
│ │ │ ├── UiPathPaint.kt
│ │ │ ├── UiPathPaintCanvasAction.kt
│ │ │ ├── controls/
│ │ │ │ ├── DrawContentControls.kt
│ │ │ │ ├── DrawContentNoDataControls.kt
│ │ │ │ └── DrawContentSecondaryControls.kt
│ │ │ ├── element/
│ │ │ │ ├── ArrowParamsSelector.kt
│ │ │ │ ├── CustomPathEffectParamsSelector.kt
│ │ │ │ ├── DrawPathModeInfoSheet.kt
│ │ │ │ ├── FloodFillParamsSelector.kt
│ │ │ │ ├── ImageParamsSelector.kt
│ │ │ │ ├── OutlinedFillColorSelector.kt
│ │ │ │ ├── OvalParamsSelector.kt
│ │ │ │ ├── PixelationParamsSelector.kt
│ │ │ │ ├── PolygonParamsSelector.kt
│ │ │ │ ├── PrivacyBlurParamsSelector.kt
│ │ │ │ ├── RectParamsSelector.kt
│ │ │ │ ├── SpotHealParamsSelector.kt
│ │ │ │ ├── SprayParamsSelector.kt
│ │ │ │ ├── StarParamsSelector.kt
│ │ │ │ ├── TextParamsSelector.kt
│ │ │ │ ├── TriangleParamsSelector.kt
│ │ │ │ └── WarpParamsSelector.kt
│ │ │ └── utils/
│ │ │ ├── BitmapDrawerPreview.kt
│ │ │ ├── DrawPathEffectPreview.kt
│ │ │ ├── DrawPathModeUtils.kt
│ │ │ ├── DrawRepeatedPath.kt
│ │ │ ├── DrawUtils.kt
│ │ │ ├── FloodFill.kt
│ │ │ ├── MotionEvent.kt
│ │ │ ├── PathHelper.kt
│ │ │ └── PointerDraw.kt
│ │ └── screenLogic/
│ │ └── DrawComponent.kt
│ ├── easter-egg/
│ │ ├── .gitignore
│ │ ├── build.gradle.kts
│ │ └── src/
│ │ └── main/
│ │ ├── AndroidManifest.xml
│ │ └── java/
│ │ └── com/
│ │ └── t8rin/
│ │ └── imagetoolbox/
│ │ └── feature/
│ │ └── easter_egg/
│ │ └── presentation/
│ │ ├── EasterEggContent.kt
│ │ └── screenLogic/
│ │ └── EasterEggComponent.kt
│ ├── edit-exif/
│ │ ├── .gitignore
│ │ ├── build.gradle.kts
│ │ └── src/
│ │ └── main/
│ │ ├── AndroidManifest.xml
│ │ └── java/
│ │ └── com/
│ │ └── t8rin/
│ │ └── imagetoolbox/
│ │ └── feature/
│ │ └── edit_exif/
│ │ └── presentation/
│ │ ├── EditExifContent.kt
│ │ └── screenLogic/
│ │ └── EditExifComponent.kt
│ ├── erase-background/
│ │ ├── .gitignore
│ │ ├── build.gradle.kts
│ │ └── src/
│ │ ├── foss/
│ │ │ └── java/
│ │ │ └── com/
│ │ │ └── t8rin/
│ │ │ └── imagetoolbox/
│ │ │ └── feature/
│ │ │ └── erase_background/
│ │ │ └── data/
│ │ │ └── backend/
│ │ │ └── MlKitBackgroundRemoverBackend.kt
│ │ ├── main/
│ │ │ ├── AndroidManifest.xml
│ │ │ └── java/
│ │ │ └── com/
│ │ │ └── t8rin/
│ │ │ └── imagetoolbox/
│ │ │ └── feature/
│ │ │ └── erase_background/
│ │ │ ├── data/
│ │ │ │ ├── AndroidAutoBackgroundRemover.kt
│ │ │ │ ├── AndroidAutoBackgroundRemoverBackendFactory.kt
│ │ │ │ └── backend/
│ │ │ │ └── GenericBackgroundRemoverBackend.kt
│ │ │ ├── di/
│ │ │ │ └── EraseBackgroundModule.kt
│ │ │ ├── domain/
│ │ │ │ ├── AutoBackgroundRemover.kt
│ │ │ │ ├── AutoBackgroundRemoverBackend.kt
│ │ │ │ ├── AutoBackgroundRemoverBackendFactory.kt
│ │ │ │ └── model/
│ │ │ │ └── BgModelType.kt
│ │ │ └── presentation/
│ │ │ ├── EraseBackgroundContent.kt
│ │ │ ├── components/
│ │ │ │ ├── AutoEraseBackgroundCard.kt
│ │ │ │ ├── BitmapEraser.kt
│ │ │ │ ├── OriginalImagePreviewAlphaSelector.kt
│ │ │ │ ├── RecoverModeCard.kt
│ │ │ │ └── TrimImageToggle.kt
│ │ │ └── screenLogic/
│ │ │ └── EraseBackgroundComponent.kt
│ │ └── market/
│ │ └── java/
│ │ └── com/
│ │ └── t8rin/
│ │ └── imagetoolbox/
│ │ └── feature/
│ │ └── erase_background/
│ │ └── data/
│ │ └── backend/
│ │ └── MlKitBackgroundRemoverBackend.kt
│ ├── filters/
│ │ ├── .gitignore
│ │ ├── build.gradle.kts
│ │ └── src/
│ │ └── main/
│ │ ├── AndroidManifest.xml
│ │ └── java/
│ │ └── com/
│ │ └── t8rin/
│ │ └── imagetoolbox/
│ │ └── feature/
│ │ └── filters/
│ │ ├── data/
│ │ │ ├── AndroidFilterMaskApplier.kt
│ │ │ ├── AndroidFilterParamsInteractor.kt
│ │ │ ├── AndroidFilterProvider.kt
│ │ │ ├── model/
│ │ │ │ ├── AcesFilmicToneMappingFilter.kt
│ │ │ │ ├── AcesHillToneMappingFilter.kt
│ │ │ │ ├── AchromatomalyFilter.kt
│ │ │ │ ├── AchromatopsiaFilter.kt
│ │ │ │ ├── AldridgeFilter.kt
│ │ │ │ ├── AmatorkaFilter.kt
│ │ │ │ ├── AnaglyphFilter.kt
│ │ │ │ ├── AnisotropicDiffusionFilter.kt
│ │ │ │ ├── ArcFilter.kt
│ │ │ │ ├── AsciiFilter.kt
│ │ │ │ ├── AtkinsonDitheringFilter.kt
│ │ │ │ ├── AutoCropFilter.kt
│ │ │ │ ├── AutoPerspectiveFilter.kt
│ │ │ │ ├── AutoRemoveRedEyesFilter.kt
│ │ │ │ ├── AutumnTonesFilter.kt
│ │ │ │ ├── AverageDistanceFilter.kt
│ │ │ │ ├── BayerEightDitheringFilter.kt
│ │ │ │ ├── BayerFourDitheringFilter.kt
│ │ │ │ ├── BayerThreeDitheringFilter.kt
│ │ │ │ ├── BayerTwoDitheringFilter.kt
│ │ │ │ ├── BilaterialBlurFilter.kt
│ │ │ │ ├── BlackAndWhiteFilter.kt
│ │ │ │ ├── BlackHatFilter.kt
│ │ │ │ ├── BleachBypassFilter.kt
│ │ │ │ ├── BlockGlitchFilter.kt
│ │ │ │ ├── BloomFilter.kt
│ │ │ │ ├── BokehFilter.kt
│ │ │ │ ├── BorderFrameFilter.kt
│ │ │ │ ├── BoxBlurFilter.kt
│ │ │ │ ├── BrightnessFilter.kt
│ │ │ │ ├── BrowniFilter.kt
│ │ │ │ ├── BulgeDistortionFilter.kt
│ │ │ │ ├── BurkesDitheringFilter.kt
│ │ │ │ ├── CGAColorSpaceFilter.kt
│ │ │ │ ├── CandlelightFilter.kt
│ │ │ │ ├── CannyFilter.kt
│ │ │ │ ├── CaramelDarknessFilter.kt
│ │ │ │ ├── CelluloidFilter.kt
│ │ │ │ ├── ChannelMixFilter.kt
│ │ │ │ ├── CircleBlurFilter.kt
│ │ │ │ ├── CirclePixelationFilter.kt
│ │ │ │ ├── ClaheFilter.kt
│ │ │ │ ├── ClaheHSLFilter.kt
│ │ │ │ ├── ClaheHSVFilter.kt
│ │ │ │ ├── ClaheJzazbzFilter.kt
│ │ │ │ ├── ClaheLABFilter.kt
│ │ │ │ ├── ClaheLUVFilter.kt
│ │ │ │ ├── ClaheOklabFilter.kt
│ │ │ │ ├── ClaheOklchFilter.kt
│ │ │ │ ├── ClosingFilter.kt
│ │ │ │ ├── Clustered2x2DitheringFilter.kt
│ │ │ │ ├── Clustered4x4DitheringFilter.kt
│ │ │ │ ├── Clustered8x8DitheringFilter.kt
│ │ │ │ ├── CodaChromeFilter.kt
│ │ │ │ ├── CoffeeFilter.kt
│ │ │ │ ├── ColorAnomalyFilter.kt
│ │ │ │ ├── ColorBalanceFilter.kt
│ │ │ │ ├── ColorExplosionFilter.kt
│ │ │ │ ├── ColorHalftoneFilter.kt
│ │ │ │ ├── ColorMapFilter.kt
│ │ │ │ ├── ColorMatrix3x3Filter.kt
│ │ │ │ ├── ColorMatrix4x4Filter.kt
│ │ │ │ ├── ColorOverlayFilter.kt
│ │ │ │ ├── ColorPosterFilter.kt
│ │ │ │ ├── ColorfulSwirlFilter.kt
│ │ │ │ ├── ContourFilter.kt
│ │ │ │ ├── ContrastFilter.kt
│ │ │ │ ├── ConvexFilter.kt
│ │ │ │ ├── Convolution3x3Filter.kt
│ │ │ │ ├── CoolFilter.kt
│ │ │ │ ├── CopyMoveDetectionFilter.kt
│ │ │ │ ├── CropOrPerspectiveFilter.kt
│ │ │ │ ├── CropToContentFilter.kt
│ │ │ │ ├── CrossBlurFilter.kt
│ │ │ │ ├── CrossPixelationFilter.kt
│ │ │ │ ├── CrosshatchFilter.kt
│ │ │ │ ├── CrtCurvatureFilter.kt
│ │ │ │ ├── CrystallizeFilter.kt
│ │ │ │ ├── CubeLutFilter.kt
│ │ │ │ ├── CyberpunkFilter.kt
│ │ │ │ ├── DeepPurpleFilter.kt
│ │ │ │ ├── DehazeFilter.kt
│ │ │ │ ├── DeskewFilter.kt
│ │ │ │ ├── DespeckleFilter.kt
│ │ │ │ ├── DeutaromalyFilter.kt
│ │ │ │ ├── DeutaronotopiaFilter.kt
│ │ │ │ ├── DiamondPixelationFilter.kt
│ │ │ │ ├── DiffuseFilter.kt
│ │ │ │ ├── DigitalCodeFilter.kt
│ │ │ │ ├── DilationFilter.kt
│ │ │ │ ├── DoGFilter.kt
│ │ │ │ ├── DragoFilter.kt
│ │ │ │ ├── DropBluesFilter.kt
│ │ │ │ ├── EdgyAmberFilter.kt
│ │ │ │ ├── ElectricGradientFilter.kt
│ │ │ │ ├── EmbossFilter.kt
│ │ │ │ ├── EnhancedCirclePixelationFilter.kt
│ │ │ │ ├── EnhancedDiamondPixelationFilter.kt
│ │ │ │ ├── EnhancedGlitchFilter.kt
│ │ │ │ ├── EnhancedOilFilter.kt
│ │ │ │ ├── EnhancedPixelationFilter.kt
│ │ │ │ ├── EnhancedZoomBlurFilter.kt
│ │ │ │ ├── EqualizeFilter.kt
│ │ │ │ ├── EqualizeHistogramAdaptiveFilter.kt
│ │ │ │ ├── EqualizeHistogramAdaptiveHSLFilter.kt
│ │ │ │ ├── EqualizeHistogramAdaptiveHSVFilter.kt
│ │ │ │ ├── EqualizeHistogramAdaptiveLABFilter.kt
│ │ │ │ ├── EqualizeHistogramAdaptiveLUVFilter.kt
│ │ │ │ ├── EqualizeHistogramFilter.kt
│ │ │ │ ├── EqualizeHistogramHSVFilter.kt
│ │ │ │ ├── EqualizeHistogramPixelationFilter.kt
│ │ │ │ ├── ErodeFilter.kt
│ │ │ │ ├── ErrorLevelAnalysisFilter.kt
│ │ │ │ ├── ExposureFilter.kt
│ │ │ │ ├── FallColorsFilter.kt
│ │ │ │ ├── FalseColorFilter.kt
│ │ │ │ ├── FalseFloydSteinbergDitheringFilter.kt
│ │ │ │ ├── FantasyLandscapeFilter.kt
│ │ │ │ ├── FastBilaterialBlurFilter.kt
│ │ │ │ ├── FastBlurFilter.kt
│ │ │ │ ├── FastGaussianBlur2DFilter.kt
│ │ │ │ ├── FastGaussianBlur3DFilter.kt
│ │ │ │ ├── FastGaussianBlur4DFilter.kt
│ │ │ │ ├── FilmStock50Filter.kt
│ │ │ │ ├── FloydSteinbergDitheringFilter.kt
│ │ │ │ ├── FoggyNightFilter.kt
│ │ │ │ ├── FractalGlassFilter.kt
│ │ │ │ ├── FuturisticGradientFilter.kt
│ │ │ │ ├── GammaFilter.kt
│ │ │ │ ├── GaussianBlurFilter.kt
│ │ │ │ ├── GaussianBoxBlurFilter.kt
│ │ │ │ ├── GlassSphereRefractionFilter.kt
│ │ │ │ ├── GlitchFilter.kt
│ │ │ │ ├── GlitchVariantFilter.kt
│ │ │ │ ├── GlowFilter.kt
│ │ │ │ ├── GoldenForestFilter.kt
│ │ │ │ ├── GoldenHourFilter.kt
│ │ │ │ ├── GothamFilter.kt
│ │ │ │ ├── GrainFilter.kt
│ │ │ │ ├── GrayscaleFilter.kt
│ │ │ │ ├── GreenSunFilter.kt
│ │ │ │ ├── GreenishFilter.kt
│ │ │ │ ├── HDRFilter.kt
│ │ │ │ ├── HableFilmicToneMappingFilter.kt
│ │ │ │ ├── HalftoneFilter.kt
│ │ │ │ ├── HazeFilter.kt
│ │ │ │ ├── HejlBurgessToneMappingFilter.kt
│ │ │ │ ├── HighlightsAndShadowsFilter.kt
│ │ │ │ ├── HorizontalWindStaggerFilter.kt
│ │ │ │ ├── HotSummerFilter.kt
│ │ │ │ ├── HueFilter.kt
│ │ │ │ ├── JarvisJudiceNinkeDitheringFilter.kt
│ │ │ │ ├── KaleidoscopeFilter.kt
│ │ │ │ ├── KodakFilter.kt
│ │ │ │ ├── KuwaharaFilter.kt
│ │ │ │ ├── LUT512x512Filter.kt
│ │ │ │ ├── LaplacianFilter.kt
│ │ │ │ ├── LaplacianSimpleFilter.kt
│ │ │ │ ├── LavenderDreamFilter.kt
│ │ │ │ ├── LeftToRightDitheringFilter.kt
│ │ │ │ ├── LemonadeLightFilter.kt
│ │ │ │ ├── LensCorrectionFilter.kt
│ │ │ │ ├── LinearBoxBlurFilter.kt
│ │ │ │ ├── LinearFastGaussianBlurFilter.kt
│ │ │ │ ├── LinearFastGaussianBlurNextFilter.kt
│ │ │ │ ├── LinearGaussianBlurFilter.kt
│ │ │ │ ├── LinearGaussianBoxBlurFilter.kt
│ │ │ │ ├── LinearStackBlurFilter.kt
│ │ │ │ ├── LinearTentBlurFilter.kt
│ │ │ │ ├── LinearTiltShiftFilter.kt
│ │ │ │ ├── LogarithmicToneMappingFilter.kt
│ │ │ │ ├── LookupFilter.kt
│ │ │ │ ├── LowPolyFilter.kt
│ │ │ │ ├── LuminanceGradientFilter.kt
│ │ │ │ ├── MarbleFilter.kt
│ │ │ │ ├── MedianBlurFilter.kt
│ │ │ │ ├── MicroMacroPixelationFilter.kt
│ │ │ │ ├── MirrorFilter.kt
│ │ │ │ ├── MissEtikateFilter.kt
│ │ │ │ ├── MobiusFilter.kt
│ │ │ │ ├── MoireFilter.kt
│ │ │ │ ├── MonochromeFilter.kt
│ │ │ │ ├── MorphologicalGradientFilter.kt
│ │ │ │ ├── MotionBlurFilter.kt
│ │ │ │ ├── NativeStackBlurFilter.kt
│ │ │ │ ├── NegativeFilter.kt
│ │ │ │ ├── NeonFilter.kt
│ │ │ │ ├── NightMagicFilter.kt
│ │ │ │ ├── NightVisionFilter.kt
│ │ │ │ ├── NoiseFilter.kt
│ │ │ │ ├── NonMaximumSuppressionFilter.kt
│ │ │ │ ├── NucleusPixelationFilter.kt
│ │ │ │ ├── OffsetFilter.kt
│ │ │ │ ├── OilFilter.kt
│ │ │ │ ├── OldTvFilter.kt
│ │ │ │ ├── OpacityFilter.kt
│ │ │ │ ├── OpeningFilter.kt
│ │ │ │ ├── OrangeHazeFilter.kt
│ │ │ │ ├── OrbitalPixelationFilter.kt
│ │ │ │ ├── PaletteTransferFilter.kt
│ │ │ │ ├── PaletteTransferVariantFilter.kt
│ │ │ │ ├── PastelFilter.kt
│ │ │ │ ├── PerlinDistortionFilter.kt
│ │ │ │ ├── PinchFilter.kt
│ │ │ │ ├── PinkDreamFilter.kt
│ │ │ │ ├── PixelMeltFilter.kt
│ │ │ │ ├── PixelationFilter.kt
│ │ │ │ ├── PointillizeFilter.kt
│ │ │ │ ├── PoissonBlurFilter.kt
│ │ │ │ ├── PolarCoordinatesFilter.kt
│ │ │ │ ├── PolaroidFilter.kt
│ │ │ │ ├── PolkaDotFilter.kt
│ │ │ │ ├── PopArtFilter.kt
│ │ │ │ ├── PosterizeFilter.kt
│ │ │ │ ├── ProtanopiaFilter.kt
│ │ │ │ ├── ProtonomalyFilter.kt
│ │ │ │ ├── PulseGridPixelationFilter.kt
│ │ │ │ ├── PurpleMistFilter.kt
│ │ │ │ ├── QuantizierFilter.kt
│ │ │ │ ├── RGBFilter.kt
│ │ │ │ ├── RadialTiltShiftFilter.kt
│ │ │ │ ├── RadialWeavePixelationFilter.kt
│ │ │ │ ├── RainbowWorldFilter.kt
│ │ │ │ ├── RandomDitheringFilter.kt
│ │ │ │ ├── RedSwirlFilter.kt
│ │ │ │ ├── ReduceNoiseFilter.kt
│ │ │ │ ├── RemoveColorFilter.kt
│ │ │ │ ├── ReplaceColorFilter.kt
│ │ │ │ ├── RetroYellowFilter.kt
│ │ │ │ ├── RingBlurFilter.kt
│ │ │ │ ├── RubberStampFilter.kt
│ │ │ │ ├── SandPaintingFilter.kt
│ │ │ │ ├── SaturationFilter.kt
│ │ │ │ ├── SeamCarvingFilter.kt
│ │ │ │ ├── SepiaFilter.kt
│ │ │ │ ├── SharpenFilter.kt
│ │ │ │ ├── ShuffleBlurFilter.kt
│ │ │ │ ├── SideFadeFilter.kt
│ │ │ │ ├── SierraDitheringFilter.kt
│ │ │ │ ├── SierraLiteDitheringFilter.kt
│ │ │ │ ├── SimpleOldTvFilter.kt
│ │ │ │ ├── SimpleSketchFilter.kt
│ │ │ │ ├── SimpleSolarizeFilter.kt
│ │ │ │ ├── SimpleThresholdDitheringFilter.kt
│ │ │ │ ├── SimpleWeavePixelationFilter.kt
│ │ │ │ ├── SketchFilter.kt
│ │ │ │ ├── SmearFilter.kt
│ │ │ │ ├── SmoothToonFilter.kt
│ │ │ │ ├── SobelEdgeDetectionFilter.kt
│ │ │ │ ├── SobelSimpleFilter.kt
│ │ │ │ ├── SoftEleganceFilter.kt
│ │ │ │ ├── SoftEleganceVariantFilter.kt
│ │ │ │ ├── SoftSpringLightFilter.kt
│ │ │ │ ├── SolarizeFilter.kt
│ │ │ │ ├── SpacePortalFilter.kt
│ │ │ │ ├── SparkleFilter.kt
│ │ │ │ ├── SpectralFireFilter.kt
│ │ │ │ ├── SphereLensDistortionFilter.kt
│ │ │ │ ├── SphereRefractionFilter.kt
│ │ │ │ ├── SpotHealFilter.kt
│ │ │ │ ├── StackBlurFilter.kt
│ │ │ │ ├── StaggeredPixelationFilter.kt
│ │ │ │ ├── StarBlurFilter.kt
│ │ │ │ ├── StrokePixelationFilter.kt
│ │ │ │ ├── StuckiDitheringFilter.kt
│ │ │ │ ├── SunriseFilter.kt
│ │ │ │ ├── SwirlDistortionFilter.kt
│ │ │ │ ├── TentBlurFilter.kt
│ │ │ │ ├── ThresholdFilter.kt
│ │ │ │ ├── ToneCurvesFilter.kt
│ │ │ │ ├── ToonFilter.kt
│ │ │ │ ├── TopHatFilter.kt
│ │ │ │ ├── TriToneFilter.kt
│ │ │ │ ├── TritanopiaFilter.kt
│ │ │ │ ├── TritonomalyFilter.kt
│ │ │ │ ├── TwirlFilter.kt
│ │ │ │ ├── TwoRowSierraDitheringFilter.kt
│ │ │ │ ├── UchimuraFilter.kt
│ │ │ │ ├── UnsharpFilter.kt
│ │ │ │ ├── VHSFilter.kt
│ │ │ │ ├── VibranceFilter.kt
│ │ │ │ ├── VignetteFilter.kt
│ │ │ │ ├── VintageFilter.kt
│ │ │ │ ├── VoronoiCrystallizeFilter.kt
│ │ │ │ ├── VortexPixelationFilter.kt
│ │ │ │ ├── WarmFilter.kt
│ │ │ │ ├── WaterEffectFilter.kt
│ │ │ │ ├── WeakPixelFilter.kt
│ │ │ │ ├── WeaveFilter.kt
│ │ │ │ ├── WhiteBalanceFilter.kt
│ │ │ │ ├── YililomaDitheringFilter.kt
│ │ │ │ └── ZoomBlurFilter.kt
│ │ │ ├── transformation/
│ │ │ │ ├── ColorMapTransformation.kt
│ │ │ │ ├── GPUFilterTransformation.kt
│ │ │ │ └── JhFilterTransformation.kt
│ │ │ └── utils/
│ │ │ ├── EnumMappings.kt
│ │ │ ├── TransformationUtils.kt
│ │ │ ├── convolution/
│ │ │ │ └── AireConvolution.kt
│ │ │ ├── glitch/
│ │ │ │ ├── GlitchTool.kt
│ │ │ │ └── tools/
│ │ │ │ ├── Anaglyph.kt
│ │ │ │ └── JpegGlitch.kt
│ │ │ ├── gpu/
│ │ │ │ └── GPUImageHighlightShadowWideRangeFilter.kt
│ │ │ ├── image/
│ │ │ │ └── ImageLoader.kt
│ │ │ ├── pixelation/
│ │ │ │ ├── PixelationTool.kt
│ │ │ │ └── tool/
│ │ │ │ ├── PixelationCommands.kt
│ │ │ │ └── PixelationLayer.kt
│ │ │ └── serialization/
│ │ │ ├── FilterSerializationUtils.kt
│ │ │ └── Mappings.kt
│ │ ├── di/
│ │ │ └── FilterModule.kt
│ │ ├── domain/
│ │ │ ├── FilterMask.kt
│ │ │ └── FilterMaskApplier.kt
│ │ └── presentation/
│ │ ├── FiltersContent.kt
│ │ ├── components/
│ │ │ ├── BasicFilterPreference.kt
│ │ │ ├── BasicFilterState.kt
│ │ │ ├── FiltersContentActionButtons.kt
│ │ │ ├── FiltersContentControls.kt
│ │ │ ├── FiltersContentNoData.kt
│ │ │ ├── FiltersContentSheets.kt
│ │ │ ├── FiltersContentTopAppBarActions.kt
│ │ │ ├── MaskFilterPreference.kt
│ │ │ ├── MaskItem.kt
│ │ │ ├── MaskReorderSheet.kt
│ │ │ ├── MaskingFilterState.kt
│ │ │ ├── PathPaintPreview.kt
│ │ │ ├── UiFilterMask.kt
│ │ │ └── addEditMaskSheet/
│ │ │ ├── AddEditMaskSheet.kt
│ │ │ ├── AddEditMaskSheetControls.kt
│ │ │ ├── AddMaskSheetBitmapPreview.kt
│ │ │ └── AddMaskSheetComponent.kt
│ │ └── screenLogic/
│ │ └── FiltersComponent.kt
│ ├── format-conversion/
│ │ ├── .gitignore
│ │ ├── build.gradle.kts
│ │ └── src/
│ │ └── main/
│ │ ├── AndroidManifest.xml
│ │ └── java/
│ │ └── com/
│ │ └── t8rin/
│ │ └── imagetoolbox/
│ │ └── feature/
│ │ └── format_conversion/
│ │ └── presentation/
│ │ ├── FormatConversionContent.kt
│ │ └── screenLogic/
│ │ └── FormatConversionComponent.kt
│ ├── gif-tools/
│ │ ├── .gitignore
│ │ ├── build.gradle.kts
│ │ └── src/
│ │ └── main/
│ │ ├── AndroidManifest.xml
│ │ └── java/
│ │ └── com/
│ │ └── t8rin/
│ │ └── imagetoolbox/
│ │ └── feature/
│ │ └── gif_tools/
│ │ ├── data/
│ │ │ └── AndroidGifConverter.kt
│ │ ├── di/
│ │ │ └── GifToolsModule.kt
│ │ ├── domain/
│ │ │ ├── GifConverter.kt
│ │ │ └── GifParams.kt
│ │ └── presentation/
│ │ ├── GifToolsContent.kt
│ │ ├── components/
│ │ │ ├── GifParamsSelector.kt
│ │ │ ├── GifToolsControls.kt
│ │ │ ├── GifToolsImagePreview.kt
│ │ │ ├── GifToolsNoDataControls.kt
│ │ │ └── GifToolsTopAppBarActions.kt
│ │ └── screenLogic/
│ │ └── GifToolsComponent.kt
│ ├── gradient-maker/
│ │ ├── .gitignore
│ │ ├── build.gradle.kts
│ │ └── src/
│ │ └── main/
│ │ ├── AndroidManifest.xml
│ │ └── java/
│ │ └── com/
│ │ └── t8rin/
│ │ └── imagetoolbox/
│ │ └── feature/
│ │ └── gradient_maker/
│ │ ├── data/
│ │ │ └── AndroidGradientMaker.kt
│ │ ├── di/
│ │ │ └── GradientMakerModule.kt
│ │ ├── domain/
│ │ │ ├── GradientMaker.kt
│ │ │ ├── GradientState.kt
│ │ │ ├── GradientType.kt
│ │ │ └── MeshGradientState.kt
│ │ └── presentation/
│ │ ├── GradientMakerContent.kt
│ │ ├── components/
│ │ │ ├── ColorStopSelection.kt
│ │ │ ├── GradientMakerAppColorSchemeHandler.kt
│ │ │ ├── GradientMakerBottomButtons.kt
│ │ │ ├── GradientMakerCompareButton.kt
│ │ │ ├── GradientMakerControls.kt
│ │ │ ├── GradientMakerImagePreview.kt
│ │ │ ├── GradientMakerNoDataControls.kt
│ │ │ ├── GradientPreview.kt
│ │ │ ├── GradientPropertiesSelector.kt
│ │ │ ├── GradientSizeSelector.kt
│ │ │ ├── GradientTypeSelector.kt
│ │ │ ├── MeshGradientEditor.kt
│ │ │ ├── MeshGradientPreview.kt
│ │ │ ├── TileModeSelector.kt
│ │ │ ├── UiGradientState.kt
│ │ │ └── model/
│ │ │ └── GradientMakerType.kt
│ │ └── screenLogic/
│ │ └── GradientMakerComponent.kt
│ ├── image-cutting/
│ │ ├── .gitignore
│ │ ├── build.gradle.kts
│ │ └── src/
│ │ └── main/
│ │ ├── AndroidManifest.xml
│ │ └── java/
│ │ └── com/
│ │ └── t8rin/
│ │ └── imagetoolbox/
│ │ └── image_cutting/
│ │ ├── data/
│ │ │ └── AndroidImageCutter.kt
│ │ ├── di/
│ │ │ └── ImageCutterModule.kt
│ │ ├── domain/
│ │ │ ├── CutParams.kt
│ │ │ └── ImageCutter.kt
│ │ └── presentation/
│ │ ├── ImageCutterContent.kt
│ │ ├── components/
│ │ │ ├── CutParamsSelector.kt
│ │ │ ├── CutPreview.kt
│ │ │ └── Utils.kt
│ │ └── screenLogic/
│ │ └── ImageCutterComponent.kt
│ ├── image-preview/
│ │ ├── .gitignore
│ │ ├── build.gradle.kts
│ │ └── src/
│ │ └── main/
│ │ ├── AndroidManifest.xml
│ │ └── java/
│ │ └── com/
│ │ └── t8rin/
│ │ └── imagetoolbox/
│ │ └── feature/
│ │ └── image_preview/
│ │ └── presentation/
│ │ ├── ImagePreviewContent.kt
│ │ └── screenLogic/
│ │ └── ImagePreviewComponent.kt
│ ├── image-splitting/
│ │ ├── .gitignore
│ │ ├── build.gradle.kts
│ │ └── src/
│ │ └── main/
│ │ ├── AndroidManifest.xml
│ │ └── java/
│ │ └── com/
│ │ └── t8rin/
│ │ └── imagetoolbox/
│ │ └── image_splitting/
│ │ ├── data/
│ │ │ └── AndroidImageSplitter.kt
│ │ ├── di/
│ │ │ └── ImageSplitterModule.kt
│ │ ├── domain/
│ │ │ ├── ImageSplitter.kt
│ │ │ └── SplitParams.kt
│ │ └── presentation/
│ │ ├── ImageSplitterContent.kt
│ │ ├── components/
│ │ │ └── SplitParamsSelector.kt
│ │ └── screenLogic/
│ │ └── ImageSplitterComponent.kt
│ ├── image-stacking/
│ │ ├── .gitignore
│ │ ├── build.gradle.kts
│ │ └── src/
│ │ └── main/
│ │ ├── AndroidManifest.xml
│ │ └── java/
│ │ └── com/
│ │ └── t8rin/
│ │ └── imagetoolbox/
│ │ └── feature/
│ │ └── image_stacking/
│ │ ├── data/
│ │ │ └── AndroidImageStacker.kt
│ │ ├── di/
│ │ │ └── ImageStackingModule.kt
│ │ ├── domain/
│ │ │ ├── ImageStacker.kt
│ │ │ ├── StackImage.kt
│ │ │ └── StackingParams.kt
│ │ └── presentation/
│ │ ├── ImageStackingContent.kt
│ │ ├── components/
│ │ │ ├── StackImageItem.kt
│ │ │ └── StackingParamsSelector.kt
│ │ └── screenLogic/
│ │ └── ImageStackingComponent.kt
│ ├── image-stitch/
│ │ ├── .gitignore
│ │ ├── build.gradle.kts
│ │ └── src/
│ │ └── main/
│ │ ├── AndroidManifest.xml
│ │ └── java/
│ │ └── com/
│ │ └── t8rin/
│ │ └── imagetoolbox/
│ │ └── feature/
│ │ └── image_stitch/
│ │ ├── data/
│ │ │ ├── AndroidImageCombiner.kt
│ │ │ └── CvStitchHelper.kt
│ │ ├── di/
│ │ │ └── ImageStitchModule.kt
│ │ ├── domain/
│ │ │ ├── CombiningParams.kt
│ │ │ ├── ImageCombiner.kt
│ │ │ ├── SavableCombiningParams.kt
│ │ │ ├── StitchAlignment.kt
│ │ │ ├── StitchFadeSide.kt
│ │ │ └── StitchMode.kt
│ │ └── presentation/
│ │ ├── ImageStitchingContent.kt
│ │ ├── components/
│ │ │ ├── FadeStrengthSelector.kt
│ │ │ ├── ImageFadingEdgesSelector.kt
│ │ │ ├── ImageScaleSelector.kt
│ │ │ ├── SpacingSelector.kt
│ │ │ ├── StitchAlignmentSelector.kt
│ │ │ └── StitchModeSelector.kt
│ │ └── screenLogic/
│ │ └── ImageStitchingComponent.kt
│ ├── jxl-tools/
│ │ ├── .gitignore
│ │ ├── build.gradle.kts
│ │ └── src/
│ │ └── main/
│ │ ├── AndroidManifest.xml
│ │ └── java/
│ │ └── com/
│ │ └── t8rin/
│ │ └── imagetoolbox/
│ │ └── feature/
│ │ └── jxl_tools/
│ │ ├── data/
│ │ │ └── AndroidJxlConverter.kt
│ │ ├── di/
│ │ │ └── JxlToolsModule.kt
│ │ ├── domain/
│ │ │ ├── AnimatedJxlParams.kt
│ │ │ └── JxlConverter.kt
│ │ └── presentation/
│ │ ├── JxlToolsContent.kt
│ │ ├── components/
│ │ │ ├── AnimatedJxlParamsSelector.kt
│ │ │ ├── JxlToolsBitmapPreview.kt
│ │ │ ├── JxlToolsButtons.kt
│ │ │ ├── JxlToolsControls.kt
│ │ │ ├── JxlToolsNoDataControls.kt
│ │ │ └── JxlToolsTopAppBarActions.kt
│ │ └── screenLogic/
│ │ └── JxlToolsComponent.kt
│ ├── libraries-info/
│ │ ├── .gitignore
│ │ ├── build.gradle.kts
│ │ └── src/
│ │ └── main/
│ │ ├── AndroidManifest.xml
│ │ └── java/
│ │ └── com/
│ │ └── t8rin/
│ │ └── imagetoolbox/
│ │ └── feature/
│ │ └── libraries_info/
│ │ └── presentation/
│ │ ├── LibrariesInfoContent.kt
│ │ ├── components/
│ │ │ ├── LibrariesContainer.kt
│ │ │ └── LibraryLink.kt
│ │ └── screenLogic/
│ │ └── LibrariesInfoComponent.kt
│ ├── library-details/
│ │ ├── .gitignore
│ │ ├── build.gradle.kts
│ │ └── src/
│ │ └── main/
│ │ ├── AndroidManifest.xml
│ │ └── java/
│ │ └── com/
│ │ └── t8rin/
│ │ └── imagetoolbox/
│ │ └── library_details/
│ │ └── presentation/
│ │ ├── LibraryDetailsContent.kt
│ │ └── screenLogic/
│ │ └── LibraryDetailsComponent.kt
│ ├── limits-resize/
│ │ ├── .gitignore
│ │ ├── build.gradle.kts
│ │ └── src/
│ │ └── main/
│ │ ├── AndroidManifest.xml
│ │ └── java/
│ │ └── com/
│ │ └── t8rin/
│ │ └── imagetoolbox/
│ │ └── feature/
│ │ └── limits_resize/
│ │ ├── data/
│ │ │ └── AndroidLimitsImageScaler.kt
│ │ ├── di/
│ │ │ └── LimitsResizeModule.kt
│ │ ├── domain/
│ │ │ ├── LimitsImageScaler.kt
│ │ │ └── LimitsResizeType.kt
│ │ └── presentation/
│ │ ├── LimitsResizeContent.kt
│ │ ├── components/
│ │ │ ├── AutoRotateLimitBoxToggle.kt
│ │ │ └── LimitResizeGroup.kt
│ │ └── screenLogic/
│ │ └── LimitsResizeComponent.kt
│ ├── load-net-image/
│ │ ├── .gitignore
│ │ ├── build.gradle.kts
│ │ └── src/
│ │ └── main/
│ │ ├── AndroidManifest.xml
│ │ └── java/
│ │ └── com/
│ │ └── t8rin/
│ │ └── imagetoolbox/
│ │ └── feature/
│ │ └── load_net_image/
│ │ ├── data/
│ │ │ └── AndroidHtmlImageParser.kt
│ │ ├── di/
│ │ │ └── LoadNetImageModule.kt
│ │ ├── domain/
│ │ │ └── HtmlImageParser.kt
│ │ └── presentation/
│ │ ├── LoadNetImageContent.kt
│ │ ├── components/
│ │ │ ├── LoadNetImageActionButtons.kt
│ │ │ ├── LoadNetImageAdaptiveActions.kt
│ │ │ ├── LoadNetImageTopAppBarActions.kt
│ │ │ ├── LoadNetImageUrlTextField.kt
│ │ │ ├── ParsedImagePreview.kt
│ │ │ └── ParsedImagesSelection.kt
│ │ └── screenLogic/
│ │ └── LoadNetImageComponent.kt
│ ├── main/
│ │ ├── .gitignore
│ │ ├── build.gradle.kts
│ │ └── src/
│ │ └── main/
│ │ ├── AndroidManifest.xml
│ │ └── java/
│ │ └── com/
│ │ └── t8rin/
│ │ └── imagetoolbox/
│ │ └── feature/
│ │ └── main/
│ │ └── presentation/
│ │ ├── MainContent.kt
│ │ ├── components/
│ │ │ ├── FilteredScreenListFor.kt
│ │ │ ├── LauncherScreenSelector.kt
│ │ │ ├── MainContentImpl.kt
│ │ │ ├── MainDrawerContent.kt
│ │ │ ├── MainNavigationBar.kt
│ │ │ ├── MainNavigationBarForFavorites.kt
│ │ │ ├── MainNavigationRail.kt
│ │ │ ├── MainNavigationRailForFavorites.kt
│ │ │ ├── MainTopAppBar.kt
│ │ │ ├── ScreenPreferenceSelection.kt
│ │ │ └── SearchableBottomBar.kt
│ │ └── screenLogic/
│ │ └── MainComponent.kt
│ ├── markup-layers/
│ │ ├── .gitignore
│ │ ├── build.gradle.kts
│ │ └── src/
│ │ └── main/
│ │ ├── AndroidManifest.xml
│ │ └── java/
│ │ └── com/
│ │ └── t8rin/
│ │ └── imagetoolbox/
│ │ └── feature/
│ │ └── markup_layers/
│ │ ├── data/
│ │ │ ├── AndroidMarkupLayersApplier.kt
│ │ │ ├── project/
│ │ │ │ ├── AssetRegistry.kt
│ │ │ │ ├── Mapping.kt
│ │ │ │ ├── MarkupProjectConstants.kt
│ │ │ │ ├── MarkupProjectExtensions.kt
│ │ │ │ ├── MarkupProjectFile.kt
│ │ │ │ └── ProjectFileLoadResult.kt
│ │ │ └── utils/
│ │ │ ├── LayersRenderer.kt
│ │ │ ├── PictureLayerShadowRenderer.kt
│ │ │ ├── ShapeLayerRenderer.kt
│ │ │ ├── TextLayerMetrics.kt
│ │ │ └── TextLayerShadowRenderer.kt
│ │ ├── di/
│ │ │ └── MarkupLayersModule.kt
│ │ ├── domain/
│ │ │ ├── MarkupLayer.kt
│ │ │ ├── MarkupLayersApplier.kt
│ │ │ ├── MarkupProject.kt
│ │ │ ├── MarkupProjectResult.kt
│ │ │ ├── ProjectBackground.kt
│ │ │ └── ShapeLayerModeExt.kt
│ │ └── presentation/
│ │ ├── MarkupLayersContent.kt
│ │ ├── components/
│ │ │ ├── ActiveLayerGestureModifier.kt
│ │ │ ├── AddShapeLayerDialog.kt
│ │ │ ├── AddTextLayerDialog.kt
│ │ │ ├── ClickableTile.kt
│ │ │ ├── DropShadowSection.kt
│ │ │ ├── EditBox.kt
│ │ │ ├── EditBoxState.kt
│ │ │ ├── EditLayerSheet.kt
│ │ │ ├── Layer.kt
│ │ │ ├── LayerContent.kt
│ │ │ ├── MarkupLayersActions.kt
│ │ │ ├── MarkupLayersContextActions.kt
│ │ │ ├── MarkupLayersNoDataControls.kt
│ │ │ ├── MarkupLayersSideMenu.kt
│ │ │ ├── MarkupLayersSideMenuColumn.kt
│ │ │ ├── MarkupLayersTopAppBarActions.kt
│ │ │ ├── ShapeLayerParamsSelector.kt
│ │ │ └── model/
│ │ │ ├── BackgroundBehavior.kt
│ │ │ ├── ShapeLayerModeUiExt.kt
│ │ │ ├── UiMarkupLayer.kt
│ │ │ └── UiMarkupLayerGrouping.kt
│ │ └── screenLogic/
│ │ └── MarkupLayersComponent.kt
│ ├── media-picker/
│ │ ├── .gitignore
│ │ ├── build.gradle.kts
│ │ └── src/
│ │ └── main/
│ │ ├── AndroidManifest.xml
│ │ └── java/
│ │ └── com/
│ │ └── t8rin/
│ │ └── imagetoolbox/
│ │ └── feature/
│ │ └── media_picker/
│ │ ├── data/
│ │ │ ├── AndroidMediaRetriever.kt
│ │ │ └── utils/
│ │ │ ├── DateExt.kt
│ │ │ ├── MediaObserver.kt
│ │ │ ├── MediaQuery.kt
│ │ │ └── SupportedFiles.kt
│ │ ├── di/
│ │ │ └── MediaPickerModule.kt
│ │ ├── domain/
│ │ │ ├── MediaRetriever.kt
│ │ │ └── model/
│ │ │ ├── Album.kt
│ │ │ ├── AllowedMedia.kt
│ │ │ ├── Media.kt
│ │ │ ├── MediaItem.kt
│ │ │ ├── MediaOrder.kt
│ │ │ ├── MediaState.kt
│ │ │ └── OrderType.kt
│ │ └── presentation/
│ │ ├── MediaPickerActivity.kt
│ │ ├── components/
│ │ │ ├── ManageExternalStorageWarning.kt
│ │ │ ├── MediaExtensionHeader.kt
│ │ │ ├── MediaImage.kt
│ │ │ ├── MediaImagePager.kt
│ │ │ ├── MediaPickerGrid.kt
│ │ │ ├── MediaPickerGridWithOverlays.kt
│ │ │ ├── MediaPickerHavePermissions.kt
│ │ │ ├── MediaPickerRootContent.kt
│ │ │ ├── MediaPickerRootContentEmbeddable.kt
│ │ │ ├── MediaSizeFooter.kt
│ │ │ ├── MediaStickyHeader.kt
│ │ │ ├── MediaVideoDurationHeader.kt
│ │ │ ├── ObserveColorSchemeExtra.kt
│ │ │ └── SendMediaAsResult.kt
│ │ └── screenLogic/
│ │ └── MediaPickerComponent.kt
│ ├── mesh-gradients/
│ │ ├── .gitignore
│ │ ├── build.gradle.kts
│ │ └── src/
│ │ └── main/
│ │ ├── AndroidManifest.xml
│ │ └── java/
│ │ └── com/
│ │ └── t8rin/
│ │ └── imagetoolbox/
│ │ └── feature/
│ │ └── mesh_gradients/
│ │ └── presentation/
│ │ ├── MeshGradientsContent.kt
│ │ └── screenLogic/
│ │ └── MeshGradientsComponent.kt
│ ├── noise-generation/
│ │ ├── .gitignore
│ │ ├── build.gradle.kts
│ │ └── src/
│ │ └── main/
│ │ ├── AndroidManifest.xml
│ │ └── java/
│ │ └── com/
│ │ └── t8rin/
│ │ └── imagetoolbox/
│ │ └── noise_generation/
│ │ ├── data/
│ │ │ └── AndroidNoiseGenerator.kt
│ │ ├── di/
│ │ │ └── NoiseGenerationModule.kt
│ │ ├── domain/
│ │ │ ├── NoiseGenerator.kt
│ │ │ └── model/
│ │ │ ├── CellularDistanceFunction.kt
│ │ │ ├── CellularReturnType.kt
│ │ │ ├── DomainWarpType.kt
│ │ │ ├── FractalType.kt
│ │ │ ├── NoiseParams.kt
│ │ │ ├── NoiseType.kt
│ │ │ └── RotationType3D.kt
│ │ └── presentation/
│ │ ├── NoiseGenerationContent.kt
│ │ ├── components/
│ │ │ └── NoiseParamsSelection.kt
│ │ └── screenLogic/
│ │ └── NoiseGenerationComponent.kt
│ ├── palette-tools/
│ │ ├── .gitignore
│ │ ├── build.gradle.kts
│ │ └── src/
│ │ └── main/
│ │ ├── AndroidManifest.xml
│ │ └── java/
│ │ └── com/
│ │ └── t8rin/
│ │ └── imagetoolbox/
│ │ └── feature/
│ │ └── palette_tools/
│ │ └── presentation/
│ │ ├── PaletteToolsContent.kt
│ │ ├── components/
│ │ │ ├── DefaultPaletteControls.kt
│ │ │ ├── EditPaletteControls.kt
│ │ │ ├── ImageColorPalette.kt
│ │ │ ├── MaterialYouPalette.kt
│ │ │ ├── MaterialYouPaletteControls.kt
│ │ │ ├── MaterialYouPaletteGroup.kt
│ │ │ ├── MaterialYouPaletteItem.kt
│ │ │ ├── PaletteColorNameField.kt
│ │ │ ├── PaletteColorsCountSelector.kt
│ │ │ ├── PaletteToolsScreenControls.kt
│ │ │ ├── PaletteType.kt
│ │ │ └── model/
│ │ │ ├── NamedColor.kt
│ │ │ └── PaletteFormatHelper.kt
│ │ └── screenLogic/
│ │ └── PaletteToolsComponent.kt
│ ├── pdf-tools/
│ │ ├── .gitignore
│ │ ├── build.gradle.kts
│ │ └── src/
│ │ └── main/
│ │ ├── AndroidManifest.xml
│ │ └── java/
│ │ └── com/
│ │ └── t8rin/
│ │ └── imagetoolbox/
│ │ └── feature/
│ │ └── pdf_tools/
│ │ ├── data/
│ │ │ ├── AndroidPdfHelper.kt
│ │ │ ├── AndroidPdfManager.kt
│ │ │ └── utils/
│ │ │ ├── Hocr.kt
│ │ │ ├── PdfContentStreamEditor.kt
│ │ │ ├── PdfRenderer.kt
│ │ │ └── PdfUtils.kt
│ │ ├── di/
│ │ │ └── PdfToolsModule.kt
│ │ ├── domain/
│ │ │ ├── PdfHelper.kt
│ │ │ ├── PdfManager.kt
│ │ │ └── model/
│ │ │ ├── ExtractPagesAction.kt
│ │ │ ├── PageOrientation.kt
│ │ │ ├── PageSize.kt
│ │ │ ├── PdfAnnotationType.kt
│ │ │ ├── PdfCheckResult.kt
│ │ │ ├── PdfCreationParams.kt
│ │ │ ├── PdfCropParams.kt
│ │ │ ├── PdfExtractPagesParams.kt
│ │ │ ├── PdfMetadata.kt
│ │ │ ├── PdfPageNumbersParams.kt
│ │ │ ├── PdfRemoveAnnotationParams.kt
│ │ │ ├── PdfSignatureParams.kt
│ │ │ ├── PdfWatermarkParams.kt
│ │ │ ├── PrintPdfParams.kt
│ │ │ └── SearchablePdfPage.kt
│ │ └── presentation/
│ │ ├── common/
│ │ │ ├── BasePdfToolComponent.kt
│ │ │ ├── BasePdfToolContent.kt
│ │ │ ├── PageSwitcher.kt
│ │ │ └── PdfPreviewItem.kt
│ │ ├── compress/
│ │ │ ├── CompressPdfToolContent.kt
│ │ │ └── screenLogic/
│ │ │ └── CompressPdfToolComponent.kt
│ │ ├── crop/
│ │ │ ├── CropPdfToolContent.kt
│ │ │ ├── components/
│ │ │ │ └── CropPreview.kt
│ │ │ └── screenLogic/
│ │ │ └── CropPdfToolComponent.kt
│ │ ├── extract_images/
│ │ │ ├── ExtractImagesPdfToolContent.kt
│ │ │ └── screenLogic/
│ │ │ └── ExtractImagesPdfToolComponent.kt
│ │ ├── extract_pages/
│ │ │ ├── ExtractPagesPdfToolContent.kt
│ │ │ └── screenLogic/
│ │ │ └── ExtractPagesPdfToolComponent.kt
│ │ ├── flatten/
│ │ │ ├── FlattenPdfToolContent.kt
│ │ │ └── screenLogic/
│ │ │ └── FlattenPdfToolComponent.kt
│ │ ├── grayscale/
│ │ │ ├── GrayscalePdfToolContent.kt
│ │ │ └── screenLogic/
│ │ │ └── GrayscalePdfToolComponent.kt
│ │ ├── images_to_pdf/
│ │ │ ├── ImagesToPdfToolContent.kt
│ │ │ └── screenLogic/
│ │ │ └── ImagesToPdfToolComponent.kt
│ │ ├── merge/
│ │ │ ├── MergePdfToolContent.kt
│ │ │ └── screenLogic/
│ │ │ └── MergePdfToolComponent.kt
│ │ ├── metadata/
│ │ │ ├── MetadataPdfToolContent.kt
│ │ │ ├── components/
│ │ │ │ └── MetadataEditor.kt
│ │ │ └── screenLogic/
│ │ │ └── MetadataPdfToolComponent.kt
│ │ ├── ocr/
│ │ │ ├── OCRPdfToolContent.kt
│ │ │ └── screenLogic/
│ │ │ └── OCRPdfToolComponent.kt
│ │ ├── page_numbers/
│ │ │ ├── PageNumbersPdfToolContent.kt
│ │ │ ├── components/
│ │ │ │ └── PageNumbersPreview.kt
│ │ │ └── screenLogic/
│ │ │ └── PageNumbersPdfToolComponent.kt
│ │ ├── preview/
│ │ │ ├── PreviewPdfToolContent.kt
│ │ │ └── screenLogic/
│ │ │ └── PreviewPdfToolComponent.kt
│ │ ├── print/
│ │ │ ├── PrintPdfToolContent.kt
│ │ │ └── screenLogic/
│ │ │ └── PrintPdfToolComponent.kt
│ │ ├── protect/
│ │ │ ├── ProtectPdfToolContent.kt
│ │ │ └── screenLogic/
│ │ │ └── ProtectPdfToolComponent.kt
│ │ ├── rearrange/
│ │ │ ├── RearrangePdfToolContent.kt
│ │ │ ├── components/
│ │ │ │ └── PdfPagesRearrangeGrid.kt
│ │ │ └── screenLogic/
│ │ │ └── RearrangePdfToolComponent.kt
│ │ ├── remove_annotations/
│ │ │ ├── RemoveAnnotationsPdfToolContent.kt
│ │ │ ├── components/
│ │ │ │ ├── PdfAnnotationTypeSelector.kt
│ │ │ │ └── RemoveAnnotationsPreview.kt
│ │ │ └── screenLogic/
│ │ │ └── RemoveAnnotationsPdfToolComponent.kt
│ │ ├── remove_pages/
│ │ │ ├── RemovePagesPdfToolContent.kt
│ │ │ ├── components/
│ │ │ │ └── PdfPagesRemoveGrid.kt
│ │ │ └── screenLogic/
│ │ │ └── RemovePagesPdfToolComponent.kt
│ │ ├── repair/
│ │ │ ├── RepairPdfToolContent.kt
│ │ │ └── screenLogic/
│ │ │ └── RepairPdfToolComponent.kt
│ │ ├── root/
│ │ │ ├── RootPdfToolsContent.kt
│ │ │ ├── components/
│ │ │ │ ├── PdfViewer.kt
│ │ │ │ └── viewer/
│ │ │ │ ├── LegacyPdfViewer.kt
│ │ │ │ ├── ModernPdfViewer.kt
│ │ │ │ └── ModernPdfViewerDelegate.kt
│ │ │ └── screenLogic/
│ │ │ └── RootPdfToolsComponent.kt
│ │ ├── rotate/
│ │ │ ├── RotatePdfToolContent.kt
│ │ │ ├── components/
│ │ │ │ └── PdfPagesRotationGrid.kt
│ │ │ └── screenLogic/
│ │ │ └── RotatePdfToolComponent.kt
│ │ ├── signature/
│ │ │ ├── SignaturePdfToolContent.kt
│ │ │ ├── components/
│ │ │ │ ├── SignatureDialog.kt
│ │ │ │ ├── SignaturePreview.kt
│ │ │ │ └── SignatureSelector.kt
│ │ │ └── screenLogic/
│ │ │ └── SignaturePdfToolComponent.kt
│ │ ├── split/
│ │ │ ├── SplitPdfToolContent.kt
│ │ │ └── screenLogic/
│ │ │ └── SplitPdfToolComponent.kt
│ │ ├── unlock/
│ │ │ ├── UnlockPdfToolContent.kt
│ │ │ └── screenLogic/
│ │ │ └── UnlockPdfToolComponent.kt
│ │ ├── watermark/
│ │ │ ├── WatermarkPdfToolContent.kt
│ │ │ ├── components/
│ │ │ │ └── WatermarkPreview.kt
│ │ │ └── screenLogic/
│ │ │ └── WatermarkPdfToolComponent.kt
│ │ └── zip_convert/
│ │ ├── ZipConvertPdfToolContent.kt
│ │ └── screenLogic/
│ │ └── ZipConvertPdfToolComponent.kt
│ ├── pick-color/
│ │ ├── .gitignore
│ │ ├── build.gradle.kts
│ │ └── src/
│ │ └── main/
│ │ ├── AndroidManifest.xml
│ │ └── java/
│ │ └── com/
│ │ └── t8rin/
│ │ └── imagetoolbox/
│ │ └── feature/
│ │ └── pick_color/
│ │ └── presentation/
│ │ ├── PickColorFromImageContent.kt
│ │ ├── components/
│ │ │ ├── PickColorFromImageBottomAppBar.kt
│ │ │ ├── PickColorFromImageContentImpl.kt
│ │ │ ├── PickColorFromImageSheet.kt
│ │ │ └── PickColorFromImageTopAppBar.kt
│ │ └── screenLogic/
│ │ └── PickColorFromImageComponent.kt
│ ├── quick-tiles/
│ │ ├── .gitignore
│ │ ├── build.gradle.kts
│ │ └── src/
│ │ └── main/
│ │ ├── AndroidManifest.xml
│ │ └── java/
│ │ └── com/
│ │ └── t8rin/
│ │ └── imagetoolbox/
│ │ └── feature/
│ │ └── quick_tiles/
│ │
================================================
FILE CONTENTS
================================================
================================================
FILE: .github/FUNDING.yml
================================================
# These are supported funding model platforms
github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry
polar: # Replace with a single Polar username
buy_me_a_coffee: # Replace with a single Buy Me a Coffee username
thanks_dev: # Replace with a single thanks.dev username
custom: ['https://boosty.to/t8rin']
================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.yml
================================================
name: Bug Report
description: Create a report to help us improve
labels: ["bug"]
body:
- type: textarea
id: description
attributes:
label: Describe the bug
description: A clear and concise description of what the bug is.
placeholder: Tell us what happened...
validations:
required: true
- type: textarea
id: reproduce
attributes:
label: Steps to reproduce
description: Steps to reproduce the behavior
placeholder: |
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
validations:
required: true
- type: textarea
id: expected
attributes:
label: Expected behavior
description: A clear and concise description of what you expected to happen.
placeholder: Tell us what should have happened...
validations:
required: true
- type: textarea
id: screenshots
attributes:
label: Screenshots
description: If applicable, add screenshots to help explain your problem.
placeholder: You can drag and drop images here...
- type: input
id: device
attributes:
label: Device
placeholder: e.g., Samsung Galaxy S23
validations:
required: true
- type: input
id: os
attributes:
label: OS
placeholder: e.g., Android 14
validations:
required: true
- type: input
id: locale
attributes:
label: Locale
placeholder: e.g., en-US, ru-RU
- type: input
id: version
attributes:
label: App Version
placeholder: e.g., 1.2.3
validations:
required: true
- type: dropdown
id: variant
attributes:
label: FOSS or Market
description: Which variant of the app are you using?
options:
- FOSS
- Market (Google Play)
validations:
required: true
================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.yml
================================================
name: Feature Request
description: Suggest an idea for this project
labels: ["enhancement"]
body:
- type: textarea
id: problem
attributes:
label: Is your feature request related to a problem? Please describe.
placeholder: A clear and concise description of what the problem is...
validations:
required: false
- type: textarea
id: solution
attributes:
label: Describe the solution you'd like
placeholder: A clear and concise description of what you want to happen...
validations:
required: true
- type: textarea
id: alternatives
attributes:
label: Describe alternatives you've considered
placeholder: A clear and concise description of any alternative solutions or features you've considered...
validations:
required: false
================================================
FILE: .github/dependabot.yml
================================================
# To get started with Dependabot version updates, you'll need to specify which
# package ecosystems to update and where the package manifests are located.
# Please see the documentation for all configuration options:
# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
version: 2
updates:
- package-ecosystem: "gradle" # See documentation for possible values
directory: "/" # Location of package manifests
schedule:
interval: "daily"
================================================
FILE: .github/workflows/android.yml
================================================
name: Android CI
on:
workflow_dispatch:
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Set Swap Space
uses: pierotofy/set-swap-space@master
with:
swap-size-gb: 10
- uses: actions/checkout@v4
- name: set up JDK 21
uses: actions/setup-java@v4
with:
java-version: '21'
distribution: 'adopt'
java-package: 'jdk'
cache: gradle
- name: Set up Keystore
run: |
sudo apt update -y || true
sudo apt install -y --no-install-recommends coreutils
mkdir -p $RUNNER_TEMP/keystores
echo "${{ secrets.SIGNING_KEY }}" | base64 --decode > $RUNNER_TEMP/keystores/keystore.jks
- name: Build FOSS APKs
run: bash ./gradlew assembleFossRelease
- name: Sign FOSS APKs
run: |
ANDROID_SDK_PATH=$ANDROID_HOME/build-tools/35.0.0/apksigner
for apk in app/build/outputs/apk/foss/release/*.apk; do
$ANDROID_SDK_PATH sign \
--ks $RUNNER_TEMP/keystores/keystore.jks \
--ks-key-alias ${{ secrets.ALIAS }} \
--ks-pass pass:${{ secrets.KEY_STORE_PASS }} \
--key-pass pass:${{ secrets.KEY_STORE_PASS }} \
--out "$apk" \
"$apk"
done
- name: Upload FOSS APKs
uses: actions/upload-artifact@v4
with:
name: Signed FOSS APKs
path: app/build/outputs/apk/foss/release/*.apk
- name: Delete FOSS APKs
run: rm -rf app/build/outputs/apk/foss
- name: Build Market APKs
run: bash ./gradlew assembleMarketRelease
- name: Sign Market APKs
run: |
ANDROID_SDK_PATH=$ANDROID_HOME/build-tools/35.0.0/apksigner
for apk in app/build/outputs/apk/market/release/*.apk; do
$ANDROID_SDK_PATH sign \
--ks $RUNNER_TEMP/keystores/keystore.jks \
--ks-key-alias ${{ secrets.ALIAS }} \
--ks-pass pass:${{ secrets.KEY_STORE_PASS }} \
--key-pass pass:${{ secrets.KEY_STORE_PASS }} \
--out "$apk" \
"$apk"
done
- name: Upload Market APKs
uses: actions/upload-artifact@v4
with:
name: Signed Market APKs
path: app/build/outputs/apk/market/release/*.apk
- name: Delete Market APKs
run: rm -rf app/build/outputs/apk/market
================================================
FILE: .github/workflows/android_foss.yml
================================================
name: Android CI FOSS
on:
workflow_dispatch:
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Set Swap Space
uses: pierotofy/set-swap-space@master
with:
swap-size-gb: 10
- uses: actions/checkout@v4
- name: set up JDK 21
uses: actions/setup-java@v4
with:
java-version: '21'
distribution: 'adopt'
java-package: 'jdk'
cache: gradle
- name: Set up Keystore
run: |
sudo apt update -y || true
sudo apt install -y --no-install-recommends coreutils
mkdir -p $RUNNER_TEMP/keystores
echo "${{ secrets.SIGNING_KEY }}" | base64 --decode > $RUNNER_TEMP/keystores/keystore.jks
- name: Build FOSS APKs
run: bash ./gradlew assembleFossRelease
- name: Sign FOSS APKs
run: |
ANDROID_SDK_PATH=$ANDROID_HOME/build-tools/35.0.0/apksigner
for apk in app/build/outputs/apk/foss/release/*.apk; do
$ANDROID_SDK_PATH sign \
--ks $RUNNER_TEMP/keystores/keystore.jks \
--ks-key-alias ${{ secrets.ALIAS }} \
--ks-pass pass:${{ secrets.KEY_STORE_PASS }} \
--key-pass pass:${{ secrets.KEY_STORE_PASS }} \
--out "$apk" \
"$apk"
done
- name: Upload FOSS APKs
uses: actions/upload-artifact@v4
with:
name: Signed FOSS APKs
path: app/build/outputs/apk/foss/release/*.apk
- name: Delete FOSS APKs
run: rm -rf app/build/outputs/apk/foss
================================================
FILE: .github/workflows/android_market.yml
================================================
name: Android CI Market
on:
workflow_dispatch:
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Set Swap Space
uses: pierotofy/set-swap-space@master
with:
swap-size-gb: 10
- uses: actions/checkout@v4
- name: set up JDK 21
uses: actions/setup-java@v4
with:
java-version: '21'
distribution: 'adopt'
java-package: 'jdk'
cache: gradle
- name: Set up Keystore
run: |
sudo apt update -y || true
sudo apt install -y --no-install-recommends coreutils
mkdir -p $RUNNER_TEMP/keystores
echo "${{ secrets.SIGNING_KEY }}" | base64 --decode > $RUNNER_TEMP/keystores/keystore.jks
- name: Build Market APKs
run: bash ./gradlew assembleMarketRelease
- name: Sign Market APKs
run: |
ANDROID_SDK_PATH=$ANDROID_HOME/build-tools/35.0.0/apksigner
for apk in app/build/outputs/apk/market/release/*.apk; do
$ANDROID_SDK_PATH sign \
--ks $RUNNER_TEMP/keystores/keystore.jks \
--ks-key-alias ${{ secrets.ALIAS }} \
--ks-pass pass:${{ secrets.KEY_STORE_PASS }} \
--key-pass pass:${{ secrets.KEY_STORE_PASS }} \
--out "$apk" \
"$apk"
done
- name: Upload Market APKs
uses: actions/upload-artifact@v4
with:
name: Signed Market APKs
path: app/build/outputs/apk/market/release/*.apk
- name: Delete Market APKs
run: rm -rf app/build/outputs/apk/market
================================================
FILE: .github/workflows/tb_release.yml
================================================
name: Create Release
on:
workflow_dispatch:
#on:
# push:
# tags:
# - '*'
jobs:
build_and_release:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'adopt'
cache: gradle
- name: Set version variable
run: echo "GITHUB_REF_NAME=$GITHUB_REF_NAME" >> $GITHUB_ENV
- name: Assemble release
env:
VERSION_NAME: ${{ env.GITHUB_REF_NAME }}
run: bash ./gradlew assembleRelease
- uses: iota9star/sign-android-release@v1.0.5
name: Sign FOSS APK
# ID used to access action output
id: sign_app_foss
with:
releaseDirectory: app/build/outputs/apk/foss/release
fileRex: .*apk
signingKeyBase64: ${{ secrets.SIGNING_KEY }}
alias: ${{ secrets.ALIAS }}
keyStorePassword: ${{ secrets.KEY_STORE_PASS }}
keyPassword: ${{ secrets.KEY_STORE_PASS }}
env:
BUILD_TOOLS_VERSION: "34.0.0"
- name: Rename foss file stage
run: |
ls -la app/build/outputs/apk/market/release
mv "app/build/outputs/apk/foss/release/image-toolbox-$GITHUB_REF_NAME-foss-arm64-v8a-release-unsigned-signed.apk" "image-toolbox-$GITHUB_REF_NAME-foss-arm64-v8a.apk"
mv "app/build/outputs/apk/foss/release/image-toolbox-$GITHUB_REF_NAME-foss-universal-release-unsigned-signed.apk" "image-toolbox-$GITHUB_REF_NAME-foss-universal.apk"
mv "app/build/outputs/apk/foss/release/image-toolbox-$GITHUB_REF_NAME-foss-armeabi-v7a-release-unsigned-signed.apk" "image-toolbox-$GITHUB_REF_NAME-foss-armeabi-v7a.apk"
mv "app/build/outputs/apk/foss/release/image-toolbox-$GITHUB_REF_NAME-foss-x86_64-release-unsigned-signed.apk" "image-toolbox-$GITHUB_REF_NAME-foss-x86_64.apk"
- uses: iota9star/sign-android-release@v1.0.5
name: Sign Market APK
# ID used to access action output
id: sign_app_market
with:
releaseDirectory: app/build/outputs/apk/market/release
fileRex: .*apk
signingKeyBase64: ${{ secrets.SIGNING_KEY }}
alias: ${{ secrets.ALIAS }}
keyStorePassword: ${{ secrets.KEY_STORE_PASS }}
keyPassword: ${{ secrets.KEY_STORE_PASS }}
env:
BUILD_TOOLS_VERSION: "34.0.0"
- name: Rename market file stage
env:
VERSION_NAME: ${{ env.GITHUB_REF_NAME }}
run: |
ls -la app/build/outputs/apk/market/release
mv "app/build/outputs/apk/market/release/image-toolbox-$VERSION_NAME-market-arm64-v8a-release-unsigned-signed.apk" "image-toolbox-$VERSION_NAME-arm64-v8a.apk"
mv "app/build/outputs/apk/market/release/image-toolbox-$VERSION_NAME-market-universal-release-unsigned-signed.apk" "image-toolbox-$VERSION_NAME-universal.apk"
mv "app/build/outputs/apk/market/release/image-toolbox-$VERSION_NAME-market-armeabi-v7a-release-unsigned-signed.apk" "image-toolbox-$VERSION_NAME-armeabi-v7a.apk"
mv "app/build/outputs/apk/market/release/image-toolbox-$VERSION_NAME-market-x86_64-release-unsigned-signed.apk" "image-toolbox-$VERSION_NAME-x86_64.apk"
- uses: actions/upload-artifact@v4
id: signed-market-apk
with:
name: Signed apks Market
path: "*.apk"
create_release:
runs-on: ubuntu-latest
permissions:
contents: write
needs:
- build_and_release
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Download All Artifacts
uses: actions/download-artifact@v4
with:
merge-multiple: true
- name: Display all downloaded files
run: ls -la
- name: Set version variable
run: echo "GITHUB_REF_NAME=$GITHUB_REF_NAME" >> $GITHUB_ENV
- name: Set Pre-release flag
run: |
if [[ "$GITHUB_REF_NAME" == *-* ]]; then
# If GITHUB_REF_NAME contains a hyphen, set GITHUB_OTHER_ENV to true
echo "PRE_RELEASE_FLAG=true" >> $GITHUB_ENV
else
# If GITHUB_REF_NAME does not contain a hyphen, set GITHUB_OTHER_ENV to false
echo "PRE_RELEASE_FLAG=false" >> $GITHUB_ENV
fi
- uses: ncipollo/release-action@v1
with:
artifacts: "*.apk"
prerelease: ${{ env.PRE_RELEASE_FLAG }}
================================================
FILE: .gitignore
================================================
*.iml
.gradle
/local.properties
.DS_Store
/build
/app/release
/captures
.externalNativeBuild
.cxx
/.idea
/libs/nQuant/build
/.kotlin/errors/
/.kotlin
================================================
FILE: ARCHITECTURE.md
================================================
# 📐 Modules Graph
```mermaid
%%{
init: {
"theme": "base",
"themeVariables": {
"mainBkg": "#121418",
"primaryColor": "#1b3a1b",
"primaryTextColor": "#e0e3de",
"primaryBorderColor": "#76c893",
"nodeBorder": "#76c893",
"lineColor": "#76c893",
"secondaryColor": "#1f2721",
"tertiaryColor": "#232c26",
"clusterBkg": "#182018",
"clusterBorder": "#4caf50",
"nodeTextColor": "#e0e3de",
"edgeLabelBackground": "#111316",
"edgeLabelColor": "#cfe9de",
"fontSize": "28px",
"fontFamily": "JetBrains Mono, Inter, system-ui"
}
}
}%%
graph LR
subgraph :core
:core:data("data")
:core:ui("ui")
:core:domain("domain")
:core:resources("resources")
:core:settings("settings")
:core:di("di")
:core:crash("crash")
:core:utils("utils")
:core:filters("filters")
:core:ksp("ksp")
end
subgraph :feature
:feature:root("root")
:feature:main("main")
:feature:load-net-image("load-net-image")
:feature:crop("crop")
:feature:limits-resize("limits-resize")
:feature:cipher("cipher")
:feature:image-preview("image-preview")
:feature:weight-resize("weight-resize")
:feature:compare("compare")
:feature:delete-exif("delete-exif")
:feature:palette-tools("palette-tools")
:feature:resize-convert("resize-convert")
:feature:pdf-tools("pdf-tools")
:feature:single-edit("single-edit")
:feature:erase-background("erase-background")
:feature:draw("draw")
:feature:filters("filters")
:feature:image-stitch("image-stitch")
:feature:pick-color("pick-color")
:feature:recognize-text("recognize-text")
:feature:gradient-maker("gradient-maker")
:feature:watermarking("watermarking")
:feature:gif-tools("gif-tools")
:feature:apng-tools("apng-tools")
:feature:zip("zip")
:feature:jxl-tools("jxl-tools")
:feature:settings("settings")
:feature:easter-egg("easter-egg")
:feature:svg-maker("svg-maker")
:feature:format-conversion("format-conversion")
:feature:document-scanner("document-scanner")
:feature:scan-qr-code("scan-qr-code")
:feature:image-stacking("image-stacking")
:feature:image-splitting("image-splitting")
:feature:color-tools("color-tools")
:feature:webp-tools("webp-tools")
:feature:noise-generation("noise-generation")
:feature:collage-maker("collage-maker")
:feature:libraries-info("libraries-info")
:feature:markup-layers("markup-layers")
:feature:base64-tools("base64-tools")
:feature:checksum-tools("checksum-tools")
:feature:mesh-gradients("mesh-gradients")
:feature:edit-exif("edit-exif")
:feature:image-cutting("image-cutting")
:feature:audio-cover-extractor("audio-cover-extractor")
:feature:library-details("library-details")
:feature:wallpapers-export("wallpapers-export")
:feature:ascii-art("ascii-art")
:feature:ai-tools("ai-tools")
:feature:media-picker("media-picker")
:feature:quick-tiles("quick-tiles")
end
:feature:root --> :core:data
:feature:root --> :core:ui
:feature:root --> :core:domain
:feature:root --> :core:resources
:feature:root --> :core:settings
:feature:root --> :core:di
:feature:root --> :core:crash
:feature:root --> :feature:main
:feature:root --> :feature:load-net-image
:feature:root --> :feature:crop
:feature:root --> :feature:limits-resize
:feature:root --> :feature:cipher
:feature:root --> :feature:image-preview
:feature:root --> :feature:weight-resize
:feature:root --> :feature:compare
:feature:root --> :feature:delete-exif
:feature:root --> :feature:palette-tools
:feature:root --> :feature:resize-convert
:feature:root --> :feature:pdf-tools
:feature:root --> :feature:single-edit
:feature:root --> :feature:erase-background
:feature:root --> :feature:draw
:feature:root --> :feature:filters
:feature:root --> :feature:image-stitch
:feature:root --> :feature:pick-color
:feature:root --> :feature:recognize-text
:feature:root --> :feature:gradient-maker
:feature:root --> :feature:watermarking
:feature:root --> :feature:gif-tools
:feature:root --> :feature:apng-tools
:feature:root --> :feature:zip
:feature:root --> :feature:jxl-tools
:feature:root --> :feature:settings
:feature:root --> :feature:easter-egg
:feature:root --> :feature:svg-maker
:feature:root --> :feature:format-conversion
:feature:root --> :feature:document-scanner
:feature:root --> :feature:scan-qr-code
:feature:root --> :feature:image-stacking
:feature:root --> :feature:image-splitting
:feature:root --> :feature:color-tools
:feature:root --> :feature:webp-tools
:feature:root --> :feature:noise-generation
:feature:root --> :feature:collage-maker
:feature:root --> :feature:libraries-info
:feature:root --> :feature:markup-layers
:feature:root --> :feature:base64-tools
:feature:root --> :feature:checksum-tools
:feature:root --> :feature:mesh-gradients
:feature:root --> :feature:edit-exif
:feature:root --> :feature:image-cutting
:feature:root --> :feature:audio-cover-extractor
:feature:root --> :feature:library-details
:feature:root --> :feature:wallpapers-export
:feature:root --> :feature:ascii-art
:feature:root --> :feature:ai-tools
:feature:erase-background --> :core:data
:feature:erase-background --> :core:ui
:feature:erase-background --> :core:domain
:feature:erase-background --> :core:resources
:feature:erase-background --> :core:settings
:feature:erase-background --> :core:di
:feature:erase-background --> :core:crash
:feature:erase-background --> :feature:draw
:feature:edit-exif --> :core:data
:feature:edit-exif --> :core:ui
:feature:edit-exif --> :core:domain
:feature:edit-exif --> :core:resources
:feature:edit-exif --> :core:settings
:feature:edit-exif --> :core:di
:feature:edit-exif --> :core:crash
:feature:limits-resize --> :core:data
:feature:limits-resize --> :core:ui
:feature:limits-resize --> :core:domain
:feature:limits-resize --> :core:resources
:feature:limits-resize --> :core:settings
:feature:limits-resize --> :core:di
:feature:limits-resize --> :core:crash
:feature:jxl-tools --> :core:data
:feature:jxl-tools --> :core:ui
:feature:jxl-tools --> :core:domain
:feature:jxl-tools --> :core:resources
:feature:jxl-tools --> :core:settings
:feature:jxl-tools --> :core:di
:feature:jxl-tools --> :core:crash
:feature:libraries-info --> :core:data
:feature:libraries-info --> :core:ui
:feature:libraries-info --> :core:domain
:feature:libraries-info --> :core:resources
:feature:libraries-info --> :core:settings
:feature:libraries-info --> :core:di
:feature:libraries-info --> :core:crash
:feature:gif-tools --> :core:data
:feature:gif-tools --> :core:ui
:feature:gif-tools --> :core:domain
:feature:gif-tools --> :core:resources
:feature:gif-tools --> :core:settings
:feature:gif-tools --> :core:di
:feature:gif-tools --> :core:crash
:feature:library-details --> :core:data
:feature:library-details --> :core:ui
:feature:library-details --> :core:domain
:feature:library-details --> :core:resources
:feature:library-details --> :core:settings
:feature:library-details --> :core:di
:feature:library-details --> :core:crash
:feature:pdf-tools --> :core:data
:feature:pdf-tools --> :core:ui
:feature:pdf-tools --> :core:domain
:feature:pdf-tools --> :core:resources
:feature:pdf-tools --> :core:settings
:feature:pdf-tools --> :core:di
:feature:pdf-tools --> :core:crash
:feature:watermarking --> :core:data
:feature:watermarking --> :core:ui
:feature:watermarking --> :core:domain
:feature:watermarking --> :core:resources
:feature:watermarking --> :core:settings
:feature:watermarking --> :core:di
:feature:watermarking --> :core:crash
:feature:watermarking --> :feature:compare
:app --> :core:data
:app --> :core:ui
:app --> :core:domain
:app --> :core:resources
:app --> :core:settings
:app --> :core:di
:app --> :core:crash
:app --> :core:utils
:app --> :feature:root
:app --> :feature:media-picker
:app --> :feature:quick-tiles
:feature:resize-convert --> :core:data
:feature:resize-convert --> :core:ui
:feature:resize-convert --> :core:domain
:feature:resize-convert --> :core:resources
:feature:resize-convert --> :core:settings
:feature:resize-convert --> :core:di
:feature:resize-convert --> :core:crash
:feature:resize-convert --> :feature:compare
:feature:easter-egg --> :core:data
:feature:easter-egg --> :core:ui
:feature:easter-egg --> :core:domain
:feature:easter-egg --> :core:resources
:feature:easter-egg --> :core:settings
:feature:easter-egg --> :core:di
:feature:easter-egg --> :core:crash
:feature:webp-tools --> :core:data
:feature:webp-tools --> :core:ui
:feature:webp-tools --> :core:domain
:feature:webp-tools --> :core:resources
:feature:webp-tools --> :core:settings
:feature:webp-tools --> :core:di
:feature:webp-tools --> :core:crash
:feature:markup-layers --> :core:data
:feature:markup-layers --> :core:ui
:feature:markup-layers --> :core:domain
:feature:markup-layers --> :core:resources
:feature:markup-layers --> :core:settings
:feature:markup-layers --> :core:di
:feature:markup-layers --> :core:crash
:feature:media-picker --> :core:data
:feature:media-picker --> :core:ui
:feature:media-picker --> :core:domain
:feature:media-picker --> :core:resources
:feature:media-picker --> :core:settings
:feature:media-picker --> :core:di
:feature:media-picker --> :core:crash
:feature:image-stitch --> :core:data
:feature:image-stitch --> :core:ui
:feature:image-stitch --> :core:domain
:feature:image-stitch --> :core:resources
:feature:image-stitch --> :core:settings
:feature:image-stitch --> :core:di
:feature:image-stitch --> :core:crash
:feature:image-stitch --> :core:filters
:core:ui --> :core:resources
:core:ui --> :core:domain
:core:ui --> :core:utils
:core:ui --> :core:di
:core:ui --> :core:settings
:feature:noise-generation --> :core:data
:feature:noise-generation --> :core:ui
:feature:noise-generation --> :core:domain
:feature:noise-generation --> :core:resources
:feature:noise-generation --> :core:settings
:feature:noise-generation --> :core:di
:feature:noise-generation --> :core:crash
:feature:wallpapers-export --> :core:data
:feature:wallpapers-export --> :core:ui
:feature:wallpapers-export --> :core:domain
:feature:wallpapers-export --> :core:resources
:feature:wallpapers-export --> :core:settings
:feature:wallpapers-export --> :core:di
:feature:wallpapers-export --> :core:crash
:feature:document-scanner --> :core:data
:feature:document-scanner --> :core:ui
:feature:document-scanner --> :core:domain
:feature:document-scanner --> :core:resources
:feature:document-scanner --> :core:settings
:feature:document-scanner --> :core:di
:feature:document-scanner --> :core:crash
:feature:document-scanner --> :feature:pdf-tools
:feature:gradient-maker --> :core:data
:feature:gradient-maker --> :core:ui
:feature:gradient-maker --> :core:domain
:feature:gradient-maker --> :core:resources
:feature:gradient-maker --> :core:settings
:feature:gradient-maker --> :core:di
:feature:gradient-maker --> :core:crash
:feature:gradient-maker --> :feature:compare
:feature:zip --> :core:data
:feature:zip --> :core:ui
:feature:zip --> :core:domain
:feature:zip --> :core:resources
:feature:zip --> :core:settings
:feature:zip --> :core:di
:feature:zip --> :core:crash
:core:utils --> :core:domain
:core:utils --> :core:resources
:core:utils --> :core:settings
:feature:cipher --> :core:data
:feature:cipher --> :core:ui
:feature:cipher --> :core:domain
:feature:cipher --> :core:resources
:feature:cipher --> :core:settings
:feature:cipher --> :core:di
:feature:cipher --> :core:crash
:feature:draw --> :core:data
:feature:draw --> :core:ui
:feature:draw --> :core:domain
:feature:draw --> :core:resources
:feature:draw --> :core:settings
:feature:draw --> :core:di
:feature:draw --> :core:crash
:feature:draw --> :core:filters
:feature:draw --> :feature:pick-color
:feature:ai-tools --> :core:data
:feature:ai-tools --> :core:ui
:feature:ai-tools --> :core:domain
:feature:ai-tools --> :core:resources
:feature:ai-tools --> :core:settings
:feature:ai-tools --> :core:di
:feature:ai-tools --> :core:crash
:feature:audio-cover-extractor --> :core:data
:feature:audio-cover-extractor --> :core:ui
:feature:audio-cover-extractor --> :core:domain
:feature:audio-cover-extractor --> :core:resources
:feature:audio-cover-extractor --> :core:settings
:feature:audio-cover-extractor --> :core:di
:feature:audio-cover-extractor --> :core:crash
:core:crash --> :core:ui
:core:crash --> :core:settings
:feature:delete-exif --> :core:data
:feature:delete-exif --> :core:ui
:feature:delete-exif --> :core:domain
:feature:delete-exif --> :core:resources
:feature:delete-exif --> :core:settings
:feature:delete-exif --> :core:di
:feature:delete-exif --> :core:crash
:feature:collage-maker --> :core:data
:feature:collage-maker --> :core:ui
:feature:collage-maker --> :core:domain
:feature:collage-maker --> :core:resources
:feature:collage-maker --> :core:settings
:feature:collage-maker --> :core:di
:feature:collage-maker --> :core:crash
:feature:compare --> :core:data
:feature:compare --> :core:ui
:feature:compare --> :core:domain
:feature:compare --> :core:resources
:feature:compare --> :core:settings
:feature:compare --> :core:di
:feature:compare --> :core:crash
:feature:mesh-gradients --> :core:data
:feature:mesh-gradients --> :core:ui
:feature:mesh-gradients --> :core:domain
:feature:mesh-gradients --> :core:resources
:feature:mesh-gradients --> :core:settings
:feature:mesh-gradients --> :core:di
:feature:mesh-gradients --> :core:crash
:core:settings --> :core:domain
:core:settings --> :core:resources
:core:settings --> :core:di
:feature:scan-qr-code --> :core:data
:feature:scan-qr-code --> :core:ui
:feature:scan-qr-code --> :core:domain
:feature:scan-qr-code --> :core:resources
:feature:scan-qr-code --> :core:settings
:feature:scan-qr-code --> :core:di
:feature:scan-qr-code --> :core:crash
:feature:scan-qr-code --> :core:filters
:feature:svg-maker --> :core:data
:feature:svg-maker --> :core:ui
:feature:svg-maker --> :core:domain
:feature:svg-maker --> :core:resources
:feature:svg-maker --> :core:settings
:feature:svg-maker --> :core:di
:feature:svg-maker --> :core:crash
:feature:weight-resize --> :core:data
:feature:weight-resize --> :core:ui
:feature:weight-resize --> :core:domain
:feature:weight-resize --> :core:resources
:feature:weight-resize --> :core:settings
:feature:weight-resize --> :core:di
:feature:weight-resize --> :core:crash
:feature:image-splitting --> :core:data
:feature:image-splitting --> :core:ui
:feature:image-splitting --> :core:domain
:feature:image-splitting --> :core:resources
:feature:image-splitting --> :core:settings
:feature:image-splitting --> :core:di
:feature:image-splitting --> :core:crash
:benchmark --> :app
:feature:checksum-tools --> :core:data
:feature:checksum-tools --> :core:ui
:feature:checksum-tools --> :core:domain
:feature:checksum-tools --> :core:resources
:feature:checksum-tools --> :core:settings
:feature:checksum-tools --> :core:di
:feature:checksum-tools --> :core:crash
:feature:base64-tools --> :core:data
:feature:base64-tools --> :core:ui
:feature:base64-tools --> :core:domain
:feature:base64-tools --> :core:resources
:feature:base64-tools --> :core:settings
:feature:base64-tools --> :core:di
:feature:base64-tools --> :core:crash
:feature:palette-tools --> :core:data
:feature:palette-tools --> :core:ui
:feature:palette-tools --> :core:domain
:feature:palette-tools --> :core:resources
:feature:palette-tools --> :core:settings
:feature:palette-tools --> :core:di
:feature:palette-tools --> :core:crash
:feature:palette-tools --> :feature:pick-color
:feature:settings --> :core:data
:feature:settings --> :core:ui
:feature:settings --> :core:domain
:feature:settings --> :core:resources
:feature:settings --> :core:settings
:feature:settings --> :core:di
:feature:settings --> :core:crash
:core:data --> :core:utils
:core:data --> :core:domain
:core:data --> :core:resources
:core:data --> :core:filters
:core:data --> :core:settings
:core:data --> :core:di
:feature:pick-color --> :core:data
:feature:pick-color --> :core:ui
:feature:pick-color --> :core:domain
:feature:pick-color --> :core:resources
:feature:pick-color --> :core:settings
:feature:pick-color --> :core:di
:feature:pick-color --> :core:crash
:feature:load-net-image --> :core:data
:feature:load-net-image --> :core:ui
:feature:load-net-image --> :core:domain
:feature:load-net-image --> :core:resources
:feature:load-net-image --> :core:settings
:feature:load-net-image --> :core:di
:feature:load-net-image --> :core:crash
:feature:quick-tiles --> :core:data
:feature:quick-tiles --> :core:ui
:feature:quick-tiles --> :core:domain
:feature:quick-tiles --> :core:resources
:feature:quick-tiles --> :core:settings
:feature:quick-tiles --> :core:di
:feature:quick-tiles --> :core:crash
:feature:quick-tiles --> :feature:erase-background
:feature:recognize-text --> :core:data
:feature:recognize-text --> :core:ui
:feature:recognize-text --> :core:domain
:feature:recognize-text --> :core:resources
:feature:recognize-text --> :core:settings
:feature:recognize-text --> :core:di
:feature:recognize-text --> :core:crash
:feature:recognize-text --> :core:filters
:feature:recognize-text --> :feature:single-edit
:core:domain --> :core:resources
:feature:single-edit --> :core:data
:feature:single-edit --> :core:ui
:feature:single-edit --> :core:domain
:feature:single-edit --> :core:resources
:feature:single-edit --> :core:settings
:feature:single-edit --> :core:di
:feature:single-edit --> :core:crash
:feature:single-edit --> :feature:crop
:feature:single-edit --> :feature:erase-background
:feature:single-edit --> :feature:draw
:feature:single-edit --> :feature:filters
:feature:single-edit --> :feature:pick-color
:feature:single-edit --> :feature:compare
:feature:image-cutting --> :core:data
:feature:image-cutting --> :core:ui
:feature:image-cutting --> :core:domain
:feature:image-cutting --> :core:resources
:feature:image-cutting --> :core:settings
:feature:image-cutting --> :core:di
:feature:image-cutting --> :core:crash
:feature:image-cutting --> :feature:compare
:feature:crop --> :core:data
:feature:crop --> :core:ui
:feature:crop --> :core:domain
:feature:crop --> :core:resources
:feature:crop --> :core:settings
:feature:crop --> :core:di
:feature:crop --> :core:crash
:feature:color-tools --> :core:data
:feature:color-tools --> :core:ui
:feature:color-tools --> :core:domain
:feature:color-tools --> :core:resources
:feature:color-tools --> :core:settings
:feature:color-tools --> :core:di
:feature:color-tools --> :core:crash
:feature:format-conversion --> :core:data
:feature:format-conversion --> :core:ui
:feature:format-conversion --> :core:domain
:feature:format-conversion --> :core:resources
:feature:format-conversion --> :core:settings
:feature:format-conversion --> :core:di
:feature:format-conversion --> :core:crash
:feature:format-conversion --> :feature:compare
:feature:ascii-art --> :core:data
:feature:ascii-art --> :core:ui
:feature:ascii-art --> :core:domain
:feature:ascii-art --> :core:resources
:feature:ascii-art --> :core:settings
:feature:ascii-art --> :core:di
:feature:ascii-art --> :core:crash
:feature:ascii-art --> :feature:filters
:core:filters --> :core:domain
:core:filters --> :core:ui
:core:filters --> :core:resources
:core:filters --> :core:settings
:core:filters --> :core:utils
:feature:apng-tools --> :core:data
:feature:apng-tools --> :core:ui
:feature:apng-tools --> :core:domain
:feature:apng-tools --> :core:resources
:feature:apng-tools --> :core:settings
:feature:apng-tools --> :core:di
:feature:apng-tools --> :core:crash
:feature:image-preview --> :core:data
:feature:image-preview --> :core:ui
:feature:image-preview --> :core:domain
:feature:image-preview --> :core:resources
:feature:image-preview --> :core:settings
:feature:image-preview --> :core:di
:feature:image-preview --> :core:crash
:feature:filters --> :core:filters
:feature:filters --> :core:data
:feature:filters --> :core:ui
:feature:filters --> :core:domain
:feature:filters --> :core:resources
:feature:filters --> :core:settings
:feature:filters --> :core:di
:feature:filters --> :core:crash
:feature:filters --> :core:ksp
:feature:filters --> :feature:draw
:feature:filters --> :feature:pick-color
:feature:filters --> :feature:compare
:feature:image-stacking --> :core:data
:feature:image-stacking --> :core:ui
:feature:image-stacking --> :core:domain
:feature:image-stacking --> :core:resources
:feature:image-stacking --> :core:settings
:feature:image-stacking --> :core:di
:feature:image-stacking --> :core:crash
:feature:main --> :core:data
:feature:main --> :core:ui
:feature:main --> :core:domain
:feature:main --> :core:resources
:feature:main --> :core:settings
:feature:main --> :core:di
:feature:main --> :core:crash
:feature:main --> :feature:settings
```
================================================
FILE: ARCHITECTURE_2
================================================
%%{
init: {
"theme": "base",
"maxEdges": 1000,
"themeVariables": {
"mainBkg": "#121418",
"primaryColor": "#1b3a1b",
"primaryTextColor": "#e0e3de",
"primaryBorderColor": "#76c893",
"nodeBorder": "#76c893",
"lineColor": "#76c893",
"secondaryColor": "#1f2721",
"tertiaryColor": "#232c26",
"clusterBkg": "#182018",
"clusterBorder": "#4caf50",
"nodeTextColor": "#e0e3de",
"edgeLabelBackground": "#111316",
"edgeLabelColor": "#cfe9de",
"fontSize": "28px",
"fontFamily": "JetBrains Mono, Inter, system-ui"
}
}
}%%
graph LR
subgraph :core
:core:data("data")
:core:ui("ui")
:core:domain("domain")
:core:resources("resources")
:core:settings("settings")
:core:di("di")
:core:crash("crash")
:core:utils("utils")
:core:filters("filters")
:core:ksp("ksp")
end
subgraph :feature
:feature:root("root")
:feature:main("main")
:feature:load-net-image("load-net-image")
:feature:crop("crop")
:feature:limits-resize("limits-resize")
:feature:cipher("cipher")
:feature:image-preview("image-preview")
:feature:weight-resize("weight-resize")
:feature:compare("compare")
:feature:delete-exif("delete-exif")
:feature:palette-tools("palette-tools")
:feature:resize-convert("resize-convert")
:feature:pdf-tools("pdf-tools")
:feature:single-edit("single-edit")
:feature:erase-background("erase-background")
:feature:draw("draw")
:feature:filters("filters")
:feature:image-stitch("image-stitch")
:feature:pick-color("pick-color")
:feature:recognize-text("recognize-text")
:feature:gradient-maker("gradient-maker")
:feature:watermarking("watermarking")
:feature:gif-tools("gif-tools")
:feature:apng-tools("apng-tools")
:feature:zip("zip")
:feature:jxl-tools("jxl-tools")
:feature:settings("settings")
:feature:easter-egg("easter-egg")
:feature:svg-maker("svg-maker")
:feature:format-conversion("format-conversion")
:feature:document-scanner("document-scanner")
:feature:scan-qr-code("scan-qr-code")
:feature:image-stacking("image-stacking")
:feature:image-splitting("image-splitting")
:feature:color-tools("color-tools")
:feature:webp-tools("webp-tools")
:feature:noise-generation("noise-generation")
:feature:collage-maker("collage-maker")
:feature:libraries-info("libraries-info")
:feature:markup-layers("markup-layers")
:feature:base64-tools("base64-tools")
:feature:checksum-tools("checksum-tools")
:feature:mesh-gradients("mesh-gradients")
:feature:edit-exif("edit-exif")
:feature:image-cutting("image-cutting")
:feature:audio-cover-extractor("audio-cover-extractor")
:feature:library-details("library-details")
:feature:wallpapers-export("wallpapers-export")
:feature:ascii-art("ascii-art")
:feature:ai-tools("ai-tools")
:feature:color-library("color-library")
:feature:media-picker("media-picker")
:feature:quick-tiles("quick-tiles")
end
subgraph :lib
:lib:neural-tools("neural-tools")
:lib:opencv-tools("opencv-tools")
:lib:dynamic-theme("dynamic-theme")
:lib:snowfall("snowfall")
:lib:documentscanner("documentscanner")
:lib:collages("collages")
:lib:palette("palette")
:lib:curves("curves")
:lib:ascii("ascii")
end
:feature:root --> :core:data
:feature:root --> :core:ui
:feature:root --> :core:domain
:feature:root --> :core:resources
:feature:root --> :core:settings
:feature:root --> :core:di
:feature:root --> :core:crash
:feature:root --> :feature:main
:feature:root --> :feature:load-net-image
:feature:root --> :feature:crop
:feature:root --> :feature:limits-resize
:feature:root --> :feature:cipher
:feature:root --> :feature:image-preview
:feature:root --> :feature:weight-resize
:feature:root --> :feature:compare
:feature:root --> :feature:delete-exif
:feature:root --> :feature:palette-tools
:feature:root --> :feature:resize-convert
:feature:root --> :feature:pdf-tools
:feature:root --> :feature:single-edit
:feature:root --> :feature:erase-background
:feature:root --> :feature:draw
:feature:root --> :feature:filters
:feature:root --> :feature:image-stitch
:feature:root --> :feature:pick-color
:feature:root --> :feature:recognize-text
:feature:root --> :feature:gradient-maker
:feature:root --> :feature:watermarking
:feature:root --> :feature:gif-tools
:feature:root --> :feature:apng-tools
:feature:root --> :feature:zip
:feature:root --> :feature:jxl-tools
:feature:root --> :feature:settings
:feature:root --> :feature:easter-egg
:feature:root --> :feature:svg-maker
:feature:root --> :feature:format-conversion
:feature:root --> :feature:document-scanner
:feature:root --> :feature:scan-qr-code
:feature:root --> :feature:image-stacking
:feature:root --> :feature:image-splitting
:feature:root --> :feature:color-tools
:feature:root --> :feature:webp-tools
:feature:root --> :feature:noise-generation
:feature:root --> :feature:collage-maker
:feature:root --> :feature:libraries-info
:feature:root --> :feature:markup-layers
:feature:root --> :feature:base64-tools
:feature:root --> :feature:checksum-tools
:feature:root --> :feature:mesh-gradients
:feature:root --> :feature:edit-exif
:feature:root --> :feature:image-cutting
:feature:root --> :feature:audio-cover-extractor
:feature:root --> :feature:library-details
:feature:root --> :feature:wallpapers-export
:feature:root --> :feature:ascii-art
:feature:root --> :feature:ai-tools
:feature:root --> :feature:color-library
:feature:erase-background --> :core:data
:feature:erase-background --> :core:ui
:feature:erase-background --> :core:domain
:feature:erase-background --> :core:resources
:feature:erase-background --> :core:settings
:feature:erase-background --> :core:di
:feature:erase-background --> :core:crash
:feature:erase-background --> :lib:neural-tools
:feature:erase-background --> :feature:draw
:feature:edit-exif --> :core:data
:feature:edit-exif --> :core:ui
:feature:edit-exif --> :core:domain
:feature:edit-exif --> :core:resources
:feature:edit-exif --> :core:settings
:feature:edit-exif --> :core:di
:feature:edit-exif --> :core:crash
:feature:limits-resize --> :core:data
:feature:limits-resize --> :core:ui
:feature:limits-resize --> :core:domain
:feature:limits-resize --> :core:resources
:feature:limits-resize --> :core:settings
:feature:limits-resize --> :core:di
:feature:limits-resize --> :core:crash
:feature:jxl-tools --> :core:data
:feature:jxl-tools --> :core:ui
:feature:jxl-tools --> :core:domain
:feature:jxl-tools --> :core:resources
:feature:jxl-tools --> :core:settings
:feature:jxl-tools --> :core:di
:feature:jxl-tools --> :core:crash
:feature:libraries-info --> :core:data
:feature:libraries-info --> :core:ui
:feature:libraries-info --> :core:domain
:feature:libraries-info --> :core:resources
:feature:libraries-info --> :core:settings
:feature:libraries-info --> :core:di
:feature:libraries-info --> :core:crash
:feature:gif-tools --> :core:data
:feature:gif-tools --> :core:ui
:feature:gif-tools --> :core:domain
:feature:gif-tools --> :core:resources
:feature:gif-tools --> :core:settings
:feature:gif-tools --> :core:di
:feature:gif-tools --> :core:crash
:feature:library-details --> :core:data
:feature:library-details --> :core:ui
:feature:library-details --> :core:domain
:feature:library-details --> :core:resources
:feature:library-details --> :core:settings
:feature:library-details --> :core:di
:feature:library-details --> :core:crash
:feature:pdf-tools --> :core:data
:feature:pdf-tools --> :core:ui
:feature:pdf-tools --> :core:domain
:feature:pdf-tools --> :core:resources
:feature:pdf-tools --> :core:settings
:feature:pdf-tools --> :core:di
:feature:pdf-tools --> :core:crash
:feature:watermarking --> :core:data
:feature:watermarking --> :core:ui
:feature:watermarking --> :core:domain
:feature:watermarking --> :core:resources
:feature:watermarking --> :core:settings
:feature:watermarking --> :core:di
:feature:watermarking --> :core:crash
:feature:watermarking --> :feature:compare
:app --> :core:data
:app --> :core:ui
:app --> :core:domain
:app --> :core:resources
:app --> :core:settings
:app --> :core:di
:app --> :core:crash
:app --> :core:utils
:app --> :feature:root
:app --> :feature:media-picker
:app --> :feature:quick-tiles
:app --> :lib:opencv-tools
:app --> :lib:neural-tools
:feature:resize-convert --> :core:data
:feature:resize-convert --> :core:ui
:feature:resize-convert --> :core:domain
:feature:resize-convert --> :core:resources
:feature:resize-convert --> :core:settings
:feature:resize-convert --> :core:di
:feature:resize-convert --> :core:crash
:feature:resize-convert --> :feature:compare
:feature:easter-egg --> :core:data
:feature:easter-egg --> :core:ui
:feature:easter-egg --> :core:domain
:feature:easter-egg --> :core:resources
:feature:easter-egg --> :core:settings
:feature:easter-egg --> :core:di
:feature:easter-egg --> :core:crash
:feature:webp-tools --> :core:data
:feature:webp-tools --> :core:ui
:feature:webp-tools --> :core:domain
:feature:webp-tools --> :core:resources
:feature:webp-tools --> :core:settings
:feature:webp-tools --> :core:di
:feature:webp-tools --> :core:crash
:feature:markup-layers --> :core:data
:feature:markup-layers --> :core:ui
:feature:markup-layers --> :core:domain
:feature:markup-layers --> :core:resources
:feature:markup-layers --> :core:settings
:feature:markup-layers --> :core:di
:feature:markup-layers --> :core:crash
:feature:media-picker --> :core:data
:feature:media-picker --> :core:ui
:feature:media-picker --> :core:domain
:feature:media-picker --> :core:resources
:feature:media-picker --> :core:settings
:feature:media-picker --> :core:di
:feature:media-picker --> :core:crash
:feature:image-stitch --> :core:data
:feature:image-stitch --> :core:ui
:feature:image-stitch --> :core:domain
:feature:image-stitch --> :core:resources
:feature:image-stitch --> :core:settings
:feature:image-stitch --> :core:di
:feature:image-stitch --> :core:crash
:feature:image-stitch --> :core:filters
:feature:image-stitch --> :lib:opencv-tools
:core:ui --> :core:resources
:core:ui --> :core:domain
:core:ui --> :core:utils
:core:ui --> :lib:dynamic-theme
:core:ui --> :lib:snowfall
:core:ui --> :core:di
:core:ui --> :core:settings
:core:ui --> :lib:documentscanner
:feature:color-library --> :core:data
:feature:color-library --> :core:ui
:feature:color-library --> :core:domain
:feature:color-library --> :core:resources
:feature:color-library --> :core:settings
:feature:color-library --> :core:di
:feature:color-library --> :core:crash
:feature:noise-generation --> :core:data
:feature:noise-generation --> :core:ui
:feature:noise-generation --> :core:domain
:feature:noise-generation --> :core:resources
:feature:noise-generation --> :core:settings
:feature:noise-generation --> :core:di
:feature:noise-generation --> :core:crash
:feature:wallpapers-export --> :core:data
:feature:wallpapers-export --> :core:ui
:feature:wallpapers-export --> :core:domain
:feature:wallpapers-export --> :core:resources
:feature:wallpapers-export --> :core:settings
:feature:wallpapers-export --> :core:di
:feature:wallpapers-export --> :core:crash
:feature:document-scanner --> :core:data
:feature:document-scanner --> :core:ui
:feature:document-scanner --> :core:domain
:feature:document-scanner --> :core:resources
:feature:document-scanner --> :core:settings
:feature:document-scanner --> :core:di
:feature:document-scanner --> :core:crash
:feature:document-scanner --> :feature:pdf-tools
:feature:gradient-maker --> :core:data
:feature:gradient-maker --> :core:ui
:feature:gradient-maker --> :core:domain
:feature:gradient-maker --> :core:resources
:feature:gradient-maker --> :core:settings
:feature:gradient-maker --> :core:di
:feature:gradient-maker --> :core:crash
:feature:gradient-maker --> :feature:compare
:feature:zip --> :core:data
:feature:zip --> :core:ui
:feature:zip --> :core:domain
:feature:zip --> :core:resources
:feature:zip --> :core:settings
:feature:zip --> :core:di
:feature:zip --> :core:crash
:core:utils --> :core:domain
:core:utils --> :core:resources
:core:utils --> :core:settings
:feature:cipher --> :core:data
:feature:cipher --> :core:ui
:feature:cipher --> :core:domain
:feature:cipher --> :core:resources
:feature:cipher --> :core:settings
:feature:cipher --> :core:di
:feature:cipher --> :core:crash
:feature:draw --> :core:data
:feature:draw --> :core:ui
:feature:draw --> :core:domain
:feature:draw --> :core:resources
:feature:draw --> :core:settings
:feature:draw --> :core:di
:feature:draw --> :core:crash
:feature:draw --> :core:filters
:feature:draw --> :feature:pick-color
:feature:ai-tools --> :core:data
:feature:ai-tools --> :core:ui
:feature:ai-tools --> :core:domain
:feature:ai-tools --> :core:resources
:feature:ai-tools --> :core:settings
:feature:ai-tools --> :core:di
:feature:ai-tools --> :core:crash
:feature:ai-tools --> :lib:neural-tools
:feature:audio-cover-extractor --> :core:data
:feature:audio-cover-extractor --> :core:ui
:feature:audio-cover-extractor --> :core:domain
:feature:audio-cover-extractor --> :core:resources
:feature:audio-cover-extractor --> :core:settings
:feature:audio-cover-extractor --> :core:di
:feature:audio-cover-extractor --> :core:crash
:core:crash --> :core:ui
:core:crash --> :core:settings
:lib:documentscanner --> :lib:opencv-tools
:feature:delete-exif --> :core:data
:feature:delete-exif --> :core:ui
:feature:delete-exif --> :core:domain
:feature:delete-exif --> :core:resources
:feature:delete-exif --> :core:settings
:feature:delete-exif --> :core:di
:feature:delete-exif --> :core:crash
:feature:collage-maker --> :core:data
:feature:collage-maker --> :core:ui
:feature:collage-maker --> :core:domain
:feature:collage-maker --> :core:resources
:feature:collage-maker --> :core:settings
:feature:collage-maker --> :core:di
:feature:collage-maker --> :core:crash
:feature:collage-maker --> :lib:collages
:feature:compare --> :core:data
:feature:compare --> :core:ui
:feature:compare --> :core:domain
:feature:compare --> :core:resources
:feature:compare --> :core:settings
:feature:compare --> :core:di
:feature:compare --> :core:crash
:feature:compare --> :lib:opencv-tools
:feature:mesh-gradients --> :core:data
:feature:mesh-gradients --> :core:ui
:feature:mesh-gradients --> :core:domain
:feature:mesh-gradients --> :core:resources
:feature:mesh-gradients --> :core:settings
:feature:mesh-gradients --> :core:di
:feature:mesh-gradients --> :core:crash
:core:settings --> :lib:dynamic-theme
:core:settings --> :core:domain
:core:settings --> :core:resources
:core:settings --> :core:di
:feature:scan-qr-code --> :core:data
:feature:scan-qr-code --> :core:ui
:feature:scan-qr-code --> :core:domain
:feature:scan-qr-code --> :core:resources
:feature:scan-qr-code --> :core:settings
:feature:scan-qr-code --> :core:di
:feature:scan-qr-code --> :core:crash
:feature:scan-qr-code --> :core:filters
:feature:svg-maker --> :core:data
:feature:svg-maker --> :core:ui
:feature:svg-maker --> :core:domain
:feature:svg-maker --> :core:resources
:feature:svg-maker --> :core:settings
:feature:svg-maker --> :core:di
:feature:svg-maker --> :core:crash
:feature:weight-resize --> :core:data
:feature:weight-resize --> :core:ui
:feature:weight-resize --> :core:domain
:feature:weight-resize --> :core:resources
:feature:weight-resize --> :core:settings
:feature:weight-resize --> :core:di
:feature:weight-resize --> :core:crash
:feature:image-splitting --> :core:data
:feature:image-splitting --> :core:ui
:feature:image-splitting --> :core:domain
:feature:image-splitting --> :core:resources
:feature:image-splitting --> :core:settings
:feature:image-splitting --> :core:di
:feature:image-splitting --> :core:crash
:benchmark --> :app
:feature:checksum-tools --> :core:data
:feature:checksum-tools --> :core:ui
:feature:checksum-tools --> :core:domain
:feature:checksum-tools --> :core:resources
:feature:checksum-tools --> :core:settings
:feature:checksum-tools --> :core:di
:feature:checksum-tools --> :core:crash
:feature:base64-tools --> :core:data
:feature:base64-tools --> :core:ui
:feature:base64-tools --> :core:domain
:feature:base64-tools --> :core:resources
:feature:base64-tools --> :core:settings
:feature:base64-tools --> :core:di
:feature:base64-tools --> :core:crash
:feature:palette-tools --> :core:data
:feature:palette-tools --> :core:ui
:feature:palette-tools --> :core:domain
:feature:palette-tools --> :core:resources
:feature:palette-tools --> :core:settings
:feature:palette-tools --> :core:di
:feature:palette-tools --> :core:crash
:feature:palette-tools --> :feature:pick-color
:feature:palette-tools --> :lib:palette
:feature:settings --> :core:data
:feature:settings --> :core:ui
:feature:settings --> :core:domain
:feature:settings --> :core:resources
:feature:settings --> :core:settings
:feature:settings --> :core:di
:feature:settings --> :core:crash
:core:data --> :core:utils
:core:data --> :core:domain
:core:data --> :core:resources
:core:data --> :core:filters
:core:data --> :core:settings
:core:data --> :core:di
:feature:pick-color --> :core:data
:feature:pick-color --> :core:ui
:feature:pick-color --> :core:domain
:feature:pick-color --> :core:resources
:feature:pick-color --> :core:settings
:feature:pick-color --> :core:di
:feature:pick-color --> :core:crash
:feature:load-net-image --> :core:data
:feature:load-net-image --> :core:ui
:feature:load-net-image --> :core:domain
:feature:load-net-image --> :core:resources
:feature:load-net-image --> :core:settings
:feature:load-net-image --> :core:di
:feature:load-net-image --> :core:crash
:feature:quick-tiles --> :core:data
:feature:quick-tiles --> :core:ui
:feature:quick-tiles --> :core:domain
:feature:quick-tiles --> :core:resources
:feature:quick-tiles --> :core:settings
:feature:quick-tiles --> :core:di
:feature:quick-tiles --> :core:crash
:feature:quick-tiles --> :feature:erase-background
:feature:recognize-text --> :core:data
:feature:recognize-text --> :core:ui
:feature:recognize-text --> :core:domain
:feature:recognize-text --> :core:resources
:feature:recognize-text --> :core:settings
:feature:recognize-text --> :core:di
:feature:recognize-text --> :core:crash
:feature:recognize-text --> :core:filters
:feature:recognize-text --> :feature:single-edit
:core:domain --> :core:resources
:feature:single-edit --> :core:data
:feature:single-edit --> :core:ui
:feature:single-edit --> :core:domain
:feature:single-edit --> :core:resources
:feature:single-edit --> :core:settings
:feature:single-edit --> :core:di
:feature:single-edit --> :core:crash
:feature:single-edit --> :feature:crop
:feature:single-edit --> :feature:erase-background
:feature:single-edit --> :feature:draw
:feature:single-edit --> :feature:filters
:feature:single-edit --> :feature:pick-color
:feature:single-edit --> :feature:compare
:feature:single-edit --> :lib:curves
:feature:image-cutting --> :core:data
:feature:image-cutting --> :core:ui
:feature:image-cutting --> :core:domain
:feature:image-cutting --> :core:resources
:feature:image-cutting --> :core:settings
:feature:image-cutting --> :core:di
:feature:image-cutting --> :core:crash
:feature:image-cutting --> :feature:compare
:feature:crop --> :core:data
:feature:crop --> :core:ui
:feature:crop --> :core:domain
:feature:crop --> :core:resources
:feature:crop --> :core:settings
:feature:crop --> :core:di
:feature:crop --> :core:crash
:feature:crop --> :lib:opencv-tools
:feature:color-tools --> :core:data
:feature:color-tools --> :core:ui
:feature:color-tools --> :core:domain
:feature:color-tools --> :core:resources
:feature:color-tools --> :core:settings
:feature:color-tools --> :core:di
:feature:color-tools --> :core:crash
:feature:format-conversion --> :core:data
:feature:format-conversion --> :core:ui
:feature:format-conversion --> :core:domain
:feature:format-conversion --> :core:resources
:feature:format-conversion --> :core:settings
:feature:format-conversion --> :core:di
:feature:format-conversion --> :core:crash
:feature:format-conversion --> :feature:compare
:feature:ascii-art --> :core:data
:feature:ascii-art --> :core:ui
:feature:ascii-art --> :core:domain
:feature:ascii-art --> :core:resources
:feature:ascii-art --> :core:settings
:feature:ascii-art --> :core:di
:feature:ascii-art --> :core:crash
:feature:ascii-art --> :feature:filters
:feature:ascii-art --> :lib:ascii
:core:filters --> :core:domain
:core:filters --> :core:ui
:core:filters --> :core:resources
:core:filters --> :core:settings
:core:filters --> :core:utils
:core:filters --> :lib:curves
:core:filters --> :lib:ascii
:core:filters --> :lib:neural-tools
:feature:apng-tools --> :core:data
:feature:apng-tools --> :core:ui
:feature:apng-tools --> :core:domain
:feature:apng-tools --> :core:resources
:feature:apng-tools --> :core:settings
:feature:apng-tools --> :core:di
:feature:apng-tools --> :core:crash
:feature:image-preview --> :core:data
:feature:image-preview --> :core:ui
:feature:image-preview --> :core:domain
:feature:image-preview --> :core:resources
:feature:image-preview --> :core:settings
:feature:image-preview --> :core:di
:feature:image-preview --> :core:crash
:feature:filters --> :core:filters
:feature:filters --> :core:data
:feature:filters --> :core:ui
:feature:filters --> :core:domain
:feature:filters --> :core:resources
:feature:filters --> :core:settings
:feature:filters --> :core:di
:feature:filters --> :core:crash
:feature:filters --> :core:ksp
:feature:filters --> :feature:draw
:feature:filters --> :feature:pick-color
:feature:filters --> :feature:compare
:feature:filters --> :lib:opencv-tools
:feature:filters --> :lib:neural-tools
:feature:filters --> :lib:curves
:feature:filters --> :lib:ascii
:feature:image-stacking --> :core:data
:feature:image-stacking --> :core:ui
:feature:image-stacking --> :core:domain
:feature:image-stacking --> :core:resources
:feature:image-stacking --> :core:settings
:feature:image-stacking --> :core:di
:feature:image-stacking --> :core:crash
:feature:main --> :core:data
:feature:main --> :core:ui
:feature:main --> :core:domain
:feature:main --> :core:resources
:feature:main --> :core:settings
:feature:main --> :core:di
:feature:main --> :core:crash
:feature:main --> :feature:settings
================================================
FILE: CONTRIBUTING.md
================================================
# Contributing Guidelines
This documentation contains set of guidelines to help you during the contribution process.
# Submitting Contributions👨🏻💻
Below you will find the process and workflow used to review and merge your changes.
## 🌟 : Choose an issue/ Create an issue
- Look for the existing issue or create your own issue.
- Comment on the respective issue you would like to work before creating a Pull Request.
- Wait for the issue to be assigned to you after which you can start working on it.
## 🌟 : Fork the repository
- Fork this repository "ImageToolbox" by clicking on the "Fork" button. This will create a local copy of this respository on your GitHub profile.
## 🌟 : Clone the forked repository
- Once the repository is forked you need to clone it to your local machine.
- Click on the "Code" button in the repository page and copy the link provided in the dropdown menu.
```bash
git clone https://github.com/<your-username>/<ImageToolbox>
```
- Keep a reference to the original project in `upstream` remote.
```bash
cd <repo-name>
git remote add upstream https://github.com/<upstream-owner>/<ImageToolbox>
git remote -v # To the check the remotes for this repository
```
- If the project is forked already, update the copy before working.
```bash
git remote update
git checkout <branch-name>
git rebase upstream/<branch-name>
```
## 🌟 : Create a new branch
- Always create a new branch and name it accordingly so as to identify the issue you are addressing.
```bash
# It will create a new branch with name branch_name and switch to that branch
git checkout -b branch_name
```
## 🌟 : Work on the issue assigned
- Work on the issue(s) assigned to you, make the necessary changes in the files/folders needed.
- After making the changes add them to the branch you've created.
```bash
# To add all new files to branch Branch_Name
git add .
# To add only a few files to Branch_Name
git add <file name>
```
## 🌟 : Commit the changes
- Add your commits.
- Along with the commit give a descriptive message that reflects your changes.
```bash
git commit -m "message"
```
- Note : A Pull Request should always have only one commit.
## 🌟 : Push the changes
- Push the committed changes in your branch to your remote repository.
```bash
git push origin branch_name
```
## 🌟 : Create a Pull Request
- Go to your repository in the browser and click on compare and pull request.
- Add a title and description to your pull request that best describes your contribution.
- After which the pull request will be reviewed and the maintainer will provide the reviews required for the changes.
If no changes are needed, this means that your Pull Request has been reviewed and will be merged to the original code base by the maintainer.
Happy Hacking!
================================================
FILE: LICENSE
================================================
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
================================================
FILE: README.md
================================================
<div align="center">
</br>
<img src="./fastlane/metadata/android/en-US/images/logo/logo.png" width="200" />
</div>
<div align="center">
# Image Toolbox
</div>
</br>
<p align="center">
<img alt="API" src="https://img.shields.io/badge/Api%2023+-50f270?logo=android&logoColor=black&style=for-the-badge"/></a>
<img alt="Kotlin" src="https://img.shields.io/badge/Kotlin-a503fc?logo=kotlin&logoColor=white&style=for-the-badge"/></a>
<img alt="Jetpack Compose" src="https://img.shields.io/static/v1?style=for-the-badge&message=Jetpack+Compose&color=4285F4&logo=Jetpack+Compose&logoColor=FFFFFF&label="/></a>
<img alt="material" src="https://custom-icon-badges.demolab.com/badge/material%20you-lightblue?style=for-the-badge&logoColor=333&logo=material-you"/></a>
</br>
</br>
<img src="https://img.shields.io/badge/327.8K-aeff4d?style=for-the-badge&logo=data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI%2BCiAgICA8cGF0aCBkPSJNMTIuODksM0wxNC44NSwzLjRMMTEuMTEsMjFMOS4xNSwyMC42TDEyLjg5LDNNMTkuNTksMTJMMTYsOC40MVY1LjU4TDIyLjQyLDEyTDE2LDE4LjQxVjE1LjU4TDE5LjU5LDEyTTEuNTgsMTJMOCw1LjU4VjguNDFMNC40MSwxMkw4LDE1LjU4VjE4LjQxTDEuNTgsMTJaIgogICAgICAgIGZpbGw9IndoaXRlIiAvPgo8L3N2Zz4%3D&label=Lines%20of%20code&labelColor=4b731a"/>
<img src="https://img.shields.io/github/commits-since/t8rin/ImageResizer/v1.0?color=palegreen&label=Commits&style=for-the-badge&logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHRpdGxlPnNvdXJjZS1jb21taXQ8L3RpdGxlPjxwYXRoIGQ9Ik0xNywxMkMxNywxNC40MiAxNS4yOCwxNi40NCAxMywxNi45VjIxSDExVjE2LjlDOC43MiwxNi40NCA3LDE0LjQyIDcsMTJDNyw5LjU4IDguNzIsNy41NiAxMSw3LjFWM0gxM1Y3LjFDMTUuMjgsNy41NiAxNyw5LjU4IDE3LDEyTTEyLDlBMywzIDAgMCwwIDksMTJBMywzIDAgMCwwIDEyLDE1QTMsMyAwIDAsMCAxNSwxMkEzLDMgMCAwLDAgMTIsOVoiIGZpbGw9IndoaXRlIiAvPjwvc3ZnPg==&labelColor=07ab4e">
<img src="https://img.shields.io/github/languages/code-size/t8rin/imageresizer?style=for-the-badge&color=8ce2ff&logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHRpdGxlPndlaWdodDwvdGl0bGU+PHBhdGggZD0iTTEyLDNBNCw0IDAgMCwxIDE2LDdDMTYsNy43MyAxNS44MSw4LjQxIDE1LjQ2LDlIMThDMTguOTUsOSAxOS43NSw5LjY3IDE5Ljk1LDEwLjU2QzIxLjk2LDE4LjU3IDIyLDE4Ljc4IDIyLDE5QTIsMiAwIDAsMSAyMCwyMUg0QTIsMiAwIDAsMSAyLDE5QzIsMTguNzggMi4wNCwxOC41NyA0LjA1LDEwLjU2QzQuMjUsOS42NyA1LjA1LDkgNiw5SDguNTRDOC4xOSw4LjQxIDgsNy43MyA4LDdBNCw0IDAgMCwxIDEyLDNNMTIsNUEyLDIgMCAwLDAgMTAsN0EyLDIgMCAwLDAgMTIsOUEyLDIgMCAwLDAgMTQsN0EyLDIgMCAwLDAgMTIsNVoiIGZpbGw9IndoaXRlIiAvPjwvc3ZnPg==&labelColor=0782ab">
</br>
</br>
<a href="https://hits.sh/github.com/t8rin/ImageResizer/">
<img src="https://hits.sh/github.com/t8rin/ImageResizer.svg?style=for-the-badge&label=Page%20Views&extraCount=7500&color=ff3f6f&logo=data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGNsYXNzPSJzdmctaWNvbiIgc3R5bGU9IndpZHRoOiAxZW07IGhlaWdodDogMWVtO3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZmlsbDojZmZmZmZmO292ZXJmbG93OiBoaWRkZW47IiB2aWV3Qm94PSIwIDAgMTAyNCAxMDI0IiB2ZXJzaW9uPSIxLjEiPjxwYXRoIGQ9Ik01MTIgMzg0YTEyOCAxMjggMCAwIDAtMTI4IDEyOCAxMjggMTI4IDAgMCAwIDEyOCAxMjggMTI4IDEyOCAwIDAgMCAxMjgtMTI4IDEyOCAxMjggMCAwIDAtMTI4LTEyOG0wIDM0MS4zMzMzMzNhMjEzLjMzMzMzMyAyMTMuMzMzMzMzIDAgMCAxLTIxMy4zMzMzMzMtMjEzLjMzMzMzMyAyMTMuMzMzMzMzIDIxMy4zMzMzMzMgMCAwIDEgMjEzLjMzMzMzMy0yMTMuMzMzMzMzIDIxMy4zMzMzMzMgMjEzLjMzMzMzMyAwIDAgMSAyMTMuMzMzMzMzIDIxMy4zMzMzMzMgMjEzLjMzMzMzMyAyMTMuMzMzMzMzIDAgMCAxLTIxMy4zMzMzMzMgMjEzLjMzMzMzM20wLTUzMy4zMzMzMzNDMjk4LjY2NjY2NyAxOTIgMTE2LjQ4IDMyNC42OTMzMzMgNDIuNjY2NjY3IDUxMmM3My44MTMzMzMgMTg3LjMwNjY2NyAyNTYgMzIwIDQ2OS4zMzMzMzMgMzIwczM5NS41Mi0xMzIuNjkzMzMzIDQ2OS4zMzMzMzMtMzIwYy03My44MTMzMzMtMTg3LjMwNjY2Ny0yNTYtMzIwLTQ2OS4zMzMzMzMtMzIweiIgZmlsbD0iIi8%2BPC9zdmc%2B&labelColor=870b2a"/>
</a>
<a href="https://github.com/t8rin/ImageResizer/releases">
<img src="https://img.shields.io/github/downloads/t8rin/ImageResizer/total?color=ff9500&style=for-the-badge&logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHRpdGxlPmRvd25sb2FkPC90aXRsZT48cGF0aCBkPSJNNSwyMEgxOVYxOEg1TTE5LDlIMTVWM0g5VjlINUwxMiwxNkwxOSw5WiIgZmlsbD0id2hpdGUiIC8+PC9zdmc+&labelColor=a6660d"/>
</a>
<a href="https://github.com/t8rin/ImageResizer/stargazers">
<img src="https://img.shields.io/github/stars/t8rin/imageresizer?color=ffff00&style=for-the-badge&labelColor=a1a116&logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHRpdGxlPnN0YXI8L3RpdGxlPjxwYXRoIGQ9Ik0xMiwxNy4yN0wxOC4xOCwyMUwxNi41NCwxMy45N0wyMiw5LjI0TDE0LjgxLDguNjJMMTIsMkw5LjE5LDguNjJMMiw5LjI0TDcuNDUsMTMuOTdMNS44MiwyMUwxMiwxNy4yN1oiIGZpbGw9IndoaXRlIiAvPjwvc3ZnPg=="/>
</a>
</br>
<a href="https://github.com/t8rin/imageresizer/releases/latest">
<img src="https://img.shields.io/github/v/release/t8rin/imageresizer?color=a1168e&include_prereleases&logo=github&style=for-the-badge&labelColor=700f63"/>
</a>
<a href="https://play.google.com/store/apps/details?id=ru.tech.imageresizershrinker">
<img src="https://img.shields.io/endpoint?color=a1168e&logo=google-play&style=for-the-badge&label=Play%20store&url=https%3A%2F%2Fplay.cuzi.workers.dev%2Fplay%3Fi%3Dru.tech.imageresizershrinker%26l%3DAndroid%26m%3D%24version&labelColor=700f63"/>
</a>
<a href="https://f-droid.org/packages/ru.tech.imageresizershrinker">
<img src="https://img.shields.io/f-droid/v/ru.tech.imageresizershrinker?color=a1168e&include_prereleases&logo=FDROID&style=for-the-badge&labelColor=700f63"/>
</a>
</br>
</br>
<img src="https://wakatime.com/badge/user/7fa5ec35-3afd-4c14-984e-6ea7daf545c7.svg?style=social" style="height: 28px;"/>
</br>
</br>
<a href="https://hellogithub.com/repository/4c5f2fae4eb545ab87cad9ffd19870ca" target="_blank">
<img src="https://abroad.hellogithub.com/v1/widgets/recommend.svg?rid=4c5f2fae4eb545ab87cad9ffd19870ca&claim_uid=ubtZe5aXVz0n2QA&theme=dark" alt="Featured|HelloGitHub" style="width: 250px; height: 54px;" width="250" height="54" />
</a>
</p>
<div align="center">
# 🗺️ Project Overview
ImageToolbox is a versatile image editing tool designed for efficient photo manipulation. It allows
users to crop, apply filters, edit EXIF data, erase backgrounds, and even enhance images with AI.
Ideal for both photographers and developers, the tool offers a simple interface with powerful
capabilities.
</div>
<p align="middle">
<img src="./fastlane/metadata/android/en-US/images/banner/banner1.png" width="99%" />
<img src="./fastlane/metadata/android/en-US/images/phoneScreenshots/01.png" width="13%" />
<img src="./fastlane/metadata/android/en-US/images/phoneScreenshots/02.png" width="13%" />
<img src="./fastlane/metadata/android/en-US/images/phoneScreenshots/03.png" width="13%" />
<img src="./fastlane/metadata/android/en-US/images/phoneScreenshots/04.png" width="13%" />
<img src="./fastlane/metadata/android/en-US/images/phoneScreenshots/05.png" width="13%" />
<img src="./fastlane/metadata/android/en-US/images/phoneScreenshots/06.png" width="13%" />
<img src="./fastlane/metadata/android/en-US/images/phoneScreenshots/07.png" width="13%" />
</p>
<div align="center">
# 📔 Wiki
Check out Image Toolbox [Wiki](https://github.com/T8RIN/ImageToolbox/wiki) for FAQ and useful info
</br>
</br>
# ✈️ Telegram Links
</br>
[](https://t.me/t8rin_imagetoolbox)
[](https://t.me/t8rin_imagetoolbox_ci)
</br>
</br>
Join our chat where you can discuss anything you want and also look into the CI channel where I post betas and announcements
</br>
# ☕ Buy me a coffee
This application is completely free, but if you want to support the project development, you can
send a donation to the crypto wallets below
| </br>  <br/> <br/> [https://boosty.to/t8rin](https://boosty.to/t8rin) <br/> <br/> | </br>  <br/> <br/> `18QFWMREkjzQa4yetfYsN5Ua51UubKmJut` <br/> <br/> | </br> -168363?style=for-the-badge&logo=tether&logoColor=white) <br/> <br/> `TVdw6fP8dYsYA6HgQiSYNijBqPJ3k5BbYo` <br/> <br/> |
|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|
# 📲 Download
Go to the [Releases](https://github.com/t8rin/imageresizer/releases/latest) and the download latest
apk
or click one of the badges below.
</br>
<p align="middle">
<a href="https://play.google.com/store/apps/details?id=ru.tech.imageresizershrinker"><img alt="Google Play" src="./fastlane/metadata/android/en-US/images/buttons/gplay.svg" height="60"></a>
<a href="https://f-droid.org/packages/ru.tech.imageresizershrinker"><img alt="F-Droid" src="./fastlane/metadata/android/en-US/images/buttons/fdroid.svg" height="60"/></a>
<a href="https://github.com/t8rin/imageresizer/releases/latest"><img alt="GitHub" src="./fastlane/metadata/android/en-US/images/buttons/github.svg" height="60"/></a>
<a href="https://apps.obtainium.imranr.dev/redirect?r=obtainium://app/%7B%22id%22%3A%22ru.tech.imageresizershrinker%22%2C%22url%22%3A%22https%3A%2F%2Fgithub.com%2FT8RIN%2FImageToolbox%22%2C%22author%22%3A%22T8RIN%22%2C%22name%22%3A%22Image%20Toolbox%22%2C%22preferredApkIndex%22%3A1%2C%22additionalSettings%22%3A%22%7B%5C%22includePrereleases%5C%22%3Afalse%2C%5C%22fallbackToOlderReleases%5C%22%3Atrue%2C%5C%22filterReleaseTitlesByRegEx%5C%22%3A%5C%22%5C%22%2C%5C%22filterReleaseNotesByRegEx%5C%22%3A%5C%22%5C%22%2C%5C%22verifyLatestTag%5C%22%3Afalse%2C%5C%22dontSortReleasesList%5C%22%3Afalse%2C%5C%22useLatestAssetDateAsReleaseDate%5C%22%3Afalse%2C%5C%22trackOnly%5C%22%3Afalse%2C%5C%22versionExtractionRegEx%5C%22%3A%5C%22%5C%22%2C%5C%22matchGroupToUse%5C%22%3A%5C%22%5C%22%2C%5C%22versionDetection%5C%22%3Atrue%2C%5C%22releaseDateAsVersion%5C%22%3Afalse%2C%5C%22useVersionCodeAsOSVersion%5C%22%3Afalse%2C%5C%22apkFilterRegEx%5C%22%3A%5C%22%5C%22%2C%5C%22invertAPKFilter%5C%22%3Afalse%2C%5C%22autoApkFilterByArch%5C%22%3Atrue%2C%5C%22appName%5C%22%3A%5C%22Image%20Toolbox%5C%22%2C%5C%22shizukuPretendToBeGooglePlay%5C%22%3Afalse%2C%5C%22exemptFromBackgroundUpdates%5C%22%3Afalse%2C%5C%22skipUpdateNotifications%5C%22%3Afalse%2C%5C%22about%5C%22%3A%5C%22Image%20Toolbox%20is%20an%20powerful%20picture%20editor%2C%20which%20can%20crop%2C%20apply%20filters%2C%20add%20some%20drawing%2C%20erase%20background%2C%20edit%20EXIF%20or%20even%20create%20PDF%20file.%5C%22%2C%5C%22appAuthor%5C%22%3A%5C%22T8RIN%5C%22%7D%22%7D"><img alt="Obtainium" src="./fastlane/metadata/android/en-US/images/buttons/obtainium.svg" height="60"/></a>
<a href="https://apps.obtainium.imranr.dev/redirect?r=obtainium://app/%7B%22id%22%3A%22ru.tech.imageresizershrinker%22%2C%22url%22%3A%22https%3A%2F%2Fgithub.com%2FT8RIN%2FImageToolbox%22%2C%22author%22%3A%22T8RIN%22%2C%22name%22%3A%22Image%20Toolbox%22%2C%22preferredApkIndex%22%3A1%2C%22additionalSettings%22%3A%22%7B%5C%22includePrereleases%5C%22%3Atrue%2C%5C%22fallbackToOlderReleases%5C%22%3Atrue%2C%5C%22filterReleaseTitlesByRegEx%5C%22%3A%5C%22%5C%22%2C%5C%22filterReleaseNotesByRegEx%5C%22%3A%5C%22%5C%22%2C%5C%22verifyLatestTag%5C%22%3Afalse%2C%5C%22dontSortReleasesList%5C%22%3Afalse%2C%5C%22useLatestAssetDateAsReleaseDate%5C%22%3Afalse%2C%5C%22trackOnly%5C%22%3Afalse%2C%5C%22versionExtractionRegEx%5C%22%3A%5C%22%5C%22%2C%5C%22matchGroupToUse%5C%22%3A%5C%22%5C%22%2C%5C%22versionDetection%5C%22%3Atrue%2C%5C%22releaseDateAsVersion%5C%22%3Afalse%2C%5C%22useVersionCodeAsOSVersion%5C%22%3Afalse%2C%5C%22apkFilterRegEx%5C%22%3A%5C%22%5C%22%2C%5C%22invertAPKFilter%5C%22%3Afalse%2C%5C%22autoApkFilterByArch%5C%22%3Atrue%2C%5C%22appName%5C%22%3A%5C%22Image%20Toolbox%5C%22%2C%5C%22shizukuPretendToBeGooglePlay%5C%22%3Afalse%2C%5C%22exemptFromBackgroundUpdates%5C%22%3Afalse%2C%5C%22skipUpdateNotifications%5C%22%3Afalse%2C%5C%22about%5C%22%3A%5C%22Image%20Toolbox%20is%20an%20powerful%20picture%20editor%2C%20which%20can%20crop%2C%20apply%20filters%2C%20add%20some%20drawing%2C%20erase%20background%2C%20edit%20EXIF%20or%20even%20create%20PDF%20file.%5C%22%2C%5C%22appAuthor%5C%22%3A%5C%22T8RIN%5C%22%7D%22%7D"><img alt="Obtainium (Pre-release)" src="./fastlane/metadata/android/en-US/images/buttons/obtainium-pre-release.svg" height="60"/></a>
</p>
</div>
# 💻 Installation Instructions
1. Clone the repository:
```bash
git clone https://github.com/yourusername/ImageToolbox.git
```
2. Install dependencies using your preferred package manager (e.g., Gradle).
3. Build the project:
bash ./gradlew build
4. Run the application:
bash ./gradlew run
# ⚔️ FOSS vs MARKET
| **Feature** | **FOSS** | **Market** |
|:-----------------------:|:------------------:|:------------------:|
| QR Scanner | Zxing | MlKit |
| Auto Background Remover | ONNX | MlKit |
| Document Scanner | OpenCV | MlKit |
| Analytics | :x: | :white_check_mark: |
| Crashlytics | :x: | :white_check_mark: |
| Other Google deps | :x: | :white_check_mark: |
| All Other Features | :white_check_mark: | :white_check_mark: |
# ✨ Features
- Batch processing
- Applying filter chains (More than 310 various filters)
<details>
<summary>Available filters</summary>
<br>
- [x] Saturation
- [x] Contrast
- [x] Brightness
- [x] Exposure
- [x] RGB
- [x] Hue
- [x] White Balance
- [x] Monochrome
- [x] Black and White
- [x] False Color
- [x] Sharpen
- [x] Gamma
- [x] Highlights and Shadows
- [x] Haze
- [x] Sepia Tone
- [x] Color Inversion
- [x] Solarize
- [x] Vibrance
- [x] Luminance Threshold
- [x] Pixellate
- [x] Halftone
- [x] Crosshatch
- [x] Sobel Edge Detection
- [x] Sketch Filter
- [x] Toon Filter
- [x] SmoothToon Filter
- [x] CGA Colorspace Filter
- [x] Posterize
- [x] Convolution 3x3
- [x] Emboss Filter
- [x] Laplacian
- [x] Kuwahara Filter
- [x] Vignette
- [x] Gaussian Blur
- [x] Box Blur
- [x] Stack Blur
- [x] Fast Blur
- [x] Bilaterial Blur
- [x] Zoom Blur
- [x] Median Blur
- [x] Pixelation
- [x] Enhanced Pixelation
- [x] Stroke Pixelation
- [x] Circle Pixelation
- [x] Enhanced Circle Pixelation
- [x] Diamond Pixelation
- [x] Enhanced Diamond Pixelation
- [x] Swirl Distortion
- [x] Bulge Distortion
- [x] Sphere Refraction
- [x] Glass Sphere Refraction
- [x] Dilation
- [x] Non Maximum Suppression
- [x] Opacity
- [x] Weak Pixel Inclusion Filter
- [x] Color Matrix 4x4
- [x] Lookup
- [x] Color Replacement
- [x] Color Removance
- [x] Bayer Two Dithering
- [x] Bayer Three Dithering
- [x] Bayer Four Dithering
- [x] Bayer Eight Dithering
- [x] Floyd Steinberg Dithering
- [x] Jarvis Judice Ninke Dithering
- [x] Sierra Dithering
- [x] Two Row Sierra Dithering
- [x] Sierra Lite Dithering
- [x] Atkinson Dithering
- [x] Stucki Dithering
- [x] Burkes Dithering
- [x] False Floyd Steinberg Dithering
- [x] Left To Right Dithering
- [x] Random Dithering
- [x] Simple Threshold Dithering
- [x] Quantizier
- [x] Glitch Effect
- [x] Enhanced Glitch Effect
- [x] Anaglyph
- [x] Noise
- [x] Tent Blur
- [x] Side Fade
- [x] Erode
- [x] Anisotropic Diffusion
- [x] Horizontal Wind Stagger
- [x] Fast Bilaterial Blur
- [x] Poisson Blur
- [x] Logarithmic Tone Mapping
- [x] Aces Filmic Tone Mapping
- [x] Crystallize
- [x] Fractal Glass
- [x] Marble
- [x] Oil
- [x] Water Effect
- [x] Hable Filmic Tone Mapping
- [x] Aces Hill Tone Mapping
- [x] Hejl Burgess Tone Mapping
- [x] Perlin Distortion
- [x] Grayscale
- [x] Dehaze
- [x] Color Matrix 3x3
- [x] Achromatomaly
- [x] Achromatopsia
- [x] Browni
- [x] CodaChrome
- [x] Cool
- [x] Deutaromaly
- [x] Deutaronotopia
- [x] Night Vision
- [x] Polaroid
- [x] Protanopia
- [x] Protonomaly
- [x] Tritanopia
- [x] Tritonomaly
- [x] Vintage
- [x] Warm
- [x] Grain
- [x] Unsharp
- [x] Pastel
- [x] Orange Haze
- [x] Pink Dream
- [x] Golden Hour
- [x] Hot Summer
- [x] Purple Mist
- [x] Sunrise
- [x] Colorful Swirl
- [x] Soft Spring Light
- [x] Autumn Tones
- [x] Lavender Dream
- [x] Cyberpunk
- [x] Lemonade Light
- [x] Spectral Fire
- [x] Night Magic
- [x] Fantasy Landscape
- [x] Color Explosion
- [x] Electric Gradient
- [x] Caramel Darkness
- [x] Futuristic Gradient
- [x] Green Sun
- [x] Rainbow World
- [x] Deep Purple
- [x] Space Portal
- [x] Red Swirl
- [x] Digital Code
- [x] Bokeh
- [x] Neon
- [x] Old Tv
- [x] Shuffle Blur
- [x] Mobius
- [x] Uchimura
- [x] Aldridge
- [x] Drago
- [x] Color Anomaly
- [x] Quantizier
- [x] Ring Blur
- [x] Cross Blur
- [x] Circle Blur
- [x] Star Blur
- [x] Motion Blur
- [x] Fast Gaussian Blur 2D
- [x] Fast Gaussian Blur 3D
- [x] Fast Gaussian Blur 4D
- [x] Equalize Histogram
- [x] Equalize Histogram HSV
- [x] Equalize Histogram Pixelation
- [x] Equalize Histogram Adaptive
- [x] Equalize Histogram Adaptive LUV
- [x] Equalize Histogram Adaptive LAB
- [x] Equalize Histogram Adaptive HSV
- [x] Equalize Histogram Adaptive HSL
- [x] Clahe
- [x] Clahe LUV
- [x] Clahe LAB
- [x] Clahe HSL
- [x] Clahe HSV
- [x] Crop To Content
- [x] Linear Box Blur
- [x] Linear Tent Blur
- [x] Linear Gaussian Box Blur
- [x] Linear Stack Blur
- [x] Gaussian Box Blur
- [x] Linear Fast Gaussian Next
- [x] LinearFast Gaussian
- [x] Linear Gaussian
- [x] Low Poly
- [x] Sand Painting
- [x] Palette Transfer
- [x] Enhanced Oil
- [x] Simple Old TV
- [x] HDR
- [x] Simple Sketch
- [x] Gotham
- [x] Color Poster
- [x] Tri Tone
- [x] Clahe Oklch
- [x] Clahe Jzazbz
- [x] Clahe Oklab
- [x] Yililoma Dithering
- [x] Clustered 2x2 Dithering
- [x] Clustered 4x4 Dithering
- [x] Clustered8x8 Dithering
- [x] Polka Dot
- [x] LUT 512\*512
- [x] Amatorka
- [x] Miss Etikate
- [x] Soft Elegance
- [x] Soft Elegance Variant
- [x] Bleach Bypass
- [x] Candlelight
- [x] Drop Blues
- [x] Edgy Amber
- [x] Fall Colors
- [x] Film Stock 50
- [x] Foggy Night
- [x] Kodak
- [x] Palette Transfer Variant
- [x] 3D LUT (.cube / .CUBE)
- [x] Pop Art
- [x] Celluloid
- [x] Coffee
- [x] Golden Forest
- [x] Greenish
- [x] Retro Yellow
- [x] Auto Crop
- [x] Opening
- [x] Closing
- [x] Morphological Gradient
- [x] Top Hat
- [x] Black Hat
- [x] Enhanced Zoom Blur
- [x] Simple Sobel
- [x] Simple Laplacian
- [x] Auto Red Eyes remover
- [x] Tone Curves
- [x] Mirror
- [x] Kaleidoscope
- [x] Channel Mix
- [x] Color Halftone
- [x] Contour
- [x] Voronoi Crystallize
- [x] Despeckle
- [x] Diffuse
- [x] DoG
- [x] Equalize
- [x] Glow
- [x] Offset
- [x] Pinch
- [x] Pointillize
- [x] Polar Coordinates
- [x] Reduce Noise
- [x] Simple Solarize
- [x] Weave
- [x] Twirl
- [x] Rubber Stamp
- [x] Smear
- [x] Sphere Lens Distortion
- [x] Arc
- [x] Sparkle
- [x] ASCII
- [x] Moire
- [x] Autumn
- [x] Bone
- [x] Jet
- [x] Winter
- [x] Rainbow
- [x] Ocean
- [x] Summer
- [x] Spring
- [x] Cool Variant
- [x] Hsv
- [x] Pink
- [x] Hot
- [x] Parula
- [x] Magma
- [x] Inferno
- [x] Plasma
- [x] Viridis
- [x] Cividis
- [x] Twilight
- [x] Twilight Shifted
- [x] Deskew
- [x] Auto Perspective
- [x] Crop Or Perspective
- [x] Turbo
- [x] Deep Green
- [x] Lens Correction
- [x] Seam Carving
- [x] Error Level Analysis
- [x] Luminance Gradient
- [x] Average Distance
- [x] Copy Move Detection
- [x] Simple Weave Pixelization
- [x] Staggered Pixelization
- [x] Cross Pixelization
- [x] Micro Macro Pixelization
- [x] Orbital Pixelization
- [x] Vortex Pixelization
- [x] Pulse Grid Pixelization
- [x] Nucleus Pixelization
- [x] Radial Weave Pixelization
- [x] Border Frame
- [x] Glitch Variant
- [x] VHS
- [x] Block Glitch
- [x] Crt Curvature
- [x] Pixel Melt
- [x] Bloom
</details>
- Custom Filters Creation by Template filters
- You can create filter from any filter chain
- Share created filters by QR code
- Scan filters from the app to get them on your device
- Files encryption and decryption with 100+ different algorithms available
- Adding Stickers and Text (Markup Layers Mode)
- Extract Text From Images (OCR)
- 120+ languages
- 3 Type of data: Fast, Standard, Best
- Segmentation Mode Selection
- Engine Mode Selection
- Custom Tesseract options entering
- Multiple languages at the same time
- Reading from batch of images to file
- Placing in EXIF metadata of batch images
- Creating searchable PDF with recognized text behind images
- EXIF metadata editing/deleting
- Loading images from internet
- Image Stitching
- Image Stacking
- Image Splitting
- Background Removal
- By drawing
- Automatically (MlKit, U2NetP, U2Net, RMBG, InSPyReNet, BiRefNet, ISNet)
- Watermarking
- Repeating Text
- Image
- Stamp
- Timestamp
- Digital (Steganography)
- Drawing on Image/Background
- Pen
- Flood Fil
- Spray
- Neon
- Highlighter
- Warp (Move, Grow, Shrink, Swirl, Mix)
- Privacy Blur
- Pixelation Paint
- Text
- Image Brush
- Filter Brush
- Spot Healing (with ability to download AI model for generative inpainting)
- Pointing Arrow
- Line
- Double Pointing Arrow
- Line Pointing Arrow
- Double Line Pointing Arrow
- Outlined Rect
- Outlined Oval
- Outlined Triangle
- Outlined Polygon
- Outlined Star
- Rect
- Oval
- Triangle
- Polygon
- Star
- Lasso
- Line Style
- Dashed
- Dot Dashed
- Zigzag
- Stamped
- Image Resizing
- Width changing
- Height changing
- Adaptive resize
- Resize retaining aspect ratio
- Resize by given limits
- Center Crop with
- Background color changing
- Background blur drawing
- Different Scaling Algorithms
<details>
<summary>Available methods</summary>
<br>
- Bilinear
- Nearest Neighbour
- Cubic
- Mitchell-Netravalli
- Catmull-Rom
- Hermite
- B-Spline
- Hann
- Bicubic
- Hamming
- Hanning
- Blackman
- Welch
- Quadric
- Gaussian
- Sphinx
- Bartlett
- Robidoux
- Robidoux Sharp
- Spline 16
- Spline 36
- Spline 64
- Kaiser
- Bartlett-Hann
- Box
- Bohman
- Lanczos 2
- Lanczos 3
- Lanczos 4
- Lanczos 2 Jinc
- Lanczos 3 Jinc
- Lanczos 4 Jinc
- Ewa Hanning
- Ewa Robidoux
- Ewa Blackman
- Ewa Quadric
- Ewa Robidoux Sharp
- Ewa Lanczos 3 Jinc
- Ginseng
- Ginseng EWA
- Lanczos Sharp EWA
- Lanczos 4 Sharpest EWA
- Lanczos Soft EWA
- Haasn Soft
- Lagrange 2
- Lagrange 3
- Lanczos 6
- Lanczos 6 Jinc
</details>
- Different Scale Color Spaces
- Linear
- sRGB
- LAB
- LUV
- Sigmoidal
- XYZ
- F32 Gamma 2.2
- F32 Gamma 2.8
- F32 Rec.709
- F32 sRGB
- LCH
- Oklab sRGB
- Oklab Rec.709
- Oklab Gamma 2.2
- Oklab Gamma 2.8
- Jzazbz sRGB
- Jzazbz Rec.709
- Jzazbz Gamma 2.2
- Jzazbz Gamma 2.8
- GIF conversion
- GIF to images
- Images to GIF
- GIF to WEBP
- WEBP conversion
- WEBP to images
- Images to WEBP
- APNG conversion
- APNG to images
- Images to APNG
- JXL transcoding
- JXL to JPEG
- JPEG to JXL
- Animated JXL conversion
- Images to JXL
- JXL to Images
- APNG to JXL
- GIF to JXL
- PDF tools
- PDF to images
- Images to PDF
- PDF previewing
- Merge
- Split
- Rotate
- Rearrange
- Page Numbering
- Watermark
- Signature
- Compress
- Grayscale
- Repair
- Protect
- Unlock
- Metadata
- Remove Pages
- Crop
- Flatten
- Extract Images
- Zip PDF
- Print PDF
- PDF to Text (OCR)
- Document Scanning
- AI tools (95+ ready to use models available)
- Upscale
- Remove BG
- DeJPEG
- DeNoise
- Colorize
- Artifacts
- Enhance
- Anime
- Scans
- Barcodes
- Scanning
- Creating & Parsing common types
- Plain
- Url
- WiFi
- Email
- Geolocation
- Phone
- SMS
- Contact (vCard)
- Calendar event
- Sharing as images
- 13 formats available
- QR CODE
- AZTEC
- CODABAR
- CODE 39
- CODE 93
- CODE 128
- DATA MATRIX
- EAN 8
- EAN 13
- ITF
- PDF 417
- UPC A
- UPC E
- Collage Creation
- From 1 to 20 images
- More than 310 various collage layouts
- Image Shrinking
- Quality compressing
- Preset shrinking
- Reducing size by given weight (in KB)
- Cropping
- Regular crop
- Free rotation crop
- Free corners crop (can be used as Perspective Correction)
- Crop by aspect ratio
- Crop with shape mask
<details>
<summary>List of shapes</summary>
<br/>
- Rounded Corners
- Cut Corners
- Oval
- Squircle
- Octagon
- Rounded Pentagon
- Clover
- Material Star
- Kotlin Logo
- Small Material Star
- Heart
- Shuriken
- Explosion
- Bookmark
- Pill
- Burger
- Shield
- Droplet
- Arrow
- Egg
- Map
- Enhanced Heart
- Star
- Image Mask
- <details>
<summary>Additional Shapes</summary>
</br>

</details>
</details>
- Image Cutting (can be used as batch crop)
- Tracing raster images to SVG
- Format Conversion
- HEIF
- HEIC
- AVIF
- WEBP
- JPEG
- JPG
- PNG Lossless
- PNG Lossy
- OxiPNG
- MozJpeg
- Jpegli
- JXL
- JP2
- J2K
- TIFF
- TIF
- QOI
- ICO
- SVG, DNG, PSD, GIF to static raster images
- Telegram sticker PNG format
- Files to Zip
- Comparing images
- Slide
- Toggle Tap
- Transparency
- Side By Side
- Pixel By Pixel (7 Methods)
- SSIM
- AE
- MAE
- NCC
- PSNR
- RMSE
- Color Utils
- Palette generation
- Material You Scheme
- Simple Colors
- Import/Export palette across 41 format
- ACB
- ACO
- ACT
- Android Xml
- ASE
- Basic Xml
- Corel Painter
- Corel Draw
- Scribus Xml
- Corel Palette
- CSV
- DCP
- Gimp
- Hex Rgba
- Image
- Json
- Open Office
- Paint Net
- Paint Shop Pro
- Rgba
- Rgb
- Riff
- Sketch
- SKP
- SVG
- Swift
- Kotlin
- Corel Draw V3
- CLF
- Swatches
- Autodesk Color Book
- Simple Palette
- Swatchbooker
- Afpalette
- Xara
- Koffice
- KPL
- HPL
- Skencil
- Vga 24Bit
- Vga 18Bit
- Picking color from image
- Gradient creation (Mesh gradients too)
- Overlaying image with gradient
- Mixing
- Conversion
- Harmonies
- Shading
- Tone Curves applying
- Color Library with more than 33k different colors
- Histograms
- RGB
- Brightness
- Camera Like RGB
- Image source selection
- Additional Features
- Base64 Decode/Encode
- Rotating
- Flipping
- Perlin Noise Generation
- Previewing SVG, DNG, PSD, DJVU and almost all types of images
- Saving to any specific folder
- Long press on save to choose one time output folder
- Randomizing output filename
- Using image cheksum as filename
- Checksum Tools with ability to calculate and compare hashes
- 64 different hashing algorithms
- Audio files Album Cover export
- Embedded media picker
- Wallpapers Export
- Ascii Art
**And More!**
#
<img src="./fastlane/metadata/android/en-US/images/banner/banner2.png" width="99%" />
# 🌟 UI tweaks
- Selecting Emoji for top app bar
- Ability to use Pixel like switch instead of Material You
- Secure Mode for app
- Maximum brightness for selected screens
- In app language changing
- Enabling or Disabling confetti
- Custom app color scheme
- Different palette styles
- Predefined schemes
- Color inversion
- Contrast adjusting
- Controlling borders thickness
- Enabling and disabling each existing shadow
- Haptics controls
- Light/Dark mode
- AMOLED mode
- Monet implementation (Dynamic colors) even for Android versions less than 12
by [Dynamic Theme](https://github.com/T8RIN/DynamicTheme)
- Image based color scheme
- Icons Background shape selection
- Rounded Corners
- Cut Corners
- Oval
- Squircle
- Octagon
- Rounded Pentagon
- Clover
- Material Star
- Small Material Star
- Heart
- Enhanced Heart
- Custom fonts
<details>
<summary>Preinstalled fonts</summary>
<br>
- Montserrat
- Comfortaa
- Caveat
- Handjet
- Jura
- Podkova
- Tektur
- YsabeauSC
- DejaVu
- BadScript
- RuslanDisplay
- Catterdale
- FRM32
- Tokeely Brookings
- Nunito
- Nothing
- WOPR Tweaked
- Alegreya Sans
- Minecraft Gnu
- Granite Fixed
- Nokia Pixel
- Ztivalia
- Axotrel
- Lcd Octagon
- Lcd Moving
- Unisource
</details>
- Ability to import any font (OTF/TTF) to further use
- In app font scale changing
- Changing between options list and grouped view
- Confetti Type selection
- Default
- Festive
- Explode
- Rain
- Side
- Corners
- ImageToolbox
- Switch Type selection:
- Material You
- Compose
- Pixel
- Fluent
- Cupertino
- Liquid Glass
- HyperOS
- Slider Type Selection:
- Fancy
- Material You
- Material
- HyperOS
- Shapes Type Selection with size adjustment:
- Rounded
- Cut
- Squircle
- Smooth
- Main screen layout customization
(Yes, the app supports dynamic coloring based on wallpapers for every android version)
# 📚 Tech stack & Open-source libraries
- Minimum SDK level 23
- [Kotlin](https://kotlinlang.org/) based
- [Image Toolbox Libs](https://github.com/T8RIN/ImageToolboxLibs) - set of essential libraries for
Image Toolbox.
- [Dynamic Theme](https://github.com/T8RIN/DynamicTheme) - library, which allows you to easily
implement custom color theming.
- [Modal Sheet](https://github.com/T8RIN/ModalSheet) - modal bottom sheet that follows M3
guidelines.
- [Coroutines](https://github.com/Kotlin/kotlinx.coroutines) for asynchronous work.
- [Flow](https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/)
to emit values from data layer reactively.
- [Accompanist](https://github.com/google/accompanist) to expand jetpack compose opportunities.
- [Decompose](https://github.com/arkivanov/Decompose) - KMP lifecycle-aware business logic
components (aka BLoCs) with routing (navigation) and pluggable UI
- [Hilt](https://dagger.dev/hilt/) for dependency injection.
- [Coil](https://github.com/coil-kt/coil) for loading images.
- [Konfetti](https://github.com/DanielMartinus/Konfetti) to establish beautiful particle system.
- Jetpack
- [Compose](https://developer.android.com/jetpack/compose) - Modern Declarative UI style
framework based on composable functions.
- [Material You Kit](https://developer.android.com/jetpack/androidx/releases/compose-material3) -
Material 3 powerful UI components.
- [Data Store](https://developer.android.com/jetpack/androidx/releases/datastore) - Store data
asynchronously, consistently, and transactionally.
- [Lifecycle](https://developer.android.com/jetpack/androidx/releases/lifecycle) - Observe
Android lifecycles and handle UI states upon the lifecycle changes.
- [Exif Interface](https://developer.android.com/jetpack/androidx/releases/exifinterface) - Read
and write image file EXIF tags.
- [GPU Image](https://github.com/cats-oss/android-gpuimage) for creating and applying filters to the
images.
- [SmartToolFactory](https://github.com/SmartToolFactory) provides a bunch of helpful libraries.
- [AVIF Coder](https://github.com/awxkee/avif-coder)
and [JXL Coder](https://github.com/awxkee/jxl-coder) libraries which provide avif, heic, heif and
jxl support.
- [Aire](https://github.com/awxkee/aire) and [Trickle](https://github.com/T8RIN/Trickle) for
creating and applying filters to the images on CPU
using native cpp code.
# 📐 App Architecture
See Modules Graph at [ARCHITECTURE.md](https://github.com/T8RIN/ImageToolbox/blob/master/ARCHITECTURE.md)
<div align="center">
#
<img src="./fastlane/metadata/android/en-US/images/banner/banner3.png" width="99%" />
# 🌐 Translation
You can help translate Image Toolbox into your language
on [Hosted Weblate](https://hosted.weblate.org/engage/image-resizer/)
[](https://hosted.weblate.org/engage/image-resizer/)
</br>
[](https://hosted.weblate.org/engage/image-resizer/)
# ❤️ Find this repository useful?
Support it by joining **[stargazers](https://github.com/t8rin/ImageToolbox/stargazers)** for this
repository. :star: <br>
And **[follow](https://github.com/t8rin)** me for my next creations! 🤩
# ⭐ Star History
<a href="https://star-history.com/#T8RIN/ImageToolbox&Date">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=T8RIN/ImageToolbox&type=Date&theme=dark" />
<source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=T8RIN/ImageToolbox&type=Date" />
<img alt="Star History Chart" src="https://api.star-history.com/svg?repos=T8RIN/ImageToolbox&type=Date" />
</picture>
</a>

# 📢 Contributors
<a href="https://github.com/t8rin/imageresizer/graphs/contributors">
<img src="https://contrib.rocks/image?repo=t8rin/Imageresizer"/>
</a>
# 🔒 Signing Certificate Hashes
SHA-256: `20d7689de0874f00015ea3e31fa067c15c03457d362d41d5e793db3a864fa534`
SHA-1: `d69eacb30eeae804e8b72d2384c3c616b1906785`
MD5: `db6f6b76c503d31099e4754e676353cf`
For more info, see [wiki](https://github.com/T8RIN/ImageToolbox/wiki/FAQ#how-can-i-verify-my-download-of-imagetoolbox-is-legitimate)
# ⚖️ License
```xml
Designed and developed by 2023 T8RIN
Licensed under the Apache License, Version 2.0 (the "License");you may not use this file except in compliance with the License.You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, softwaredistributed under the License is distributed on an "AS IS" BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.See the License for the specific language governing permissions andlimitations under the License.
```
================================================
FILE: app/.gitignore
================================================
/build/
/release/
/foss/
/market/
/jxl/
/build
/release
/foss
/market
/jxl
================================================
FILE: app/build.gradle.kts
================================================
/*
* ImageToolbox is an image editor for android
* Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* You should have received a copy of the Apache License
* along with this program. If not, see <http://www.apache.org/licenses/LICENSE-2.0>.
*/
@file:Suppress("UnstableApiUsage")
plugins {
alias(libs.plugins.image.toolbox.application)
alias(libs.plugins.image.toolbox.hilt)
}
android {
val supportedAbi = arrayOf("armeabi-v7a", "arm64-v8a", "x86_64")
namespace = "com.t8rin.imagetoolbox"
defaultConfig {
vectorDrawables.useSupportLibrary = true
//Maintained for compatibility with old version
applicationId = "ru.tech.imageresizershrinker"
versionCode = libs.versions.versionCode.get().toIntOrNull()
versionName = System.getenv("VERSION_NAME") ?: libs.versions.versionName.get()
ndk {
abiFilters.clear()
//noinspection ChromeOsAbiSupport
abiFilters += supportedAbi.toSet()
}
}
androidResources {
generateLocaleConfig = true
}
flavorDimensions += "app"
productFlavors {
create("foss") {
dimension = "app"
versionNameSuffix = "-foss"
extra.set("gmsEnabled", false)
}
create("market") {
dimension = "app"
extra.set("gmsEnabled", true)
}
}
buildTypes {
debug {
applicationIdSuffix = ".debug"
resValue("string", "app_launcher_name", "Image Toolbox DEBUG")
resValue("string", "file_provider", "com.t8rin.imagetoolbox.fileprovider.debug")
}
release {
isMinifyEnabled = true
isShrinkResources = true
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
resValue("string", "app_launcher_name", "Image Toolbox")
resValue("string", "file_provider", "com.t8rin.imagetoolbox.fileprovider")
}
create("benchmark") {
initWith(buildTypes.getByName("release"))
signingConfig = signingConfigs.getByName("debug")
matchingFallbacks += listOf("release")
isMinifyEnabled = false
isShrinkResources = false
}
}
splits {
abi {
// Detect app bundle and conditionally disable split abis
// This is needed due to a "Sequence contains more than one matching element" error
// present since AGP 8.9.0, for more info see:
// https://issuetracker.google.com/issues/402800800
// AppBundle tasks usually contain "bundle" in their name
//noinspection WrongGradleMethod
val isBuildingBundle =
gradle.startParameter.taskNames.any { it.lowercase().contains("bundle") }
// Disable split abis when building appBundle
isEnable = !isBuildingBundle
reset()
//noinspection ChromeOsAbiSupport
include(*supportedAbi)
isUniversalApk = true
}
}
lint {
disable += "Instantiatable"
}
packaging {
jniLibs {
keepDebugSymbols.add("**/*.so")
pickFirsts.add("lib/*/libcoder.so")
pickFirsts.add("**/libc++_shared.so")
pickFirsts.add("**/libdatstore_shared_counter.so")
useLegacyPackaging = true
}
resources {
excludes += "META-INF/"
excludes += "kotlin/"
excludes += "org/"
excludes += ".properties"
excludes += ".bin"
excludes += "META-INF/versions/9/OSGI-INF/MANIFEST.MF"
}
}
buildFeatures {
resValues = true
}
}
base {
archivesName = "image-toolbox-${android.defaultConfig.versionName}"
}
aboutLibraries {
export.excludeFields.addAll("generated")
}
dependencies {
implementation(projects.feature.root)
implementation(projects.feature.mediaPicker)
implementation(projects.feature.quickTiles)
implementation(projects.lib.opencvTools)
implementation(projects.lib.neuralTools)
implementation(projects.lib.collages)
implementation(libs.bouncycastle.pkix)
implementation(libs.bouncycastle.provider)
implementation(libs.pdfbox)
"marketImplementation"(libs.quickie.bundled)
"fossImplementation"(libs.quickie.foss)
}
dependencySubstitution {
substitute(
dependency = "com.caverock:androidsvg-aar:1.4",
using = "com.github.deckerst:androidsvg:cc9d59a88f"
)
}
afterEvaluate {
android.productFlavors.forEach { flavor ->
tasks.matching { task ->
listOf("GoogleServices", "Crashlytics").any {
task.name.contains(it)
}.and(
task.name.contains(
flavor.name.replaceFirstChar(Char::uppercase)
)
)
}.forEach { task ->
task.enabled = flavor.extra.get("gmsEnabled") == true
}
}
}
fun Project.dependencySubstitution(action: DependencySubstitutions.() -> Unit) {
allprojects {
configurations.all {
resolutionStrategy.dependencySubstitution(action)
}
}
}
fun DependencySubstitutions.substitute(
dependency: String,
using: String
) {
substitute(module(dependency)).using(module(using))
}
================================================
FILE: app/proguard-rules.pro
================================================
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.kts.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile
-keepclassmembers class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator CREATOR;
}
-keep class * implements com.t8rin.imagetoolbox.core.filters.presentation.model.UiFilter
-keepclassmembers class * implements com.t8rin.imagetoolbox.core.filters.presentation.model.UiFilter {
<init>(...);
}
-keep class * implements com.t8rin.imagetoolbox.core.filters.domain.model.Filter
-keepclassmembers class * implements com.t8rin.imagetoolbox.core.filters.domain.model.Filter {
<init>(...);
}
-keepclassmembers class com.t8rin.imagetoolbox.core.filters.** {
<init>(...);
}
-keep class com.t8rin.imagetoolbox.core.filters.**
-keep class com.t8rin.imagetoolbox.core.filters.*
# Please add these rules to your existing keep rules in order to suppress warnings.
# This is generated automatically by the Android Gradle plugin.
-dontwarn org.bouncycastle.jsse.BCSSLParameters
-dontwarn org.bouncycastle.jsse.BCSSLSocket
-dontwarn org.bouncycastle.jsse.provider.BouncyCastleJsseProvider
-dontwarn org.conscrypt.Conscrypt$Version
-dontwarn org.conscrypt.Conscrypt
-dontwarn org.conscrypt.ConscryptHostnameVerifier
-dontwarn org.openjsse.javax.net.ssl.SSLParameters
-dontwarn org.openjsse.javax.net.ssl.SSLSocket
-dontwarn org.openjsse.net.ssl.OpenJSSE
-keep class org.beyka.tiffbitmapfactory.**{ *; }
-keep class org.bouncycastle.jcajce.provider.** { *; }
-keep class org.bouncycastle.jce.provider.** { *; }
-dontwarn com.google.re2j.Matcher
-dontwarn com.google.re2j.Pattern
-keepclassmembers class * {
public java.lang.String name();
}
-keep enum * { *; }
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keepclassmembers class * extends java.lang.Enum {
public java.lang.String name();
}
-keep class ai.onnxruntime.** { *; }
-keep class com.google.firebase.crashlytics.** { *; }
-keep class com.google.firebase.analytics.** { *; }
-keep class androidx.pdf.** { *; }
-keepnames class androidx.pdf.** { *; }
# Moshi reflective adapters need generic signatures in release.
-keepattributes Signature
-keepattributes *Annotation*
-keep class kotlin.Metadata { *; }
-keep class com.t8rin.imagetoolbox.feature.markup_layers.data.project.** { *; }
-keep class com.t8rin.imagetoolbox.feature.markup_layers.data.project.**
-keep class com.t8rin.imagetoolbox.feature.markup_layers.data.project.*
================================================
FILE: app/src/main/AndroidManifest.xml
================================================
<?xml version="1.0" encoding="utf-8"?><!--
~ ImageToolbox is an image editor for android
~ Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License.
~
~ You should have received a copy of the Apache License
~ along with this program. If not, see <http://www.apache.org/licenses/LICENSE-2.0>.
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<uses-sdk tools:overrideLibrary="com.github.awxkee.avifcodercoil, com.github.awxkee.avifcoder, com.google.mlkit.vision.segmentation.subject, androidx.pdf,androidx.pdf.viewer.fragment, androidx.pdf.document.service" />
<uses-feature
android:name="android.hardware.camera"
android:required="false" />
<uses-feature
android:name="android.hardware.screen.portrait"
android:required="false" />
<uses-permission
android:name="com.google.android.gms.permission.AD_ID"
tools:node="remove" />
<uses-permission
android:name="android.permission.ACCESS_ADSERVICES_AD_ID"
tools:node="remove" />
<uses-permission
android:name="android.permission.READ_PHONE_STATE"
tools:node="remove" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_MEDIA_LOCATION" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PROJECTION" />
<uses-permission android:name="android.permission.PROJECT_MEDIA" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission
android:name="android.permission.MANAGE_EXTERNAL_STORAGE"
tools:ignore="ScopedStorage" />
<application
android:name=".app.presentation.components.ImageToolboxApplication"
android:allowBackup="true"
android:colorMode="wideColorGamut"
android:dataExtractionRules="@xml/data_extraction_rules"
android:enableOnBackInvokedCallback="true"
android:fullBackupContent="@xml/backup_rules"
android:hardwareAccelerated="true"
android:hasFragileUserData="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_launcher_name"
android:largeHeap="true"
android:requestLegacyExternalStorage="true"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.ImageToolbox.Launcher"
android:usesCleartextTraffic="true"
tools:replace="android:allowBackup, android:label"
tools:targetApi="tiramisu">
<profileable
android:shell="true"
tools:targetApi="29" />
<meta-data
android:name="firebase_crashlytics_collection_enabled"
android:value="false" />
<meta-data
android:name="firebase_analytics_collection_enabled"
android:value="false" />
<activity
android:name=".app.presentation.AppActivity"
android:exported="true"
android:launchMode="singleTop">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter android:label="@string/app_launcher_name">
<action android:name="android.intent.action.VIEW" />
<action android:name="com.android.camera.action.REVIEW" />
<action android:name="android.provider.action.REVIEW" />
<action android:name="android.provider.action.REVIEW_SECURE" />
<data
android:scheme="content"
tools:ignore="AppLinkUrlError" />
<data android:scheme="file" />
<data android:mimeType="image/*" />
<data android:pathSuffix=".jxl" />
<data android:pathSuffix=".qoi" />
<data android:pathSuffix=".itp" />
<data android:mimeType="application/vnd.shana.informed.formtemplate" />
<data android:mimeType="application/x-imagetoolbox-project" />
<data android:mimeType="application/octet-stream" />
<data android:mimeType="application/zip" />
<data android:mimeType="application/pdf" />
<data android:mimeType="*/pdf" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="*/*" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.ACTION_BUG_REPORT" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.SEND_MULTIPLE" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="*/*" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.EDIT" />
<category android:name="android.intent.category.DEFAULT" />
<data
android:mimeType="image/*"
tools:ignore="AppLinkUrlError" />
<data android:mimeType="application/vnd.shana.informed.formtemplate" />
<data android:mimeType="application/x-imagetoolbox-project" />
<data android:mimeType="application/octet-stream" />
<data android:mimeType="application/zip" />
<data android:pathSuffix=".jxl" />
<data android:pathSuffix=".qoi" />
<data android:pathSuffix=".itp" />
<data android:mimeType="application/pdf" />
<data android:mimeType="*/pdf" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.INSERT_OR_EDIT" />
<category android:name="android.intent.category.DEFAULT" />
<data
android:mimeType="image/*"
tools:ignore="AppLinkUrlError" />
<data android:mimeType="application/vnd.shana.informed.formtemplate" />
<data android:mimeType="application/x-imagetoolbox-project" />
<data android:mimeType="application/octet-stream" />
<data android:mimeType="application/zip" />
<data android:pathSuffix=".jxl" />
<data android:pathSuffix=".qoi" />
<data android:pathSuffix=".itp" />
<data android:mimeType="application/pdf" />
<data android:mimeType="*/pdf" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.INSERT" />
<category android:name="android.intent.category.DEFAULT" />
<data
android:mimeType="image/*"
tools:ignore="AppLinkUrlError" />
<data android:mimeType="application/vnd.shana.informed.formtemplate" />
<data android:mimeType="application/x-imagetoolbox-project" />
<data android:mimeType="application/octet-stream" />
<data android:mimeType="application/zip" />
<data android:pathSuffix=".jxl" />
<data android:pathSuffix=".qoi" />
<data android:pathSuffix=".itp" />
<data android:mimeType="application/pdf" />
<data android:mimeType="*/pdf" />
</intent-filter>
</activity>
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="@string/file_provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
<service
android:name="androidx.appcompat.app.AppLocalesMetadataHolderService"
android:enabled="false"
android:exported="false">
<meta-data
android:name="autoStoreLocales"
android:value="true" />
</service>
<!-- Prompt Google Play services to install the backported photo picker module -->
<!--suppress AndroidDomInspection -->
<service
android:name="com.google.android.gms.metadata.ModuleDependencies"
android:enabled="false"
android:exported="false"
tools:ignore="MissingClass">
<intent-filter>
<action android:name="com.google.android.gms.metadata.MODULE_DEPENDENCIES" />
</intent-filter>
<meta-data
android:name="photopicker_activity:0:required"
android:value="" />
</service>
</application>
</manifest>
================================================
FILE: app/src/main/java/com/t8rin/imagetoolbox/app/presentation/AppActivity.kt
================================================
/*
* ImageToolbox is an image editor for android
* Copyright (c) 2024 T8RIN (Malik Mukhametzyanov)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* You should have received a copy of the Apache License
* along with this program. If not, see <http://www.apache.org/licenses/LICENSE-2.0>.
*/
package com.t8rin.imagetoolbox.app.presentation
import android.content.Intent
import androidx.compose.runtime.Composable
import com.arkivanov.decompose.retainedComponent
import com.t8rin.imagetoolbox.core.ui.utils.ComposeActivity
import com.t8rin.imagetoolbox.feature.root.presentation.RootContent
import com.t8rin.imagetoolbox.feature.root.presentation.screenLogic.RootComponent
import dagger.hilt.android.AndroidEntryPoint
import javax.inject.Inject
@AndroidEntryPoint
class AppActivity : ComposeActivity() {
@Inject
lateinit var rootComponentFactory: RootComponent.Factory
private val component: RootComponent by lazy {
retainedComponent(factory = rootComponentFactory::invoke)
}
override fun handleIntent(intent: Intent) = component.handleDeeplinks(intent)
@Composable
override fun Content() = RootContent(component = component)
}
================================================
FILE: app/src/main/java/com/t8rin/imagetoolbox/app/presentation/components/ImageToolboxApplication.kt
================================================
/*
* ImageToolbox is an image editor for android
* Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* You should have received a copy of the Apache License
* along with this program. If not, see <http://www.apache.org/licenses/LICENSE-2.0>.
*/
package com.t8rin.imagetoolbox.app.presentation.components
import com.t8rin.imagetoolbox.app.presentation.components.functions.attachLogWriter
import com.t8rin.imagetoolbox.app.presentation.components.functions.initCollages
import com.t8rin.imagetoolbox.app.presentation.components.functions.initColorNames
import com.t8rin.imagetoolbox.app.presentation.components.functions.initNeuralTool
import com.t8rin.imagetoolbox.app.presentation.components.functions.initOpenCV
import com.t8rin.imagetoolbox.app.presentation.components.functions.initPdfBox
import com.t8rin.imagetoolbox.app.presentation.components.functions.initQrScanner
import com.t8rin.imagetoolbox.app.presentation.components.functions.injectBaseComponent
import com.t8rin.imagetoolbox.app.presentation.components.functions.registerSecurityProviders
import com.t8rin.imagetoolbox.app.presentation.components.functions.setupFlags
import com.t8rin.imagetoolbox.app.presentation.components.utils.isMain
import com.t8rin.imagetoolbox.core.crash.presentation.components.applyGlobalExceptionHandler
import com.t8rin.imagetoolbox.core.domain.coroutines.AppScope
import com.t8rin.imagetoolbox.core.domain.saving.KeepAliveService
import com.t8rin.imagetoolbox.core.ui.utils.ComposeApplication
import com.t8rin.imagetoolbox.core.utils.initAppContext
import dagger.hilt.android.HiltAndroidApp
import io.ktor.client.HttpClient
import javax.inject.Inject
@HiltAndroidApp
class ImageToolboxApplication : ComposeApplication() {
@Inject
lateinit var keepAliveService: KeepAliveService
@Inject
lateinit var appScope: AppScope
@Inject
lateinit var httpClient: HttpClient
private var isSetupCompleted: Boolean = false
override fun onCreate() {
super.onCreate()
runSetup()
}
override fun runSetup() {
if (isSetupCompleted) return
if (isMain()) {
setupFlags()
initAppContext()
initOpenCV()
initNeuralTool()
initColorNames()
initQrScanner()
attachLogWriter()
applyGlobalExceptionHandler()
registerSecurityProviders()
initPdfBox()
injectBaseComponent()
initCollages()
isSetupCompleted = true
}
}
}
================================================
FILE: app/src/main/java/com/t8rin/imagetoolbox/app/presentation/components/functions/AttachLogWriter.kt
================================================
/*
* ImageToolbox is an image editor for android
* Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* You should have received a copy of the Apache License
* along with this program. If not, see <http://www.apache.org/licenses/LICENSE-2.0>.
*/
package com.t8rin.imagetoolbox.app.presentation.components.functions
import android.app.Application
import com.t8rin.imagetoolbox.core.resources.R
import com.t8rin.imagetoolbox.core.ui.utils.helper.DeviceInfo
import com.t8rin.logger.Logger
import com.t8rin.logger.attachLogWriter
internal fun Application.attachLogWriter() {
Logger.attachLogWriter(
context = this@attachLogWriter,
fileProvider = getString(R.string.file_provider),
logsFilename = "image_toolbox_logs.txt",
startupLog = Logger.Log(
tag = "Device Info",
message = "--${DeviceInfo.get()}--",
level = Logger.Level.Info
),
isSyncCreate = false
)
}
================================================
FILE: app/src/main/java/com/t8rin/imagetoolbox/app/presentation/components/functions/InitCollages.kt
================================================
/*
* ImageToolbox is an image editor for android
* Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* You should have received a copy of the Apache License
* along with this program. If not, see <http://www.apache.org/licenses/LICENSE-2.0>.
*/
package com.t8rin.imagetoolbox.app.presentation.components.functions
import com.t8rin.collages.public.CollageConstants
import com.t8rin.imagetoolbox.core.data.image.utils.static
fun initCollages() =
CollageConstants.requestMapper { static() }
================================================
FILE: app/src/main/java/com/t8rin/imagetoolbox/app/presentation/components/functions/InitColorNames.kt
================================================
/*
* ImageToolbox is an image editor for android
* Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* You should have received a copy of the Apache License
* along with this program. If not, see <http://www.apache.org/licenses/LICENSE-2.0>.
*/
package com.t8rin.imagetoolbox.app.presentation.components.functions
import com.t8rin.colors.parser.ColorNameParser
import com.t8rin.imagetoolbox.app.presentation.components.ImageToolboxApplication
import kotlinx.coroutines.launch
internal fun ImageToolboxApplication.initColorNames() =
appScope.launch { ColorNameParser.init(this@initColorNames) }
================================================
FILE: app/src/main/java/com/t8rin/imagetoolbox/app/presentation/components/functions/InitNeuralTool.kt
================================================
/*
* ImageToolbox is an image editor for android
* Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* You should have received a copy of the Apache License
* along with this program. If not, see <http://www.apache.org/licenses/LICENSE-2.0>.
*/
package com.t8rin.imagetoolbox.app.presentation.components.functions
import com.t8rin.imagetoolbox.app.presentation.components.ImageToolboxApplication
import com.t8rin.imagetoolbox.core.domain.HF_BASE_URL
import com.t8rin.neural_tools.NeuralTool
internal fun ImageToolboxApplication.initNeuralTool() = NeuralTool.init(
context = this,
httpClient = httpClient,
baseUrl = HF_BASE_URL
)
================================================
FILE: app/src/main/java/com/t8rin/imagetoolbox/app/presentation/components/functions/InitOpenCV.kt
================================================
/*
* ImageToolbox is an image editor for android
* Copyright (c) 2025 T8RIN (Malik Mukhametzyanov)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* You should have received a copy of the Apache License
* along with this program. If not, see <http://www.apache.org/licenses/LICENSE-2.0>.
*/
package com.t8rin.imagetoolbox.app.presentation.components.functions
import android.app.Application
import com.t8rin.opencv_tools.utils.OpenCV
internal fun Application.initOpenCV() = OpenCV.init(this)
================================================
FILE: app/src/main/java/com/t8rin/imagetoolbox/app/presentation/components/functions/InitPdfBox.kt
================================================
/*
* ImageToolbox is an image editor for android
* Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* You should have received a copy of the Apache License
* along with this program. If not, see <http://www.apache.org/licenses/LICENSE-2.0>.
*/
package com.t8rin.imagetoolbox.app.presentation.components.functions
import android.app.Application
import com.tom_roush.pdfbox.android.PDFBoxResourceLoader
internal fun Application.initPdfBox() = PDFBoxResourceLoader.init(this)
================================================
FILE: app/src/main/java/com/t8rin/imagetoolbox/app/presentation/components/functions/InitQrScanner.kt
================================================
/*
* ImageToolbox is an image editor for android
* Copyright (c) 2025 T8RIN (Malik Mukhametzyanov)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* You should have received a copy of the Apache License
* along with this program. If not, see <http://www.apache.org/licenses/LICENSE-2.0>.
*/
package com.t8rin.imagetoolbox.app.presentation.components.functions
import android.graphics.Bitmap
import com.t8rin.imagetoolbox.core.ui.utils.helper.ImageUtils.applyPadding
import com.t8rin.opencv_tools.qr_prepare.QrPrepareHelper
import io.github.g00fy2.quickie.extensions.QrProcessor
internal fun initQrScanner() = QrProcessor.setProcessor(::prepareBitmap)
private fun prepareBitmap(bitmap: Bitmap): Bitmap =
QrPrepareHelper.prepareQrForDecode(bitmap.applyPadding(100))
================================================
FILE: app/src/main/java/com/t8rin/imagetoolbox/app/presentation/components/functions/InjectBaseComponent.kt
================================================
/*
* ImageToolbox is an image editor for android
* Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* You should have received a copy of the Apache License
* along with this program. If not, see <http://www.apache.org/licenses/LICENSE-2.0>.
*/
package com.t8rin.imagetoolbox.app.presentation.components.functions
import com.t8rin.imagetoolbox.app.presentation.components.ImageToolboxApplication
import com.t8rin.imagetoolbox.core.ui.utils.BaseComponent
internal fun ImageToolboxApplication.injectBaseComponent() = BaseComponent.inject(keepAliveService)
================================================
FILE: app/src/main/java/com/t8rin/imagetoolbox/app/presentation/components/functions/RegisterSecurityProviders.kt
================================================
/*
* ImageToolbox is an image editor for android
* Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* You should have received a copy of the Apache License
* along with this program. If not, see <http://www.apache.org/licenses/LICENSE-2.0>.
*/
package com.t8rin.imagetoolbox.app.presentation.components.functions
import com.t8rin.imagetoolbox.core.domain.model.CipherType
import com.t8rin.imagetoolbox.core.domain.model.HashingType
import com.t8rin.logger.makeLog
import org.bouncycastle.asn1.ASN1ObjectIdentifier
import org.bouncycastle.jce.provider.BouncyCastleProvider
import org.bouncycastle.operator.DefaultAlgorithmNameFinder
import java.security.Provider
import java.security.Security
internal fun registerSecurityProviders() {
initBouncyCastle()
HashingType.registerSecurityMessageDigests(
Security.getAlgorithms("MessageDigest").filterNotNull()
)
val finder = DefaultAlgorithmNameFinder()
CipherType.registerSecurityCiphers(
Security.getAlgorithms("Cipher").filterNotNull().mapNotNull { cipher ->
if (CipherType.BROKEN.any { cipher.contains(it, true) }) return@mapNotNull null
val oid = cipher.removePrefix("OID.")
if (oid.all { it.isDigit() || it.isWhitespace() || it == '.' }) {
CipherType.getInstance(
cipher = cipher,
name = finder.getAlgorithmName(
ASN1ObjectIdentifier(oid)
)
)
} else {
CipherType.getInstance(
cipher = cipher
)
}.also {
val extraExclude = it.cipher == "DES"
|| it.name == "DES/CBC"
|| it.name == "THREEFISH-512"
|| it.name == "THREEFISH-1024"
|| it.name == "CCM"
if (extraExclude) return@mapNotNull null
}
}
)
}
private fun initBouncyCastle() {
if (Security.getProvider(WORKAROUND_NAME) != null) return
try {
logProviders("OLD")
Security.addProvider(BouncyCastleWorkaroundProvider())
logProviders("NEW")
} catch (e: Exception) {
e.makeLog()
"Failed to register BouncyCastleWorkaroundProvider".makeLog()
}
}
private fun logProviders(tag: String): Int {
val providers = Security.getProviders()
providers.forEachIndexed { index, provider ->
"$tag [$index]: ${provider.name} - ${provider.info}".makeLog("Providers")
}
return providers.size
}
private class BouncyCastleWorkaroundProvider(
bouncyCastleProvider: Provider = BouncyCastleProvider()
) : Provider(
WORKAROUND_NAME,
bouncyCastleProvider.version,
bouncyCastleProvider.info
) {
init {
for ((key, value) in bouncyCastleProvider.entries) {
put(key.toString(), value.toString())
}
}
}
private const val WORKAROUND_NAME = "BC_WORKAROUND"
================================================
FILE: app/src/main/java/com/t8rin/imagetoolbox/app/presentation/components/functions/SetupFlags.kt
================================================
/*
* ImageToolbox is an image editor for android
* Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* You should have received a copy of the Apache License
* along with this program. If not, see <http://www.apache.org/licenses/LICENSE-2.0>.
*/
package com.t8rin.imagetoolbox.app.presentation.components.functions
import androidx.compose.foundation.ComposeFoundationFlags.isPausableCompositionInPrefetchEnabled
import androidx.compose.material3.ComposeMaterial3Flags.isCheckboxStylingFixEnabled
import com.arkivanov.decompose.DecomposeSettings
internal fun setupFlags() {
isCheckboxStylingFixEnabled = true
DecomposeSettings.update { it.copy(duplicateConfigurationsEnabled = true) }
isPausableCompositionInPrefetchEnabled = true
}
================================================
FILE: app/src/main/java/com/t8rin/imagetoolbox/app/presentation/components/utils/GetProcessName.kt
================================================
/*
* ImageToolbox is an image editor for android
* Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* You should have received a copy of the Apache License
* along with this program. If not, see <http://www.apache.org/licenses/LICENSE-2.0>.
*/
package com.t8rin.imagetoolbox.app.presentation.components.utils
import android.annotation.SuppressLint
import android.app.ActivityManager
import android.app.Application
import android.content.Context.ACTIVITY_SERVICE
import android.os.Build.VERSION.SDK_INT
import com.t8rin.logger.makeLog
internal fun Application.isMain(): Boolean =
getProcessName().makeLog("Current Process") == packageName.makeLog("Current packageName")
@SuppressLint("PrivateApi")
internal fun Application.getProcessName(): String? {
if (SDK_INT >= 28) {
return Application.getProcessName()
}
// Try using ActivityThread to determine the current process name.
try {
val activityThread = Class.forName(
"android.app.ActivityThread",
false,
this::class.java.getClassLoader()
)
val packageName: Any?
val currentProcessName = activityThread.getDeclaredMethod("currentProcessName")
currentProcessName.isAccessible = true
packageName = currentProcessName.invoke(null)
if (packageName is String) {
return packageName
}
} catch (exception: Throwable) {
exception.makeLog()
}
// Fallback to the most expensive way
val pid: Int = android.os.Process.myPid()
val am = getSystemService(ACTIVITY_SERVICE) as ActivityManager
val processes = am.runningAppProcesses
if (processes != null && processes.isNotEmpty()) {
for (process in processes) {
if (process.pid == pid) {
return process.processName
}
}
}
return null
}
================================================
FILE: app/src/main/res/resources.properties
================================================
#
# ImageToolbox is an image editor for android
# Copyright (c) 2024 T8RIN (Malik Mukhametzyanov)
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# You should have received a copy of the Apache License
# along with this program. If not, see <http://www.apache.org/licenses/LICENSE-2.0>.
#
unqualifiedResLocale=en
================================================
FILE: app/src/market/debug/google-services.json
================================================
{
"project_info": {
"project_number": "698299287298",
"project_id": "imagetoolbox-13e3c",
"storage_bucket": "imagetoolbox-13e3c.appspot.com"
},
"client": [
{
"client_info": {
"mobilesdk_app_id": "1:698299287298:android:11af7edf43198644b6e41b",
"android_client_info": {
"package_name": "ru.tech.imageresizershrinker.debug"
}
},
"oauth_client": [
{
"client_id": "698299287298-5ukroo831v2bn1vj8ff0oa7ch5h94mfg.apps.googleusercontent.com",
"client_type": 3
}
],
"api_key": [
{
"current_key": "AIzaSyBH5QgaBw6XAfuxhPVJzq-r9s8ZMFalXzU"
}
],
"services": {
"appinvite_service": {
"other_platform_oauth_client": [
{
"client_id": "698299287298-5ukroo831v2bn1vj8ff0oa7ch5h94mfg.apps.googleusercontent.com",
"client_type": 3
}
]
}
}
}
],
"configuration_version": "1"
}
================================================
FILE: app/src/market/release/google-services.json
================================================
{
"project_info": {
"project_number": "698299287298",
"project_id": "imagetoolbox-13e3c",
"storage_bucket": "imagetoolbox-13e3c.appspot.com"
},
"client": [
{
"client_info": {
"mobilesdk_app_id": "1:698299287298:android:11af7edf43198644b6e41b",
"android_client_info": {
"package_name": "ru.tech.imageresizershrinker"
}
},
"oauth_client": [
{
"client_id": "698299287298-5ukroo831v2bn1vj8ff0oa7ch5h94mfg.apps.googleusercontent.com",
"client_type": 3
}
],
"api_key": [
{
"current_key": "AIzaSyBH5QgaBw6XAfuxhPVJzq-r9s8ZMFalXzU"
}
],
"services": {
"appinvite_service": {
"other_platform_oauth_client": [
{
"client_id": "698299287298-5ukroo831v2bn1vj8ff0oa7ch5h94mfg.apps.googleusercontent.com",
"client_type": 3
}
]
}
}
}
],
"configuration_version": "1"
}
================================================
FILE: benchmark/.gitignore
================================================
/build
================================================
FILE: benchmark/build.gradle.kts
================================================
/*
* ImageToolbox is an image editor for android
* Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* You should have received a copy of the Apache License
* along with this program. If not, see <http://www.apache.org/licenses/LICENSE-2.0>.
*/
@file:Suppress("UnstableApiUsage")
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
plugins {
id("com.android.test")
id("androidx.baselineprofile")
}
android {
namespace = "com.t8rin.imagetoolbox.benchmark"
compileSdk = libs.versions.androidCompileSdk.get().toIntOrNull()
defaultConfig {
minSdk = 23
targetSdk = libs.versions.androidTargetSdk.get().toIntOrNull()
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
compileOptions {
sourceCompatibility = JavaVersion.toVersion(libs.versions.jvmTarget.get())
targetCompatibility = JavaVersion.toVersion(libs.versions.jvmTarget.get())
}
kotlin {
compilerOptions {
jvmTarget.set(JvmTarget.fromTarget(libs.versions.jvmTarget.get()))
}
}
buildTypes {
// This benchmark buildType is used for benchmarking, and should function like your
// release build (for example, with minification on). It"s signed with a debug key
// for easy local/CI testing.
create("benchmark") {
isDebuggable = true
signingConfig = getByName("debug").signingConfig
matchingFallbacks += listOf("release")
}
}
flavorDimensions += listOf("app")
productFlavors {
create("foss") { dimension = "app" }
create("market") { dimension = "app" }
}
targetProjectPath = ":app"
experimentalProperties["android.experimental.self-instrumenting"] = true
}
dependencies {
implementation(libs.androidx.test.ext.junit)
implementation(libs.espresso)
implementation(libs.uiautomator)
implementation(libs.benchmark.macro.junit4)
}
androidComponents {
beforeVariants(selector().all()) {
it.enable = it.buildType == "benchmark"
}
}
================================================
FILE: benchmark/src/main/AndroidManifest.xml
================================================
<!--
~ ImageToolbox is an image editor for android
~ Copyright (c) 2024 T8RIN (Malik Mukhametzyanov)
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License.
~
~ You should have received a copy of the Apache License
~ along with this program. If not, see <http://www.apache.org/licenses/LICENSE-2.0>.
-->
<manifest />
================================================
FILE: benchmark/src/main/java/com/t8rin/imagetoolbox/benchmark/BaselineProfileGenerator.kt
================================================
/*
* ImageToolbox is an image editor for android
* Copyright (c) 2024 T8RIN (Malik Mukhametzyanov)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* You should have received a copy of the Apache License
* along with this program. If not, see <http://www.apache.org/licenses/LICENSE-2.0>.
*/
package com.t8rin.imagetoolbox.benchmark
import androidx.annotation.RequiresApi
import androidx.benchmark.macro.junit4.BaselineProfileRule
import org.junit.Rule
import org.junit.Test
@RequiresApi(28)
class BaselineProfileGenerator {
@get:Rule
val baselineProfileRule = BaselineProfileRule()
@Test
fun startup() = baselineProfileRule.collect(
packageName = "com.t8rin.imagetoolbox",
includeInStartupProfile = true,
profileBlock = {
startActivityAndWait()
device.pressBack()
}
)
}
================================================
FILE: build-logic/.gitignore
================================================
*.iml
.gradle
/local.properties
.DS_Store
/build
/app/release
/captures
.externalNativeBuild
.cxx
/.idea
================================================
FILE: build-logic/convention/.gitignore
================================================
/build
================================================
FILE: build-logic/convention/build.gradle.kts
================================================
/*
* ImageToolbox is an image editor for android
* Copyright (c) 2024 T8RIN (Malik Mukhametzyanov)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* You should have received a copy of the Apache License
* along with this program. If not, see <http://www.apache.org/licenses/LICENSE-2.0>.
*/
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
`kotlin-dsl`
}
group = "com.t8rin.imagetoolbox.buildlogic"
// Configure the build-logic plugins to target JDK 17
// This matches the JDK used to build the project, and is not related to what is running on device.
java {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
tasks.withType<KotlinCompile>().configureEach {
compilerOptions {
jvmTarget.set(JvmTarget.JVM_17)
}
}
dependencies {
compileOnly(libs.agp.gradle)
compileOnly(libs.kotlin.gradle)
compileOnly(libs.detekt.gradle)
compileOnly(libs.compose.compiler.gradle)
compileOnly(files(libs.javaClass.superclass.protectionDomain.codeSource.location))
}
gradlePlugin {
// register the convention plugin
plugins {
register("imageToolboxLibrary") {
id = "image.toolbox.library"
implementationClass = "ImageToolboxLibraryPlugin"
}
register("imageToolboxHiltPlugin") {
id = "image.toolbox.hilt"
implementationClass = "ImageToolboxHiltPlugin"
}
register("imageToolboxLibraryFeature") {
id = "image.toolbox.feature"
implementationClass = "ImageToolboxLibraryFeaturePlugin"
}
register("imageToolboxLibraryComposePlugin") {
id = "image.toolbox.compose"
implementationClass = "ImageToolboxLibraryComposePlugin"
}
register("imageToolboxApplicationPlugin") {
id = "image.toolbox.application"
implementationClass = "ImageToolboxApplicationPlugin"
}
}
}
================================================
FILE: build-logic/convention/src/main/kotlin/ImageToolboxApplicationPlugin.kt
================================================
/*
* ImageToolbox is an image editor for android
* Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* You should have received a copy of the Apache License
* along with this program. If not, see <http://www.apache.org/licenses/LICENSE-2.0>.
*/
import com.android.build.api.dsl.ApplicationExtension
import com.t8rin.imagetoolbox.configureCompose
import com.t8rin.imagetoolbox.configureDetekt
import com.t8rin.imagetoolbox.configureKotlinAndroid
import com.t8rin.imagetoolbox.core
import com.t8rin.imagetoolbox.crash
import com.t8rin.imagetoolbox.data
import com.t8rin.imagetoolbox.di
import com.t8rin.imagetoolbox.domain
import com.t8rin.imagetoolbox.implementation
import com.t8rin.imagetoolbox.libs
import com.t8rin.imagetoolbox.projects
import com.t8rin.imagetoolbox.resources
import com.t8rin.imagetoolbox.settings
import com.t8rin.imagetoolbox.ui
import com.t8rin.imagetoolbox.utils
import io.gitlab.arturbosch.detekt.extensions.DetektExtension
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.kotlin.dsl.apply
import org.gradle.kotlin.dsl.configure
import org.gradle.kotlin.dsl.dependencies
import org.gradle.kotlin.dsl.getByType
@Suppress("UNUSED")
class ImageToolboxApplicationPlugin : Plugin<Project> {
override fun apply(target: Project) {
with(target) {
apply(plugin = "com.android.application")
apply(plugin = "kotlin-parcelize")
apply(plugin = "com.google.gms.google-services")
apply(plugin = "com.google.firebase.crashlytics")
apply(plugin = "com.mikepenz.aboutlibraries.plugin.android")
apply(plugin = "org.jetbrains.kotlin.plugin.compose")
apply(plugin = "io.gitlab.arturbosch.detekt")
configureDetekt(extensions.getByType<DetektExtension>())
extensions.configure<ApplicationExtension> {
configureKotlinAndroid(
commonExtension = this,
createFlavors = false
)
defaultConfig.targetSdk = libs.versions.androidTargetSdk.get().toIntOrNull()
}
dependencies {
implementation(libs.androidxCore)
implementation(projects.core.data)
implementation(projects.core.ui)
implementation(projects.core.domain)
implementation(projects.core.resources)
implementation(projects.core.settings)
implementation(projects.core.di)
implementation(projects.core.crash)
implementation(projects.core.utils)
}
configureCompose(extensions.getByType<ApplicationExtension>())
}
}
}
================================================
FILE: build-logic/convention/src/main/kotlin/ImageToolboxHiltPlugin.kt
================================================
/*
* ImageToolbox is an image editor for android
* Copyright (c) 2024 T8RIN (Malik Mukhametzyanov)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* You should have received a copy of the Apache License
* along with this program. If not, see <http://www.apache.org/licenses/LICENSE-2.0>.
*/
import com.t8rin.imagetoolbox.implementation
import com.t8rin.imagetoolbox.ksp
import com.t8rin.imagetoolbox.libs
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.kotlin.dsl.apply
import org.gradle.kotlin.dsl.dependencies
@Suppress("UNUSED")
class ImageToolboxHiltPlugin : Plugin<Project> {
override fun apply(target: Project) {
with(target) {
apply(plugin = "dagger.hilt.android.plugin")
apply(plugin = "com.google.devtools.ksp")
dependencies {
implementation(libs.dagger.hilt.android)
ksp(libs.dagger.hilt.compiler)
}
}
}
}
================================================
FILE: build-logic/convention/src/main/kotlin/ImageToolboxLibraryComposePlugin.kt
================================================
/*
* ImageToolbox is an image editor for android
* Copyright (c) 2024 T8RIN (Malik Mukhametzyanov)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* You should have received a copy of the Apache License
* along with this program. If not, see <http://www.apache.org/licenses/LICENSE-2.0>.
*/
import com.android.build.api.dsl.LibraryExtension
import com.t8rin.imagetoolbox.configureCompose
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.kotlin.dsl.apply
import org.gradle.kotlin.dsl.getByType
@Suppress("UNUSED")
class ImageToolboxLibraryComposePlugin : Plugin<Project> {
override fun apply(target: Project) {
with(target) {
apply(plugin = "com.android.library")
apply(plugin = "org.jetbrains.kotlin.plugin.compose")
configureCompose(extensions.getByType<LibraryExtension>())
}
}
}
================================================
FILE: build-logic/convention/src/main/kotlin/ImageToolboxLibraryFeaturePlugin.kt
================================================
/*
* ImageToolbox is an image editor for android
* Copyright (c) 2024 T8RIN (Malik Mukhametzyanov)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* You should have received a copy of the Apache License
* along with this program. If not, see <http://www.apache.org/licenses/LICENSE-2.0>.
*/
import com.t8rin.imagetoolbox.configureDetekt
import com.t8rin.imagetoolbox.core
import com.t8rin.imagetoolbox.crash
import com.t8rin.imagetoolbox.data
import com.t8rin.imagetoolbox.di
import com.t8rin.imagetoolbox.domain
import com.t8rin.imagetoolbox.implementation
import com.t8rin.imagetoolbox.projects
import com.t8rin.imagetoolbox.resources
import com.t8rin.imagetoolbox.settings
import com.t8rin.imagetoolbox.ui
import io.gitlab.arturbosch.detekt.extensions.DetektExtension
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.kotlin.dsl.dependencies
import org.gradle.kotlin.dsl.getByType
@Suppress("UNUSED")
class ImageToolboxLibraryFeaturePlugin : Plugin<Project> {
override fun apply(target: Project) {
with(target) {
configureDetekt(extensions.getByType<DetektExtension>())
dependencies {
implementation(projects.core.data)
implementation(projects.core.ui)
implementation(projects.core.domain)
implementation(projects.core.resources)
implementation(projects.core.settings)
implementation(projects.core.di)
implementation(projects.core.crash)
}
}
}
}
================================================
FILE: build-logic/convention/src/main/kotlin/ImageToolboxLibraryPlugin.kt
================================================
/*
* ImageToolbox is an image editor for android
* Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* You should have received a copy of the Apache License
* along with this program. If not, see <http://www.apache.org/licenses/LICENSE-2.0>.
*/
import com.android.build.api.dsl.LibraryExtension
import com.t8rin.imagetoolbox.configureDetekt
import com.t8rin.imagetoolbox.configureKotlinAndroid
import com.t8rin.imagetoolbox.implementation
import com.t8rin.imagetoolbox.libs
import io.gitlab.arturbosch.detekt.extensions.DetektExtension
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.kotlin.dsl.configure
import org.gradle.kotlin.dsl.dependencies
import org.gradle.kotlin.dsl.getByType
@Suppress("UNUSED")
class ImageToolboxLibraryPlugin : Plugin<Project> {
override fun apply(target: Project) {
with(target) {
with(pluginManager) {
apply("com.android.library")
apply("kotlin-parcelize")
apply("kotlinx-serialization")
apply(libs.detekt.gradle.get().group)
}
configureDetekt(extensions.getByType<DetektExtension>())
extensions.configure<LibraryExtension> {
configureKotlinAndroid(this)
defaultConfig.minSdk = libs.versions.androidMinSdk.get().toIntOrNull()
}
dependencies {
implementation(libs.androidxCore)
}
}
}
}
================================================
FILE: build-logic/convention/src/main/kotlin/com/t8rin/imagetoolbox/ConfigureCompose.kt
================================================
/*
* ImageToolbox is an image editor for android
* Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* You should have received a copy of the Apache License
* along with this program. If not, see <http://www.apache.org/licenses/LICENSE-2.0>.
*/
package com.t8rin.imagetoolbox
import com.android.build.api.dsl.CommonExtension
import org.gradle.api.Project
import org.gradle.kotlin.dsl.configure
import org.gradle.kotlin.dsl.dependencies
import org.jetbrains.kotlin.compose.compiler.gradle.ComposeCompilerGradlePluginExtension
internal fun Project.configureCompose(
commonExtension: CommonExtension
) {
commonExtension.apply {
buildFeatures.apply {
compose = true
}
dependencies {
implementation(libs.androidx.material3)
implementation(libs.window.sizeclass)
implementation(libs.androidx.material)
implementation(libs.icons.extended)
implementation(libs.compose.preview)
}
}
extensions.configure<ComposeCompilerGradlePluginExtension> {
stabilityConfigurationFiles.addAll(
rootProject.layout.projectDirectory.file("compose_compiler_config.conf")
)
}
}
================================================
FILE: build-logic/convention/src/main/kotlin/com/t8rin/imagetoolbox/ConfigureDetekt.kt
================================================
/*
* ImageToolbox is an image editor for android
* Copyright (c) 2024 T8RIN (Malik Mukhametzyanov)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* You should have received a copy of the Apache License
* along with this program. If not, see <http://www.apache.org/licenses/LICENSE-2.0>.
*/
package com.t8rin.imagetoolbox
import io.gitlab.arturbosch.detekt.Detekt
import io.gitlab.arturbosch.detekt.extensions.DetektExtension
import org.gradle.api.Project
import org.gradle.kotlin.dsl.dependencies
import org.gradle.kotlin.dsl.named
internal fun Project.configureDetekt(extension: DetektExtension) = extension.apply {
tasks.named<Detekt>("detekt") {
reports {
xml.required.set(true)
html.required.set(true)
txt.required.set(true)
sarif.required.set(true)
md.required.set(true)
}
}
dependencies {
detektPlugins(libs.detekt.formatting)
detektPlugins(libs.detekt.compose)
}
}
================================================
FILE: build-logic/convention/src/main/kotlin/com/t8rin/imagetoolbox/ConfigureKotlinAndroid.kt
================================================
/*
* ImageToolbox is an image editor for android
* Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* You should have received a copy of the Apache License
* along with this program. If not, see <http://www.apache.org/licenses/LICENSE-2.0>.
*/
package com.t8rin.imagetoolbox
import com.android.build.api.dsl.CommonExtension
import org.gradle.api.JavaVersion
import org.gradle.api.Project
import org.gradle.kotlin.dsl.assign
import org.gradle.kotlin.dsl.configure
import org.gradle.kotlin.dsl.dependencies
import org.gradle.kotlin.dsl.provideDelegate
import org.gradle.kotlin.dsl.withType
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
import org.jetbrains.kotlin.gradle.dsl.KotlinAndroidProjectExtension
import org.jetbrains.kotlin.gradle.dsl.KotlinBaseExtension
import org.jetbrains.kotlin.gradle.dsl.KotlinJvmProjectExtension
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
internal fun Project.configureKotlinAndroid(
commonExtension: CommonExtension,
createFlavors: Boolean = true
) {
commonExtension.apply {
compileSdk = libs.versions.androidCompileSdk.get().toIntOrNull()
compileSdkExtension = libs.versions.androidCompileSdkExtension.get().toIntOrNull()
defaultConfig.apply {
minSdk = libs.versions.androidMinSdk.get().toIntOrNull()
}
if (createFlavors) {
flavorDimensions += "app"
productFlavors.apply {
create("foss") {
dimension = "app"
}
create("market") {
dimension = "app"
}
}
}
compileOptions.apply {
sourceCompatibility = javaVersion
targetCompatibility = javaVersion
isCoreLibraryDesugaringEnabled = true
}
buildFeatures.apply {
compose = false
aidl = false
shaders = false
buildConfig = false
resValues = false
}
packaging.apply {
resources {
excludes.add("/META-INF/{AL2.0,LGPL2.1}")
}
}
lint.apply {
disable += "UsingMaterialAndMaterial3Libraries"
disable += "ModifierParameter"
}
}
configureKotlin<KotlinAndroidProjectExtension>()
dependencies {
coreLibraryDesugaring(libs.desugaring)
}
}
val Project.javaVersion: JavaVersion
get() = JavaVersion.toVersion(
libs.versions.jvmTarget.get()
)
/**
* Configure base Kotlin options
*/
private inline fun <reified T : KotlinBaseExtension> Project.configureKotlin() = configure<T> {
val args = listOf(
"-opt-in=androidx.compose.material3.ExperimentalMaterial3Api",
"-opt-in=androidx.compose.material3.ExperimentalMaterial3ExpressiveApi",
"-opt-in=androidx.compose.material3.windowsizeclass.ExperimentalMaterial3WindowSizeClassApi",
"-opt-in=androidx.compose.animation.ExperimentalAnimationApi",
"-opt-in=androidx.compose.foundation.ExperimentalFoundationApi",
"-opt-in=androidx.compose.foundation.layout.ExperimentalLayoutApi",
"-opt-in=androidx.compose.ui.unit.ExperimentalUnitApi",
"-opt-in=kotlinx.coroutines.ExperimentalCoroutinesApi",
"-opt-in=kotlinx.coroutines.FlowPreview",
"-opt-in=androidx.compose.material.ExperimentalMaterialApi",
"-opt-in=com.arkivanov.decompose.ExperimentalDecomposeApi",
"-opt-in=coil3.annotation.ExperimentalCoilApi",
"-opt-in=coil3.annotation.DelicateCoilApi",
"-opt-in=kotlin.contracts.ExperimentalContracts",
"-opt-in=androidx.compose.ui.ExperimentalComposeUiApi",
"-opt-in=androidx.compose.ui.text.ExperimentalTextApi",
"-opt-in=kotlinx.coroutines.DelicateCoroutinesApi",
"-Xannotation-default-target=param-property",
"-XXLanguage:+PropertyParamAnnotationDefaultTargetMode"
)
// Treat all Kotlin warnings as errors (disabled by default)
// Override by setting warningsAsErrors=true in your ~/.gradle/gradle.properties
val warningsAsErrors: String? by project
when (this) {
is KotlinAndroidProjectExtension -> compilerOptions
is KotlinJvmProjectExtension -> compilerOptions
else -> error("Unsupported project extension $this ${T::class}")
}.apply {
jvmTarget = JvmTarget.fromTarget(libs.versions.jvmTarget.get())
allWarningsAsErrors = warningsAsErrors.toBoolean()
freeCompilerArgs.addAll(args)
}
tasks.withType<KotlinCompile>().configureEach {
compilerOptions.freeCompilerArgs.addAll(args)
}
}
================================================
FILE: build-logic/convention/src/main/kotlin/com/t8rin/imagetoolbox/ProjectExtensions.kt
================================================
/*
* ImageToolbox is an image editor for android
* Copyright (c) 2024 T8RIN (Malik Mukhametzyanov)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* You should have received a copy of the Apache License
* along with this program. If not, see <http://www.apache.org/licenses/LICENSE-2.0>.
*/
package com.t8rin.imagetoolbox
import org.gradle.accessors.dm.LibrariesForLibs
import org.gradle.api.Project
import org.gradle.api.artifacts.MinimalExternalModuleDependency
import org.gradle.api.provider.Provider
import org.gradle.kotlin.dsl.DependencyHandlerScope
import org.gradle.kotlin.dsl.the
val Project.libs
get(): LibrariesForLibs = the<LibrariesForLibs>()
val Project.projects
get(): Projects = object : Projects, ProjectHolder {
override fun project(path: String): Project = this@projects.project(path)
}
val Projects.core
get(): CoreProjects = object : CoreProjects, ProjectHolder by this {}
val CoreProjects.data
get(): ProjectLibrary = project(":core:data")
val CoreProjects.ui
get(): ProjectLibrary = project(":core:ui")
val CoreProjects.domain
get(): ProjectLibrary = project(":core:domain")
val CoreProjects.resources
get(): ProjectLibrary = project(":core:resources")
val CoreProjects.settings
get(): ProjectLibrary = project(":core:settings")
val CoreProjects.di
get(): ProjectLibrary = project(":core:di")
val CoreProjects.crash
get(): ProjectLibrary = project(":core:crash")
val CoreProjects.utils
get(): ProjectLibrary = project(":core:utils")
fun DependencyHandlerScope.implementation(
dependency: Library
) = add("implementation", dependency)
fun DependencyHandlerScope.coreLibraryDesugaring(
dependency: Library
) = add("coreLibraryDesugaring", dependency)
fun DependencyHandlerScope.implementation(
dependency: ProjectLibrary
) = add("implementation", dependency)
fun DependencyHandlerScope.ksp(
dependency: Library
) = add("ksp", dependency)
fun DependencyHandlerScope.detektPlugins(
dependency: Library
) = add("detektPlugins", dependency)
typealias Library = Provider<MinimalExternalModuleDependency>
typealias ProjectLibrary = Project
interface Projects : ProjectHolder
interface CoreProjects : ProjectHolder
interface ProjectHolder {
fun project(path: String): Project
}
================================================
FILE: build-logic/settings.gradle.kts
================================================
/*
* ImageToolbox is an image editor for android
* Copyright (c) 2024 T8RIN (Malik Mukhametzyanov)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* You should have received a copy of the Apache License
* along with this program. If not, see <http://www.apache.org/licenses/LICENSE-2.0>.
*/
@file:Suppress("UnstableApiUsage")
dependencyResolutionManagement {
repositories {
google()
mavenCentral()
}
versionCatalogs {
create("libs") {
// make sure the file rootProject/gradle/verison.toml exists!
from(files("../gradle/libs.versions.toml"))
}
}
}
rootProject.name = "build-logic"
include(":convention")
================================================
FILE: build.gradle.kts
================================================
/*
* ImageToolbox is an image editor for android
* Copyright (c) 2024 T8RIN (Malik Mukhametzyanov)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* You should have received a copy of the Apache License
* along with this program. If not, see <http://www.apache.org/licenses/LICENSE-2.0>.
*/
buildscript {
repositories {
gradlePluginPortal()
google()
mavenCentral()
maven { setUrl("https://jitpack.io") }
}
dependencies {
classpath(libs.kotlinx.serialization.gradle)
classpath(libs.ksp.gradle)
classpath(libs.agp.gradle)
classpath(libs.kotlin.gradle)
classpath(libs.hilt.gradle)
classpath(libs.gms.gradle)
classpath(libs.firebase.crashlytics.gradle)
classpath(libs.baselineprofile.gradle)
classpath(libs.detekt.gradle)
classpath(libs.aboutlibraries.gradle)
classpath(libs.compose.compiler.gradle)
}
}
tasks.register("clean", Delete::class) {
delete(rootProject.layout.buildDirectory)
}
================================================
FILE: compose_compiler_config.conf
================================================
java.time.ZoneId
java.time.ZoneOffset
java.text.DecimalFormat
java.text.NumberFormat
java.time.Instant
java.time.Duration
java.time.LocalDate
java.time.LocalDateTime
java.time.LocalTime
java.time.ZonedDateTime
java.util.Date
java.util.Locale
java.io.File
kotlin.collections.*
kotlin.time.Duration
android.net.Uri
android.graphics.Bitmap
androidx.compose.ui.graphics.painter.Painter
androidx.compose.ui.graphics.vector.ImageVector
androidx.compose.ui.graphics.ImageBitmap
com.t8rin.imagetoolbox.core.crash.*
com.t8rin.imagetoolbox.core.filters.*
com.t8rin.imagetoolbox.core.resources.*
com.t8rin.imagetoolbox.core.data.*
com.t8rin.imagetoolbox.core.domain.*
com.t8rin.imagetoolbox.core.ui.*
com.t8rin.imagetoolbox.core.settings.*
com.t8rin.imagetoolbox.core.*
com.t8rin.imagetoolbox.feature.*
nl.dionsegijn.konfetti.core.*
================================================
FILE: core/crash/.gitignore
================================================
/build
================================================
FILE: core/crash/build.gradle.kts
================================================
/*
* ImageToolbox is an image editor for android
* Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* You should have received a copy of the Apache License
* along with this program. If not, see <http://www.apache.org/licenses/LICENSE-2.0>.
*/
plugins {
alias(libs.plugins.image.toolbox.library)
alias(libs.plugins.image.toolbox.hilt)
alias(libs.plugins.image.toolbox.compose)
}
android.namespace = "com.t8rin.imagetoolbox.core.crash"
dependencies {
implementation(projects.core.ui)
implementation(projects.core.settings)
"marketImplementation"(platform(libs.firebase.bom))
"marketImplementation"(libs.firebase.crashlytics)
"marketImplementation"(libs.firebase.analytics)
}
================================================
FILE: core/crash/src/foss/java/com/t8rin/imagetoolbox/core/crash/data/AnalyticsManagerImpl.kt
================================================
/*
* ImageToolbox is an image editor for android
* Copyright (c) 2025 T8RIN (Malik Mukhametzyanov)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* You should have received a copy of the Apache License
* along with this program. If not, see <http://www.apache.org/licenses/LICENSE-2.0>.
*/
package com.t8rin.imagetoolbox.core.crash.data
import com.t8rin.imagetoolbox.core.domain.remote.AnalyticsManager
internal object AnalyticsManagerImpl : AnalyticsManager {
override var allowCollectCrashlytics: Boolean = false
override var allowCollectAnalytics: Boolean = false
override fun updateAnalyticsCollectionEnabled(value: Boolean) = Unit
override fun updateAllowCollectCrashlytics(value: Boolean) = Unit
override fun sendReport(throwable: Throwable) = Unit
override fun registerScreenOpen(screenName: String) = Unit
}
================================================
FILE: core/crash/src/main/AndroidManifest.xml
================================================
<?xml version="1.0" encoding="utf-8"?><!--
~ ImageToolbox is an image editor for android
~ Copyright (c) 2024 T8RIN (Malik Mukhametzyanov)
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License.
~
~ You should have received a copy of the Apache License
~ along with this program. If not, see <http://www.apache.org/licenses/LICENSE-2.0>.
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<application>
<activity android:name=".presentation.CrashActivity" />
</application>
</manifest>
================================================
FILE: core/crash/src/main/java/com/t8rin/imagetoolbox/core/crash/di/CrashModule.kt
================================================
/*
* ImageToolbox is an image editor for android
* Copyright (c) 2025 T8RIN (M
Showing preview only (306K chars total). Download the full file or copy to clipboard to get everything.
gitextract_9qydnqng/ ├── .github/ │ ├── FUNDING.yml │ ├── ISSUE_TEMPLATE/ │ │ ├── bug_report.yml │ │ └── feature_request.yml │ ├── dependabot.yml │ └── workflows/ │ ├── android.yml │ ├── android_foss.yml │ ├── android_market.yml │ └── tb_release.yml ├── .gitignore ├── ARCHITECTURE.md ├── ARCHITECTURE_2 ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── app/ │ ├── .gitignore │ ├── build.gradle.kts │ ├── proguard-rules.pro │ └── src/ │ ├── main/ │ │ ├── AndroidManifest.xml │ │ ├── java/ │ │ │ └── com/ │ │ │ └── t8rin/ │ │ │ └── imagetoolbox/ │ │ │ └── app/ │ │ │ └── presentation/ │ │ │ ├── AppActivity.kt │ │ │ └── components/ │ │ │ ├── ImageToolboxApplication.kt │ │ │ ├── functions/ │ │ │ │ ├── AttachLogWriter.kt │ │ │ │ ├── InitCollages.kt │ │ │ │ ├── InitColorNames.kt │ │ │ │ ├── InitNeuralTool.kt │ │ │ │ ├── InitOpenCV.kt │ │ │ │ ├── InitPdfBox.kt │ │ │ │ ├── InitQrScanner.kt │ │ │ │ ├── InjectBaseComponent.kt │ │ │ │ ├── RegisterSecurityProviders.kt │ │ │ │ └── SetupFlags.kt │ │ │ └── utils/ │ │ │ └── GetProcessName.kt │ │ └── res/ │ │ └── resources.properties │ └── market/ │ ├── debug/ │ │ └── google-services.json │ └── release/ │ └── google-services.json ├── benchmark/ │ ├── .gitignore │ ├── build.gradle.kts │ └── src/ │ └── main/ │ ├── AndroidManifest.xml │ └── java/ │ └── com/ │ └── t8rin/ │ └── imagetoolbox/ │ └── benchmark/ │ └── BaselineProfileGenerator.kt ├── build-logic/ │ ├── .gitignore │ ├── convention/ │ │ ├── .gitignore │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── main/ │ │ └── kotlin/ │ │ ├── ImageToolboxApplicationPlugin.kt │ │ ├── ImageToolboxHiltPlugin.kt │ │ ├── ImageToolboxLibraryComposePlugin.kt │ │ ├── ImageToolboxLibraryFeaturePlugin.kt │ │ ├── ImageToolboxLibraryPlugin.kt │ │ └── com/ │ │ └── t8rin/ │ │ └── imagetoolbox/ │ │ ├── ConfigureCompose.kt │ │ ├── ConfigureDetekt.kt │ │ ├── ConfigureKotlinAndroid.kt │ │ └── ProjectExtensions.kt │ └── settings.gradle.kts ├── build.gradle.kts ├── compose_compiler_config.conf ├── core/ │ ├── crash/ │ │ ├── .gitignore │ │ ├── build.gradle.kts │ │ └── src/ │ │ ├── foss/ │ │ │ └── java/ │ │ │ └── com/ │ │ │ └── t8rin/ │ │ │ └── imagetoolbox/ │ │ │ └── core/ │ │ │ └── crash/ │ │ │ └── data/ │ │ │ └── AnalyticsManagerImpl.kt │ │ ├── main/ │ │ │ ├── AndroidManifest.xml │ │ │ └── java/ │ │ │ └── com/ │ │ │ └── t8rin/ │ │ │ └── imagetoolbox/ │ │ │ └── core/ │ │ │ └── crash/ │ │ │ ├── di/ │ │ │ │ └── CrashModule.kt │ │ │ └── presentation/ │ │ │ ├── CrashActivity.kt │ │ │ ├── components/ │ │ │ │ ├── CrashActionButtons.kt │ │ │ │ ├── CrashAttentionCard.kt │ │ │ │ ├── CrashBottomButtons.kt │ │ │ │ ├── CrashHandler.kt │ │ │ │ ├── CrashInfoCard.kt │ │ │ │ ├── CrashRootContent.kt │ │ │ │ └── GlobalExceptionHandler.kt │ │ │ └── screenLogic/ │ │ │ └── CrashComponent.kt │ │ └── market/ │ │ └── java/ │ │ └── com/ │ │ └── t8rin/ │ │ └── imagetoolbox/ │ │ └── core/ │ │ └── crash/ │ │ └── data/ │ │ └── AnalyticsManagerImpl.kt │ ├── data/ │ │ ├── .gitignore │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── main/ │ │ ├── AndroidManifest.xml │ │ └── java/ │ │ └── com/ │ │ └── t8rin/ │ │ └── imagetoolbox/ │ │ └── core/ │ │ └── data/ │ │ ├── coil/ │ │ │ ├── Base64Fetcher.kt │ │ │ ├── CoilLogger.kt │ │ │ ├── MemoryCache.kt │ │ │ ├── PdfDecoder.kt │ │ │ ├── TiffDecoder.kt │ │ │ ├── TimeMeasureInterceptor.kt │ │ │ └── UpscaleSvgDecoder.kt │ │ ├── coroutines/ │ │ │ ├── AndroidDispatchersHolder.kt │ │ │ └── AppScopeImpl.kt │ │ ├── di/ │ │ │ ├── CoroutinesModule.kt │ │ │ ├── ImageLoaderModule.kt │ │ │ ├── ImageModule.kt │ │ │ ├── JsonModule.kt │ │ │ ├── LocalModule.kt │ │ │ ├── RemoteModule.kt │ │ │ ├── ResourcesModule.kt │ │ │ └── SavingModule.kt │ │ ├── image/ │ │ │ ├── AndroidImageCompressor.kt │ │ │ ├── AndroidImageGetter.kt │ │ │ ├── AndroidImagePreviewCreator.kt │ │ │ ├── AndroidImageScaler.kt │ │ │ ├── AndroidImageTransformer.kt │ │ │ ├── AndroidMetadata.kt │ │ │ ├── AndroidShareProvider.kt │ │ │ └── utils/ │ │ │ ├── BlendingModeExt.kt │ │ │ ├── CanvasUtils.kt │ │ │ ├── ColorUtils.kt │ │ │ ├── ImageCompressorBackend.kt │ │ │ ├── StaticOptions.kt │ │ │ └── compressor/ │ │ │ ├── AvifBackend.kt │ │ │ ├── BmpBackend.kt │ │ │ ├── HeicBackend.kt │ │ │ ├── IcoBackend.kt │ │ │ ├── Jpeg2000Backend.kt │ │ │ ├── JpegliBackend.kt │ │ │ ├── JpgBackend.kt │ │ │ ├── JxlBackend.kt │ │ │ ├── MozJpegBackend.kt │ │ │ ├── OxiPngBackend.kt │ │ │ ├── PngLosslessBackend.kt │ │ │ ├── PngLossyBackend.kt │ │ │ ├── QoiBackend.kt │ │ │ ├── StaticGifBackend.kt │ │ │ ├── TiffBackend.kt │ │ │ └── WebpBackend.kt │ │ ├── json/ │ │ │ └── MoshiParser.kt │ │ ├── remote/ │ │ │ ├── AndroidDownloadManager.kt │ │ │ └── AndroidRemoteResourcesStore.kt │ │ ├── resource/ │ │ │ └── AndroidResourceManager.kt │ │ ├── saving/ │ │ │ ├── AndroidFileController.kt │ │ │ ├── AndroidFilenameCreator.kt │ │ │ ├── AndroidKeepAliveService.kt │ │ │ ├── KeepAliveForegroundService.kt │ │ │ ├── SaveException.kt │ │ │ ├── SavingFolder.kt │ │ │ └── io/ │ │ │ ├── FileWriteable.kt │ │ │ ├── StreamWriteable.kt │ │ │ └── UriReadable.kt │ │ └── utils/ │ │ ├── BitmapUtils.kt │ │ ├── ChecksumUtils.kt │ │ ├── CoilUtils.kt │ │ ├── ContextUtils.kt │ │ ├── CoroutinesUtils.kt │ │ ├── FileUtils.kt │ │ ├── HttpClientUtils.kt │ │ └── WriteableUtils.kt │ ├── di/ │ │ ├── .gitignore │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── main/ │ │ ├── AndroidManifest.xml │ │ └── java/ │ │ └── com/ │ │ └── t8rin/ │ │ └── imagetoolbox/ │ │ └── core/ │ │ └── di/ │ │ ├── EntryPointUtils.kt │ │ └── Qualifiers.kt │ ├── domain/ │ │ ├── .gitignore │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── main/ │ │ ├── AndroidManifest.xml │ │ └── kotlin/ │ │ └── com/ │ │ └── t8rin/ │ │ └── imagetoolbox/ │ │ └── core/ │ │ └── domain/ │ │ ├── Constants.kt │ │ ├── coroutines/ │ │ │ ├── AppScope.kt │ │ │ └── DispatchersHolder.kt │ │ ├── image/ │ │ │ ├── ImageCompressor.kt │ │ │ ├── ImageGetter.kt │ │ │ ├── ImagePreviewCreator.kt │ │ │ ├── ImageScaler.kt │ │ │ ├── ImageShareProvider.kt │ │ │ ├── ImageTransformer.kt │ │ │ ├── Metadata.kt │ │ │ ├── ShareProvider.kt │ │ │ └── model/ │ │ │ ├── BlendingMode.kt │ │ │ ├── ImageData.kt │ │ │ ├── ImageFormat.kt │ │ │ ├── ImageFormatGroup.kt │ │ │ ├── ImageFrames.kt │ │ │ ├── ImageInfo.kt │ │ │ ├── ImageScaleMode.kt │ │ │ ├── ImageWithSize.kt │ │ │ ├── MetadataTag.kt │ │ │ ├── Preset.kt │ │ │ ├── Quality.kt │ │ │ ├── ResizeAnchor.kt │ │ │ ├── ResizeType.kt │ │ │ └── TiffCompressionScheme.kt │ │ ├── json/ │ │ │ └── JsonParser.kt │ │ ├── model/ │ │ │ ├── CipherType.kt │ │ │ ├── ColorModel.kt │ │ │ ├── DomainAspectRatio.kt │ │ │ ├── ExtraDataType.kt │ │ │ ├── FileModel.kt │ │ │ ├── FloatSize.kt │ │ │ ├── HashingType.kt │ │ │ ├── ImageModel.kt │ │ │ ├── IntegerSize.kt │ │ │ ├── MimeType.kt │ │ │ ├── OffsetModel.kt │ │ │ ├── Outline.kt │ │ │ ├── PerformanceClass.kt │ │ │ ├── Position.kt │ │ │ ├── Pt.kt │ │ │ ├── QrType.kt │ │ │ ├── RectModel.kt │ │ │ ├── SecureAlgorithmsMapping.kt │ │ │ ├── SortType.kt │ │ │ ├── SystemBarsVisibility.kt │ │ │ └── VisibilityOwner.kt │ │ ├── remote/ │ │ │ ├── AnalyticsManager.kt │ │ │ ├── Cache.kt │ │ │ ├── DownloadManager.kt │ │ │ ├── DownloadProgress.kt │ │ │ ├── RemoteResources.kt │ │ │ └── RemoteResourcesStore.kt │ │ ├── resource/ │ │ │ └── ResourceManager.kt │ │ ├── saving/ │ │ │ ├── FileController.kt │ │ │ ├── FilenameCreator.kt │ │ │ ├── KeepAliveService.kt │ │ │ ├── ObjectSaver.kt │ │ │ ├── RandomStringGenerator.kt │ │ │ ├── io/ │ │ │ │ ├── IoCloseable.kt │ │ │ │ ├── Readable.kt │ │ │ │ └── Writeable.kt │ │ │ └── model/ │ │ │ ├── FileSaveTarget.kt │ │ │ ├── FilenamePattern.kt │ │ │ ├── ImageSaveTarget.kt │ │ │ ├── SaveResult.kt │ │ │ └── SaveTarget.kt │ │ ├── transformation/ │ │ │ ├── ChainTransformation.kt │ │ │ ├── GenericTransformation.kt │ │ │ └── Transformation.kt │ │ └── utils/ │ │ ├── ByteUtils.kt │ │ ├── Delegates.kt │ │ ├── FileMode.kt │ │ ├── Flavor.kt │ │ ├── IntUtils.kt │ │ ├── KotlinUtils.kt │ │ ├── ListUtils.kt │ │ ├── ProgressInputStream.kt │ │ ├── Quad.kt │ │ ├── Rounding.kt │ │ ├── SmartJob.kt │ │ ├── StringUtils.kt │ │ └── TimeUtils.kt │ ├── filters/ │ │ ├── .gitignore │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── main/ │ │ ├── AndroidManifest.xml │ │ └── java/ │ │ └── com/ │ │ └── t8rin/ │ │ └── imagetoolbox/ │ │ └── core/ │ │ └── filters/ │ │ ├── data/ │ │ │ └── SideFadePaint.kt │ │ ├── domain/ │ │ │ ├── FilterParamsInteractor.kt │ │ │ ├── FilterProvider.kt │ │ │ └── model/ │ │ │ ├── Filter.kt │ │ │ ├── FilterParam.kt │ │ │ ├── FilterUtils.kt │ │ │ ├── FilterValueWrapper.kt │ │ │ ├── TemplateFilter.kt │ │ │ ├── enums/ │ │ │ │ ├── BlurEdgeMode.kt │ │ │ │ ├── ColorMapType.kt │ │ │ │ ├── FadeSide.kt │ │ │ │ ├── MirrorSide.kt │ │ │ │ ├── PaletteTransferSpace.kt │ │ │ │ ├── PolarCoordinatesType.kt │ │ │ │ ├── PopArtBlendingMode.kt │ │ │ │ ├── SpotHealMode.kt │ │ │ │ └── TransferFunc.kt │ │ │ └── params/ │ │ │ ├── ArcParams.kt │ │ │ ├── AsciiParams.kt │ │ │ ├── BilaterialBlurParams.kt │ │ │ ├── BloomParams.kt │ │ │ ├── ChannelMixParams.kt │ │ │ ├── ClaheParams.kt │ │ │ ├── CropOrPerspectiveParams.kt │ │ │ ├── EnhancedZoomBlurParams.kt │ │ │ ├── GlitchParams.kt │ │ │ ├── KaleidoscopeParams.kt │ │ │ ├── LinearGaussianParams.kt │ │ │ ├── LinearTiltShiftParams.kt │ │ │ ├── PinchParams.kt │ │ │ ├── RadialTiltShiftParams.kt │ │ │ ├── RubberStampParams.kt │ │ │ ├── SideFadeParams.kt │ │ │ ├── SmearParams.kt │ │ │ ├── SparkleParams.kt │ │ │ ├── ToneCurvesParams.kt │ │ │ ├── VoronoiCrystallizeParams.kt │ │ │ └── WaterParams.kt │ │ └── presentation/ │ │ ├── model/ │ │ │ ├── UiAcesFilmicToneMappingFilter.kt │ │ │ ├── UiAcesHillToneMappingFilter.kt │ │ │ ├── UiAchromatomalyFilter.kt │ │ │ ├── UiAchromatopsiaFilter.kt │ │ │ ├── UiAldridgeFilter.kt │ │ │ ├── UiAmatorkaFilter.kt │ │ │ ├── UiAnaglyphFilter.kt │ │ │ ├── UiAnisotropicDiffusionFilter.kt │ │ │ ├── UiArcFilter.kt │ │ │ ├── UiAsciiFilter.kt │ │ │ ├── UiAtkinsonDitheringFilter.kt │ │ │ ├── UiAutoCropFilter.kt │ │ │ ├── UiAutoPerspectiveFilter.kt │ │ │ ├── UiAutoRemoveRedEyesFilter.kt │ │ │ ├── UiAutumnTonesFilter.kt │ │ │ ├── UiAverageDistanceFilter.kt │ │ │ ├── UiBayerEightDitheringFilter.kt │ │ │ ├── UiBayerFourDitheringFilter.kt │ │ │ ├── UiBayerThreeDitheringFilter.kt │ │ │ ├── UiBayerTwoDitheringFilter.kt │ │ │ ├── UiBilaterialBlurFilter.kt │ │ │ ├── UiBlackAndWhiteFilter.kt │ │ │ ├── UiBlackHatFilter.kt │ │ │ ├── UiBleachBypassFilter.kt │ │ │ ├── UiBlockGlitchFilter.kt │ │ │ ├── UiBloomFilter.kt │ │ │ ├── UiBokehFilter.kt │ │ │ ├── UiBorderFrameFilter.kt │ │ │ ├── UiBoxBlurFilter.kt │ │ │ ├── UiBrightnessFilter.kt │ │ │ ├── UiBrowniFilter.kt │ │ │ ├── UiBulgeDistortionFilter.kt │ │ │ ├── UiBurkesDitheringFilter.kt │ │ │ ├── UiCGAColorSpaceFilter.kt │ │ │ ├── UiCandlelightFilter.kt │ │ │ ├── UiCannyFilter.kt │ │ │ ├── UiCaramelDarknessFilter.kt │ │ │ ├── UiCelluloidFilter.kt │ │ │ ├── UiChannelMixFilter.kt │ │ │ ├── UiCircleBlurFilter.kt │ │ │ ├── UiCirclePixelationFilter.kt │ │ │ ├── UiClaheFilter.kt │ │ │ ├── UiClaheHSLFilter.kt │ │ │ ├── UiClaheHSVFilter.kt │ │ │ ├── UiClaheJzazbzFilter.kt │ │ │ ├── UiClaheLABFilter.kt │ │ │ ├── UiClaheLUVFilter.kt │ │ │ ├── UiClaheOklabFilter.kt │ │ │ ├── UiClaheOklchFilter.kt │ │ │ ├── UiClosingFilter.kt │ │ │ ├── UiClustered2x2DitheringFilter.kt │ │ │ ├── UiClustered4x4DitheringFilter.kt │ │ │ ├── UiClustered8x8DitheringFilter.kt │ │ │ ├── UiCodaChromeFilter.kt │ │ │ ├── UiCoffeeFilter.kt │ │ │ ├── UiColorAnomalyFilter.kt │ │ │ ├── UiColorBalanceFilter.kt │ │ │ ├── UiColorExplosionFilter.kt │ │ │ ├── UiColorHalftoneFilter.kt │ │ │ ├── UiColorMapFilter.kt │ │ │ ├── UiColorMatrix3x3Filter.kt │ │ │ ├── UiColorMatrix4x4Filter.kt │ │ │ ├── UiColorOverlayFilter.kt │ │ │ ├── UiColorPosterFilter.kt │ │ │ ├── UiColorfulSwirlFilter.kt │ │ │ ├── UiContourFilter.kt │ │ │ ├── UiContrastFilter.kt │ │ │ ├── UiConvexFilter.kt │ │ │ ├── UiConvolution3x3Filter.kt │ │ │ ├── UiCoolFilter.kt │ │ │ ├── UiCopyMoveDetectionFilter.kt │ │ │ ├── UiCropOrPerspectiveFilter.kt │ │ │ ├── UiCropToContentFilter.kt │ │ │ ├── UiCrossBlurFilter.kt │ │ │ ├── UiCrossPixelizationFilter.kt │ │ │ ├── UiCrosshatchFilter.kt │ │ │ ├── UiCrtCurvatureFilter.kt │ │ │ ├── UiCrystallizeFilter.kt │ │ │ ├── UiCubeLutFilter.kt │ │ │ ├── UiCyberpunkFilter.kt │ │ │ ├── UiDeepPurpleFilter.kt │ │ │ ├── UiDehazeFilter.kt │ │ │ ├── UiDeskewFilter.kt │ │ │ ├── UiDespeckleFilter.kt │ │ │ ├── UiDeutaromalyFilter.kt │ │ │ ├── UiDeutaronotopiaFilter.kt │ │ │ ├── UiDiamondPixelationFilter.kt │ │ │ ├── UiDiffuseFilter.kt │ │ │ ├── UiDigitalCodeFilter.kt │ │ │ ├── UiDilationFilter.kt │ │ │ ├── UiDoGFilter.kt │ │ │ ├── UiDragoFilter.kt │ │ │ ├── UiDropBluesFilter.kt │ │ │ ├── UiEdgyAmberFilter.kt │ │ │ ├── UiElectricGradientFilter.kt │ │ │ ├── UiEmbossFilter.kt │ │ │ ├── UiEnhancedCirclePixelationFilter.kt │ │ │ ├── UiEnhancedDiamondPixelationFilter.kt │ │ │ ├── UiEnhancedGlitchFilter.kt │ │ │ ├── UiEnhancedOilFilter.kt │ │ │ ├── UiEnhancedPixelationFilter.kt │ │ │ ├── UiEnhancedZoomBlurFilter.kt │ │ │ ├── UiEqualizeFilter.kt │ │ │ ├── UiEqualizeHistogramAdaptiveFilter.kt │ │ │ ├── UiEqualizeHistogramAdaptiveHSLFilter.kt │ │ │ ├── UiEqualizeHistogramAdaptiveHSVFilter.kt │ │ │ ├── UiEqualizeHistogramAdaptiveLABFilter.kt │ │ │ ├── UiEqualizeHistogramAdaptiveLUVFilter.kt │ │ │ ├── UiEqualizeHistogramFilter.kt │ │ │ ├── UiEqualizeHistogramHSVFilter.kt │ │ │ ├── UiEqualizeHistogramPixelationFilter.kt │ │ │ ├── UiErodeFilter.kt │ │ │ ├── UiErrorLevelAnalysisFilter.kt │ │ │ ├── UiExposureFilter.kt │ │ │ ├── UiFallColorsFilter.kt │ │ │ ├── UiFalseColorFilter.kt │ │ │ ├── UiFalseFloydSteinbergDitheringFilter.kt │ │ │ ├── UiFantasyLandscapeFilter.kt │ │ │ ├── UiFastBilaterialBlurFilter.kt │ │ │ ├── UiFastBlurFilter.kt │ │ │ ├── UiFastGaussianBlur2DFilter.kt │ │ │ ├── UiFastGaussianBlur3DFilter.kt │ │ │ ├── UiFastGaussianBlur4DFilter.kt │ │ │ ├── UiFilmStock50Filter.kt │ │ │ ├── UiFilter.kt │ │ │ ├── UiFloydSteinbergDitheringFilter.kt │ │ │ ├── UiFoggyNightFilter.kt │ │ │ ├── UiFractalGlassFilter.kt │ │ │ ├── UiFuturisticGradientFilter.kt │ │ │ ├── UiGammaFilter.kt │ │ │ ├── UiGaussianBlurFilter.kt │ │ │ ├── UiGaussianBoxBlurFilter.kt │ │ │ ├── UiGlassSphereRefractionFilter.kt │ │ │ ├── UiGlitchFilter.kt │ │ │ ├── UiGlitchVariantFilter.kt │ │ │ ├── UiGlowFilter.kt │ │ │ ├── UiGoldenForestFilter.kt │ │ │ ├── UiGoldenHourFilter.kt │ │ │ ├── UiGothamFilter.kt │ │ │ ├── UiGrainFilter.kt │ │ │ ├── UiGrayscaleFilter.kt │ │ │ ├── UiGreenSunFilter.kt │ │ │ ├── UiGreenishFilter.kt │ │ │ ├── UiHDRFilter.kt │ │ │ ├── UiHableFilmicToneMappingFilter.kt │ │ │ ├── UiHalftoneFilter.kt │ │ │ ├── UiHazeFilter.kt │ │ │ ├── UiHejlBurgessToneMappingFilter.kt │ │ │ ├── UiHighlightsAndShadowsFilter.kt │ │ │ ├── UiHorizontalWindStaggerFilter.kt │ │ │ ├── UiHotSummerFilter.kt │ │ │ ├── UiHueFilter.kt │ │ │ ├── UiJarvisJudiceNinkeDitheringFilter.kt │ │ │ ├── UiKaleidoscopeFilter.kt │ │ │ ├── UiKodakFilter.kt │ │ │ ├── UiKuwaharaFilter.kt │ │ │ ├── UiLUT512x512Filter.kt │ │ │ ├── UiLaplacianFilter.kt │ │ │ ├── UiLaplacianSimpleFilter.kt │ │ │ ├── UiLavenderDreamFilter.kt │ │ │ ├── UiLeftToRightDitheringFilter.kt │ │ │ ├── UiLemonadeLightFilter.kt │ │ │ ├── UiLensCorrectionFilter.kt │ │ │ ├── UiLinearBoxBlurFilter.kt │ │ │ ├── UiLinearFastGaussianBlurFilter.kt │ │ │ ├── UiLinearFastGaussianBlurNextFilter.kt │ │ │ ├── UiLinearGaussianBlurFilter.kt │ │ │ ├── UiLinearGaussianBoxBlurFilter.kt │ │ │ ├── UiLinearStackBlurFilter.kt │ │ │ ├── UiLinearTentBlurFilter.kt │ │ │ ├── UiLinearTiltShiftFilter.kt │ │ │ ├── UiLogarithmicToneMappingFilter.kt │ │ │ ├── UiLookupFilter.kt │ │ │ ├── UiLowPolyFilter.kt │ │ │ ├── UiLuminanceGradientFilter.kt │ │ │ ├── UiMarbleFilter.kt │ │ │ ├── UiMedianBlurFilter.kt │ │ │ ├── UiMicroMacroPixelizationFilter.kt │ │ │ ├── UiMirrorFilter.kt │ │ │ ├── UiMissEtikateFilter.kt │ │ │ ├── UiMobiusFilter.kt │ │ │ ├── UiMoireFilter.kt │ │ │ ├── UiMonochromeFilter.kt │ │ │ ├── UiMorphologicalGradientFilter.kt │ │ │ ├── UiMotionBlurFilter.kt │ │ │ ├── UiNativeStackBlurFilter.kt │ │ │ ├── UiNegativeFilter.kt │ │ │ ├── UiNeonFilter.kt │ │ │ ├── UiNightMagicFilter.kt │ │ │ ├── UiNightVisionFilter.kt │ │ │ ├── UiNoiseFilter.kt │ │ │ ├── UiNonMaximumSuppressionFilter.kt │ │ │ ├── UiNucleusPixelizationFilter.kt │ │ │ ├── UiOffsetFilter.kt │ │ │ ├── UiOilFilter.kt │ │ │ ├── UiOldTvFilter.kt │ │ │ ├── UiOpacityFilter.kt │ │ │ ├── UiOpeningFilter.kt │ │ │ ├── UiOrangeHazeFilter.kt │ │ │ ├── UiOrbitalPixelizationFilter.kt │ │ │ ├── UiPaletteTransferFilter.kt │ │ │ ├── UiPaletteTransferVariantFilter.kt │ │ │ ├── UiPastelFilter.kt │ │ │ ├── UiPerlinDistortionFilter.kt │ │ │ ├── UiPinchFilter.kt │ │ │ ├── UiPinkDreamFilter.kt │ │ │ ├── UiPixelMeltFilter.kt │ │ │ ├── UiPixelationFilter.kt │ │ │ ├── UiPointillizeFilter.kt │ │ │ ├── UiPoissonBlurFilter.kt │ │ │ ├── UiPolarCoordinatesFilter.kt │ │ │ ├── UiPolaroidFilter.kt │ │ │ ├── UiPolkaDotFilter.kt │ │ │ ├── UiPopArtFilter.kt │ │ │ ├── UiPosterizeFilter.kt │ │ │ ├── UiProtanopiaFilter.kt │ │ │ ├── UiProtonomalyFilter.kt │ │ │ ├── UiPulseGridPixelizationFilter.kt │ │ │ ├── UiPurpleMistFilter.kt │ │ │ ├── UiQuantizierFilter.kt │ │ │ ├── UiRGBFilter.kt │ │ │ ├── UiRadialTiltShiftFilter.kt │ │ │ ├── UiRadialWeavePixelizationFilter.kt │ │ │ ├── UiRainbowWorldFilter.kt │ │ │ ├── UiRandomDitheringFilter.kt │ │ │ ├── UiRedSwirlFilter.kt │ │ │ ├── UiReduceNoiseFilter.kt │ │ │ ├── UiRemoveColorFilter.kt │ │ │ ├── UiReplaceColorFilter.kt │ │ │ ├── UiRetroYellowFilter.kt │ │ │ ├── UiRingBlurFilter.kt │ │ │ ├── UiRubberStampFilter.kt │ │ │ ├── UiSandPaintingFilter.kt │ │ │ ├── UiSaturationFilter.kt │ │ │ ├── UiSeamCarvingFilter.kt │ │ │ ├── UiSepiaFilter.kt │ │ │ ├── UiSharpenFilter.kt │ │ │ ├── UiShuffleBlurFilter.kt │ │ │ ├── UiSideFadeFilter.kt │ │ │ ├── UiSierraDitheringFilter.kt │ │ │ ├── UiSierraLiteDitheringFilter.kt │ │ │ ├── UiSimpleOldTvFilter.kt │ │ │ ├── UiSimpleSketchFilter.kt │ │ │ ├── UiSimpleSolarizeFilter.kt │ │ │ ├── UiSimpleThresholdDitheringFilter.kt │ │ │ ├── UiSimpleWeavePixelationFilter.kt │ │ │ ├── UiSketchFilter.kt │ │ │ ├── UiSmearFilter.kt │ │ │ ├── UiSmoothToonFilter.kt │ │ │ ├── UiSobelEdgeDetectionFilter.kt │ │ │ ├── UiSobelSimpleFilter.kt │ │ │ ├── UiSoftEleganceFilter.kt │ │ │ ├── UiSoftEleganceVariantFilter.kt │ │ │ ├── UiSoftSpringLightFilter.kt │ │ │ ├── UiSolarizeFilter.kt │ │ │ ├── UiSpacePortalFilter.kt │ │ │ ├── UiSparkleFilter.kt │ │ │ ├── UiSpectralFireFilter.kt │ │ │ ├── UiSphereLensDistortionFilter.kt │ │ │ ├── UiSphereRefractionFilter.kt │ │ │ ├── UiStackBlurFilter.kt │ │ │ ├── UiStaggeredPixelizationFilter.kt │ │ │ ├── UiStarBlurFilter.kt │ │ │ ├── UiStrokePixelationFilter.kt │ │ │ ├── UiStuckiDitheringFilter.kt │ │ │ ├── UiSunriseFilter.kt │ │ │ ├── UiSwirlDistortionFilter.kt │ │ │ ├── UiTentBlurFilter.kt │ │ │ ├── UiThresholdFilter.kt │ │ │ ├── UiToneCurvesFilter.kt │ │ │ ├── UiToonFilter.kt │ │ │ ├── UiTopHatFilter.kt │ │ │ ├── UiTriToneFilter.kt │ │ │ ├── UiTritanopiaFilter.kt │ │ │ ├── UiTritonomalyFilter.kt │ │ │ ├── UiTwirlFilter.kt │ │ │ ├── UiTwoRowSierraDitheringFilter.kt │ │ │ ├── UiUchimuraFilter.kt │ │ │ ├── UiUnsharpFilter.kt │ │ │ ├── UiVHSFilter.kt │ │ │ ├── UiVibranceFilter.kt │ │ │ ├── UiVignetteFilter.kt │ │ │ ├── UiVintageFilter.kt │ │ │ ├── UiVoronoiCrystallizeFilter.kt │ │ │ ├── UiVortexPixelizationFilter.kt │ │ │ ├── UiWarmFilter.kt │ │ │ ├── UiWaterEffectFilter.kt │ │ │ ├── UiWeakPixelFilter.kt │ │ │ ├── UiWeaveFilter.kt │ │ │ ├── UiWhiteBalanceFilter.kt │ │ │ ├── UiYililomaDitheringFilter.kt │ │ │ └── UiZoomBlurFilter.kt │ │ ├── utils/ │ │ │ ├── CollectAsUiState.kt │ │ │ ├── LamaLoader.kt │ │ │ └── Mappings.kt │ │ └── widget/ │ │ ├── AddFilterButton.kt │ │ ├── CalculateBrightnessEstimate.kt │ │ ├── CubeLutDownloadDialog.kt │ │ ├── FilterItem.kt │ │ ├── FilterItemContent.kt │ │ ├── FilterPreviewSheet.kt │ │ ├── FilterReorderSheet.kt │ │ ├── FilterSelectionCubeLutBottomContent.kt │ │ ├── FilterSelectionItem.kt │ │ ├── FilterTemplateAddingGroup.kt │ │ ├── FilterTemplateCreationSheet.kt │ │ ├── FilterTemplateInfoSheet.kt │ │ ├── TemplateFilterSelectionItem.kt │ │ ├── addFilters/ │ │ │ ├── AddFiltersSheet.kt │ │ │ ├── AddFiltersSheetComponent.kt │ │ │ ├── FavoritesContent.kt │ │ │ ├── OtherContent.kt │ │ │ └── TemplatesContent.kt │ │ └── filterItem/ │ │ ├── ArcParamsItem.kt │ │ ├── AsciiParamsItem.kt │ │ ├── BilaterialBlurParamsItem.kt │ │ ├── BloomParamsItem.kt │ │ ├── BooleanItem.kt │ │ ├── ChannelMixParamsItem.kt │ │ ├── ClaheParamsItem.kt │ │ ├── CropOrPerspectiveParamsItem.kt │ │ ├── EdgeModeSelector.kt │ │ ├── EnhancedZoomBlurParamsItem.kt │ │ ├── FilterValueWrapperItem.kt │ │ ├── FloatArrayItem.kt │ │ ├── FloatItem.kt │ │ ├── GlitchParamsItem.kt │ │ ├── IntegerSizeParamsItem.kt │ │ ├── KaleidoscopeParamsItem.kt │ │ ├── LinearGaussianParamsItem.kt │ │ ├── LinearTiltShiftParamsItem.kt │ │ ├── MirrorSideSelector.kt │ │ ├── PairItem.kt │ │ ├── PinchParamsItem.kt │ │ ├── QuadItem.kt │ │ ├── RadialTiltShiftParamsItem.kt │ │ ├── RubberStampParamsItem.kt │ │ ├── SideFadeRelativeItem.kt │ │ ├── SmearParamsItem.kt │ │ ├── SparkleParamsItem.kt │ │ ├── ToneCurvesParamsItem.kt │ │ ├── TransferFuncSelector.kt │ │ ├── TripleItem.kt │ │ ├── VoronoiCrystallizeParamsItem.kt │ │ ├── WaterParamsItem.kt │ │ ├── pair_components/ │ │ │ ├── ColorModelPairItem.kt │ │ │ ├── FloatColorModelPairItem.kt │ │ │ ├── FloatFileModelPairItem.kt │ │ │ ├── FloatImageModelPairItem.kt │ │ │ ├── NumberBlurEdgeModePairItem.kt │ │ │ ├── NumberBooleanPairItem.kt │ │ │ ├── NumberMirrorSidePairItem.kt │ │ │ ├── NumberPairItem.kt │ │ │ └── NumberTransferFuncPairItem.kt │ │ ├── quad_components/ │ │ │ ├── NumberColorModelQuadItem.kt │ │ │ └── NumberQuadItem.kt │ │ └── triple_components/ │ │ ├── ColorModelTripleItem.kt │ │ ├── FloatPaletteImageModelTripleItem.kt │ │ ├── NumberColorModelColorModelTripleItem.kt │ │ ├── NumberColorModelPopArtTripleItem.kt │ │ ├── NumberNumberBlurEdgeModeTripleItem.kt │ │ ├── NumberNumberColorModelTripleItem.kt │ │ ├── NumberTransferFuncBlurEdgeModeTripleItem.kt │ │ └── NumberTripleItem.kt │ ├── ksp/ │ │ ├── .gitignore │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── t8rin/ │ │ │ └── imagetoolbox/ │ │ │ └── core/ │ │ │ └── ksp/ │ │ │ ├── annotations/ │ │ │ │ ├── FilterInject.kt │ │ │ │ └── UiFilterInject.kt │ │ │ └── processor/ │ │ │ ├── FilterInjectProcessor.kt │ │ │ └── UiFilterInjectProcessor.kt │ │ └── resources/ │ │ └── META-INF/ │ │ └── services/ │ │ └── com.google.devtools.ksp.processing.SymbolProcessorProvider │ ├── resources/ │ │ ├── .gitignore │ │ ├── build.gradle.kts │ │ └── src/ │ │ ├── debug/ │ │ │ └── res/ │ │ │ ├── drawable/ │ │ │ │ ├── ic_launcher_foreground.xml │ │ │ │ ├── ic_logo_animated.xml │ │ │ │ └── ic_notification_icon.xml │ │ │ ├── drawable-v31/ │ │ │ │ └── ic_logo_animated.xml │ │ │ ├── mipmap-anydpi-v26/ │ │ │ │ ├── ic_launcher.xml │ │ │ │ └── ic_launcher_round.xml │ │ │ ├── values/ │ │ │ │ ├── colors.xml │ │ │ │ └── ic_launcher_background.xml │ │ │ ├── values-night/ │ │ │ │ └── colors.xml │ │ │ ├── values-night-v31/ │ │ │ │ └── colors.xml │ │ │ └── values-v31/ │ │ │ └── colors.xml │ │ └── main/ │ │ ├── AndroidManifest.xml │ │ ├── java/ │ │ │ └── com/ │ │ │ └── t8rin/ │ │ │ └── imagetoolbox/ │ │ │ └── core/ │ │ │ └── resources/ │ │ │ ├── emoji/ │ │ │ │ ├── Emoji.kt │ │ │ │ └── EmojiData.kt │ │ │ ├── icons/ │ │ │ │ ├── AddPhotoAlt.kt │ │ │ │ ├── AddSticky.kt │ │ │ │ ├── Analogous.kt │ │ │ │ ├── AnalogousComplementary.kt │ │ │ │ ├── Analytics.kt │ │ │ │ ├── Animation.kt │ │ │ │ ├── Apng.kt │ │ │ │ ├── ApngBox.kt │ │ │ │ ├── AppShortcut.kt │ │ │ │ ├── Apps.kt │ │ │ │ ├── Archive.kt │ │ │ │ ├── AreaChart.kt │ │ │ │ ├── ArtTrack.kt │ │ │ │ ├── Ascii.kt │ │ │ │ ├── AutoDelete.kt │ │ │ │ ├── BackgroundColor.kt │ │ │ │ ├── BarcodeScanner.kt │ │ │ │ ├── Base64.kt │ │ │ │ ├── BatchPrediction.kt │ │ │ │ ├── Beta.kt │ │ │ │ ├── Bitcoin.kt │ │ │ │ ├── Block.kt │ │ │ │ ├── BlurCircular.kt │ │ │ │ ├── BoldLine.kt │ │ │ │ ├── Bolt.kt │ │ │ │ ├── BookmarkOff.kt │ │ │ │ ├── BookmarkRemove.kt │ │ │ │ ├── Boosty.kt │ │ │ │ ├── BorderColor.kt │ │ │ │ ├── BrokenImageAlt.kt │ │ │ │ ├── BrushColor.kt │ │ │ │ ├── BubbleDelete.kt │ │ │ │ ├── Build.kt │ │ │ │ ├── CancelSmall.kt │ │ │ │ ├── ClipboardFile.kt │ │ │ │ ├── Collage.kt │ │ │ │ ├── Communication.kt │ │ │ │ ├── Compare.kt │ │ │ │ ├── CompareArrows.kt │ │ │ │ ├── Complementary.kt │ │ │ │ ├── ContractEdit.kt │ │ │ │ ├── ContractImage.kt │ │ │ │ ├── Cool.kt │ │ │ │ ├── Counter.kt │ │ │ │ ├── Crashlytics.kt │ │ │ │ ├── CropSmall.kt │ │ │ │ ├── Cube.kt │ │ │ │ ├── Curve.kt │ │ │ │ ├── DashedLine.kt │ │ │ │ ├── Database.kt │ │ │ │ ├── Delete.kt │ │ │ │ ├── DeleteSweep.kt │ │ │ │ ├── Deselect.kt │ │ │ │ ├── DesignServices.kt │ │ │ │ ├── DocumentScanner.kt │ │ │ │ ├── DotDashedLine.kt │ │ │ │ ├── Dots.kt │ │ │ │ ├── DownloadFile.kt │ │ │ │ ├── Draw.kt │ │ │ │ ├── EditAlt.kt │ │ │ │ ├── EmojiMultiple.kt │ │ │ │ ├── EmojiSticky.kt │ │ │ │ ├── Encrypted.kt │ │ │ │ ├── Eraser.kt │ │ │ │ ├── Exercise.kt │ │ │ │ ├── Exif.kt │ │ │ │ ├── ExifEdit.kt │ │ │ │ ├── Eyedropper.kt │ │ │ │ ├── FabCorner.kt │ │ │ │ ├── FileExport.kt │ │ │ │ ├── FileImage.kt │ │ │ │ ├── FileImport.kt │ │ │ │ ├── FileReplace.kt │ │ │ │ ├── FindInPage.kt │ │ │ │ ├── FingerprintOff.kt │ │ │ │ ├── Firebase.kt │ │ │ │ ├── Flip.kt │ │ │ │ ├── FlipVertical.kt │ │ │ │ ├── FloatingActionButton.kt │ │ │ │ ├── FloodFill.kt │ │ │ │ ├── FolderCompare.kt │ │ │ │ ├── FolderImage.kt │ │ │ │ ├── FolderImageAlt.kt │ │ │ │ ├── FolderMatch.kt │ │ │ │ ├── FolderOpened.kt │ │ │ │ ├── FontFamily.kt │ │ │ │ ├── FormatPaintVariant.kt │ │ │ │ ├── Forum.kt │ │ │ │ ├── FreeArrow.kt │ │ │ │ ├── FreeDoubleArrow.kt │ │ │ │ ├── FreeDraw.kt │ │ │ │ ├── Github.kt │ │ │ │ ├── Glyphs.kt │ │ │ │ ├── GooglePlay.kt │ │ │ │ ├── Gradient.kt │ │ │ │ ├── Group.kt │ │ │ │ ├── HandshakeAlt.kt │ │ │ │ ├── HardDrive.kt │ │ │ │ ├── HighRes.kt │ │ │ │ ├── Highlighter.kt │ │ │ │ ├── HistoryCreate.kt │ │ │ │ ├── HyperOS.kt │ │ │ │ ├── IOS.kt │ │ │ │ ├── ImageCombine.kt │ │ │ │ ├── ImageConvert.kt │ │ │ │ ├── ImageDownload.kt │ │ │ │ ├── ImageEdit.kt │ │ │ │ ├── ImageEmbedded.kt │ │ │ │ ├── ImageLimit.kt │ │ │ │ ├── ImageOverlay.kt │ │ │ │ ├── ImageReset.kt │ │ │ │ ├── ImageResize.kt │ │ │ │ ├── ImageSaw.kt │ │ │ │ ├── ImageSearch.kt │ │ │ │ ├── ImageSticky.kt │ │ │ │ ├── ImageSync.kt │ │ │ │ ├── ImageText.kt │ │ │ │ ├── ImageToText.kt │ │ │ │ ├── ImageToolboxBroken.kt │ │ │ │ ├── ImageTooltip.kt │ │ │ │ ├── ImageWeight.kt │ │ │ │ ├── ImagesMode.kt │ │ │ │ ├── ImagesearchRoller.kt │ │ │ │ ├── Interface.kt │ │ │ │ ├── Jpg.kt │ │ │ │ ├── Jxl.kt │ │ │ │ ├── KeyVariant.kt │ │ │ │ ├── KeyVertical.kt │ │ │ │ ├── LabelPercent.kt │ │ │ │ ├── Landscape.kt │ │ │ │ ├── Landscape2.kt │ │ │ │ ├── Lasso.kt │ │ │ │ ├── Latitude.kt │ │ │ │ ├── Layers.kt │ │ │ │ ├── LayersSearchOutline.kt │ │ │ │ ├── LetterO.kt │ │ │ │ ├── LetterS.kt │ │ │ │ ├── License.kt │ │ │ │ ├── Line.kt │ │ │ │ ├── LineArrow.kt │ │ │ │ ├── LineDoubleArrow.kt │ │ │ │ ├── Longitude.kt │ │ │ │ ├── Manga.kt │ │ │ │ ├── MaterialDesign.kt │ │ │ │ ├── MeshDownload.kt │ │ │ │ ├── MeshGradient.kt │ │ │ │ ├── MiniEdit.kt │ │ │ │ ├── MiniEditLarge.kt │ │ │ │ ├── Mobile.kt │ │ │ │ ├── MobileArrowDown.kt │ │ │ │ ├── MobileArrowUpRight.kt │ │ │ │ ├── MobileCast.kt │ │ │ │ ├── MobileLandscape.kt │ │ │ │ ├── MobileLayout.kt │ │ │ │ ├── MobileRotateLock.kt │ │ │ │ ├── MobileShare.kt │ │ │ │ ├── MobileVibrate.kt │ │ │ │ ├── Mop.kt │ │ │ │ ├── MultipleImageEdit.kt │ │ │ │ ├── MusicAdd.kt │ │ │ │ ├── NeonBrush.kt │ │ │ │ ├── Neurology.kt │ │ │ │ ├── NextPlan.kt │ │ │ │ ├── Noise.kt │ │ │ │ ├── NoiseAlt.kt │ │ │ │ ├── Numeric.kt │ │ │ │ ├── OverlayAbove.kt │ │ │ │ ├── PaletteBox.kt │ │ │ │ ├── PaletteSwatch.kt │ │ │ │ ├── Panorama.kt │ │ │ │ ├── Pdf.kt │ │ │ │ ├── Pen.kt │ │ │ │ ├── Perspective.kt │ │ │ │ ├── PhotoPicker.kt │ │ │ │ ├── PhotoPickerMobile.kt │ │ │ │ ├── PhotoPrints.kt │ │ │ │ ├── PhotoSizeSelectSmall.kt │ │ │ │ ├── PictureInPictureCenter.kt │ │ │ │ ├── Png.kt │ │ │ │ ├── Polygon.kt │ │ │ │ ├── Prefix.kt │ │ │ │ ├── Preview.kt │ │ │ │ ├── Print.kt │ │ │ │ ├── Psychology.kt │ │ │ │ ├── Puzzle.kt │ │ │ │ ├── QrCode.kt │ │ │ │ ├── QualityHigh.kt │ │ │ │ ├── QualityLow.kt │ │ │ │ ├── QualityMedium.kt │ │ │ │ ├── Rabbit.kt │ │ │ │ ├── Resize.kt │ │ │ │ ├── ResponsiveLayout.kt │ │ │ │ ├── Robot.kt │ │ │ │ ├── RobotExcited.kt │ │ │ │ ├── Rotate90Cw.kt │ │ │ │ ├── Routine.kt │ │ │ │ ├── SamsungLetter.kt │ │ │ │ ├── SaveConfirm.kt │ │ │ │ ├── ScaleUnbalanced.kt │ │ │ │ ├── Scanner.kt │ │ │ │ ├── Scissors.kt │ │ │ │ ├── ScissorsSmall.kt │ │ │ │ ├── SelectAll.kt │ │ │ │ ├── SelectInverse.kt │ │ │ │ ├── ServiceToolbox.kt │ │ │ │ ├── SettingsTimelapse.kt │ │ │ │ ├── Shadow.kt │ │ │ │ ├── ShareOff.kt │ │ │ │ ├── ShieldKey.kt │ │ │ │ ├── ShieldLock.kt │ │ │ │ ├── ShieldOpen.kt │ │ │ │ ├── ShineDiamond.kt │ │ │ │ ├── Signature.kt │ │ │ │ ├── SkewMore.kt │ │ │ │ ├── Slider.kt │ │ │ │ ├── Snail.kt │ │ │ │ ├── Snowflake.kt │ │ │ │ ├── Speed.kt │ │ │ │ ├── SplitAlt.kt │ │ │ │ ├── SplitComplementary.kt │ │ │ │ ├── Spray.kt │ │ │ │ ├── Square.kt │ │ │ │ ├── SquareEdit.kt │ │ │ │ ├── SquareFoot.kt │ │ │ │ ├── SquareHarmony.kt │ │ │ │ ├── Stack.kt │ │ │ │ ├── StackSticky.kt │ │ │ │ ├── StackStickyOff.kt │ │ │ │ ├── Stacks.kt │ │ │ │ ├── StampedLine.kt │ │ │ │ ├── StarSticky.kt │ │ │ │ ├── StickerEmoji.kt │ │ │ │ ├── Stylus.kt │ │ │ │ ├── Suffix.kt │ │ │ │ ├── Svg.kt │ │ │ │ ├── SwapVerticalCircle.kt │ │ │ │ ├── Swatch.kt │ │ │ │ ├── Symbol.kt │ │ │ │ ├── SyncArrowDown.kt │ │ │ │ ├── TableEye.kt │ │ │ │ ├── TagText.kt │ │ │ │ ├── Telegram.kt │ │ │ │ ├── TelevisionAmbientLight.kt │ │ │ │ ├── Tetradic.kt │ │ │ │ ├── TextFields.kt │ │ │ │ ├── TextSearch.kt │ │ │ │ ├── TextSticky.kt │ │ │ │ ├── Theme.kt │ │ │ │ ├── TimerEdit.kt │ │ │ │ ├── Titlecase.kt │ │ │ │ ├── Ton.kt │ │ │ │ ├── Tonality.kt │ │ │ │ ├── Toolbox.kt │ │ │ │ ├── TopLeft.kt │ │ │ │ ├── Tortoise.kt │ │ │ │ ├── Transparency.kt │ │ │ │ ├── Triadic.kt │ │ │ │ ├── Triangle.kt │ │ │ │ ├── USDT.kt │ │ │ │ ├── Unarchive.kt │ │ │ │ ├── Ungroup.kt │ │ │ │ ├── VectorPolyline.kt │ │ │ │ ├── VolunteerActivism.kt │ │ │ │ ├── WallpaperAlt.kt │ │ │ │ ├── WandShine.kt │ │ │ │ ├── WandStars.kt │ │ │ │ ├── Watermark.kt │ │ │ │ ├── Webp.kt │ │ │ │ ├── WebpBox.kt │ │ │ │ ├── Windows.kt │ │ │ │ └── ZigzagLine.kt │ │ │ └── shapes/ │ │ │ ├── ArrowShape.kt │ │ │ ├── BookmarkShape.kt │ │ │ ├── BurgerShape.kt │ │ │ ├── CloverShape.kt │ │ │ ├── DropletShape.kt │ │ │ ├── EggShape.kt │ │ │ ├── ExplosionShape.kt │ │ │ ├── HeartShape.kt │ │ │ ├── KotlinShape.kt │ │ │ ├── MapShape.kt │ │ │ ├── MaterialStarShape.kt │ │ │ ├── MorphShape.kt │ │ │ ├── OctagonShape.kt │ │ │ ├── OvalShape.kt │ │ │ ├── PathShape.kt │ │ │ ├── PentagonShape.kt │ │ │ ├── PillShape.kt │ │ │ ├── ShieldShape.kt │ │ │ ├── ShurikenShape.kt │ │ │ ├── SimpleHeartShape.kt │ │ │ ├── SmallMaterialStarShape.kt │ │ │ └── SquircleShape.kt │ │ └── res/ │ │ ├── drawable/ │ │ │ ├── app_registration_24px.xml │ │ │ ├── ic_24_barcode_scanner.xml │ │ │ ├── ic_launcher_foreground.xml │ │ │ ├── ic_launcher_monochrome_24.xml │ │ │ ├── ic_logo_animated.xml │ │ │ ├── ic_notification_icon.xml │ │ │ ├── image_to_text_outlined.xml │ │ │ ├── mobile_screenshot.xml │ │ │ ├── multiple_image_edit.xml │ │ │ ├── outline_colorize_24.xml │ │ │ ├── outline_drag_handle_24.xml │ │ │ ├── palette_swatch_outlined.xml │ │ │ ├── rounded_document_scanner_24.xml │ │ │ ├── rounded_qr_code_scanner_24.xml │ │ │ └── shape_find_in_file.xml │ │ ├── drawable-v31/ │ │ │ └── ic_logo_animated.xml │ │ ├── mipmap-anydpi-v26/ │ │ │ ├── ic_launcher.xml │ │ │ └── ic_launcher_round.xml │ │ ├── raw/ │ │ │ └── keep.xml │ │ ├── values/ │ │ │ ├── arrays.xml │ │ │ ├── bools.xml │ │ │ ├── colors.xml │ │ │ ├── ic_launcher_background.xml │ │ │ ├── strings.xml │ │ │ └── themes.xml │ │ ├── values-ar/ │ │ │ └── strings.xml │ │ ├── values-be/ │ │ │ └── strings.xml │ │ ├── values-bn/ │ │ │ └── strings.xml │ │ ├── values-ca/ │ │ │ └── strings.xml │ │ ├── values-cs/ │ │ │ └── strings.xml │ │ ├── values-da/ │ │ │ └── strings.xml │ │ ├── values-de/ │ │ │ └── strings.xml │ │ ├── values-es/ │ │ │ └── strings.xml │ │ ├── values-et/ │ │ │ └── strings.xml │ │ ├── values-eu/ │ │ │ └── strings.xml │ │ ├── values-fa/ │ │ │ └── strings.xml │ │ ├── values-fi/ │ │ │ └── strings.xml │ │ ├── values-fil/ │ │ │ └── strings.xml │ │ ├── values-fr/ │ │ │ └── strings.xml │ │ ├── values-hi/ │ │ │ └── strings.xml │ │ ├── values-hu/ │ │ │ └── strings.xml │ │ ├── values-in/ │ │ │ └── strings.xml │ │ ├── values-it/ │ │ │ └── strings.xml │ │ ├── values-iw/ │ │ │ └── strings.xml │ │ ├── values-ja/ │ │ │ └── strings.xml │ │ ├── values-kk/ │ │ │ └── strings.xml │ │ ├── values-ko/ │ │ │ └── strings.xml │ │ ├── values-lt/ │ │ │ └── strings.xml │ │ ├── values-mr/ │ │ │ └── strings.xml │ │ ├── values-night/ │ │ │ └── colors.xml │ │ ├── values-night-v31/ │ │ │ └── colors.xml │ │ ├── values-nl/ │ │ │ └── strings.xml │ │ ├── values-pa/ │ │ │ └── strings.xml │ │ ├── values-pl/ │ │ │ └── strings.xml │ │ ├── values-pt-rBR/ │ │ │ └── strings.xml │ │ ├── values-ro/ │ │ │ └── strings.xml │ │ ├── values-ru/ │ │ │ └── strings.xml │ │ ├── values-si/ │ │ │ └── strings.xml │ │ ├── values-sk/ │ │ │ └── strings.xml │ │ ├── values-sr/ │ │ │ └── strings.xml │ │ ├── values-sv/ │ │ │ └── strings.xml │ │ ├── values-ta/ │ │ │ └── strings.xml │ │ ├── values-te/ │ │ │ └── strings.xml │ │ ├── values-th/ │ │ │ └── strings.xml │ │ ├── values-tr/ │ │ │ └── strings.xml │ │ ├── values-ug/ │ │ │ └── strings.xml │ │ ├── values-uk/ │ │ │ └── strings.xml │ │ ├── values-v26/ │ │ │ └── bools.xml │ │ ├── values-v31/ │ │ │ └── colors.xml │ │ ├── values-vi/ │ │ │ └── strings.xml │ │ ├── values-zh-rCN/ │ │ │ └── strings.xml │ │ ├── values-zh-rTW/ │ │ │ └── strings.xml │ │ └── xml/ │ │ ├── backup_rules.xml │ │ ├── data_extraction_rules.xml │ │ └── file_paths.xml │ ├── settings/ │ │ ├── .gitignore │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── main/ │ │ ├── AndroidManifest.xml │ │ └── java/ │ │ └── com/ │ │ └── t8rin/ │ │ └── imagetoolbox/ │ │ └── core/ │ │ └── settings/ │ │ ├── di/ │ │ │ └── SettingsStateEntryPoint.kt │ │ ├── domain/ │ │ │ ├── SettingsInteractor.kt │ │ │ ├── SettingsManager.kt │ │ │ ├── SettingsProvider.kt │ │ │ ├── SimpleSettingsInteractor.kt │ │ │ └── model/ │ │ │ ├── ColorHarmonizer.kt │ │ │ ├── CopyToClipboardMode.kt │ │ │ ├── DomainFontFamily.kt │ │ │ ├── FastSettingsSide.kt │ │ │ ├── FilenameBehavior.kt │ │ │ ├── FlingType.kt │ │ │ ├── NightMode.kt │ │ │ ├── OneTimeSaveLocation.kt │ │ │ ├── SettingsState.kt │ │ │ ├── ShapeType.kt │ │ │ ├── SliderType.kt │ │ │ ├── SnowfallMode.kt │ │ │ └── SwitchType.kt │ │ └── presentation/ │ │ ├── model/ │ │ │ ├── EditPresetsController.kt │ │ │ ├── IconShape.kt │ │ │ ├── PicturePickerMode.kt │ │ │ ├── Setting.kt │ │ │ ├── SettingsGroup.kt │ │ │ ├── UiFontFamily.kt │ │ │ └── UiSettingsState.kt │ │ ├── provider/ │ │ │ └── LocalSettingsState.kt │ │ └── utils/ │ │ └── RoundedPolygonUtils.kt │ ├── ui/ │ │ ├── .gitignore │ │ ├── build.gradle.kts │ │ └── src/ │ │ ├── foss/ │ │ │ └── java/ │ │ │ └── com/ │ │ │ └── t8rin/ │ │ │ └── imagetoolbox/ │ │ │ └── core/ │ │ │ └── ui/ │ │ │ ├── utils/ │ │ │ │ ├── content_pickers/ │ │ │ │ │ └── DocumentScannerImpl.kt │ │ │ │ └── helper/ │ │ │ │ └── ReviewHandlerImpl.kt │ │ │ └── widget/ │ │ │ └── sheets/ │ │ │ └── UpdateSheetImpl.kt │ │ ├── main/ │ │ │ ├── AndroidManifest.xml │ │ │ └── kotlin/ │ │ │ └── com/ │ │ │ └── t8rin/ │ │ │ └── imagetoolbox/ │ │ │ └── core/ │ │ │ └── ui/ │ │ │ ├── theme/ │ │ │ │ ├── Color.kt │ │ │ │ ├── Motion.kt │ │ │ │ ├── Theme.kt │ │ │ │ ├── ThemePreview.kt │ │ │ │ └── Type.kt │ │ │ ├── transformation/ │ │ │ │ └── ImageInfoTransformation.kt │ │ │ ├── utils/ │ │ │ │ ├── BaseComponent.kt │ │ │ │ ├── ComposeActivity.kt │ │ │ │ ├── ComposeApplication.kt │ │ │ │ ├── animation/ │ │ │ │ │ ├── Animate.kt │ │ │ │ │ ├── Animations.kt │ │ │ │ │ ├── CombinedMutableInteractionSource.kt │ │ │ │ │ └── Easing.kt │ │ │ │ ├── capturable/ │ │ │ │ │ ├── Capturable.kt │ │ │ │ │ ├── CaptureController.kt │ │ │ │ │ └── impl/ │ │ │ │ │ ├── CapturableNew.kt │ │ │ │ │ └── CapturableOld.kt │ │ │ │ ├── confetti/ │ │ │ │ │ ├── ConfettiHostState.kt │ │ │ │ │ └── Particles.kt │ │ │ │ ├── content_pickers/ │ │ │ │ │ ├── BarcodeScanner.kt │ │ │ │ │ ├── ContactPicker.kt │ │ │ │ │ ├── DocumentScanner.kt │ │ │ │ │ ├── FileMaker.kt │ │ │ │ │ ├── FilePicker.kt │ │ │ │ │ ├── FolderPicker.kt │ │ │ │ │ ├── ImagePicker.kt │ │ │ │ │ ├── ResultLauncher.kt │ │ │ │ │ └── Scanner.kt │ │ │ │ ├── helper/ │ │ │ │ │ ├── ActivityUtils.kt │ │ │ │ │ ├── AppToastHost.kt │ │ │ │ │ ├── BlendingModeExt.kt │ │ │ │ │ ├── Clipboard.kt │ │ │ │ │ ├── ClipboardUtils.kt │ │ │ │ │ ├── CoilUtils.kt │ │ │ │ │ ├── ColorUtils.kt │ │ │ │ │ ├── CompositionLocalUtils.kt │ │ │ │ │ ├── ContextUtils.kt │ │ │ │ │ ├── DensityUtils.kt │ │ │ │ │ ├── DeviceInfo.kt │ │ │ │ │ ├── DrawUtils.kt │ │ │ │ │ ├── HandleDeeplinks.kt │ │ │ │ │ ├── HandlerUtils.kt │ │ │ │ │ ├── ImageUtils.kt │ │ │ │ │ ├── IntentUtils.kt │ │ │ │ │ ├── LazyUtils.kt │ │ │ │ │ ├── LinkUtils.kt │ │ │ │ │ ├── LocalFilterPreviewModel.kt │ │ │ │ │ ├── LocaleConfigCompat.kt │ │ │ │ │ ├── PaddingUtils.kt │ │ │ │ │ ├── PredictiveBackObserver.kt │ │ │ │ │ ├── Preview.kt │ │ │ │ │ ├── Rect.kt │ │ │ │ │ ├── ReviewHandler.kt │ │ │ │ │ ├── Ripple.kt │ │ │ │ │ ├── SafeUriHandler.kt │ │ │ │ │ ├── SaveResultHandler.kt │ │ │ │ │ ├── ScanResult.kt │ │ │ │ │ └── image_vector/ │ │ │ │ │ ├── DrawCache.kt │ │ │ │ │ ├── GroupComponent.kt │ │ │ │ │ ├── ImageVectorUtils.kt │ │ │ │ │ ├── PathComponent.kt │ │ │ │ │ ├── VNode.kt │ │ │ │ │ ├── VectorComponent.kt │ │ │ │ │ └── VectorPainter.kt │ │ │ │ ├── navigation/ │ │ │ │ │ ├── Decompose.kt │ │ │ │ │ ├── Screen.kt │ │ │ │ │ └── ScreenUtils.kt │ │ │ │ ├── painter/ │ │ │ │ │ ├── CenterCropPainter.kt │ │ │ │ │ └── RoundCornersPainter.kt │ │ │ │ ├── permission/ │ │ │ │ │ ├── PermissionResult.kt │ │ │ │ │ ├── PermissionStatus.kt │ │ │ │ │ └── PermissionUtils.kt │ │ │ │ ├── provider/ │ │ │ │ │ ├── ImageToolboxCompositionLocals.kt │ │ │ │ │ ├── LocalComponentActivity.kt │ │ │ │ │ ├── LocalContainerShape.kt │ │ │ │ │ ├── LocalKeepAliveService.kt │ │ │ │ │ ├── LocalMetadataProvider.kt │ │ │ │ │ ├── LocalResourceManager.kt │ │ │ │ │ ├── LocalScreenSize.kt │ │ │ │ │ └── LocalWindowSizeClass.kt │ │ │ │ └── state/ │ │ │ │ ├── ObjectSaverDelegate.kt │ │ │ │ └── Update.kt │ │ │ └── widget/ │ │ │ ├── AdaptiveBottomScaffoldLayoutScreen.kt │ │ │ ├── AdaptiveLayoutScreen.kt │ │ │ ├── buttons/ │ │ │ │ ├── BottomButtonsBlock.kt │ │ │ │ ├── CompareButton.kt │ │ │ │ ├── EraseModeButton.kt │ │ │ │ ├── MediaCheckBox.kt │ │ │ │ ├── PagerScrollPanel.kt │ │ │ │ ├── PanModeButton.kt │ │ │ │ ├── ShareButton.kt │ │ │ │ ├── ShowOriginalButton.kt │ │ │ │ ├── SupportingButton.kt │ │ │ │ └── ZoomButton.kt │ │ │ ├── color_picker/ │ │ │ │ ├── AvailableColorTuplesSheet.kt │ │ │ │ ├── ColorInfo.kt │ │ │ │ ├── ColorPicker.kt │ │ │ │ ├── ColorPickerSheet.kt │ │ │ │ ├── ColorSelection.kt │ │ │ │ ├── ColorSelectionRow.kt │ │ │ │ ├── ColorTupleDefaults.kt │ │ │ │ ├── ColorTuplePicker.kt │ │ │ │ ├── ColorTuplePreview.kt │ │ │ │ └── RecentAndFavoriteColorsCard.kt │ │ │ ├── controls/ │ │ │ │ ├── FileReorderVerticalList.kt │ │ │ │ ├── FormatExifWarning.kt │ │ │ │ ├── IcoSizeWarning.kt │ │ │ │ ├── ImageReorderCarousel.kt │ │ │ │ ├── ImageTransformBar.kt │ │ │ │ ├── OOMWarning.kt │ │ │ │ ├── ResizeImageField.kt │ │ │ │ ├── SaveExifWidget.kt │ │ │ │ ├── ScaleSmallImagesToLargeToggle.kt │ │ │ │ ├── SortButton.kt │ │ │ │ ├── page/ │ │ │ │ │ ├── PageInputDialog.kt │ │ │ │ │ ├── PageInputField.kt │ │ │ │ │ ├── PageSelectionItem.kt │ │ │ │ │ └── PagesSelectionParser.kt │ │ │ │ ├── resize_group/ │ │ │ │ │ ├── ResizeTypeSelector.kt │ │ │ │ │ └── components/ │ │ │ │ │ ├── BlurRadiusSelector.kt │ │ │ │ │ └── UseBlurredBackgroundToggle.kt │ │ │ │ └── selection/ │ │ │ │ ├── AlphaSelector.kt │ │ │ │ ├── BlendingModeSelector.kt │ │ │ │ ├── ColorRowSelector.kt │ │ │ │ ├── DataSelector.kt │ │ │ │ ├── FontSelector.kt │ │ │ │ ├── HelperGridParamsSelector.kt │ │ │ │ ├── ImageFormatSelector.kt │ │ │ │ ├── ImageSelector.kt │ │ │ │ ├── MagnifierEnabledSelector.kt │ │ │ │ ├── PositionSelector.kt │ │ │ │ ├── PresetSelector.kt │ │ │ │ ├── QualitySelector.kt │ │ │ │ └── ScaleModeSelector.kt │ │ │ ├── dialogs/ │ │ │ │ ├── CalculatorDialog.kt │ │ │ │ ├── ExitWithoutSavingDialog.kt │ │ │ │ ├── LoadingDialog.kt │ │ │ │ ├── OneTimeImagePickingDialog.kt │ │ │ │ ├── OneTimeSaveLocationSelectionDialog.kt │ │ │ │ ├── PasswordRequestDialog.kt │ │ │ │ ├── ResetDialog.kt │ │ │ │ └── WantCancelLoadingDialog.kt │ │ │ ├── enhanced/ │ │ │ │ ├── EnhancedAlertDialog.kt │ │ │ │ ├── EnhancedBadge.kt │ │ │ │ ├── EnhancedButton.kt │ │ │ │ ├── EnhancedButtonGroup.kt │ │ │ │ ├── EnhancedCheckbox.kt │ │ │ │ ├── EnhancedChip.kt │ │ │ │ ├── EnhancedCircularProgressIndicator.kt │ │ │ │ ├── EnhancedDatePickerDialog.kt │ │ │ │ ├── EnhancedDropdownMenu.kt │ │ │ │ ├── EnhancedFlingBehavior.kt │ │ │ │ ├── EnhancedFloatingActionButton.kt │ │ │ │ ├── EnhancedHapticFeedback.kt │ │ │ │ ├── EnhancedIconButton.kt │ │ │ │ ├── EnhancedLoadingIndicator.kt │ │ │ │ ├── EnhancedModalBottomSheet.kt │ │ │ │ ├── EnhancedModalSheetDragHandle.kt │ │ │ │ ├── EnhancedNavigationBarItem.kt │ │ │ │ ├── EnhancedNavigationRailItem.kt │ │ │ │ ├── EnhancedRadioButton.kt │ │ │ │ ├── EnhancedRangeSliderItem.kt │ │ │ │ ├── EnhancedSlider.kt │ │ │ │ ├── EnhancedSliderItem.kt │ │ │ │ ├── EnhancedSwitch.kt │ │ │ │ ├── EnhancedToggleButton.kt │ │ │ │ ├── EnhancedTopAppBar.kt │ │ │ │ └── derivative/ │ │ │ │ └── OnlyAllowedSliderItem.kt │ │ │ ├── icon_shape/ │ │ │ │ └── IconShapeContainer.kt │ │ │ ├── image/ │ │ │ │ ├── AspectRatioSelector.kt │ │ │ │ ├── AspectRatios.kt │ │ │ │ ├── AutoFilePicker.kt │ │ │ │ ├── BadImageWidget.kt │ │ │ │ ├── HistogramChart.kt │ │ │ │ ├── ImageContainer.kt │ │ │ │ ├── ImageCounter.kt │ │ │ │ ├── ImageHeaderState.kt │ │ │ │ ├── ImageNotPickedWidget.kt │ │ │ │ ├── ImagePager.kt │ │ │ │ ├── ImagePreviewGrid.kt │ │ │ │ ├── ImageStickyHeader.kt │ │ │ │ ├── ImagesPreviewWithSelection.kt │ │ │ │ ├── MetadataPreviewButton.kt │ │ │ │ ├── Picture.kt │ │ │ │ ├── SimplePicture.kt │ │ │ │ ├── UrisCarousel.kt │ │ │ │ └── UrisPreview.kt │ │ │ ├── modifier/ │ │ │ │ ├── AdvancedShadow.kt │ │ │ │ ├── AlertDialogBorder.kt │ │ │ │ ├── AnimateContentSizeNoClip.kt │ │ │ │ ├── AutoCornersShape.kt │ │ │ │ ├── AutoElevatedBorder.kt │ │ │ │ ├── Blink.kt │ │ │ │ ├── Container.kt │ │ │ │ ├── ContiniousRoundedRectangle.kt │ │ │ │ ├── DetectSwipe.kt │ │ │ │ ├── DragHandler.kt │ │ │ │ ├── DrawHorizontalStroke.kt │ │ │ │ ├── FadingEdges.kt │ │ │ │ ├── HelperGrid.kt │ │ │ │ ├── LayoutCorners.kt │ │ │ │ ├── Line.kt │ │ │ │ ├── MaterialShadow.kt │ │ │ │ ├── MeshGradient.kt │ │ │ │ ├── NegativePadding.kt │ │ │ │ ├── ObservePointersCount.kt │ │ │ │ ├── Placholder.kt │ │ │ │ ├── PointerInput.kt │ │ │ │ ├── Pulsate.kt │ │ │ │ ├── RealisticSnowfall.kt │ │ │ │ ├── RotateAnimation.kt │ │ │ │ ├── ScaleOnTap.kt │ │ │ │ ├── ShapeDefaults.kt │ │ │ │ ├── Shimmer.kt │ │ │ │ ├── Tappable.kt │ │ │ │ ├── TransparencyChecker.kt │ │ │ │ └── WithModifier.kt │ │ │ ├── other/ │ │ │ │ ├── AnimatedBorder.kt │ │ │ │ ├── BoxAnimatedVisibility.kt │ │ │ │ ├── ColorWithNameItem.kt │ │ │ │ ├── DrawLockScreenOrientation.kt │ │ │ │ ├── EmojiItem.kt │ │ │ │ ├── ExpandableItem.kt │ │ │ │ ├── FeatureNotAvailableContent.kt │ │ │ │ ├── FontSelectionItem.kt │ │ │ │ ├── GradientEdge.kt │ │ │ │ ├── InfoContainer.kt │ │ │ │ ├── LinkPreviewCard.kt │ │ │ │ ├── LinkPreviewList.kt │ │ │ │ ├── QrPainter.kt │ │ │ │ ├── SearchBar.kt │ │ │ │ ├── SwipeToReveal.kt │ │ │ │ ├── ToastHost.kt │ │ │ │ └── TopAppBarEmoji.kt │ │ │ ├── palette_selection/ │ │ │ │ ├── PaletteMappings.kt │ │ │ │ ├── PaletteStyleSelection.kt │ │ │ │ └── PaletteStyleSelectionItem.kt │ │ │ ├── preferences/ │ │ │ │ ├── PreferenceItem.kt │ │ │ │ ├── PreferenceItemOverload.kt │ │ │ │ ├── PreferenceRow.kt │ │ │ │ ├── PreferenceRowSwitch.kt │ │ │ │ └── ScreenPreference.kt │ │ │ ├── saver/ │ │ │ │ ├── OneTimeEffect.kt │ │ │ │ └── Savers.kt │ │ │ ├── sheets/ │ │ │ │ ├── AddExifSheet.kt │ │ │ │ ├── DefaultUpdateSheet.kt │ │ │ │ ├── EditExifSheet.kt │ │ │ │ ├── EmojiSelectionSheet.kt │ │ │ │ ├── PickImageFromUrisSheet.kt │ │ │ │ ├── ProcessImagesPreferenceSheet.kt │ │ │ │ ├── UpdateSheet.kt │ │ │ │ └── ZoomModalSheet.kt │ │ │ ├── sliders/ │ │ │ │ ├── FancySlider.kt │ │ │ │ ├── HyperOSSlider.kt │ │ │ │ ├── M2Slider.kt │ │ │ │ ├── M3Slider.kt │ │ │ │ └── custom_slider/ │ │ │ │ ├── CustomRangeSlider.kt │ │ │ │ ├── CustomRangeSliderState.kt │ │ │ │ ├── CustomRangeSliderUtils.kt │ │ │ │ ├── CustomSlider.kt │ │ │ │ ├── CustomSliderColors.kt │ │ │ │ ├── CustomSliderDefaults.kt │ │ │ │ ├── CustomSliderRange.kt │ │ │ │ ├── CustomSliderState.kt │ │ │ │ └── CustomSliderUtils.kt │ │ │ ├── switches/ │ │ │ │ ├── CupertinoSwitch.kt │ │ │ │ ├── FluentSwitch.kt │ │ │ │ ├── HyperOSSwitch.kt │ │ │ │ ├── LiquidToggle.kt │ │ │ │ ├── M3Switch.kt │ │ │ │ ├── OneUISwitch.kt │ │ │ │ └── PixelSwitch.kt │ │ │ ├── text/ │ │ │ │ ├── AutoSizeText.kt │ │ │ │ ├── HtmlText.kt │ │ │ │ ├── IsKeyboardVisibleAsState.kt │ │ │ │ ├── Linkify.kt │ │ │ │ ├── Marquee.kt │ │ │ │ ├── OutlinedText.kt │ │ │ │ ├── PatternHighlightTransformation.kt │ │ │ │ ├── RoundedTextField.kt │ │ │ │ ├── TitleItem.kt │ │ │ │ └── TopAppBarTitle.kt │ │ │ ├── utils/ │ │ │ │ ├── AutoContentBasedColors.kt │ │ │ │ ├── AvailableHeight.kt │ │ │ │ ├── RememberRetainedLazyListState.kt │ │ │ │ └── ScreenList.kt │ │ │ └── value/ │ │ │ ├── ValueDialog.kt │ │ │ └── ValueText.kt │ │ └── market/ │ │ └── java/ │ │ └── com/ │ │ └── t8rin/ │ │ └── imagetoolbox/ │ │ └── core/ │ │ └── ui/ │ │ ├── utils/ │ │ │ ├── content_pickers/ │ │ │ │ └── DocumentScannerImpl.kt │ │ │ └── helper/ │ │ │ └── ReviewHandlerImpl.kt │ │ └── widget/ │ │ └── sheets/ │ │ └── UpdateSheetImpl.kt │ └── utils/ │ ├── .gitignore │ ├── build.gradle.kts │ └── src/ │ └── main/ │ ├── AndroidManifest.xml │ └── java/ │ └── com/ │ └── t8rin/ │ └── imagetoolbox/ │ └── core/ │ └── utils/ │ ├── AppContext.kt │ ├── QrType.kt │ ├── Typeface.kt │ ├── Update.kt │ ├── UriUtils.kt │ └── Zip.kt ├── fastlane/ │ └── metadata/ │ └── android/ │ ├── en-US/ │ │ ├── changelogs/ │ │ │ ├── 13.txt │ │ │ └── 16.txt │ │ ├── full_description.txt │ │ └── short_description.txt │ └── ru/ │ ├── full_description.txt │ └── short_description.txt ├── feature/ │ ├── ai-tools/ │ │ ├── .gitignore │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── main/ │ │ ├── AndroidManifest.xml │ │ └── java/ │ │ └── com/ │ │ └── t8rin/ │ │ └── imagetoolbox/ │ │ └── feature/ │ │ └── ai_tools/ │ │ ├── data/ │ │ │ ├── AiProcessor.kt │ │ │ ├── AndroidAiToolsRepository.kt │ │ │ └── model/ │ │ │ ├── ChunkInfo.kt │ │ │ └── ModelInfo.kt │ │ ├── di/ │ │ │ └── AiToolsModule.kt │ │ ├── domain/ │ │ │ ├── AiProgressListener.kt │ │ │ ├── AiToolsRepository.kt │ │ │ └── model/ │ │ │ ├── NeuralConstants.kt │ │ │ ├── NeuralModel.kt │ │ │ └── NeuralParams.kt │ │ └── presentation/ │ │ ├── AiToolsContent.kt │ │ ├── components/ │ │ │ ├── AiToolsControls.kt │ │ │ ├── DeleteModelDialog.kt │ │ │ ├── FilteredModels.kt │ │ │ ├── NeuralModelFilterSheet.kt │ │ │ ├── NeuralModelSelectionSheet.kt │ │ │ ├── NeuralModelSelector.kt │ │ │ ├── NeuralModelTypeResources.kt │ │ │ ├── NeuralModelsColumn.kt │ │ │ ├── NeuralSaveProgress.kt │ │ │ ├── NeuralSaveProgressDialog.kt │ │ │ └── Savers.kt │ │ └── screenLogic/ │ │ └── AiToolsComponent.kt │ ├── apng-tools/ │ │ ├── .gitignore │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── main/ │ │ ├── AndroidManifest.xml │ │ └── java/ │ │ └── com/ │ │ └── t8rin/ │ │ └── imagetoolbox/ │ │ └── feature/ │ │ └── apng_tools/ │ │ ├── data/ │ │ │ └── AndroidApngConverter.kt │ │ ├── di/ │ │ │ └── ApngToolsModule.kt │ │ ├── domain/ │ │ │ ├── ApngConverter.kt │ │ │ └── ApngParams.kt │ │ └── presentation/ │ │ ├── ApngToolsContent.kt │ │ ├── components/ │ │ │ └── ApngParamsSelector.kt │ │ └── screenLogic/ │ │ └── ApngToolsComponent.kt │ ├── ascii-art/ │ │ ├── .gitignore │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── main/ │ │ ├── AndroidManifest.xml │ │ └── java/ │ │ └── com/ │ │ └── t8rin/ │ │ └── imagetoolbox/ │ │ └── feature/ │ │ └── ascii_art/ │ │ ├── data/ │ │ │ └── AndroidAsciiConverter.kt │ │ ├── di/ │ │ │ └── AsciiArtModule.kt │ │ ├── domain/ │ │ │ └── AsciiConverter.kt │ │ └── presentation/ │ │ ├── AsciiArtContent.kt │ │ ├── components/ │ │ │ └── AsciiArtControls.kt │ │ └── screenLogic/ │ │ └── AsciiArtComponent.kt │ ├── audio-cover-extractor/ │ │ ├── .gitignore │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── main/ │ │ ├── AndroidManifest.xml │ │ └── java/ │ │ └── com/ │ │ └── t8rin/ │ │ └── imagetoolbox/ │ │ └── feature/ │ │ └── audio_cover_extractor/ │ │ ├── data/ │ │ │ └── AndroidAudioCoverRetriever.kt │ │ ├── di/ │ │ │ └── AudioCoverExtractorModule.kt │ │ ├── domain/ │ │ │ ├── AudioCoverRetriever.kt │ │ │ └── model/ │ │ │ └── AudioCoverResult.kt │ │ └── ui/ │ │ ├── AudioCoverExtractorContent.kt │ │ ├── components/ │ │ │ └── AudioWithCover.kt │ │ └── screenLogic/ │ │ └── AudioCoverExtractorComponent.kt │ ├── base64-tools/ │ │ ├── .gitignore │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── main/ │ │ ├── AndroidManifest.xml │ │ └── java/ │ │ └── com/ │ │ └── t8rin/ │ │ └── imagetoolbox/ │ │ └── feature/ │ │ └── base64_tools/ │ │ ├── data/ │ │ │ └── AndroidBase64Converter.kt │ │ ├── di/ │ │ │ └── Base64ToolsModule.kt │ │ ├── domain/ │ │ │ └── Base64Converter.kt │ │ └── presentation/ │ │ ├── Base64ToolsContent.kt │ │ ├── components/ │ │ │ └── Base64ToolsTiles.kt │ │ └── screenLogic/ │ │ └── Base64ToolsComponent.kt │ ├── checksum-tools/ │ │ ├── .gitignore │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── main/ │ │ ├── AndroidManifest.xml │ │ └── java/ │ │ └── com/ │ │ └── t8rin/ │ │ └── imagetoolbox/ │ │ └── feature/ │ │ └── checksum_tools/ │ │ ├── data/ │ │ │ └── AndroidChecksumManager.kt │ │ ├── di/ │ │ │ └── ChecksumToolsModule.kt │ │ ├── domain/ │ │ │ ├── ChecksumManager.kt │ │ │ └── ChecksumSource.kt │ │ └── presentation/ │ │ ├── ChecksumToolsContent.kt │ │ ├── components/ │ │ │ ├── ChecksumEnterField.kt │ │ │ ├── ChecksumPage.kt │ │ │ ├── ChecksumPreviewField.kt │ │ │ ├── ChecksumResultCard.kt │ │ │ ├── ChecksumToolsTabs.kt │ │ │ ├── UriWithHashItem.kt │ │ │ └── pages/ │ │ │ ├── CalculateFromTextPage.kt │ │ │ ├── CalculateFromUriPage.kt │ │ │ ├── CompareWithUriPage.kt │ │ │ └── CompareWithUrisPage.kt │ │ └── screenLogic/ │ │ └── ChecksumToolsComponent.kt │ ├── cipher/ │ │ ├── .gitignore │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── main/ │ │ ├── AndroidManifest.xml │ │ └── java/ │ │ └── com/ │ │ └── t8rin/ │ │ └── imagetoolbox/ │ │ └── feature/ │ │ └── cipher/ │ │ ├── data/ │ │ │ ├── AndroidCryptographyManager.kt │ │ │ └── AndroidRandomStringGenerator.kt │ │ ├── di/ │ │ │ └── CipherModule.kt │ │ ├── domain/ │ │ │ ├── CryptographyManager.kt │ │ │ └── WrongKeyException.kt │ │ └── presentation/ │ │ ├── CipherContent.kt │ │ ├── components/ │ │ │ ├── CipherControls.kt │ │ │ └── CipherTipSheet.kt │ │ └── screenLogic/ │ │ └── CipherComponent.kt │ ├── collage-maker/ │ │ ├── .gitignore │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── main/ │ │ ├── AndroidManifest.xml │ │ └── java/ │ │ └── com/ │ │ └── t8rin/ │ │ └── imagetoolbox/ │ │ └── collage_maker/ │ │ └── presentation/ │ │ ├── CollageMakerContent.kt │ │ ├── components/ │ │ │ └── CollageParams.kt │ │ └── screenLogic/ │ │ └── CollageMakerComponent.kt │ ├── color-library/ │ │ ├── .gitignore │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── main/ │ │ ├── AndroidManifest.xml │ │ └── java/ │ │ └── com/ │ │ └── t8rin/ │ │ └── imagetoolbox/ │ │ └── color_library/ │ │ └── presentation/ │ │ ├── ColorLibraryContent.kt │ │ ├── components/ │ │ │ └── FavoriteColors.kt │ │ └── screenLogic/ │ │ └── ColorLibraryComponent.kt │ ├── color-tools/ │ │ ├── .gitignore │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── main/ │ │ ├── AndroidManifest.xml │ │ └── java/ │ │ └── com/ │ │ └── t8rin/ │ │ └── imagetoolbox/ │ │ └── color_tools/ │ │ └── presentation/ │ │ ├── ColorToolsContent.kt │ │ ├── components/ │ │ │ ├── ColorHarmonies.kt │ │ │ ├── ColorHarmoniesUtils.kt │ │ │ ├── ColorHistogram.kt │ │ │ ├── ColorInfo.kt │ │ │ ├── ColorInfoDisplay.kt │ │ │ ├── ColorMixing.kt │ │ │ ├── ColorMixingUtils.kt │ │ │ └── ColorShading.kt │ │ └── screenLogic/ │ │ └── ColorToolsComponent.kt │ ├── compare/ │ │ ├── .gitignore │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── main/ │ │ ├── AndroidManifest.xml │ │ └── java/ │ │ └── com/ │ │ └── t8rin/ │ │ └── imagetoolbox/ │ │ └── feature/ │ │ └── compare/ │ │ └── presentation/ │ │ ├── CompareContent.kt │ │ ├── components/ │ │ │ ├── CompareLabel.kt │ │ │ ├── CompareScreenContent.kt │ │ │ ├── CompareScreenContentImpl.kt │ │ │ ├── CompareScreenTopAppBar.kt │ │ │ ├── CompareSelectionButtons.kt │ │ │ ├── CompareShareSheet.kt │ │ │ ├── CompareSheet.kt │ │ │ ├── CompareType.kt │ │ │ ├── PixelByPixelCompareState.kt │ │ │ ├── beforeafter/ │ │ │ │ ├── BeforeAfterLayout.kt │ │ │ │ ├── BeforeAfterLayoutImpl.kt │ │ │ │ ├── ContentOrder.kt │ │ │ │ ├── DefaultOverlay.kt │ │ │ │ ├── DimensionSubcomposeLayout.kt │ │ │ │ ├── DimensionUtil.kt │ │ │ │ ├── Label.kt │ │ │ │ └── SlotsEnum.kt │ │ │ └── model/ │ │ │ └── CompareData.kt │ │ └── screenLogic/ │ │ └── CompareComponent.kt │ ├── crop/ │ │ ├── .gitignore │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── main/ │ │ ├── AndroidManifest.xml │ │ ├── java/ │ │ │ └── com/ │ │ │ └── t8rin/ │ │ │ └── imagetoolbox/ │ │ │ └── feature/ │ │ │ └── crop/ │ │ │ └── presentation/ │ │ │ ├── CropContent.kt │ │ │ ├── components/ │ │ │ │ ├── CoercePointsToImageBoundsToggle.kt │ │ │ │ ├── CropMaskSelection.kt │ │ │ │ ├── CropRotationSelector.kt │ │ │ │ ├── CropType.kt │ │ │ │ ├── Cropper.kt │ │ │ │ ├── DefaultOutlineProperties.kt │ │ │ │ └── FreeCornersCropToggle.kt │ │ │ └── screenLogic/ │ │ │ └── CropComponent.kt │ │ └── res/ │ │ └── values/ │ │ └── dimens.xml │ ├── delete-exif/ │ │ ├── .gitignore │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── main/ │ │ ├── AndroidManifest.xml │ │ └── java/ │ │ └── com/ │ │ └── t8rin/ │ │ └── imagetoolbox/ │ │ └── feature/ │ │ └── delete_exif/ │ │ └── presentation/ │ │ ├── DeleteExifContent.kt │ │ └── screenLogic/ │ │ └── DeleteExifComponent.kt │ ├── document-scanner/ │ │ ├── .gitignore │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── main/ │ │ ├── AndroidManifest.xml │ │ └── java/ │ │ └── com/ │ │ └── t8rin/ │ │ └── imagetoolbox/ │ │ └── feature/ │ │ └── document_scanner/ │ │ └── presentation/ │ │ ├── DocumentScannerContent.kt │ │ └── screenLogic/ │ │ └── DocumentScannerComponent.kt │ ├── draw/ │ │ ├── .gitignore │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── main/ │ │ ├── AndroidManifest.xml │ │ └── java/ │ │ └── com/ │ │ └── t8rin/ │ │ └── imagetoolbox/ │ │ └── feature/ │ │ └── draw/ │ │ ├── data/ │ │ │ ├── AndroidImageDrawApplier.kt │ │ │ └── utils/ │ │ │ └── DrawRepeatedPath.kt │ │ ├── di/ │ │ │ └── DrawModule.kt │ │ ├── domain/ │ │ │ ├── DrawBehavior.kt │ │ │ ├── DrawLineStyle.kt │ │ │ ├── DrawMode.kt │ │ │ ├── DrawOnBackgroundParams.kt │ │ │ ├── DrawPathMode.kt │ │ │ ├── ImageDrawApplier.kt │ │ │ ├── PathPaint.kt │ │ │ └── Warp.kt │ │ └── presentation/ │ │ ├── DrawContent.kt │ │ ├── components/ │ │ │ ├── BitmapDrawer.kt │ │ │ ├── BrushSoftnessSelector.kt │ │ │ ├── DrawColorSelector.kt │ │ │ ├── DrawLineStyleSelector.kt │ │ │ ├── DrawModeSelector.kt │ │ │ ├── DrawPathModeSelector.kt │ │ │ ├── LineWidthSelector.kt │ │ │ ├── OpenColorPickerCard.kt │ │ │ ├── PixelSizeSelector.kt │ │ │ ├── UiPathPaint.kt │ │ │ ├── UiPathPaintCanvasAction.kt │ │ │ ├── controls/ │ │ │ │ ├── DrawContentControls.kt │ │ │ │ ├── DrawContentNoDataControls.kt │ │ │ │ └── DrawContentSecondaryControls.kt │ │ │ ├── element/ │ │ │ │ ├── ArrowParamsSelector.kt │ │ │ │ ├── CustomPathEffectParamsSelector.kt │ │ │ │ ├── DrawPathModeInfoSheet.kt │ │ │ │ ├── FloodFillParamsSelector.kt │ │ │ │ ├── ImageParamsSelector.kt │ │ │ │ ├── OutlinedFillColorSelector.kt │ │ │ │ ├── OvalParamsSelector.kt │ │ │ │ ├── PixelationParamsSelector.kt │ │ │ │ ├── PolygonParamsSelector.kt │ │ │ │ ├── PrivacyBlurParamsSelector.kt │ │ │ │ ├── RectParamsSelector.kt │ │ │ │ ├── SpotHealParamsSelector.kt │ │ │ │ ├── SprayParamsSelector.kt │ │ │ │ ├── StarParamsSelector.kt │ │ │ │ ├── TextParamsSelector.kt │ │ │ │ ├── TriangleParamsSelector.kt │ │ │ │ └── WarpParamsSelector.kt │ │ │ └── utils/ │ │ │ ├── BitmapDrawerPreview.kt │ │ │ ├── DrawPathEffectPreview.kt │ │ │ ├── DrawPathModeUtils.kt │ │ │ ├── DrawRepeatedPath.kt │ │ │ ├── DrawUtils.kt │ │ │ ├── FloodFill.kt │ │ │ ├── MotionEvent.kt │ │ │ ├── PathHelper.kt │ │ │ └── PointerDraw.kt │ │ └── screenLogic/ │ │ └── DrawComponent.kt │ ├── easter-egg/ │ │ ├── .gitignore │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── main/ │ │ ├── AndroidManifest.xml │ │ └── java/ │ │ └── com/ │ │ └── t8rin/ │ │ └── imagetoolbox/ │ │ └── feature/ │ │ └── easter_egg/ │ │ └── presentation/ │ │ ├── EasterEggContent.kt │ │ └── screenLogic/ │ │ └── EasterEggComponent.kt │ ├── edit-exif/ │ │ ├── .gitignore │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── main/ │ │ ├── AndroidManifest.xml │ │ └── java/ │ │ └── com/ │ │ └── t8rin/ │ │ └── imagetoolbox/ │ │ └── feature/ │ │ └── edit_exif/ │ │ └── presentation/ │ │ ├── EditExifContent.kt │ │ └── screenLogic/ │ │ └── EditExifComponent.kt │ ├── erase-background/ │ │ ├── .gitignore │ │ ├── build.gradle.kts │ │ └── src/ │ │ ├── foss/ │ │ │ └── java/ │ │ │ └── com/ │ │ │ └── t8rin/ │ │ │ └── imagetoolbox/ │ │ │ └── feature/ │ │ │ └── erase_background/ │ │ │ └── data/ │ │ │ └── backend/ │ │ │ └── MlKitBackgroundRemoverBackend.kt │ │ ├── main/ │ │ │ ├── AndroidManifest.xml │ │ │ └── java/ │ │ │ └── com/ │ │ │ └── t8rin/ │ │ │ └── imagetoolbox/ │ │ │ └── feature/ │ │ │ └── erase_background/ │ │ │ ├── data/ │ │ │ │ ├── AndroidAutoBackgroundRemover.kt │ │ │ │ ├── AndroidAutoBackgroundRemoverBackendFactory.kt │ │ │ │ └── backend/ │ │ │ │ └── GenericBackgroundRemoverBackend.kt │ │ │ ├── di/ │ │ │ │ └── EraseBackgroundModule.kt │ │ │ ├── domain/ │ │ │ │ ├── AutoBackgroundRemover.kt │ │ │ │ ├── AutoBackgroundRemoverBackend.kt │ │ │ │ ├── AutoBackgroundRemoverBackendFactory.kt │ │ │ │ └── model/ │ │ │ │ └── BgModelType.kt │ │ │ └── presentation/ │ │ │ ├── EraseBackgroundContent.kt │ │ │ ├── components/ │ │ │ │ ├── AutoEraseBackgroundCard.kt │ │ │ │ ├── BitmapEraser.kt │ │ │ │ ├── OriginalImagePreviewAlphaSelector.kt │ │ │ │ ├── RecoverModeCard.kt │ │ │ │ └── TrimImageToggle.kt │ │ │ └── screenLogic/ │ │ │ └── EraseBackgroundComponent.kt │ │ └── market/ │ │ └── java/ │ │ └── com/ │ │ └── t8rin/ │ │ └── imagetoolbox/ │ │ └── feature/ │ │ └── erase_background/ │ │ └── data/ │ │ └── backend/ │ │ └── MlKitBackgroundRemoverBackend.kt │ ├── filters/ │ │ ├── .gitignore │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── main/ │ │ ├── AndroidManifest.xml │ │ └── java/ │ │ └── com/ │ │ └── t8rin/ │ │ └── imagetoolbox/ │ │ └── feature/ │ │ └── filters/ │ │ ├── data/ │ │ │ ├── AndroidFilterMaskApplier.kt │ │ │ ├── AndroidFilterParamsInteractor.kt │ │ │ ├── AndroidFilterProvider.kt │ │ │ ├── model/ │ │ │ │ ├── AcesFilmicToneMappingFilter.kt │ │ │ │ ├── AcesHillToneMappingFilter.kt │ │ │ │ ├── AchromatomalyFilter.kt │ │ │ │ ├── AchromatopsiaFilter.kt │ │ │ │ ├── AldridgeFilter.kt │ │ │ │ ├── AmatorkaFilter.kt │ │ │ │ ├── AnaglyphFilter.kt │ │ │ │ ├── AnisotropicDiffusionFilter.kt │ │ │ │ ├── ArcFilter.kt │ │ │ │ ├── AsciiFilter.kt │ │ │ │ ├── AtkinsonDitheringFilter.kt │ │ │ │ ├── AutoCropFilter.kt │ │ │ │ ├── AutoPerspectiveFilter.kt │ │ │ │ ├── AutoRemoveRedEyesFilter.kt │ │ │ │ ├── AutumnTonesFilter.kt │ │ │ │ ├── AverageDistanceFilter.kt │ │ │ │ ├── BayerEightDitheringFilter.kt │ │ │ │ ├── BayerFourDitheringFilter.kt │ │ │ │ ├── BayerThreeDitheringFilter.kt │ │ │ │ ├── BayerTwoDitheringFilter.kt │ │ │ │ ├── BilaterialBlurFilter.kt │ │ │ │ ├── BlackAndWhiteFilter.kt │ │ │ │ ├── BlackHatFilter.kt │ │ │ │ ├── BleachBypassFilter.kt │ │ │ │ ├── BlockGlitchFilter.kt │ │ │ │ ├── BloomFilter.kt │ │ │ │ ├── BokehFilter.kt │ │ │ │ ├── BorderFrameFilter.kt │ │ │ │ ├── BoxBlurFilter.kt │ │ │ │ ├── BrightnessFilter.kt │ │ │ │ ├── BrowniFilter.kt │ │ │ │ ├── BulgeDistortionFilter.kt │ │ │ │ ├── BurkesDitheringFilter.kt │ │ │ │ ├── CGAColorSpaceFilter.kt │ │ │ │ ├── CandlelightFilter.kt │ │ │ │ ├── CannyFilter.kt │ │ │ │ ├── CaramelDarknessFilter.kt │ │ │ │ ├── CelluloidFilter.kt │ │ │ │ ├── ChannelMixFilter.kt │ │ │ │ ├── CircleBlurFilter.kt │ │ │ │ ├── CirclePixelationFilter.kt │ │ │ │ ├── ClaheFilter.kt │ │ │ │ ├── ClaheHSLFilter.kt │ │ │ │ ├── ClaheHSVFilter.kt │ │ │ │ ├── ClaheJzazbzFilter.kt │ │ │ │ ├── ClaheLABFilter.kt │ │ │ │ ├── ClaheLUVFilter.kt │ │ │ │ ├── ClaheOklabFilter.kt │ │ │ │ ├── ClaheOklchFilter.kt │ │ │ │ ├── ClosingFilter.kt │ │ │ │ ├── Clustered2x2DitheringFilter.kt │ │ │ │ ├── Clustered4x4DitheringFilter.kt │ │ │ │ ├── Clustered8x8DitheringFilter.kt │ │ │ │ ├── CodaChromeFilter.kt │ │ │ │ ├── CoffeeFilter.kt │ │ │ │ ├── ColorAnomalyFilter.kt │ │ │ │ ├── ColorBalanceFilter.kt │ │ │ │ ├── ColorExplosionFilter.kt │ │ │ │ ├── ColorHalftoneFilter.kt │ │ │ │ ├── ColorMapFilter.kt │ │ │ │ ├── ColorMatrix3x3Filter.kt │ │ │ │ ├── ColorMatrix4x4Filter.kt │ │ │ │ ├── ColorOverlayFilter.kt │ │ │ │ ├── ColorPosterFilter.kt │ │ │ │ ├── ColorfulSwirlFilter.kt │ │ │ │ ├── ContourFilter.kt │ │ │ │ ├── ContrastFilter.kt │ │ │ │ ├── ConvexFilter.kt │ │ │ │ ├── Convolution3x3Filter.kt │ │ │ │ ├── CoolFilter.kt │ │ │ │ ├── CopyMoveDetectionFilter.kt │ │ │ │ ├── CropOrPerspectiveFilter.kt │ │ │ │ ├── CropToContentFilter.kt │ │ │ │ ├── CrossBlurFilter.kt │ │ │ │ ├── CrossPixelationFilter.kt │ │ │ │ ├── CrosshatchFilter.kt │ │ │ │ ├── CrtCurvatureFilter.kt │ │ │ │ ├── CrystallizeFilter.kt │ │ │ │ ├── CubeLutFilter.kt │ │ │ │ ├── CyberpunkFilter.kt │ │ │ │ ├── DeepPurpleFilter.kt │ │ │ │ ├── DehazeFilter.kt │ │ │ │ ├── DeskewFilter.kt │ │ │ │ ├── DespeckleFilter.kt │ │ │ │ ├── DeutaromalyFilter.kt │ │ │ │ ├── DeutaronotopiaFilter.kt │ │ │ │ ├── DiamondPixelationFilter.kt │ │ │ │ ├── DiffuseFilter.kt │ │ │ │ ├── DigitalCodeFilter.kt │ │ │ │ ├── DilationFilter.kt │ │ │ │ ├── DoGFilter.kt │ │ │ │ ├── DragoFilter.kt │ │ │ │ ├── DropBluesFilter.kt │ │ │ │ ├── EdgyAmberFilter.kt │ │ │ │ ├── ElectricGradientFilter.kt │ │ │ │ ├── EmbossFilter.kt │ │ │ │ ├── EnhancedCirclePixelationFilter.kt │ │ │ │ ├── EnhancedDiamondPixelationFilter.kt │ │ │ │ ├── EnhancedGlitchFilter.kt │ │ │ │ ├── EnhancedOilFilter.kt │ │ │ │ ├── EnhancedPixelationFilter.kt │ │ │ │ ├── EnhancedZoomBlurFilter.kt │ │ │ │ ├── EqualizeFilter.kt │ │ │ │ ├── EqualizeHistogramAdaptiveFilter.kt │ │ │ │ ├── EqualizeHistogramAdaptiveHSLFilter.kt │ │ │ │ ├── EqualizeHistogramAdaptiveHSVFilter.kt │ │ │ │ ├── EqualizeHistogramAdaptiveLABFilter.kt │ │ │ │ ├── EqualizeHistogramAdaptiveLUVFilter.kt │ │ │ │ ├── EqualizeHistogramFilter.kt │ │ │ │ ├── EqualizeHistogramHSVFilter.kt │ │ │ │ ├── EqualizeHistogramPixelationFilter.kt │ │ │ │ ├── ErodeFilter.kt │ │ │ │ ├── ErrorLevelAnalysisFilter.kt │ │ │ │ ├── ExposureFilter.kt │ │ │ │ ├── FallColorsFilter.kt │ │ │ │ ├── FalseColorFilter.kt │ │ │ │ ├── FalseFloydSteinbergDitheringFilter.kt │ │ │ │ ├── FantasyLandscapeFilter.kt │ │ │ │ ├── FastBilaterialBlurFilter.kt │ │ │ │ ├── FastBlurFilter.kt │ │ │ │ ├── FastGaussianBlur2DFilter.kt │ │ │ │ ├── FastGaussianBlur3DFilter.kt │ │ │ │ ├── FastGaussianBlur4DFilter.kt │ │ │ │ ├── FilmStock50Filter.kt │ │ │ │ ├── FloydSteinbergDitheringFilter.kt │ │ │ │ ├── FoggyNightFilter.kt │ │ │ │ ├── FractalGlassFilter.kt │ │ │ │ ├── FuturisticGradientFilter.kt │ │ │ │ ├── GammaFilter.kt │ │ │ │ ├── GaussianBlurFilter.kt │ │ │ │ ├── GaussianBoxBlurFilter.kt │ │ │ │ ├── GlassSphereRefractionFilter.kt │ │ │ │ ├── GlitchFilter.kt │ │ │ │ ├── GlitchVariantFilter.kt │ │ │ │ ├── GlowFilter.kt │ │ │ │ ├── GoldenForestFilter.kt │ │ │ │ ├── GoldenHourFilter.kt │ │ │ │ ├── GothamFilter.kt │ │ │ │ ├── GrainFilter.kt │ │ │ │ ├── GrayscaleFilter.kt │ │ │ │ ├── GreenSunFilter.kt │ │ │ │ ├── GreenishFilter.kt │ │ │ │ ├── HDRFilter.kt │ │ │ │ ├── HableFilmicToneMappingFilter.kt │ │ │ │ ├── HalftoneFilter.kt │ │ │ │ ├── HazeFilter.kt │ │ │ │ ├── HejlBurgessToneMappingFilter.kt │ │ │ │ ├── HighlightsAndShadowsFilter.kt │ │ │ │ ├── HorizontalWindStaggerFilter.kt │ │ │ │ ├── HotSummerFilter.kt │ │ │ │ ├── HueFilter.kt │ │ │ │ ├── JarvisJudiceNinkeDitheringFilter.kt │ │ │ │ ├── KaleidoscopeFilter.kt │ │ │ │ ├── KodakFilter.kt │ │ │ │ ├── KuwaharaFilter.kt │ │ │ │ ├── LUT512x512Filter.kt │ │ │ │ ├── LaplacianFilter.kt │ │ │ │ ├── LaplacianSimpleFilter.kt │ │ │ │ ├── LavenderDreamFilter.kt │ │ │ │ ├── LeftToRightDitheringFilter.kt │ │ │ │ ├── LemonadeLightFilter.kt │ │ │ │ ├── LensCorrectionFilter.kt │ │ │ │ ├── LinearBoxBlurFilter.kt │ │ │ │ ├── LinearFastGaussianBlurFilter.kt │ │ │ │ ├── LinearFastGaussianBlurNextFilter.kt │ │ │ │ ├── LinearGaussianBlurFilter.kt │ │ │ │ ├── LinearGaussianBoxBlurFilter.kt │ │ │ │ ├── LinearStackBlurFilter.kt │ │ │ │ ├── LinearTentBlurFilter.kt │ │ │ │ ├── LinearTiltShiftFilter.kt │ │ │ │ ├── LogarithmicToneMappingFilter.kt │ │ │ │ ├── LookupFilter.kt │ │ │ │ ├── LowPolyFilter.kt │ │ │ │ ├── LuminanceGradientFilter.kt │ │ │ │ ├── MarbleFilter.kt │ │ │ │ ├── MedianBlurFilter.kt │ │ │ │ ├── MicroMacroPixelationFilter.kt │ │ │ │ ├── MirrorFilter.kt │ │ │ │ ├── MissEtikateFilter.kt │ │ │ │ ├── MobiusFilter.kt │ │ │ │ ├── MoireFilter.kt │ │ │ │ ├── MonochromeFilter.kt │ │ │ │ ├── MorphologicalGradientFilter.kt │ │ │ │ ├── MotionBlurFilter.kt │ │ │ │ ├── NativeStackBlurFilter.kt │ │ │ │ ├── NegativeFilter.kt │ │ │ │ ├── NeonFilter.kt │ │ │ │ ├── NightMagicFilter.kt │ │ │ │ ├── NightVisionFilter.kt │ │ │ │ ├── NoiseFilter.kt │ │ │ │ ├── NonMaximumSuppressionFilter.kt │ │ │ │ ├── NucleusPixelationFilter.kt │ │ │ │ ├── OffsetFilter.kt │ │ │ │ ├── OilFilter.kt │ │ │ │ ├── OldTvFilter.kt │ │ │ │ ├── OpacityFilter.kt │ │ │ │ ├── OpeningFilter.kt │ │ │ │ ├── OrangeHazeFilter.kt │ │ │ │ ├── OrbitalPixelationFilter.kt │ │ │ │ ├── PaletteTransferFilter.kt │ │ │ │ ├── PaletteTransferVariantFilter.kt │ │ │ │ ├── PastelFilter.kt │ │ │ │ ├── PerlinDistortionFilter.kt │ │ │ │ ├── PinchFilter.kt │ │ │ │ ├── PinkDreamFilter.kt │ │ │ │ ├── PixelMeltFilter.kt │ │ │ │ ├── PixelationFilter.kt │ │ │ │ ├── PointillizeFilter.kt │ │ │ │ ├── PoissonBlurFilter.kt │ │ │ │ ├── PolarCoordinatesFilter.kt │ │ │ │ ├── PolaroidFilter.kt │ │ │ │ ├── PolkaDotFilter.kt │ │ │ │ ├── PopArtFilter.kt │ │ │ │ ├── PosterizeFilter.kt │ │ │ │ ├── ProtanopiaFilter.kt │ │ │ │ ├── ProtonomalyFilter.kt │ │ │ │ ├── PulseGridPixelationFilter.kt │ │ │ │ ├── PurpleMistFilter.kt │ │ │ │ ├── QuantizierFilter.kt │ │ │ │ ├── RGBFilter.kt │ │ │ │ ├── RadialTiltShiftFilter.kt │ │ │ │ ├── RadialWeavePixelationFilter.kt │ │ │ │ ├── RainbowWorldFilter.kt │ │ │ │ ├── RandomDitheringFilter.kt │ │ │ │ ├── RedSwirlFilter.kt │ │ │ │ ├── ReduceNoiseFilter.kt │ │ │ │ ├── RemoveColorFilter.kt │ │ │ │ ├── ReplaceColorFilter.kt │ │ │ │ ├── RetroYellowFilter.kt │ │ │ │ ├── RingBlurFilter.kt │ │ │ │ ├── RubberStampFilter.kt │ │ │ │ ├── SandPaintingFilter.kt │ │ │ │ ├── SaturationFilter.kt │ │ │ │ ├── SeamCarvingFilter.kt │ │ │ │ ├── SepiaFilter.kt │ │ │ │ ├── SharpenFilter.kt │ │ │ │ ├── ShuffleBlurFilter.kt │ │ │ │ ├── SideFadeFilter.kt │ │ │ │ ├── SierraDitheringFilter.kt │ │ │ │ ├── SierraLiteDitheringFilter.kt │ │ │ │ ├── SimpleOldTvFilter.kt │ │ │ │ ├── SimpleSketchFilter.kt │ │ │ │ ├── SimpleSolarizeFilter.kt │ │ │ │ ├── SimpleThresholdDitheringFilter.kt │ │ │ │ ├── SimpleWeavePixelationFilter.kt │ │ │ │ ├── SketchFilter.kt │ │ │ │ ├── SmearFilter.kt │ │ │ │ ├── SmoothToonFilter.kt │ │ │ │ ├── SobelEdgeDetectionFilter.kt │ │ │ │ ├── SobelSimpleFilter.kt │ │ │ │ ├── SoftEleganceFilter.kt │ │ │ │ ├── SoftEleganceVariantFilter.kt │ │ │ │ ├── SoftSpringLightFilter.kt │ │ │ │ ├── SolarizeFilter.kt │ │ │ │ ├── SpacePortalFilter.kt │ │ │ │ ├── SparkleFilter.kt │ │ │ │ ├── SpectralFireFilter.kt │ │ │ │ ├── SphereLensDistortionFilter.kt │ │ │ │ ├── SphereRefractionFilter.kt │ │ │ │ ├── SpotHealFilter.kt │ │ │ │ ├── StackBlurFilter.kt │ │ │ │ ├── StaggeredPixelationFilter.kt │ │ │ │ ├── StarBlurFilter.kt │ │ │ │ ├── StrokePixelationFilter.kt │ │ │ │ ├── StuckiDitheringFilter.kt │ │ │ │ ├── SunriseFilter.kt │ │ │ │ ├── SwirlDistortionFilter.kt │ │ │ │ ├── TentBlurFilter.kt │ │ │ │ ├── ThresholdFilter.kt │ │ │ │ ├── ToneCurvesFilter.kt │ │ │ │ ├── ToonFilter.kt │ │ │ │ ├── TopHatFilter.kt │ │ │ │ ├── TriToneFilter.kt │ │ │ │ ├── TritanopiaFilter.kt │ │ │ │ ├── TritonomalyFilter.kt │ │ │ │ ├── TwirlFilter.kt │ │ │ │ ├── TwoRowSierraDitheringFilter.kt │ │ │ │ ├── UchimuraFilter.kt │ │ │ │ ├── UnsharpFilter.kt │ │ │ │ ├── VHSFilter.kt │ │ │ │ ├── VibranceFilter.kt │ │ │ │ ├── VignetteFilter.kt │ │ │ │ ├── VintageFilter.kt │ │ │ │ ├── VoronoiCrystallizeFilter.kt │ │ │ │ ├── VortexPixelationFilter.kt │ │ │ │ ├── WarmFilter.kt │ │ │ │ ├── WaterEffectFilter.kt │ │ │ │ ├── WeakPixelFilter.kt │ │ │ │ ├── WeaveFilter.kt │ │ │ │ ├── WhiteBalanceFilter.kt │ │ │ │ ├── YililomaDitheringFilter.kt │ │ │ │ └── ZoomBlurFilter.kt │ │ │ ├── transformation/ │ │ │ │ ├── ColorMapTransformation.kt │ │ │ │ ├── GPUFilterTransformation.kt │ │ │ │ └── JhFilterTransformation.kt │ │ │ └── utils/ │ │ │ ├── EnumMappings.kt │ │ │ ├── TransformationUtils.kt │ │ │ ├── convolution/ │ │ │ │ └── AireConvolution.kt │ │ │ ├── glitch/ │ │ │ │ ├── GlitchTool.kt │ │ │ │ └── tools/ │ │ │ │ ├── Anaglyph.kt │ │ │ │ └── JpegGlitch.kt │ │ │ ├── gpu/ │ │ │ │ └── GPUImageHighlightShadowWideRangeFilter.kt │ │ │ ├── image/ │ │ │ │ └── ImageLoader.kt │ │ │ ├── pixelation/ │ │ │ │ ├── PixelationTool.kt │ │ │ │ └── tool/ │ │ │ │ ├── PixelationCommands.kt │ │ │ │ └── PixelationLayer.kt │ │ │ └── serialization/ │ │ │ ├── FilterSerializationUtils.kt │ │ │ └── Mappings.kt │ │ ├── di/ │ │ │ └── FilterModule.kt │ │ ├── domain/ │ │ │ ├── FilterMask.kt │ │ │ └── FilterMaskApplier.kt │ │ └── presentation/ │ │ ├── FiltersContent.kt │ │ ├── components/ │ │ │ ├── BasicFilterPreference.kt │ │ │ ├── BasicFilterState.kt │ │ │ ├── FiltersContentActionButtons.kt │ │ │ ├── FiltersContentControls.kt │ │ │ ├── FiltersContentNoData.kt │ │ │ ├── FiltersContentSheets.kt │ │ │ ├── FiltersContentTopAppBarActions.kt │ │ │ ├── MaskFilterPreference.kt │ │ │ ├── MaskItem.kt │ │ │ ├── MaskReorderSheet.kt │ │ │ ├── MaskingFilterState.kt │ │ │ ├── PathPaintPreview.kt │ │ │ ├── UiFilterMask.kt │ │ │ └── addEditMaskSheet/ │ │ │ ├── AddEditMaskSheet.kt │ │ │ ├── AddEditMaskSheetControls.kt │ │ │ ├── AddMaskSheetBitmapPreview.kt │ │ │ └── AddMaskSheetComponent.kt │ │ └── screenLogic/ │ │ └── FiltersComponent.kt │ ├── format-conversion/ │ │ ├── .gitignore │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── main/ │ │ ├── AndroidManifest.xml │ │ └── java/ │ │ └── com/ │ │ └── t8rin/ │ │ └── imagetoolbox/ │ │ └── feature/ │ │ └── format_conversion/ │ │ └── presentation/ │ │ ├── FormatConversionContent.kt │ │ └── screenLogic/ │ │ └── FormatConversionComponent.kt │ ├── gif-tools/ │ │ ├── .gitignore │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── main/ │ │ ├── AndroidManifest.xml │ │ └── java/ │ │ └── com/ │ │ └── t8rin/ │ │ └── imagetoolbox/ │ │ └── feature/ │ │ └── gif_tools/ │ │ ├── data/ │ │ │ └── AndroidGifConverter.kt │ │ ├── di/ │ │ │ └── GifToolsModule.kt │ │ ├── domain/ │ │ │ ├── GifConverter.kt │ │ │ └── GifParams.kt │ │ └── presentation/ │ │ ├── GifToolsContent.kt │ │ ├── components/ │ │ │ ├── GifParamsSelector.kt │ │ │ ├── GifToolsControls.kt │ │ │ ├── GifToolsImagePreview.kt │ │ │ ├── GifToolsNoDataControls.kt │ │ │ └── GifToolsTopAppBarActions.kt │ │ └── screenLogic/ │ │ └── GifToolsComponent.kt │ ├── gradient-maker/ │ │ ├── .gitignore │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── main/ │ │ ├── AndroidManifest.xml │ │ └── java/ │ │ └── com/ │ │ └── t8rin/ │ │ └── imagetoolbox/ │ │ └── feature/ │ │ └── gradient_maker/ │ │ ├── data/ │ │ │ └── AndroidGradientMaker.kt │ │ ├── di/ │ │ │ └── GradientMakerModule.kt │ │ ├── domain/ │ │ │ ├── GradientMaker.kt │ │ │ ├── GradientState.kt │ │ │ ├── GradientType.kt │ │ │ └── MeshGradientState.kt │ │ └── presentation/ │ │ ├── GradientMakerContent.kt │ │ ├── components/ │ │ │ ├── ColorStopSelection.kt │ │ │ ├── GradientMakerAppColorSchemeHandler.kt │ │ │ ├── GradientMakerBottomButtons.kt │ │ │ ├── GradientMakerCompareButton.kt │ │ │ ├── GradientMakerControls.kt │ │ │ ├── GradientMakerImagePreview.kt │ │ │ ├── GradientMakerNoDataControls.kt │ │ │ ├── GradientPreview.kt │ │ │ ├── GradientPropertiesSelector.kt │ │ │ ├── GradientSizeSelector.kt │ │ │ ├── GradientTypeSelector.kt │ │ │ ├── MeshGradientEditor.kt │ │ │ ├── MeshGradientPreview.kt │ │ │ ├── TileModeSelector.kt │ │ │ ├── UiGradientState.kt │ │ │ └── model/ │ │ │ └── GradientMakerType.kt │ │ └── screenLogic/ │ │ └── GradientMakerComponent.kt │ ├── image-cutting/ │ │ ├── .gitignore │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── main/ │ │ ├── AndroidManifest.xml │ │ └── java/ │ │ └── com/ │ │ └── t8rin/ │ │ └── imagetoolbox/ │ │ └── image_cutting/ │ │ ├── data/ │ │ │ └── AndroidImageCutter.kt │ │ ├── di/ │ │ │ └── ImageCutterModule.kt │ │ ├── domain/ │ │ │ ├── CutParams.kt │ │ │ └── ImageCutter.kt │ │ └── presentation/ │ │ ├── ImageCutterContent.kt │ │ ├── components/ │ │ │ ├── CutParamsSelector.kt │ │ │ ├── CutPreview.kt │ │ │ └── Utils.kt │ │ └── screenLogic/ │ │ └── ImageCutterComponent.kt │ ├── image-preview/ │ │ ├── .gitignore │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── main/ │ │ ├── AndroidManifest.xml │ │ └── java/ │ │ └── com/ │ │ └── t8rin/ │ │ └── imagetoolbox/ │ │ └── feature/ │ │ └── image_preview/ │ │ └── presentation/ │ │ ├── ImagePreviewContent.kt │ │ └── screenLogic/ │ │ └── ImagePreviewComponent.kt │ ├── image-splitting/ │ │ ├── .gitignore │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── main/ │ │ ├── AndroidManifest.xml │ │ └── java/ │ │ └── com/ │ │ └── t8rin/ │ │ └── imagetoolbox/ │ │ └── image_splitting/ │ │ ├── data/ │ │ │ └── AndroidImageSplitter.kt │ │ ├── di/ │ │ │ └── ImageSplitterModule.kt │ │ ├── domain/ │ │ │ ├── ImageSplitter.kt │ │ │ └── SplitParams.kt │ │ └── presentation/ │ │ ├── ImageSplitterContent.kt │ │ ├── components/ │ │ │ └── SplitParamsSelector.kt │ │ └── screenLogic/ │ │ └── ImageSplitterComponent.kt │ ├── image-stacking/ │ │ ├── .gitignore │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── main/ │ │ ├── AndroidManifest.xml │ │ └── java/ │ │ └── com/ │ │ └── t8rin/ │ │ └── imagetoolbox/ │ │ └── feature/ │ │ └── image_stacking/ │ │ ├── data/ │ │ │ └── AndroidImageStacker.kt │ │ ├── di/ │ │ │ └── ImageStackingModule.kt │ │ ├── domain/ │ │ │ ├── ImageStacker.kt │ │ │ ├── StackImage.kt │ │ │ └── StackingParams.kt │ │ └── presentation/ │ │ ├── ImageStackingContent.kt │ │ ├── components/ │ │ │ ├── StackImageItem.kt │ │ │ └── StackingParamsSelector.kt │ │ └── screenLogic/ │ │ └── ImageStackingComponent.kt │ ├── image-stitch/ │ │ ├── .gitignore │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── main/ │ │ ├── AndroidManifest.xml │ │ └── java/ │ │ └── com/ │ │ └── t8rin/ │ │ └── imagetoolbox/ │ │ └── feature/ │ │ └── image_stitch/ │ │ ├── data/ │ │ │ ├── AndroidImageCombiner.kt │ │ │ └── CvStitchHelper.kt │ │ ├── di/ │ │ │ └── ImageStitchModule.kt │ │ ├── domain/ │ │ │ ├── CombiningParams.kt │ │ │ ├── ImageCombiner.kt │ │ │ ├── SavableCombiningParams.kt │ │ │ ├── StitchAlignment.kt │ │ │ ├── StitchFadeSide.kt │ │ │ └── StitchMode.kt │ │ └── presentation/ │ │ ├── ImageStitchingContent.kt │ │ ├── components/ │ │ │ ├── FadeStrengthSelector.kt │ │ │ ├── ImageFadingEdgesSelector.kt │ │ │ ├── ImageScaleSelector.kt │ │ │ ├── SpacingSelector.kt │ │ │ ├── StitchAlignmentSelector.kt │ │ │ └── StitchModeSelector.kt │ │ └── screenLogic/ │ │ └── ImageStitchingComponent.kt │ ├── jxl-tools/ │ │ ├── .gitignore │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── main/ │ │ ├── AndroidManifest.xml │ │ └── java/ │ │ └── com/ │ │ └── t8rin/ │ │ └── imagetoolbox/ │ │ └── feature/ │ │ └── jxl_tools/ │ │ ├── data/ │ │ │ └── AndroidJxlConverter.kt │ │ ├── di/ │ │ │ └── JxlToolsModule.kt │ │ ├── domain/ │ │ │ ├── AnimatedJxlParams.kt │ │ │ └── JxlConverter.kt │ │ └── presentation/ │ │ ├── JxlToolsContent.kt │ │ ├── components/ │ │ │ ├── AnimatedJxlParamsSelector.kt │ │ │ ├── JxlToolsBitmapPreview.kt │ │ │ ├── JxlToolsButtons.kt │ │ │ ├── JxlToolsControls.kt │ │ │ ├── JxlToolsNoDataControls.kt │ │ │ └── JxlToolsTopAppBarActions.kt │ │ └── screenLogic/ │ │ └── JxlToolsComponent.kt │ ├── libraries-info/ │ │ ├── .gitignore │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── main/ │ │ ├── AndroidManifest.xml │ │ └── java/ │ │ └── com/ │ │ └── t8rin/ │ │ └── imagetoolbox/ │ │ └── feature/ │ │ └── libraries_info/ │ │ └── presentation/ │ │ ├── LibrariesInfoContent.kt │ │ ├── components/ │ │ │ ├── LibrariesContainer.kt │ │ │ └── LibraryLink.kt │ │ └── screenLogic/ │ │ └── LibrariesInfoComponent.kt │ ├── library-details/ │ │ ├── .gitignore │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── main/ │ │ ├── AndroidManifest.xml │ │ └── java/ │ │ └── com/ │ │ └── t8rin/ │ │ └── imagetoolbox/ │ │ └── library_details/ │ │ └── presentation/ │ │ ├── LibraryDetailsContent.kt │ │ └── screenLogic/ │ │ └── LibraryDetailsComponent.kt │ ├── limits-resize/ │ │ ├── .gitignore │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── main/ │ │ ├── AndroidManifest.xml │ │ └── java/ │ │ └── com/ │ │ └── t8rin/ │ │ └── imagetoolbox/ │ │ └── feature/ │ │ └── limits_resize/ │ │ ├── data/ │ │ │ └── AndroidLimitsImageScaler.kt │ │ ├── di/ │ │ │ └── LimitsResizeModule.kt │ │ ├── domain/ │ │ │ ├── LimitsImageScaler.kt │ │ │ └── LimitsResizeType.kt │ │ └── presentation/ │ │ ├── LimitsResizeContent.kt │ │ ├── components/ │ │ │ ├── AutoRotateLimitBoxToggle.kt │ │ │ └── LimitResizeGroup.kt │ │ └── screenLogic/ │ │ └── LimitsResizeComponent.kt │ ├── load-net-image/ │ │ ├── .gitignore │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── main/ │ │ ├── AndroidManifest.xml │ │ └── java/ │ │ └── com/ │ │ └── t8rin/ │ │ └── imagetoolbox/ │ │ └── feature/ │ │ └── load_net_image/ │ │ ├── data/ │ │ │ └── AndroidHtmlImageParser.kt │ │ ├── di/ │ │ │ └── LoadNetImageModule.kt │ │ ├── domain/ │ │ │ └── HtmlImageParser.kt │ │ └── presentation/ │ │ ├── LoadNetImageContent.kt │ │ ├── components/ │ │ │ ├── LoadNetImageActionButtons.kt │ │ │ ├── LoadNetImageAdaptiveActions.kt │ │ │ ├── LoadNetImageTopAppBarActions.kt │ │ │ ├── LoadNetImageUrlTextField.kt │ │ │ ├── ParsedImagePreview.kt │ │ │ └── ParsedImagesSelection.kt │ │ └── screenLogic/ │ │ └── LoadNetImageComponent.kt │ ├── main/ │ │ ├── .gitignore │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── main/ │ │ ├── AndroidManifest.xml │ │ └── java/ │ │ └── com/ │ │ └── t8rin/ │ │ └── imagetoolbox/ │ │ └── feature/ │ │ └── main/ │ │ └── presentation/ │ │ ├── MainContent.kt │ │ ├── components/ │ │ │ ├── FilteredScreenListFor.kt │ │ │ ├── LauncherScreenSelector.kt │ │ │ ├── MainContentImpl.kt │ │ │ ├── MainDrawerContent.kt │ │ │ ├── MainNavigationBar.kt │ │ │ ├── MainNavigationBarForFavorites.kt │ │ │ ├── MainNavigationRail.kt │ │ │ ├── MainNavigationRailForFavorites.kt │ │ │ ├── MainTopAppBar.kt │ │ │ ├── ScreenPreferenceSelection.kt │ │ │ └── SearchableBottomBar.kt │ │ └── screenLogic/ │ │ └── MainComponent.kt │ ├── markup-layers/ │ │ ├── .gitignore │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── main/ │ │ ├── AndroidManifest.xml │ │ └── java/ │ │ └── com/ │ │ └── t8rin/ │ │ └── imagetoolbox/ │ │ └── feature/ │ │ └── markup_layers/ │ │ ├── data/ │ │ │ ├── AndroidMarkupLayersApplier.kt │ │ │ ├── project/ │ │ │ │ ├── AssetRegistry.kt │ │ │ │ ├── Mapping.kt │ │ │ │ ├── MarkupProjectConstants.kt │ │ │ │ ├── MarkupProjectExtensions.kt │ │ │ │ ├── MarkupProjectFile.kt │ │ │ │ └── ProjectFileLoadResult.kt │ │ │ └── utils/ │ │ │ ├── LayersRenderer.kt │ │ │ ├── PictureLayerShadowRenderer.kt │ │ │ ├── ShapeLayerRenderer.kt │ │ │ ├── TextLayerMetrics.kt │ │ │ └── TextLayerShadowRenderer.kt │ │ ├── di/ │ │ │ └── MarkupLayersModule.kt │ │ ├── domain/ │ │ │ ├── MarkupLayer.kt │ │ │ ├── MarkupLayersApplier.kt │ │ │ ├── MarkupProject.kt │ │ │ ├── MarkupProjectResult.kt │ │ │ ├── ProjectBackground.kt │ │ │ └── ShapeLayerModeExt.kt │ │ └── presentation/ │ │ ├── MarkupLayersContent.kt │ │ ├── components/ │ │ │ ├── ActiveLayerGestureModifier.kt │ │ │ ├── AddShapeLayerDialog.kt │ │ │ ├── AddTextLayerDialog.kt │ │ │ ├── ClickableTile.kt │ │ │ ├── DropShadowSection.kt │ │ │ ├── EditBox.kt │ │ │ ├── EditBoxState.kt │ │ │ ├── EditLayerSheet.kt │ │ │ ├── Layer.kt │ │ │ ├── LayerContent.kt │ │ │ ├── MarkupLayersActions.kt │ │ │ ├── MarkupLayersContextActions.kt │ │ │ ├── MarkupLayersNoDataControls.kt │ │ │ ├── MarkupLayersSideMenu.kt │ │ │ ├── MarkupLayersSideMenuColumn.kt │ │ │ ├── MarkupLayersTopAppBarActions.kt │ │ │ ├── ShapeLayerParamsSelector.kt │ │ │ └── model/ │ │ │ ├── BackgroundBehavior.kt │ │ │ ├── ShapeLayerModeUiExt.kt │ │ │ ├── UiMarkupLayer.kt │ │ │ └── UiMarkupLayerGrouping.kt │ │ └── screenLogic/ │ │ └── MarkupLayersComponent.kt │ ├── media-picker/ │ │ ├── .gitignore │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── main/ │ │ ├── AndroidManifest.xml │ │ └── java/ │ │ └── com/ │ │ └── t8rin/ │ │ └── imagetoolbox/ │ │ └── feature/ │ │ └── media_picker/ │ │ ├── data/ │ │ │ ├── AndroidMediaRetriever.kt │ │ │ └── utils/ │ │ │ ├── DateExt.kt │ │ │ ├── MediaObserver.kt │ │ │ ├── MediaQuery.kt │ │ │ └── SupportedFiles.kt │ │ ├── di/ │ │ │ └── MediaPickerModule.kt │ │ ├── domain/ │ │ │ ├── MediaRetriever.kt │ │ │ └── model/ │ │ │ ├── Album.kt │ │ │ ├── AllowedMedia.kt │ │ │ ├── Media.kt │ │ │ ├── MediaItem.kt │ │ │ ├── MediaOrder.kt │ │ │ ├── MediaState.kt │ │ │ └── OrderType.kt │ │ └── presentation/ │ │ ├── MediaPickerActivity.kt │ │ ├── components/ │ │ │ ├── ManageExternalStorageWarning.kt │ │ │ ├── MediaExtensionHeader.kt │ │ │ ├── MediaImage.kt │ │ │ ├── MediaImagePager.kt │ │ │ ├── MediaPickerGrid.kt │ │ │ ├── MediaPickerGridWithOverlays.kt │ │ │ ├── MediaPickerHavePermissions.kt │ │ │ ├── MediaPickerRootContent.kt │ │ │ ├── MediaPickerRootContentEmbeddable.kt │ │ │ ├── MediaSizeFooter.kt │ │ │ ├── MediaStickyHeader.kt │ │ │ ├── MediaVideoDurationHeader.kt │ │ │ ├── ObserveColorSchemeExtra.kt │ │ │ └── SendMediaAsResult.kt │ │ └── screenLogic/ │ │ └── MediaPickerComponent.kt │ ├── mesh-gradients/ │ │ ├── .gitignore │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── main/ │ │ ├── AndroidManifest.xml │ │ └── java/ │ │ └── com/ │ │ └── t8rin/ │ │ └── imagetoolbox/ │ │ └── feature/ │ │ └── mesh_gradients/ │ │ └── presentation/ │ │ ├── MeshGradientsContent.kt │ │ └── screenLogic/ │ │ └── MeshGradientsComponent.kt │ ├── noise-generation/ │ │ ├── .gitignore │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── main/ │ │ ├── AndroidManifest.xml │ │ └── java/ │ │ └── com/ │ │ └── t8rin/ │ │ └── imagetoolbox/ │ │ └── noise_generation/ │ │ ├── data/ │ │ │ └── AndroidNoiseGenerator.kt │ │ ├── di/ │ │ │ └── NoiseGenerationModule.kt │ │ ├── domain/ │ │ │ ├── NoiseGenerator.kt │ │ │ └── model/ │ │ │ ├── CellularDistanceFunction.kt │ │ │ ├── CellularReturnType.kt │ │ │ ├── DomainWarpType.kt │ │ │ ├── FractalType.kt │ │ │ ├── NoiseParams.kt │ │ │ ├── NoiseType.kt │ │ │ └── RotationType3D.kt │ │ └── presentation/ │ │ ├── NoiseGenerationContent.kt │ │ ├── components/ │ │ │ └── NoiseParamsSelection.kt │ │ └── screenLogic/ │ │ └── NoiseGenerationComponent.kt │ ├── palette-tools/ │ │ ├── .gitignore │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── main/ │ │ ├── AndroidManifest.xml │ │ └── java/ │ │ └── com/ │ │ └── t8rin/ │ │ └── imagetoolbox/ │ │ └── feature/ │ │ └── palette_tools/ │ │ └── presentation/ │ │ ├── PaletteToolsContent.kt │ │ ├── components/ │ │ │ ├── DefaultPaletteControls.kt │ │ │ ├── EditPaletteControls.kt │ │ │ ├── ImageColorPalette.kt │ │ │ ├── MaterialYouPalette.kt │ │ │ ├── MaterialYouPaletteControls.kt │ │ │ ├── MaterialYouPaletteGroup.kt │ │ │ ├── MaterialYouPaletteItem.kt │ │ │ ├── PaletteColorNameField.kt │ │ │ ├── PaletteColorsCountSelector.kt │ │ │ ├── PaletteToolsScreenControls.kt │ │ │ ├── PaletteType.kt │ │ │ └── model/ │ │ │ ├── NamedColor.kt │ │ │ └── PaletteFormatHelper.kt │ │ └── screenLogic/ │ │ └── PaletteToolsComponent.kt │ ├── pdf-tools/ │ │ ├── .gitignore │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── main/ │ │ ├── AndroidManifest.xml │ │ └── java/ │ │ └── com/ │ │ └── t8rin/ │ │ └── imagetoolbox/ │ │ └── feature/ │ │ └── pdf_tools/ │ │ ├── data/ │ │ │ ├── AndroidPdfHelper.kt │ │ │ ├── AndroidPdfManager.kt │ │ │ └── utils/ │ │ │ ├── Hocr.kt │ │ │ ├── PdfContentStreamEditor.kt │ │ │ ├── PdfRenderer.kt │ │ │ └── PdfUtils.kt │ │ ├── di/ │ │ │ └── PdfToolsModule.kt │ │ ├── domain/ │ │ │ ├── PdfHelper.kt │ │ │ ├── PdfManager.kt │ │ │ └── model/ │ │ │ ├── ExtractPagesAction.kt │ │ │ ├── PageOrientation.kt │ │ │ ├── PageSize.kt │ │ │ ├── PdfAnnotationType.kt │ │ │ ├── PdfCheckResult.kt │ │ │ ├── PdfCreationParams.kt │ │ │ ├── PdfCropParams.kt │ │ │ ├── PdfExtractPagesParams.kt │ │ │ ├── PdfMetadata.kt │ │ │ ├── PdfPageNumbersParams.kt │ │ │ ├── PdfRemoveAnnotationParams.kt │ │ │ ├── PdfSignatureParams.kt │ │ │ ├── PdfWatermarkParams.kt │ │ │ ├── PrintPdfParams.kt │ │ │ └── SearchablePdfPage.kt │ │ └── presentation/ │ │ ├── common/ │ │ │ ├── BasePdfToolComponent.kt │ │ │ ├── BasePdfToolContent.kt │ │ │ ├── PageSwitcher.kt │ │ │ └── PdfPreviewItem.kt │ │ ├── compress/ │ │ │ ├── CompressPdfToolContent.kt │ │ │ └── screenLogic/ │ │ │ └── CompressPdfToolComponent.kt │ │ ├── crop/ │ │ │ ├── CropPdfToolContent.kt │ │ │ ├── components/ │ │ │ │ └── CropPreview.kt │ │ │ └── screenLogic/ │ │ │ └── CropPdfToolComponent.kt │ │ ├── extract_images/ │ │ │ ├── ExtractImagesPdfToolContent.kt │ │ │ └── screenLogic/ │ │ │ └── ExtractImagesPdfToolComponent.kt │ │ ├── extract_pages/ │ │ │ ├── ExtractPagesPdfToolContent.kt │ │ │ └── screenLogic/ │ │ │ └── ExtractPagesPdfToolComponent.kt │ │ ├── flatten/ │ │ │ ├── FlattenPdfToolContent.kt │ │ │ └── screenLogic/ │ │ │ └── FlattenPdfToolComponent.kt │ │ ├── grayscale/ │ │ │ ├── GrayscalePdfToolContent.kt │ │ │ └── screenLogic/ │ │ │ └── GrayscalePdfToolComponent.kt │ │ ├── images_to_pdf/ │ │ │ ├── ImagesToPdfToolContent.kt │ │ │ └── screenLogic/ │ │ │ └── ImagesToPdfToolComponent.kt │ │ ├── merge/ │ │ │ ├── MergePdfToolContent.kt │ │ │ └── screenLogic/ │ │ │ └── MergePdfToolComponent.kt │ │ ├── metadata/ │ │ │ ├── MetadataPdfToolContent.kt │ │ │ ├── components/ │ │ │ │ └── MetadataEditor.kt │ │ │ └── screenLogic/ │ │ │ └── MetadataPdfToolComponent.kt │ │ ├── ocr/ │ │ │ ├── OCRPdfToolContent.kt │ │ │ └── screenLogic/ │ │ │ └── OCRPdfToolComponent.kt │ │ ├── page_numbers/ │ │ │ ├── PageNumbersPdfToolContent.kt │ │ │ ├── components/ │ │ │ │ └── PageNumbersPreview.kt │ │ │ └── screenLogic/ │ │ │ └── PageNumbersPdfToolComponent.kt │ │ ├── preview/ │ │ │ ├── PreviewPdfToolContent.kt │ │ │ └── screenLogic/ │ │ │ └── PreviewPdfToolComponent.kt │ │ ├── print/ │ │ │ ├── PrintPdfToolContent.kt │ │ │ └── screenLogic/ │ │ │ └── PrintPdfToolComponent.kt │ │ ├── protect/ │ │ │ ├── ProtectPdfToolContent.kt │ │ │ └── screenLogic/ │ │ │ └── ProtectPdfToolComponent.kt │ │ ├── rearrange/ │ │ │ ├── RearrangePdfToolContent.kt │ │ │ ├── components/ │ │ │ │ └── PdfPagesRearrangeGrid.kt │ │ │ └── screenLogic/ │ │ │ └── RearrangePdfToolComponent.kt │ │ ├── remove_annotations/ │ │ │ ├── RemoveAnnotationsPdfToolContent.kt │ │ │ ├── components/ │ │ │ │ ├── PdfAnnotationTypeSelector.kt │ │ │ │ └── RemoveAnnotationsPreview.kt │ │ │ └── screenLogic/ │ │ │ └── RemoveAnnotationsPdfToolComponent.kt │ │ ├── remove_pages/ │ │ │ ├── RemovePagesPdfToolContent.kt │ │ │ ├── components/ │ │ │ │ └── PdfPagesRemoveGrid.kt │ │ │ └── screenLogic/ │ │ │ └── RemovePagesPdfToolComponent.kt │ │ ├── repair/ │ │ │ ├── RepairPdfToolContent.kt │ │ │ └── screenLogic/ │ │ │ └── RepairPdfToolComponent.kt │ │ ├── root/ │ │ │ ├── RootPdfToolsContent.kt │ │ │ ├── components/ │ │ │ │ ├── PdfViewer.kt │ │ │ │ └── viewer/ │ │ │ │ ├── LegacyPdfViewer.kt │ │ │ │ ├── ModernPdfViewer.kt │ │ │ │ └── ModernPdfViewerDelegate.kt │ │ │ └── screenLogic/ │ │ │ └── RootPdfToolsComponent.kt │ │ ├── rotate/ │ │ │ ├── RotatePdfToolContent.kt │ │ │ ├── components/ │ │ │ │ └── PdfPagesRotationGrid.kt │ │ │ └── screenLogic/ │ │ │ └── RotatePdfToolComponent.kt │ │ ├── signature/ │ │ │ ├── SignaturePdfToolContent.kt │ │ │ ├── components/ │ │ │ │ ├── SignatureDialog.kt │ │ │ │ ├── SignaturePreview.kt │ │ │ │ └── SignatureSelector.kt │ │ │ └── screenLogic/ │ │ │ └── SignaturePdfToolComponent.kt │ │ ├── split/ │ │ │ ├── SplitPdfToolContent.kt │ │ │ └── screenLogic/ │ │ │ └── SplitPdfToolComponent.kt │ │ ├── unlock/ │ │ │ ├── UnlockPdfToolContent.kt │ │ │ └── screenLogic/ │ │ │ └── UnlockPdfToolComponent.kt │ │ ├── watermark/ │ │ │ ├── WatermarkPdfToolContent.kt │ │ │ ├── components/ │ │ │ │ └── WatermarkPreview.kt │ │ │ └── screenLogic/ │ │ │ └── WatermarkPdfToolComponent.kt │ │ └── zip_convert/ │ │ ├── ZipConvertPdfToolContent.kt │ │ └── screenLogic/ │ │ └── ZipConvertPdfToolComponent.kt │ ├── pick-color/ │ │ ├── .gitignore │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── main/ │ │ ├── AndroidManifest.xml │ │ └── java/ │ │ └── com/ │ │ └── t8rin/ │ │ └── imagetoolbox/ │ │ └── feature/ │ │ └── pick_color/ │ │ └── presentation/ │ │ ├── PickColorFromImageContent.kt │ │ ├── components/ │ │ │ ├── PickColorFromImageBottomAppBar.kt │ │ │ ├── PickColorFromImageContentImpl.kt │ │ │ ├── PickColorFromImageSheet.kt │ │ │ └── PickColorFromImageTopAppBar.kt │ │ └── screenLogic/ │ │ └── PickColorFromImageComponent.kt │ ├── quick-tiles/ │ │ ├── .gitignore │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── main/ │ │ ├── AndroidManifest.xml │ │ └── java/ │ │ └── com/ │ │ └── t8rin/ │ │ └── imagetoolbox/ │ │ └── feature/ │ │ └── quick_tiles/ │ │ ├── screenshot/ │ │ │ ├── Contants.kt │ │ │
Copy disabled (too large)
Download .json
Condensed preview — 3013 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (25,042K chars).
[
{
"path": ".github/FUNDING.yml",
"chars": 877,
"preview": "# These are supported funding model platforms\n\ngithub: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [u"
},
{
"path": ".github/ISSUE_TEMPLATE/bug_report.yml",
"chars": 1875,
"preview": "name: Bug Report\ndescription: Create a report to help us improve\nlabels: [\"bug\"]\n\nbody:\n - type: textarea\n id: descr"
},
{
"path": ".github/ISSUE_TEMPLATE/feature_request.yml",
"chars": 822,
"preview": "name: Feature Request\ndescription: Suggest an idea for this project\nlabels: [\"enhancement\"]\n\nbody:\n - type: textarea\n "
},
{
"path": ".github/dependabot.yml",
"chars": 504,
"preview": "# To get started with Dependabot version updates, you'll need to specify which\n# package ecosystems to update and where "
},
{
"path": ".github/workflows/android.yml",
"chars": 2450,
"preview": "name: Android CI\n\non:\n workflow_dispatch:\n\njobs:\n build:\n\n runs-on: ubuntu-latest\n\n steps:\n - name: Set Swa"
},
{
"path": ".github/workflows/android_foss.yml",
"chars": 1587,
"preview": "name: Android CI FOSS\n\non:\n workflow_dispatch:\n\njobs:\n build:\n\n runs-on: ubuntu-latest\n\n steps:\n - name: Se"
},
{
"path": ".github/workflows/android_market.yml",
"chars": 1607,
"preview": "name: Android CI Market\n\non:\n workflow_dispatch:\n\njobs:\n build:\n\n runs-on: ubuntu-latest\n\n steps:\n - name: "
},
{
"path": ".github/workflows/tb_release.yml",
"chars": 4457,
"preview": "name: Create Release\n\non:\n workflow_dispatch:\n#on:\n# push:\n# tags:\n# - '*'\n\njobs:\n build_and_release:\n\n ru"
},
{
"path": ".gitignore",
"chars": 150,
"preview": "*.iml\n.gradle\n/local.properties\n.DS_Store\n/build\n/app/release\n/captures\n.externalNativeBuild\n.cxx\n/.idea\n/libs/nQuant/bu"
},
{
"path": "ARCHITECTURE.md",
"chars": 23008,
"preview": "# 📐 Modules Graph\n\n```mermaid\n%%{\n init: {\n \"theme\": \"base\",\n \"themeVariables\": {\n \"mainBkg\": \"#1214"
},
{
"path": "ARCHITECTURE_2",
"chars": 24670,
"preview": "%%{\n init: {\n \"theme\": \"base\",\n \"maxEdges\": 1000,\n \"themeVariables\": {\n \"mainBkg\": \"#121418\",\n "
},
{
"path": "CONTRIBUTING.md",
"chars": 2792,
"preview": "# Contributing Guidelines\n\nThis documentation contains set of guidelines to help you during the contribution process.\n\n#"
},
{
"path": "LICENSE",
"chars": 11357,
"preview": " Apache License\n Version 2.0, January 2004\n "
},
{
"path": "README.md",
"chars": 37510,
"preview": "<div align=\"center\">\n</br>\n<img src=\"./fastlane/metadata/android/en-US/images/logo/logo.png\" width=\"200\" />\n\n</div>\n\n<di"
},
{
"path": "app/.gitignore",
"chars": 74,
"preview": "/build/\n/release/\n/foss/\n/market/\n/jxl/\n/build\n/release\n/foss\n/market\n/jxl"
},
{
"path": "app/build.gradle.kts",
"chars": 5912,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "app/proguard-rules.pro",
"chars": 3160,
"preview": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguar"
},
{
"path": "app/src/main/AndroidManifest.xml",
"chars": 10347,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n ~ ImageToolbox is an image editor for android\n ~ Copyright (c) 2026 T8RIN "
},
{
"path": "app/src/main/java/com/t8rin/imagetoolbox/app/presentation/AppActivity.kt",
"chars": 1592,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2024 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "app/src/main/java/com/t8rin/imagetoolbox/app/presentation/components/ImageToolboxApplication.kt",
"chars": 3003,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "app/src/main/java/com/t8rin/imagetoolbox/app/presentation/components/functions/AttachLogWriter.kt",
"chars": 1418,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "app/src/main/java/com/t8rin/imagetoolbox/app/presentation/components/functions/InitCollages.kt",
"chars": 963,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "app/src/main/java/com/t8rin/imagetoolbox/app/presentation/components/functions/InitColorNames.kt",
"chars": 1069,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "app/src/main/java/com/t8rin/imagetoolbox/app/presentation/components/functions/InitNeuralTool.kt",
"chars": 1112,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "app/src/main/java/com/t8rin/imagetoolbox/app/presentation/components/functions/InitOpenCV.kt",
"chars": 917,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2025 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "app/src/main/java/com/t8rin/imagetoolbox/app/presentation/components/functions/InitPdfBox.kt",
"chars": 945,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "app/src/main/java/com/t8rin/imagetoolbox/app/presentation/components/functions/InitQrScanner.kt",
"chars": 1194,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2025 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "app/src/main/java/com/t8rin/imagetoolbox/app/presentation/components/functions/InjectBaseComponent.kt",
"chars": 1025,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "app/src/main/java/com/t8rin/imagetoolbox/app/presentation/components/functions/RegisterSecurityProviders.kt",
"chars": 3452,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "app/src/main/java/com/t8rin/imagetoolbox/app/presentation/components/functions/SetupFlags.kt",
"chars": 1214,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "app/src/main/java/com/t8rin/imagetoolbox/app/presentation/components/utils/GetProcessName.kt",
"chars": 2336,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "app/src/main/res/resources.properties",
"chars": 720,
"preview": "#\n# ImageToolbox is an image editor for android\n# Copyright (c) 2024 T8RIN (Malik Mukhametzyanov)\n#\n# Licensed under the"
},
{
"path": "app/src/market/debug/google-services.json",
"chars": 1018,
"preview": "{\n \"project_info\": {\n \"project_number\": \"698299287298\",\n \"project_id\": \"imagetoolbox-13e3c\",\n \"storage_bucket\""
},
{
"path": "app/src/market/release/google-services.json",
"chars": 1012,
"preview": "{\n \"project_info\": {\n \"project_number\": \"698299287298\",\n \"project_id\": \"imagetoolbox-13e3c\",\n \"storage_bucket\""
},
{
"path": "benchmark/.gitignore",
"chars": 6,
"preview": "/build"
},
{
"path": "benchmark/build.gradle.kts",
"chars": 2532,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "benchmark/src/main/AndroidManifest.xml",
"chars": 745,
"preview": "<!--\n ~ ImageToolbox is an image editor for android\n ~ Copyright (c) 2024 T8RIN (Malik Mukhametzyanov)\n ~\n ~ License"
},
{
"path": "benchmark/src/main/java/com/t8rin/imagetoolbox/benchmark/BaselineProfileGenerator.kt",
"chars": 1272,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2024 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "build-logic/.gitignore",
"chars": 104,
"preview": "*.iml\n.gradle\n/local.properties\n.DS_Store\n/build\n/app/release\n/captures\n.externalNativeBuild\n.cxx\n/.idea"
},
{
"path": "build-logic/convention/.gitignore",
"chars": 6,
"preview": "/build"
},
{
"path": "build-logic/convention/build.gradle.kts",
"chars": 2429,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2024 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "build-logic/convention/src/main/kotlin/ImageToolboxApplicationPlugin.kt",
"chars": 3178,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "build-logic/convention/src/main/kotlin/ImageToolboxHiltPlugin.kt",
"chars": 1374,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2024 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "build-logic/convention/src/main/kotlin/ImageToolboxLibraryComposePlugin.kt",
"chars": 1296,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2024 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "build-logic/convention/src/main/kotlin/ImageToolboxLibraryFeaturePlugin.kt",
"chars": 1972,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2024 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "build-logic/convention/src/main/kotlin/ImageToolboxLibraryPlugin.kt",
"chars": 1938,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "build-logic/convention/src/main/kotlin/com/t8rin/imagetoolbox/ConfigureCompose.kt",
"chars": 1675,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "build-logic/convention/src/main/kotlin/com/t8rin/imagetoolbox/ConfigureDetekt.kt",
"chars": 1407,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2024 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "build-logic/convention/src/main/kotlin/com/t8rin/imagetoolbox/ConfigureKotlinAndroid.kt",
"chars": 5109,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "build-logic/convention/src/main/kotlin/com/t8rin/imagetoolbox/ProjectExtensions.kt",
"chars": 2717,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2024 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "build-logic/settings.gradle.kts",
"chars": 1100,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2024 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "build.gradle.kts",
"chars": 1450,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2024 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "compose_compiler_config.conf",
"chars": 827,
"preview": "java.time.ZoneId\njava.time.ZoneOffset\njava.text.DecimalFormat\njava.text.NumberFormat\njava.time.Instant\njava.time.Duratio"
},
{
"path": "core/crash/.gitignore",
"chars": 6,
"preview": "/build"
},
{
"path": "core/crash/build.gradle.kts",
"chars": 1179,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/crash/src/foss/java/com/t8rin/imagetoolbox/core/crash/data/AnalyticsManagerImpl.kt",
"chars": 1272,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2025 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/crash/src/main/AndroidManifest.xml",
"chars": 955,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n ~ ImageToolbox is an image editor for android\n ~ Copyright (c) 2024 T8RIN "
},
{
"path": "core/crash/src/main/java/com/t8rin/imagetoolbox/core/crash/di/CrashModule.kt",
"chars": 1223,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2025 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/crash/src/main/java/com/t8rin/imagetoolbox/core/crash/presentation/CrashActivity.kt",
"chars": 1728,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2025 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/crash/src/main/java/com/t8rin/imagetoolbox/core/crash/presentation/components/CrashActionButtons.kt",
"chars": 5608,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/crash/src/main/java/com/t8rin/imagetoolbox/core/crash/presentation/components/CrashAttentionCard.kt",
"chars": 3869,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2025 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/crash/src/main/java/com/t8rin/imagetoolbox/core/crash/presentation/components/CrashBottomButtons.kt",
"chars": 3151,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2025 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/crash/src/main/java/com/t8rin/imagetoolbox/core/crash/presentation/components/CrashHandler.kt",
"chars": 2600,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/crash/src/main/java/com/t8rin/imagetoolbox/core/crash/presentation/components/CrashInfoCard.kt",
"chars": 2763,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2025 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/crash/src/main/java/com/t8rin/imagetoolbox/core/crash/presentation/components/CrashRootContent.kt",
"chars": 3391,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/crash/src/main/java/com/t8rin/imagetoolbox/core/crash/presentation/components/GlobalExceptionHandler.kt",
"chars": 2918,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2025 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/crash/src/main/java/com/t8rin/imagetoolbox/core/crash/presentation/screenLogic/CrashComponent.kt",
"chars": 2664,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2025 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/crash/src/market/java/com/t8rin/imagetoolbox/core/crash/data/AnalyticsManagerImpl.kt",
"chars": 2670,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/data/.gitignore",
"chars": 6,
"preview": "/build"
},
{
"path": "core/data/build.gradle.kts",
"chars": 2368,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/data/src/main/AndroidManifest.xml",
"chars": 1345,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n ~ ImageToolbox is an image editor for android\n ~ Copyright (c) 2026 T8RIN "
},
{
"path": "core/data/src/main/java/com/t8rin/imagetoolbox/core/data/coil/Base64Fetcher.kt",
"chars": 2181,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2024 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/data/src/main/java/com/t8rin/imagetoolbox/core/data/coil/CoilLogger.kt",
"chars": 2031,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/data/src/main/java/com/t8rin/imagetoolbox/core/data/coil/MemoryCache.kt",
"chars": 925,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/data/src/main/java/com/t8rin/imagetoolbox/core/data/coil/PdfDecoder.kt",
"chars": 4633,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/data/src/main/java/com/t8rin/imagetoolbox/core/data/coil/TiffDecoder.kt",
"chars": 3313,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/data/src/main/java/com/t8rin/imagetoolbox/core/data/coil/TimeMeasureInterceptor.kt",
"chars": 1656,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2024 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/data/src/main/java/com/t8rin/imagetoolbox/core/data/coil/UpscaleSvgDecoder.kt",
"chars": 2153,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2024 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/data/src/main/java/com/t8rin/imagetoolbox/core/data/coroutines/AndroidDispatchersHolder.kt",
"chars": 1616,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2024 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/data/src/main/java/com/t8rin/imagetoolbox/core/data/coroutines/AppScopeImpl.kt",
"chars": 1406,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2025 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/data/src/main/java/com/t8rin/imagetoolbox/core/data/di/CoroutinesModule.kt",
"chars": 2911,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2024 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/data/src/main/java/com/t8rin/imagetoolbox/core/data/di/ImageLoaderModule.kt",
"chars": 4821,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/data/src/main/java/com/t8rin/imagetoolbox/core/data/di/ImageModule.kt",
"chars": 2771,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2024 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/data/src/main/java/com/t8rin/imagetoolbox/core/data/di/JsonModule.kt",
"chars": 3260,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/data/src/main/java/com/t8rin/imagetoolbox/core/data/di/LocalModule.kt",
"chars": 1617,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/data/src/main/java/com/t8rin/imagetoolbox/core/data/di/RemoteModule.kt",
"chars": 2468,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/data/src/main/java/com/t8rin/imagetoolbox/core/data/di/ResourcesModule.kt",
"chars": 1243,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2025 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/data/src/main/java/com/t8rin/imagetoolbox/core/data/di/SavingModule.kt",
"chars": 2104,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/data/src/main/java/com/t8rin/imagetoolbox/core/data/image/AndroidImageCompressor.kt",
"chars": 6968,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/data/src/main/java/com/t8rin/imagetoolbox/core/data/image/AndroidImageGetter.kt",
"chars": 8518,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/data/src/main/java/com/t8rin/imagetoolbox/core/data/image/AndroidImagePreviewCreator.kt",
"chars": 5141,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2024 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/data/src/main/java/com/t8rin/imagetoolbox/core/data/image/AndroidImageScaler.kt",
"chars": 19725,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2024 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/data/src/main/java/com/t8rin/imagetoolbox/core/data/image/AndroidImageTransformer.kt",
"chars": 6917,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/data/src/main/java/com/t8rin/imagetoolbox/core/data/image/AndroidMetadata.kt",
"chars": 1715,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/data/src/main/java/com/t8rin/imagetoolbox/core/data/image/AndroidShareProvider.kt",
"chars": 10571,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/data/src/main/java/com/t8rin/imagetoolbox/core/data/image/utils/BlendingModeExt.kt",
"chars": 4343,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/data/src/main/java/com/t8rin/imagetoolbox/core/data/image/utils/CanvasUtils.kt",
"chars": 3076,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/data/src/main/java/com/t8rin/imagetoolbox/core/data/image/utils/ColorUtils.kt",
"chars": 1581,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2024 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/data/src/main/java/com/t8rin/imagetoolbox/core/data/image/utils/ImageCompressorBackend.kt",
"chars": 4002,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/data/src/main/java/com/t8rin/imagetoolbox/core/data/image/utils/StaticOptions.kt",
"chars": 1181,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/data/src/main/java/com/t8rin/imagetoolbox/core/data/image/utils/compressor/AvifBackend.kt",
"chars": 1798,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2025 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/data/src/main/java/com/t8rin/imagetoolbox/core/data/image/utils/compressor/BmpBackend.kt",
"chars": 1238,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/data/src/main/java/com/t8rin/imagetoolbox/core/data/image/utils/compressor/HeicBackend.kt",
"chars": 1613,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2025 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/data/src/main/java/com/t8rin/imagetoolbox/core/data/image/utils/compressor/IcoBackend.kt",
"chars": 3823,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2025 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/data/src/main/java/com/t8rin/imagetoolbox/core/data/image/utils/compressor/Jpeg2000Backend.kt",
"chars": 1451,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2025 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/data/src/main/java/com/t8rin/imagetoolbox/core/data/image/utils/compressor/JpegliBackend.kt",
"chars": 1667,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2025 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/data/src/main/java/com/t8rin/imagetoolbox/core/data/image/utils/compressor/JpgBackend.kt",
"chars": 1274,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2025 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/data/src/main/java/com/t8rin/imagetoolbox/core/data/image/utils/compressor/JxlBackend.kt",
"chars": 2383,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2025 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/data/src/main/java/com/t8rin/imagetoolbox/core/data/image/utils/compressor/MozJpegBackend.kt",
"chars": 1228,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2025 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/data/src/main/java/com/t8rin/imagetoolbox/core/data/image/utils/compressor/OxiPngBackend.kt",
"chars": 1301,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/data/src/main/java/com/t8rin/imagetoolbox/core/data/image/utils/compressor/PngLosslessBackend.kt",
"chars": 1281,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2025 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/data/src/main/java/com/t8rin/imagetoolbox/core/data/image/utils/compressor/PngLossyBackend.kt",
"chars": 1716,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2025 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/data/src/main/java/com/t8rin/imagetoolbox/core/data/image/utils/compressor/QoiBackend.kt",
"chars": 1178,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2025 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/data/src/main/java/com/t8rin/imagetoolbox/core/data/image/utils/compressor/StaticGifBackend.kt",
"chars": 1750,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2025 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/data/src/main/java/com/t8rin/imagetoolbox/core/data/image/utils/compressor/TiffBackend.kt",
"chars": 1828,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2025 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/data/src/main/java/com/t8rin/imagetoolbox/core/data/image/utils/compressor/WebpBackend.kt",
"chars": 1716,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2025 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/data/src/main/java/com/t8rin/imagetoolbox/core/data/json/MoshiParser.kt",
"chars": 1698,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/data/src/main/java/com/t8rin/imagetoolbox/core/data/remote/AndroidDownloadManager.kt",
"chars": 7569,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/data/src/main/java/com/t8rin/imagetoolbox/core/data/remote/AndroidRemoteResourcesStore.kt",
"chars": 4519,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/data/src/main/java/com/t8rin/imagetoolbox/core/data/resource/AndroidResourceManager.kt",
"chars": 2437,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2025 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/data/src/main/java/com/t8rin/imagetoolbox/core/data/saving/AndroidFileController.kt",
"chars": 21432,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/data/src/main/java/com/t8rin/imagetoolbox/core/data/saving/AndroidFilenameCreator.kt",
"chars": 10243,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/data/src/main/java/com/t8rin/imagetoolbox/core/data/saving/AndroidKeepAliveService.kt",
"chars": 2701,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/data/src/main/java/com/t8rin/imagetoolbox/core/data/saving/KeepAliveForegroundService.kt",
"chars": 7097,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/data/src/main/java/com/t8rin/imagetoolbox/core/data/saving/SaveException.kt",
"chars": 835,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2024 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/data/src/main/java/com/t8rin/imagetoolbox/core/data/saving/SavingFolder.kt",
"chars": 4517,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/data/src/main/java/com/t8rin/imagetoolbox/core/data/saving/io/FileWriteable.kt",
"chars": 1000,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/data/src/main/java/com/t8rin/imagetoolbox/core/data/saving/io/StreamWriteable.kt",
"chars": 2435,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/data/src/main/java/com/t8rin/imagetoolbox/core/data/saving/io/UriReadable.kt",
"chars": 1913,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/data/src/main/java/com/t8rin/imagetoolbox/core/data/utils/BitmapUtils.kt",
"chars": 2586,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2024 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/data/src/main/java/com/t8rin/imagetoolbox/core/data/utils/ChecksumUtils.kt",
"chars": 4735,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/data/src/main/java/com/t8rin/imagetoolbox/core/data/utils/CoilUtils.kt",
"chars": 1994,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2024 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/data/src/main/java/com/t8rin/imagetoolbox/core/data/utils/ContextUtils.kt",
"chars": 3731,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/data/src/main/java/com/t8rin/imagetoolbox/core/data/utils/CoroutinesUtils.kt",
"chars": 1021,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2024 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/data/src/main/java/com/t8rin/imagetoolbox/core/data/utils/FileUtils.kt",
"chars": 1618,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/data/src/main/java/com/t8rin/imagetoolbox/core/data/utils/HttpClientUtils.kt",
"chars": 1609,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/data/src/main/java/com/t8rin/imagetoolbox/core/data/utils/WriteableUtils.kt",
"chars": 1126,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/di/.gitignore",
"chars": 6,
"preview": "/build"
},
{
"path": "core/di/build.gradle.kts",
"chars": 869,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2024 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/di/src/main/AndroidManifest.xml",
"chars": 794,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n ~ ImageToolbox is an image editor for android\n ~ Copyright (c) 2024 T8RIN "
},
{
"path": "core/di/src/main/java/com/t8rin/imagetoolbox/core/di/EntryPointUtils.kt",
"chars": 1026,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2024 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/di/src/main/java/com/t8rin/imagetoolbox/core/di/Qualifiers.kt",
"chars": 1211,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2024 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/domain/.gitignore",
"chars": 6,
"preview": "/build"
},
{
"path": "core/domain/build.gradle.kts",
"chars": 935,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2024 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/domain/src/main/AndroidManifest.xml",
"chars": 794,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n ~ ImageToolbox is an image editor for android\n ~ Copyright (c) 2024 T8RIN "
},
{
"path": "core/domain/src/main/kotlin/com/t8rin/imagetoolbox/core/domain/Constants.kt",
"chars": 2378,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/domain/src/main/kotlin/com/t8rin/imagetoolbox/core/domain/coroutines/AppScope.kt",
"chars": 847,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2025 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/domain/src/main/kotlin/com/t8rin/imagetoolbox/core/domain/coroutines/DispatchersHolder.kt",
"chars": 1056,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2024 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/domain/src/main/kotlin/com/t8rin/imagetoolbox/core/domain/image/ImageCompressor.kt",
"chars": 1489,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2024 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/domain/src/main/kotlin/com/t8rin/imagetoolbox/core/domain/image/ImageGetter.kt",
"chars": 2082,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/domain/src/main/kotlin/com/t8rin/imagetoolbox/core/domain/image/ImagePreviewCreator.kt",
"chars": 1168,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2024 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/domain/src/main/kotlin/com/t8rin/imagetoolbox/core/domain/image/ImageScaler.kt",
"chars": 1211,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2024 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/domain/src/main/kotlin/com/t8rin/imagetoolbox/core/domain/image/ImageShareProvider.kt",
"chars": 1287,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2025 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/domain/src/main/kotlin/com/t8rin/imagetoolbox/core/domain/image/ImageTransformer.kt",
"chars": 1607,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2024 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/domain/src/main/kotlin/com/t8rin/imagetoolbox/core/domain/image/Metadata.kt",
"chars": 2854,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/domain/src/main/kotlin/com/t8rin/imagetoolbox/core/domain/image/ShareProvider.kt",
"chars": 1796,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/domain/src/main/kotlin/com/t8rin/imagetoolbox/core/domain/image/model/BlendingMode.kt",
"chars": 21741,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2024 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/domain/src/main/kotlin/com/t8rin/imagetoolbox/core/domain/image/model/ImageData.kt",
"chars": 1643,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2024 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/domain/src/main/kotlin/com/t8rin/imagetoolbox/core/domain/image/model/ImageFormat.kt",
"chars": 10497,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/domain/src/main/kotlin/com/t8rin/imagetoolbox/core/domain/image/model/ImageFormatGroup.kt",
"chars": 3999,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/domain/src/main/kotlin/com/t8rin/imagetoolbox/core/domain/image/model/ImageFrames.kt",
"chars": 1440,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2024 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/domain/src/main/kotlin/com/t8rin/imagetoolbox/core/domain/image/model/ImageInfo.kt",
"chars": 1200,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2024 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/domain/src/main/kotlin/com/t8rin/imagetoolbox/core/domain/image/model/ImageScaleMode.kt",
"chars": 21572,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2024 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/domain/src/main/kotlin/com/t8rin/imagetoolbox/core/domain/image/model/ImageWithSize.kt",
"chars": 1028,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2024 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/domain/src/main/kotlin/com/t8rin/imagetoolbox/core/domain/image/model/MetadataTag.kt",
"chars": 24157,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/domain/src/main/kotlin/com/t8rin/imagetoolbox/core/domain/image/model/Preset.kt",
"chars": 1676,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2024 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/domain/src/main/kotlin/com/t8rin/imagetoolbox/core/domain/image/model/Quality.kt",
"chars": 3961,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/domain/src/main/kotlin/com/t8rin/imagetoolbox/core/domain/image/model/ResizeAnchor.kt",
"chars": 851,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2024 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/domain/src/main/kotlin/com/t8rin/imagetoolbox/core/domain/image/model/ResizeType.kt",
"chars": 1934,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2024 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/domain/src/main/kotlin/com/t8rin/imagetoolbox/core/domain/image/model/TiffCompressionScheme.kt",
"chars": 1416,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2024 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/domain/src/main/kotlin/com/t8rin/imagetoolbox/core/domain/json/JsonParser.kt",
"chars": 1217,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2024 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/domain/src/main/kotlin/com/t8rin/imagetoolbox/core/domain/model/CipherType.kt",
"chars": 4603,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2025 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/domain/src/main/kotlin/com/t8rin/imagetoolbox/core/domain/model/ColorModel.kt",
"chars": 866,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2024 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/domain/src/main/kotlin/com/t8rin/imagetoolbox/core/domain/model/DomainAspectRatio.kt",
"chars": 4175,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2024 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/domain/src/main/kotlin/com/t8rin/imagetoolbox/core/domain/model/ExtraDataType.kt",
"chars": 1056,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/domain/src/main/kotlin/com/t8rin/imagetoolbox/core/domain/model/FileModel.kt",
"chars": 820,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2024 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/domain/src/main/kotlin/com/t8rin/imagetoolbox/core/domain/model/FloatSize.kt",
"chars": 832,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/domain/src/main/kotlin/com/t8rin/imagetoolbox/core/domain/model/HashingType.kt",
"chars": 2983,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2024 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/domain/src/main/kotlin/com/t8rin/imagetoolbox/core/domain/model/ImageModel.kt",
"chars": 819,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2024 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/domain/src/main/kotlin/com/t8rin/imagetoolbox/core/domain/model/IntegerSize.kt",
"chars": 2793,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2024 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/domain/src/main/kotlin/com/t8rin/imagetoolbox/core/domain/model/MimeType.kt",
"chars": 3083,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/domain/src/main/kotlin/com/t8rin/imagetoolbox/core/domain/model/OffsetModel.kt",
"chars": 825,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/domain/src/main/kotlin/com/t8rin/imagetoolbox/core/domain/model/Outline.kt",
"chars": 827,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2024 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/domain/src/main/kotlin/com/t8rin/imagetoolbox/core/domain/model/PerformanceClass.kt",
"chars": 924,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2024 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/domain/src/main/kotlin/com/t8rin/imagetoolbox/core/domain/model/Position.kt",
"chars": 925,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2024 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/domain/src/main/kotlin/com/t8rin/imagetoolbox/core/domain/model/Pt.kt",
"chars": 2357,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2024 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/domain/src/main/kotlin/com/t8rin/imagetoolbox/core/domain/model/QrType.kt",
"chars": 6891,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2025 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/domain/src/main/kotlin/com/t8rin/imagetoolbox/core/domain/model/RectModel.kt",
"chars": 8087,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)\n * \n * Licensed un"
},
{
"path": "core/domain/src/main/kotlin/com/t8rin/imagetoolbox/core/domain/model/SecureAlgorithmsMapping.kt",
"chars": 20687,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2025 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/domain/src/main/kotlin/com/t8rin/imagetoolbox/core/domain/model/SortType.kt",
"chars": 975,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2024 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/domain/src/main/kotlin/com/t8rin/imagetoolbox/core/domain/model/SystemBarsVisibility.kt",
"chars": 1484,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2024 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/domain/src/main/kotlin/com/t8rin/imagetoolbox/core/domain/model/VisibilityOwner.kt",
"chars": 959,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2024 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/domain/src/main/kotlin/com/t8rin/imagetoolbox/core/domain/remote/AnalyticsManager.kt",
"chars": 1082,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2025 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/domain/src/main/kotlin/com/t8rin/imagetoolbox/core/domain/remote/Cache.kt",
"chars": 2046,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/domain/src/main/kotlin/com/t8rin/imagetoolbox/core/domain/remote/DownloadManager.kt",
"chars": 1248,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/domain/src/main/kotlin/com/t8rin/imagetoolbox/core/domain/remote/DownloadProgress.kt",
"chars": 858,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/domain/src/main/kotlin/com/t8rin/imagetoolbox/core/domain/remote/RemoteResources.kt",
"chars": 1323,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2024 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/domain/src/main/kotlin/com/t8rin/imagetoolbox/core/domain/remote/RemoteResourcesStore.kt",
"chars": 2240,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/domain/src/main/kotlin/com/t8rin/imagetoolbox/core/domain/resource/ResourceManager.kt",
"chars": 1131,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2025 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
},
{
"path": "core/domain/src/main/kotlin/com/t8rin/imagetoolbox/core/domain/saving/FileController.kt",
"chars": 2225,
"preview": "/*\n * ImageToolbox is an image editor for android\n * Copyright (c) 2026 T8RIN (Malik Mukhametzyanov)\n *\n * Licensed unde"
}
]
// ... and 2813 more files (download for full content)
About this extraction
This page contains the full source code of the T8RIN/ImageResizer GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 3013 files (21.2 MB), approximately 5.8M tokens. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.