├── .gitattributes
├── .gitignore
├── README.md
├── app
├── .gitignore
├── CMakeLists.txt
├── build.gradle.kts
├── example.png
├── example1.png
├── example2.png
├── example3.png
├── example4.png
├── example5.png
├── example6.png
├── example7.png
├── example8.png
├── example9.png
├── proguard-rules.pro
└── src
│ └── main
│ ├── AndroidManifest.xml
│ ├── assets
│ ├── WorkspacePlanet.json
│ ├── bird.gif
│ ├── feng.lrc
│ ├── feng.mp4
│ ├── feng.srt
│ ├── font
│ │ ├── AlimamaFangYuanTiVF-Thin.ttf
│ │ ├── NotoColorEmoji.ttf
│ │ └── iconfont.woff
│ ├── gl_transition_window_slice.glsl
│ ├── jetpack-compose.svg
│ ├── materials
│ │ └── baked_color.filamat
│ ├── music
│ │ ├── bg.png
│ │ ├── ic_next.png
│ │ ├── ic_pause.png
│ │ ├── ic_play.png
│ │ ├── ic_previous.png
│ │ ├── logo.png
│ │ ├── mv_definition_super.svg
│ │ ├── record_player_dark_arm.png
│ │ └── record_player_verydark_highlight.png
│ ├── raining.glsl
│ ├── raining.png
│ ├── react.svg
│ ├── react_bundle.js
│ ├── sincos.glsl
│ ├── skia_nv12_fragment_shader.glsl
│ ├── skia_video_black_white.glsl
│ ├── skia_video_bright_shader.glsl
│ ├── skia_video_lightning_shader.glsl
│ ├── skia_video_raining_shader.glsl
│ ├── skia_yuv420p_camera_shader.glsl
│ ├── skia_yuv420p_fragment_shader.glsl
│ ├── test.js
│ ├── tiger.svg
│ ├── transition1.png
│ ├── transition2.png
│ ├── vue.svg
│ ├── vue_bundle.js
│ └── yiluxiangbei.mp4
│ ├── cpp
│ ├── SkiaUI.cpp
│ ├── anim
│ │ ├── EaseType.h
│ │ ├── IAnimator.cpp
│ │ ├── IAnimator.h
│ │ ├── LinearAnimator.cpp
│ │ ├── LinearAnimator.h
│ │ ├── TranslateAnimator.cpp
│ │ └── TranslateAnimator.h
│ ├── app
│ │ ├── FrontEngineType.h
│ │ ├── SkiaGLApp.cpp
│ │ ├── SkiaGLApp.h
│ │ ├── SkiaUIApp.cpp
│ │ ├── SkiaUIApp.h
│ │ └── SkiaUIContext.h
│ ├── base
│ │ ├── AndroidBitmap.cpp
│ │ ├── AndroidBitmap.h
│ │ ├── AssetManager.cpp
│ │ ├── AssetManager.h
│ │ ├── EGLCore.cpp
│ │ ├── EGLCore.h
│ │ ├── MeasureTime.h
│ │ ├── bitmap_util.h
│ │ ├── color_util.h
│ │ ├── gl_utils.cpp
│ │ ├── gl_utils.h
│ │ ├── json11.cpp
│ │ ├── json11.h
│ │ ├── matrix_util.h
│ │ ├── native_log.h
│ │ ├── stb_image.h
│ │ └── w3c_util.h
│ ├── compose
│ │ ├── ComposeAndroidImageJNI.h
│ │ ├── ComposeBaseSurfaceTextureJNI.h
│ │ ├── ComposeButtonJNI.h
│ │ ├── ComposeCameraJNI.h
│ │ ├── ComposeCanvas.cpp
│ │ ├── ComposeCanvas.h
│ │ ├── ComposeCanvasJNI.h
│ │ ├── ComposeCanvasPaintJNI.h
│ │ ├── ComposeCanvasPathJNI.h
│ │ ├── ComposeContext.h
│ │ ├── ComposeEditTextJNI.h
│ │ ├── ComposeExoVideoJNI.h
│ │ ├── ComposeFilamentJNI.h
│ │ ├── ComposeFlexboxLayoutJNI.h
│ │ ├── ComposeIconJNI.h
│ │ ├── ComposeImageJNI.h
│ │ ├── ComposeJNI.h
│ │ ├── ComposeLoadingViewJNI.h
│ │ ├── ComposeLottieJNI.h
│ │ ├── ComposeNodeJNI.h
│ │ ├── ComposePageJNI.h
│ │ ├── ComposeProgressBarJNI.h
│ │ ├── ComposeRecyclerView.cpp
│ │ ├── ComposeRecyclerView.h
│ │ ├── ComposeRecyclerViewJNI.h
│ │ ├── ComposeSVGJNI.h
│ │ ├── ComposeScrollViewJNI.h
│ │ ├── ComposeShaderJNI.h
│ │ ├── ComposeSwitchJNI.h
│ │ ├── ComposeTextJNI.h
│ │ ├── ComposeViewGroupJNI.h
│ │ ├── ComposeViewJNI.h
│ │ └── ComposeWebJNI.h
│ ├── custom
│ │ ├── AudioFFTView.cpp
│ │ ├── AudioFFTView.h
│ │ ├── LyricScrollView.cpp
│ │ └── LyricScrollView.h
│ ├── filter
│ │ ├── GrAHardwareBufferUtils.cpp
│ │ ├── GrAHardwareBufferUtils.h
│ │ ├── IFilter.h
│ │ ├── PersistentCache.cpp
│ │ ├── PersistentCache.h
│ │ ├── SkiaFilter.cpp
│ │ └── SkiaFilter.h
│ ├── inspect
│ │ ├── Inspector.cpp
│ │ ├── Inspector.h
│ │ ├── V8InspctprChannelImpl.cpp
│ │ ├── V8InspctprChannelImpl.h
│ │ ├── V8InspectorClientImpl.cpp
│ │ ├── V8InspectorClientImpl.h
│ │ ├── V8InspectorListener.h
│ │ ├── WebSocketServer.cpp
│ │ ├── WebSocketServer.h
│ │ └── inspect_utils.h
│ ├── js
│ │ ├── File.cpp
│ │ ├── File.h
│ │ ├── JSAudioPlayer.cpp
│ │ ├── JSAudioPlayer.h
│ │ ├── JSAudioPlayerBinding.cpp
│ │ ├── JSAudioPlayerBinding.h
│ │ ├── JSBinding.h
│ │ ├── JSButtonBinding.cpp
│ │ ├── JSButtonBinding.h
│ │ ├── JSFileBinding.cpp
│ │ ├── JSFileBinding.h
│ │ ├── JSFlexboxLayoutBinding.cpp
│ │ ├── JSFlexboxLayoutBinding.h
│ │ ├── JSIconBinding.cpp
│ │ ├── JSIconBinding.h
│ │ ├── JSImageViewBinding.cpp
│ │ ├── JSImageViewBinding.h
│ │ ├── JSLinearAnimationBinding.cpp
│ │ ├── JSLinearAnimationBinding.h
│ │ ├── JSLottieViewBinding.cpp
│ │ ├── JSLottieViewBinding.h
│ │ ├── JSPageBinding.cpp
│ │ ├── JSPageBinding.h
│ │ ├── JSProgressBarBinding.cpp
│ │ ├── JSProgressBarBinding.h
│ │ ├── JSSVGViewBinding.cpp
│ │ ├── JSSVGViewBinding.h
│ │ ├── JSScrollViewBinding.cpp
│ │ ├── JSScrollViewBinding.h
│ │ ├── JSShaderViewBinding.cpp
│ │ ├── JSShaderViewBinding.h
│ │ ├── JSSwitchBinding.cpp
│ │ ├── JSSwitchBinding.h
│ │ ├── JSTextEncodingBinding.cpp
│ │ ├── JSTextEncodingBinding.h
│ │ ├── JSTextViewBinding.cpp
│ │ ├── JSTextViewBinding.h
│ │ ├── JSVideoViewBinding.cpp
│ │ ├── JSVideoViewBinding.h
│ │ ├── JSViewBinding.cpp
│ │ ├── JSViewBinding.h
│ │ ├── JSViewGroupBinding.cpp
│ │ ├── JSViewGroupBinding.h
│ │ ├── JSYUVVideoViewBinding.cpp
│ │ ├── JSYUVVideoViewBinding.h
│ │ ├── TextEncoding.cpp
│ │ ├── TextEncoding.h
│ │ ├── V8Instance.h
│ │ ├── V8Runtime.cpp
│ │ ├── V8Runtime.h
│ │ ├── ViewManager.cpp
│ │ ├── ViewManager.h
│ │ ├── animationFrame.h
│ │ ├── backPressed.h
│ │ ├── console.h
│ │ ├── performance.h
│ │ └── timer.h
│ ├── page
│ │ ├── Page.cpp
│ │ ├── Page.h
│ │ ├── PageStackManager.cpp
│ │ └── PageStackManager.h
│ ├── plugin
│ │ ├── PluginManager.cpp
│ │ └── PluginManager.h
│ ├── resources
│ │ ├── ResourceLoader.cpp
│ │ └── ResourceLoader.h
│ ├── test
│ │ ├── BlendTestPage.cpp
│ │ ├── BlendTestPage.h
│ │ ├── BlendTestView.cpp
│ │ ├── BlendTestView.h
│ │ ├── CameraPage.cpp
│ │ ├── CameraPage.h
│ │ ├── CanvasTest.cpp
│ │ ├── CanvasTest.h
│ │ ├── ClockView.cpp
│ │ ├── ClockView.h
│ │ ├── CppTest.cpp
│ │ ├── CppTest.h
│ │ ├── EasingTestPage.cpp
│ │ ├── EasingTestPage.h
│ │ ├── ExamplePage.cpp
│ │ ├── ExamplePage.h
│ │ ├── FilamentPage.cpp
│ │ ├── FilamentPage.h
│ │ ├── GridLayoutTest.cpp
│ │ ├── GridLayoutTest.h
│ │ ├── ITestDraw.h
│ │ ├── JavascriptTest.cpp
│ │ ├── JavascriptTest.h
│ │ ├── JetpackComposeTest.cpp
│ │ ├── JetpackComposeTest.h
│ │ ├── MatrixTestPage.cpp
│ │ ├── MatrixTestPage.h
│ │ ├── QQMusicPage.cpp
│ │ ├── QQMusicPage.h
│ │ ├── ReactjsTest.cpp
│ │ ├── ReactjsTest.h
│ │ ├── RecyclerViewPage.cpp
│ │ ├── RecyclerViewPage.h
│ │ ├── SimpleJavascriptTest.cpp
│ │ ├── SimpleJavascriptTest.h
│ │ ├── TextTestPage.cpp
│ │ ├── TextTestPage.h
│ │ ├── VideoShaderTest.cpp
│ │ ├── VideoShaderTest.h
│ │ ├── VuejsTest.cpp
│ │ ├── VuejsTest.h
│ │ ├── WebViewPage.cpp
│ │ └── WebViewPage.h
│ ├── touch
│ │ ├── ScrollDispatcher.cpp
│ │ ├── ScrollDispatcher.h
│ │ ├── TouchEvent.h
│ │ ├── TouchEventDispatcher.cpp
│ │ ├── TouchEventDispatcher.h
│ │ └── Velocity.h
│ ├── widget
│ │ ├── AndroidImageView.cpp
│ │ ├── AndroidImageView.h
│ │ ├── BaseSurfaceTextureView.cpp
│ │ ├── BaseSurfaceTextureView.h
│ │ ├── BoxDecoration.cpp
│ │ ├── BoxDecoration.h
│ │ ├── Button.cpp
│ │ ├── Button.h
│ │ ├── CameraView.cpp
│ │ ├── CameraView.h
│ │ ├── EditText.cpp
│ │ ├── EditText.h
│ │ ├── ExoPlayerView.cpp
│ │ ├── ExoPlayerView.h
│ │ ├── FilamentView.cpp
│ │ ├── FilamentView.h
│ │ ├── FlexboxLayout.cpp
│ │ ├── FlexboxLayout.h
│ │ ├── GridLayout.cpp
│ │ ├── GridLayout.h
│ │ ├── Icon.cpp
│ │ ├── Icon.h
│ │ ├── ImageView.cpp
│ │ ├── ImageView.h
│ │ ├── LoadingView.cpp
│ │ ├── LoadingView.h
│ │ ├── LottieView.cpp
│ │ ├── LottieView.h
│ │ ├── MovingArea.cpp
│ │ ├── MovingArea.h
│ │ ├── PickerView.cpp
│ │ ├── PickerView.h
│ │ ├── PlatformView.cpp
│ │ ├── PlatformView.h
│ │ ├── ProgressBar.cpp
│ │ ├── ProgressBar.h
│ │ ├── Radio.cpp
│ │ ├── Radio.h
│ │ ├── RecyclerView.cpp
│ │ ├── RecyclerView.h
│ │ ├── RichText.cpp
│ │ ├── RichText.h
│ │ ├── SVGView.cpp
│ │ ├── SVGView.h
│ │ ├── ScrollView.cpp
│ │ ├── ScrollView.h
│ │ ├── ShaderView.cpp
│ │ ├── ShaderView.h
│ │ ├── SwiperView.cpp
│ │ ├── SwiperView.h
│ │ ├── Switch.cpp
│ │ ├── Switch.h
│ │ ├── TextView.cpp
│ │ ├── TextView.h
│ │ ├── VideoView.cpp
│ │ ├── VideoView.h
│ │ ├── View.cpp
│ │ ├── View.h
│ │ ├── ViewGroup.cpp
│ │ ├── ViewGroup.h
│ │ ├── WebView.cpp
│ │ ├── WebView.h
│ │ ├── YUVVideoView.cpp
│ │ └── YUVVideoView.h
│ └── yoga
│ │ ├── BitUtils.h
│ │ ├── CompactValue.h
│ │ ├── Utils.h
│ │ ├── YGConfig.cpp
│ │ ├── YGConfig.h
│ │ ├── YGEnums.cpp
│ │ ├── YGEnums.h
│ │ ├── YGFloatOptional.h
│ │ ├── YGLayout.cpp
│ │ ├── YGLayout.h
│ │ ├── YGMacros.h
│ │ ├── YGNode.cpp
│ │ ├── YGNode.h
│ │ ├── YGNodePrint.cpp
│ │ ├── YGNodePrint.h
│ │ ├── YGStyle.cpp
│ │ ├── YGStyle.h
│ │ ├── YGValue.cpp
│ │ ├── YGValue.h
│ │ ├── Yoga-internal.h
│ │ ├── Yoga.cpp
│ │ ├── Yoga.h
│ │ ├── event
│ │ ├── event.cpp
│ │ └── event.h
│ │ ├── inspect_utils.cpp
│ │ ├── log.cpp
│ │ └── log.h
│ ├── java
│ └── com
│ │ └── temple
│ │ └── skiaui
│ │ ├── HYSkiaEngine.kt
│ │ ├── HYSkiaExampleActivity.kt
│ │ ├── HYSkiaSurfaceView.kt
│ │ ├── HYSkiaTextureView.kt
│ │ ├── HYSkiaUIApp.kt
│ │ ├── ISkiaView.kt
│ │ ├── MainActivity.kt
│ │ ├── RenderCallback.kt
│ │ ├── audio
│ │ ├── HYSkiaAudioPlayer.kt
│ │ ├── HYSkiaAudioTracker.kt
│ │ ├── IAudioCallback.kt
│ │ └── IAudioPlayer.kt
│ │ ├── bitmap
│ │ ├── AndroidBitmapLoader.kt
│ │ ├── GlideImageLoader.kt
│ │ └── ImageLoader.kt
│ │ ├── cache
│ │ └── PersistentCache.kt
│ │ ├── compose
│ │ ├── example
│ │ │ ├── HYComposeCameraPage.kt
│ │ │ ├── HYComposeCanvasPage.kt
│ │ │ ├── HYComposeExampleApp.kt
│ │ │ ├── HYComposeExamplePage.kt
│ │ │ ├── HYComposeFilamentPage.kt
│ │ │ ├── HYComposeMaterialPage.kt
│ │ │ ├── HYComposeMusicPage.kt
│ │ │ ├── HYComposeNativeViewsPage.kt
│ │ │ ├── HYComposeRecyclerPage.kt
│ │ │ ├── HYComposeVideoListPage.kt
│ │ │ ├── HYComposeVideoService.kt
│ │ │ ├── lyric
│ │ │ │ ├── Lyric.kt
│ │ │ │ └── LyricsViewModel.kt
│ │ │ └── theme
│ │ │ │ ├── Color.kt
│ │ │ │ ├── Theme.kt
│ │ │ │ └── Type.kt
│ │ ├── foundation
│ │ │ ├── Attributes.kt
│ │ │ ├── Modifier.kt
│ │ │ ├── StyleKey.kt
│ │ │ └── styles.kt
│ │ ├── material
│ │ │ └── HYBadge.kt
│ │ ├── runtime
│ │ │ ├── Composables.kt
│ │ │ ├── HYComposeApplication.kt
│ │ │ ├── HYComposeApplier.kt
│ │ │ ├── HYComposeBasePage.kt
│ │ │ ├── HYComposeComposer.kt
│ │ │ ├── HYComposeSDK.kt
│ │ │ ├── HYComposeUIDispatcher.kt
│ │ │ └── HYComposeUIFrameClock.kt
│ │ └── ui
│ │ │ ├── AutoReleasable.kt
│ │ │ ├── Canvas.kt
│ │ │ ├── HYComposeAndroidImage.kt
│ │ │ ├── HYComposeBaseSurfaceTexture.kt
│ │ │ ├── HYComposeButton.kt
│ │ │ ├── HYComposeCamera.kt
│ │ │ ├── HYComposeCanvas.kt
│ │ │ ├── HYComposeEditText.kt
│ │ │ ├── HYComposeExoVideo.kt
│ │ │ ├── HYComposeFilament.kt
│ │ │ ├── HYComposeFlexboxLayout.kt
│ │ │ ├── HYComposeIcon.kt
│ │ │ ├── HYComposeImage.kt
│ │ │ ├── HYComposeLoadingView.kt
│ │ │ ├── HYComposeLottie.kt
│ │ │ ├── HYComposeNode.kt
│ │ │ ├── HYComposePage.kt
│ │ │ ├── HYComposePaint.kt
│ │ │ ├── HYComposePath.kt
│ │ │ ├── HYComposeProgressBar.kt
│ │ │ ├── HYComposeRecyclerView.kt
│ │ │ ├── HYComposeSVG.kt
│ │ │ ├── HYComposeScrollView.kt
│ │ │ ├── HYComposeShader.kt
│ │ │ ├── HYComposeSwitch.kt
│ │ │ ├── HYComposeText.kt
│ │ │ ├── HYComposeView.kt
│ │ │ ├── HYComposeViewGroup.kt
│ │ │ ├── HYComposeWeb.kt
│ │ │ ├── HYFlexboxEnum.kt
│ │ │ └── util
│ │ │ ├── Bitmap_androidKt.kt
│ │ │ ├── Colors_androidKt.kt
│ │ │ └── Dp_androidKt.kt
│ │ ├── inspect
│ │ ├── InspectPlugin.kt
│ │ └── InspectServer.kt
│ │ ├── platform
│ │ ├── HYSurfaceCallback.kt
│ │ ├── ICanvasProvider.kt
│ │ ├── PlatformImageReaderBasePlugin.kt
│ │ ├── PlatformTextureLayerBasePlugin.kt
│ │ ├── SurfaceObj.kt
│ │ ├── SurfaceTextureBasePlugin.kt
│ │ ├── camera
│ │ │ └── PlatformCameraViewPlugin.kt
│ │ ├── data
│ │ │ └── ImageReaderYUVData.kt
│ │ ├── edittext
│ │ │ ├── PlatformEditText.kt
│ │ │ └── PlatformEditTextPlugin.kt
│ │ ├── filament
│ │ │ └── PlatformFilamentViewPlugin.kt
│ │ ├── video
│ │ │ ├── ExoPlayerImpl.kt
│ │ │ ├── IVideoPlayer.kt
│ │ │ └── PlatformVideoViewPlugin.kt
│ │ └── webview
│ │ │ ├── IWebViewCallback.kt
│ │ │ ├── PlatformWebView.kt
│ │ │ └── PlatformWebViewPlugin.kt
│ │ ├── plugin
│ │ ├── IPlugin.kt
│ │ ├── InspectWSServer.kt
│ │ ├── PluginManager.kt
│ │ └── ToastPlugin.kt
│ │ └── video
│ │ ├── HYSkiaVideo.kt
│ │ ├── HYSkiaYUVVideo.kt
│ │ └── YUVData.kt
│ ├── jniLibs
│ ├── arm64-v8a.zip
│ ├── skia
│ │ ├── include
│ │ │ ├── android
│ │ │ │ ├── AHardwareBufferUtils.h
│ │ │ │ ├── GrAHardwareBufferUtils.h
│ │ │ │ ├── SkAndroidFrameworkUtils.h
│ │ │ │ ├── SkAnimatedImage.h
│ │ │ │ ├── SkCanvasAndroid.h
│ │ │ │ ├── SkHeifDecoder.h
│ │ │ │ ├── SkImageAndroid.h
│ │ │ │ ├── SkSurfaceAndroid.h
│ │ │ │ └── graphite
│ │ │ │ │ └── SurfaceAndroid.h
│ │ │ ├── codec
│ │ │ │ ├── SkAndroidCodec.h
│ │ │ │ ├── SkAvifDecoder.h
│ │ │ │ ├── SkBmpDecoder.h
│ │ │ │ ├── SkCodec.h
│ │ │ │ ├── SkCodecAnimation.h
│ │ │ │ ├── SkEncodedImageFormat.h
│ │ │ │ ├── SkEncodedOrigin.h
│ │ │ │ ├── SkGifDecoder.h
│ │ │ │ ├── SkIcoDecoder.h
│ │ │ │ ├── SkJpegDecoder.h
│ │ │ │ ├── SkJpegxlDecoder.h
│ │ │ │ ├── SkPixmapUtils.h
│ │ │ │ ├── SkPngChunkReader.h
│ │ │ │ ├── SkPngDecoder.h
│ │ │ │ ├── SkRawDecoder.h
│ │ │ │ ├── SkWbmpDecoder.h
│ │ │ │ └── SkWebpDecoder.h
│ │ │ ├── config
│ │ │ │ └── SkUserConfig.h
│ │ │ ├── core
│ │ │ │ ├── SkAlphaType.h
│ │ │ │ ├── SkAnnotation.h
│ │ │ │ ├── SkArc.h
│ │ │ │ ├── SkBBHFactory.h
│ │ │ │ ├── SkBitmap.h
│ │ │ │ ├── SkBlendMode.h
│ │ │ │ ├── SkBlender.h
│ │ │ │ ├── SkBlurTypes.h
│ │ │ │ ├── SkCanvas.h
│ │ │ │ ├── SkCanvasVirtualEnforcer.h
│ │ │ │ ├── SkCapabilities.h
│ │ │ │ ├── SkClipOp.h
│ │ │ │ ├── SkColor.h
│ │ │ │ ├── SkColorFilter.h
│ │ │ │ ├── SkColorPriv.h
│ │ │ │ ├── SkColorSpace.h
│ │ │ │ ├── SkColorTable.h
│ │ │ │ ├── SkColorType.h
│ │ │ │ ├── SkContourMeasure.h
│ │ │ │ ├── SkCoverageMode.h
│ │ │ │ ├── SkCubicMap.h
│ │ │ │ ├── SkData.h
│ │ │ │ ├── SkDataTable.h
│ │ │ │ ├── SkDocument.h
│ │ │ │ ├── SkDrawable.h
│ │ │ │ ├── SkExecutor.h
│ │ │ │ ├── SkFlattenable.h
│ │ │ │ ├── SkFont.h
│ │ │ │ ├── SkFontArguments.h
│ │ │ │ ├── SkFontMetrics.h
│ │ │ │ ├── SkFontMgr.h
│ │ │ │ ├── SkFontParameters.h
│ │ │ │ ├── SkFontScanner.h
│ │ │ │ ├── SkFontStyle.h
│ │ │ │ ├── SkFontTypes.h
│ │ │ │ ├── SkFourByteTag.h
│ │ │ │ ├── SkGraphics.h
│ │ │ │ ├── SkImage.h
│ │ │ │ ├── SkImageFilter.h
│ │ │ │ ├── SkImageGenerator.h
│ │ │ │ ├── SkImageInfo.h
│ │ │ │ ├── SkM44.h
│ │ │ │ ├── SkMallocPixelRef.h
│ │ │ │ ├── SkMaskFilter.h
│ │ │ │ ├── SkMatrix.h
│ │ │ │ ├── SkMesh.h
│ │ │ │ ├── SkMilestone.h
│ │ │ │ ├── SkOpenTypeSVGDecoder.h
│ │ │ │ ├── SkOverdrawCanvas.h
│ │ │ │ ├── SkPaint.h
│ │ │ │ ├── SkPath.h
│ │ │ │ ├── SkPathBuilder.h
│ │ │ │ ├── SkPathEffect.h
│ │ │ │ ├── SkPathMeasure.h
│ │ │ │ ├── SkPathTypes.h
│ │ │ │ ├── SkPathUtils.h
│ │ │ │ ├── SkPicture.h
│ │ │ │ ├── SkPictureRecorder.h
│ │ │ │ ├── SkPixelRef.h
│ │ │ │ ├── SkPixmap.h
│ │ │ │ ├── SkPoint.h
│ │ │ │ ├── SkPoint3.h
│ │ │ │ ├── SkRRect.h
│ │ │ │ ├── SkRSXform.h
│ │ │ │ ├── SkRasterHandleAllocator.h
│ │ │ │ ├── SkRect.h
│ │ │ │ ├── SkRefCnt.h
│ │ │ │ ├── SkRegion.h
│ │ │ │ ├── SkSamplingOptions.h
│ │ │ │ ├── SkScalar.h
│ │ │ │ ├── SkSerialProcs.h
│ │ │ │ ├── SkShader.h
│ │ │ │ ├── SkSize.h
│ │ │ │ ├── SkSpan.h
│ │ │ │ ├── SkStream.h
│ │ │ │ ├── SkString.h
│ │ │ │ ├── SkStrokeRec.h
│ │ │ │ ├── SkSurface.h
│ │ │ │ ├── SkSurfaceProps.h
│ │ │ │ ├── SkSwizzle.h
│ │ │ │ ├── SkTextBlob.h
│ │ │ │ ├── SkTextureCompressionType.h
│ │ │ │ ├── SkTileMode.h
│ │ │ │ ├── SkTiledImageUtils.h
│ │ │ │ ├── SkTraceMemoryDump.h
│ │ │ │ ├── SkTypeface.h
│ │ │ │ ├── SkTypes.h
│ │ │ │ ├── SkUnPreMultiply.h
│ │ │ │ ├── SkVertices.h
│ │ │ │ ├── SkYUVAInfo.h
│ │ │ │ └── SkYUVAPixmaps.h
│ │ │ ├── docs
│ │ │ │ ├── SkMultiPictureDocument.h
│ │ │ │ ├── SkPDFDocument.h
│ │ │ │ └── SkXPSDocument.h
│ │ │ ├── effects
│ │ │ │ ├── Sk1DPathEffect.h
│ │ │ │ ├── Sk2DPathEffect.h
│ │ │ │ ├── SkBlenders.h
│ │ │ │ ├── SkBlurMaskFilter.h
│ │ │ │ ├── SkColorMatrix.h
│ │ │ │ ├── SkColorMatrixFilter.h
│ │ │ │ ├── SkCornerPathEffect.h
│ │ │ │ ├── SkDashPathEffect.h
│ │ │ │ ├── SkDiscretePathEffect.h
│ │ │ │ ├── SkGradientShader.h
│ │ │ │ ├── SkHighContrastFilter.h
│ │ │ │ ├── SkImageFilters.h
│ │ │ │ ├── SkLumaColorFilter.h
│ │ │ │ ├── SkOverdrawColorFilter.h
│ │ │ │ ├── SkPerlinNoiseShader.h
│ │ │ │ ├── SkRuntimeEffect.h
│ │ │ │ ├── SkShaderMaskFilter.h
│ │ │ │ ├── SkTableMaskFilter.h
│ │ │ │ └── SkTrimPathEffect.h
│ │ │ ├── encode
│ │ │ │ ├── SkEncoder.h
│ │ │ │ ├── SkICC.h
│ │ │ │ ├── SkJpegEncoder.h
│ │ │ │ ├── SkPngEncoder.h
│ │ │ │ └── SkWebpEncoder.h
│ │ │ ├── gpu
│ │ │ │ ├── GpuTypes.h
│ │ │ │ ├── MutableTextureState.h
│ │ │ │ ├── ShaderErrorHandler.h
│ │ │ │ ├── ganesh
│ │ │ │ │ ├── GrBackendSemaphore.h
│ │ │ │ │ ├── GrBackendSurface.h
│ │ │ │ │ ├── GrContextOptions.h
│ │ │ │ │ ├── GrContextThreadSafeProxy.h
│ │ │ │ │ ├── GrDirectContext.h
│ │ │ │ │ ├── GrDriverBugWorkarounds.h
│ │ │ │ │ ├── GrDriverBugWorkaroundsAutogen.h
│ │ │ │ │ ├── GrExternalTextureGenerator.h
│ │ │ │ │ ├── GrRecordingContext.h
│ │ │ │ │ ├── GrTypes.h
│ │ │ │ │ ├── GrYUVABackendTextures.h
│ │ │ │ │ ├── SkImageGanesh.h
│ │ │ │ │ ├── SkMeshGanesh.h
│ │ │ │ │ ├── SkSurfaceGanesh.h
│ │ │ │ │ ├── d3d
│ │ │ │ │ │ ├── GrD3DBackendContext.h
│ │ │ │ │ │ └── GrD3DTypes.h
│ │ │ │ │ ├── gl
│ │ │ │ │ │ ├── GrGLAssembleHelpers.h
│ │ │ │ │ │ ├── GrGLAssembleInterface.h
│ │ │ │ │ │ ├── GrGLBackendSurface.h
│ │ │ │ │ │ ├── GrGLConfig.h
│ │ │ │ │ │ ├── GrGLDirectContext.h
│ │ │ │ │ │ ├── GrGLExtensions.h
│ │ │ │ │ │ ├── GrGLFunctions.h
│ │ │ │ │ │ ├── GrGLInterface.h
│ │ │ │ │ │ ├── GrGLMakeWebGLInterface.h
│ │ │ │ │ │ ├── GrGLTypes.h
│ │ │ │ │ │ ├── egl
│ │ │ │ │ │ │ └── GrGLMakeEGLInterface.h
│ │ │ │ │ │ ├── epoxy
│ │ │ │ │ │ │ └── GrGLMakeEpoxyEGLInterface.h
│ │ │ │ │ │ ├── glx
│ │ │ │ │ │ │ └── GrGLMakeGLXInterface.h
│ │ │ │ │ │ ├── ios
│ │ │ │ │ │ │ └── GrGLMakeIOSInterface.h
│ │ │ │ │ │ ├── mac
│ │ │ │ │ │ │ └── GrGLMakeMacInterface.h
│ │ │ │ │ │ └── win
│ │ │ │ │ │ │ └── GrGLMakeWinInterface.h
│ │ │ │ │ ├── mock
│ │ │ │ │ │ └── GrMockTypes.h
│ │ │ │ │ ├── mtl
│ │ │ │ │ │ ├── GrMtlBackendContext.h
│ │ │ │ │ │ ├── GrMtlBackendSemaphore.h
│ │ │ │ │ │ ├── GrMtlBackendSurface.h
│ │ │ │ │ │ ├── GrMtlDirectContext.h
│ │ │ │ │ │ ├── GrMtlTypes.h
│ │ │ │ │ │ └── SkSurfaceMetal.h
│ │ │ │ │ └── vk
│ │ │ │ │ │ ├── GrBackendDrawableInfo.h
│ │ │ │ │ │ ├── GrVkBackendSemaphore.h
│ │ │ │ │ │ ├── GrVkBackendSurface.h
│ │ │ │ │ │ ├── GrVkDirectContext.h
│ │ │ │ │ │ └── GrVkTypes.h
│ │ │ │ ├── graphite
│ │ │ │ │ ├── BackendSemaphore.h
│ │ │ │ │ ├── BackendTexture.h
│ │ │ │ │ ├── Context.h
│ │ │ │ │ ├── ContextOptions.h
│ │ │ │ │ ├── GraphiteTypes.h
│ │ │ │ │ ├── Image.h
│ │ │ │ │ ├── ImageProvider.h
│ │ │ │ │ ├── Recorder.h
│ │ │ │ │ ├── Recording.h
│ │ │ │ │ ├── Surface.h
│ │ │ │ │ ├── TextureInfo.h
│ │ │ │ │ ├── YUVABackendTextures.h
│ │ │ │ │ ├── dawn
│ │ │ │ │ │ ├── DawnBackendContext.h
│ │ │ │ │ │ ├── DawnTypes.h
│ │ │ │ │ │ └── DawnUtils.h
│ │ │ │ │ ├── mtl
│ │ │ │ │ │ ├── MtlBackendContext.h
│ │ │ │ │ │ ├── MtlGraphiteTypes.h
│ │ │ │ │ │ └── MtlGraphiteUtils.h
│ │ │ │ │ ├── precompile
│ │ │ │ │ │ ├── PaintOptions.h
│ │ │ │ │ │ ├── Precompile.h
│ │ │ │ │ │ ├── PrecompileBase.h
│ │ │ │ │ │ ├── PrecompileBlender.h
│ │ │ │ │ │ ├── PrecompileColorFilter.h
│ │ │ │ │ │ ├── PrecompileImageFilter.h
│ │ │ │ │ │ ├── PrecompileMaskFilter.h
│ │ │ │ │ │ ├── PrecompileRuntimeEffect.h
│ │ │ │ │ │ └── PrecompileShader.h
│ │ │ │ │ └── vk
│ │ │ │ │ │ ├── VulkanGraphiteTypes.h
│ │ │ │ │ │ └── VulkanGraphiteUtils.h
│ │ │ │ ├── mtl
│ │ │ │ │ └── MtlMemoryAllocator.h
│ │ │ │ └── vk
│ │ │ │ │ ├── VulkanBackendContext.h
│ │ │ │ │ ├── VulkanExtensions.h
│ │ │ │ │ ├── VulkanMemoryAllocator.h
│ │ │ │ │ ├── VulkanMutableTextureState.h
│ │ │ │ │ └── VulkanTypes.h
│ │ │ ├── pathops
│ │ │ │ └── SkPathOps.h
│ │ │ ├── ports
│ │ │ │ ├── SkCFObject.h
│ │ │ │ ├── SkFontConfigInterface.h
│ │ │ │ ├── SkFontMgr_FontConfigInterface.h
│ │ │ │ ├── SkFontMgr_Fontations.h
│ │ │ │ ├── SkFontMgr_android.h
│ │ │ │ ├── SkFontMgr_android_ndk.h
│ │ │ │ ├── SkFontMgr_data.h
│ │ │ │ ├── SkFontMgr_directory.h
│ │ │ │ ├── SkFontMgr_empty.h
│ │ │ │ ├── SkFontMgr_fontconfig.h
│ │ │ │ ├── SkFontMgr_fuchsia.h
│ │ │ │ ├── SkFontMgr_mac_ct.h
│ │ │ │ ├── SkFontScanner_Fontations.h
│ │ │ │ ├── SkFontScanner_FreeType.h
│ │ │ │ ├── SkImageGeneratorCG.h
│ │ │ │ ├── SkImageGeneratorNDK.h
│ │ │ │ ├── SkImageGeneratorWIC.h
│ │ │ │ ├── SkTypeface_fontations.h
│ │ │ │ ├── SkTypeface_mac.h
│ │ │ │ └── SkTypeface_win.h
│ │ │ ├── private
│ │ │ │ ├── SkColorData.h
│ │ │ │ ├── SkEncodedInfo.h
│ │ │ │ ├── SkExif.h
│ │ │ │ ├── SkGainmapInfo.h
│ │ │ │ ├── SkGainmapShader.h
│ │ │ │ ├── SkIDChangeListener.h
│ │ │ │ ├── SkJpegGainmapEncoder.h
│ │ │ │ ├── SkJpegMetadataDecoder.h
│ │ │ │ ├── SkPathRef.h
│ │ │ │ ├── SkSLSampleUsage.h
│ │ │ │ ├── SkWeakRefCnt.h
│ │ │ │ ├── SkXmp.h
│ │ │ │ ├── base
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── SingleOwner.h
│ │ │ │ │ ├── SkAPI.h
│ │ │ │ │ ├── SkASAN.h
│ │ │ │ │ ├── SkAlign.h
│ │ │ │ │ ├── SkAlignedStorage.h
│ │ │ │ │ ├── SkAnySubclass.h
│ │ │ │ │ ├── SkAssert.h
│ │ │ │ │ ├── SkAttributes.h
│ │ │ │ │ ├── SkCPUTypes.h
│ │ │ │ │ ├── SkContainers.h
│ │ │ │ │ ├── SkDebug.h
│ │ │ │ │ ├── SkDeque.h
│ │ │ │ │ ├── SkFeatures.h
│ │ │ │ │ ├── SkFixed.h
│ │ │ │ │ ├── SkFloatingPoint.h
│ │ │ │ │ ├── SkLoadUserConfig.h
│ │ │ │ │ ├── SkMacros.h
│ │ │ │ │ ├── SkMalloc.h
│ │ │ │ │ ├── SkMath.h
│ │ │ │ │ ├── SkMutex.h
│ │ │ │ │ ├── SkNoncopyable.h
│ │ │ │ │ ├── SkOnce.h
│ │ │ │ │ ├── SkPoint_impl.h
│ │ │ │ │ ├── SkSafe32.h
│ │ │ │ │ ├── SkSemaphore.h
│ │ │ │ │ ├── SkSpan_impl.h
│ │ │ │ │ ├── SkTArray.h
│ │ │ │ │ ├── SkTDArray.h
│ │ │ │ │ ├── SkTFitsIn.h
│ │ │ │ │ ├── SkTLogic.h
│ │ │ │ │ ├── SkTPin.h
│ │ │ │ │ ├── SkTemplates.h
│ │ │ │ │ ├── SkThreadAnnotations.h
│ │ │ │ │ ├── SkThreadID.h
│ │ │ │ │ ├── SkTo.h
│ │ │ │ │ └── SkTypeTraits.h
│ │ │ │ ├── chromium
│ │ │ │ │ ├── GrDeferredDisplayList.h
│ │ │ │ │ ├── GrDeferredDisplayListRecorder.h
│ │ │ │ │ ├── GrPromiseImageTexture.h
│ │ │ │ │ ├── GrSurfaceCharacterization.h
│ │ │ │ │ ├── GrVkSecondaryCBDrawContext.h
│ │ │ │ │ ├── SkChromeRemoteGlyphCache.h
│ │ │ │ │ ├── SkDiscardableMemory.h
│ │ │ │ │ ├── SkImageChromium.h
│ │ │ │ │ └── Slug.h
│ │ │ │ └── gpu
│ │ │ │ │ ├── ganesh
│ │ │ │ │ ├── GrContext_Base.h
│ │ │ │ │ ├── GrD3DTypesMinimal.h
│ │ │ │ │ ├── GrImageContext.h
│ │ │ │ │ ├── GrTextureGenerator.h
│ │ │ │ │ └── GrTypesPriv.h
│ │ │ │ │ └── vk
│ │ │ │ │ └── SkiaVulkan.h
│ │ │ ├── sksl
│ │ │ │ ├── SkSLDebugTrace.h
│ │ │ │ └── SkSLVersion.h
│ │ │ ├── svg
│ │ │ │ └── SkSVGCanvas.h
│ │ │ ├── third_party
│ │ │ │ └── vulkan
│ │ │ │ │ └── vulkan
│ │ │ │ │ ├── vk_platform.h
│ │ │ │ │ ├── vk_video
│ │ │ │ │ ├── vulkan_video_codec_h264std.h
│ │ │ │ │ ├── vulkan_video_codec_h264std_decode.h
│ │ │ │ │ ├── vulkan_video_codec_h265std.h
│ │ │ │ │ ├── vulkan_video_codec_h265std_decode.h
│ │ │ │ │ └── vulkan_video_codecs_common.h
│ │ │ │ │ ├── vulkan.h
│ │ │ │ │ ├── vulkan_android.h
│ │ │ │ │ ├── vulkan_core.h
│ │ │ │ │ ├── vulkan_ios.h
│ │ │ │ │ ├── vulkan_macos.h
│ │ │ │ │ ├── vulkan_win32.h
│ │ │ │ │ └── vulkan_xcb.h
│ │ │ └── utils
│ │ │ │ ├── SkCamera.h
│ │ │ │ ├── SkCanvasStateUtils.h
│ │ │ │ ├── SkCustomTypeface.h
│ │ │ │ ├── SkEventTracer.h
│ │ │ │ ├── SkNWayCanvas.h
│ │ │ │ ├── SkNoDrawCanvas.h
│ │ │ │ ├── SkNullCanvas.h
│ │ │ │ ├── SkOrderedFontMgr.h
│ │ │ │ ├── SkPaintFilterCanvas.h
│ │ │ │ ├── SkParse.h
│ │ │ │ ├── SkParsePath.h
│ │ │ │ ├── SkShadowUtils.h
│ │ │ │ ├── SkTextUtils.h
│ │ │ │ ├── SkTraceEventPhase.h
│ │ │ │ └── mac
│ │ │ │ └── SkCGUtils.h
│ │ ├── modules
│ │ │ ├── skcms
│ │ │ │ ├── skcms.h
│ │ │ │ └── src
│ │ │ │ │ ├── Transform_inl.h
│ │ │ │ │ ├── skcms_Transform.h
│ │ │ │ │ ├── skcms_internals.h
│ │ │ │ │ └── skcms_public.h
│ │ │ ├── skottie
│ │ │ │ ├── include
│ │ │ │ │ ├── BUILD.bazel
│ │ │ │ │ ├── ExternalLayer.h
│ │ │ │ │ ├── Skottie.h
│ │ │ │ │ ├── SkottieProperty.h
│ │ │ │ │ ├── SlotManager.h
│ │ │ │ │ └── TextShaper.h
│ │ │ │ └── src
│ │ │ │ │ ├── SkottieValue.h
│ │ │ │ │ └── text
│ │ │ │ │ └── SkottieShaper.h
│ │ │ ├── skparagraph
│ │ │ │ └── include
│ │ │ │ │ ├── DartTypes.h
│ │ │ │ │ ├── FontArguments.h
│ │ │ │ │ ├── FontCollection.h
│ │ │ │ │ ├── Metrics.h
│ │ │ │ │ ├── Paragraph.h
│ │ │ │ │ ├── ParagraphBuilder.h
│ │ │ │ │ ├── ParagraphCache.h
│ │ │ │ │ ├── ParagraphPainter.h
│ │ │ │ │ ├── ParagraphStyle.h
│ │ │ │ │ ├── TextShadow.h
│ │ │ │ │ ├── TextStyle.h
│ │ │ │ │ └── TypefaceFontProvider.h
│ │ │ ├── skresources
│ │ │ │ └── include
│ │ │ │ │ └── SkResources.h
│ │ │ ├── skshaper
│ │ │ │ └── include
│ │ │ │ │ ├── SkShaper.h
│ │ │ │ │ ├── SkShaper_coretext.h
│ │ │ │ │ ├── SkShaper_factory.h
│ │ │ │ │ ├── SkShaper_harfbuzz.h
│ │ │ │ │ └── SkShaper_skunicode.h
│ │ │ ├── skunicode
│ │ │ │ └── include
│ │ │ │ │ └── SkUnicode.h
│ │ │ └── svg
│ │ │ │ └── include
│ │ │ │ ├── SkSVGAttribute.h
│ │ │ │ ├── SkSVGAttributeParser.h
│ │ │ │ ├── SkSVGCircle.h
│ │ │ │ ├── SkSVGClipPath.h
│ │ │ │ ├── SkSVGContainer.h
│ │ │ │ ├── SkSVGDOM.h
│ │ │ │ ├── SkSVGDefs.h
│ │ │ │ ├── SkSVGEllipse.h
│ │ │ │ ├── SkSVGFe.h
│ │ │ │ ├── SkSVGFeBlend.h
│ │ │ │ ├── SkSVGFeColorMatrix.h
│ │ │ │ ├── SkSVGFeComponentTransfer.h
│ │ │ │ ├── SkSVGFeComposite.h
│ │ │ │ ├── SkSVGFeDisplacementMap.h
│ │ │ │ ├── SkSVGFeFlood.h
│ │ │ │ ├── SkSVGFeGaussianBlur.h
│ │ │ │ ├── SkSVGFeImage.h
│ │ │ │ ├── SkSVGFeLightSource.h
│ │ │ │ ├── SkSVGFeLighting.h
│ │ │ │ ├── SkSVGFeMerge.h
│ │ │ │ ├── SkSVGFeMorphology.h
│ │ │ │ ├── SkSVGFeOffset.h
│ │ │ │ ├── SkSVGFeTurbulence.h
│ │ │ │ ├── SkSVGFilter.h
│ │ │ │ ├── SkSVGFilterContext.h
│ │ │ │ ├── SkSVGG.h
│ │ │ │ ├── SkSVGGradient.h
│ │ │ │ ├── SkSVGHiddenContainer.h
│ │ │ │ ├── SkSVGIDMapper.h
│ │ │ │ ├── SkSVGImage.h
│ │ │ │ ├── SkSVGLine.h
│ │ │ │ ├── SkSVGLinearGradient.h
│ │ │ │ ├── SkSVGMask.h
│ │ │ │ ├── SkSVGNode.h
│ │ │ │ ├── SkSVGOpenTypeSVGDecoder.h
│ │ │ │ ├── SkSVGPath.h
│ │ │ │ ├── SkSVGPattern.h
│ │ │ │ ├── SkSVGPoly.h
│ │ │ │ ├── SkSVGRadialGradient.h
│ │ │ │ ├── SkSVGRect.h
│ │ │ │ ├── SkSVGRenderContext.h
│ │ │ │ ├── SkSVGSVG.h
│ │ │ │ ├── SkSVGShape.h
│ │ │ │ ├── SkSVGStop.h
│ │ │ │ ├── SkSVGText.h
│ │ │ │ ├── SkSVGTransformableNode.h
│ │ │ │ ├── SkSVGTypes.h
│ │ │ │ ├── SkSVGUse.h
│ │ │ │ └── SkSVGValue.h
│ │ └── src
│ │ │ ├── base
│ │ │ ├── SkMathPriv.h
│ │ │ ├── SkTInternalLList.h
│ │ │ ├── SkTLazy.h
│ │ │ └── SkUTF.h
│ │ │ ├── core
│ │ │ ├── SkChecksum.h
│ │ │ ├── SkLRUCache.h
│ │ │ └── SkTHash.h
│ │ │ └── gpu
│ │ │ └── ganesh
│ │ │ └── gl
│ │ │ └── GrGLDefines.h
│ ├── v8
│ │ └── include
│ │ │ ├── APIDesign.md
│ │ │ ├── DEPS
│ │ │ ├── OWNERS
│ │ │ ├── codecache-units.h
│ │ │ ├── inspector
│ │ │ ├── Debugger.h
│ │ │ ├── Runtime.h
│ │ │ └── Schema.h
│ │ │ ├── js_protocol-1.2.json
│ │ │ ├── js_protocol-1.3.json
│ │ │ ├── js_protocol.pdl
│ │ │ ├── libplatform
│ │ │ ├── DEPS
│ │ │ ├── libplatform-export.h
│ │ │ ├── libplatform.h
│ │ │ └── v8-tracing.h
│ │ │ ├── mkjso-units.h
│ │ │ ├── v8-debug.h
│ │ │ ├── v8-inspector-protocol.h
│ │ │ ├── v8-inspector.h
│ │ │ ├── v8-internal.h
│ │ │ ├── v8-jsaot.h
│ │ │ ├── v8-platform.h
│ │ │ ├── v8-profiler.h
│ │ │ ├── v8-util.h
│ │ │ ├── v8-value-serializer-version.h
│ │ │ ├── v8-version-string.h
│ │ │ ├── v8-version.h
│ │ │ ├── v8-vex.h
│ │ │ ├── v8-wasm-trap-handler-posix.h
│ │ │ ├── v8-wasm-trap-handler-win.h
│ │ │ ├── v8.h
│ │ │ ├── v8config.h
│ │ │ └── xts.h
│ └── x86_64.zip
│ └── res
│ ├── drawable-v24
│ └── ic_launcher_foreground.xml
│ ├── drawable
│ ├── ic_launcher_background.xml
│ ├── logo.png
│ └── round_logo.png
│ ├── layout
│ ├── activity_example.xml
│ └── activity_main.xml
│ ├── mipmap-anydpi-v26
│ ├── ic_launcher.xml
│ └── ic_launcher_round.xml
│ ├── mipmap-xxhdpi
│ ├── ic_launcher.png
│ └── ic_launcher_round.png
│ ├── mipmap-xxxhdpi
│ ├── ic_launcher.png
│ └── ic_launcher_round.png
│ └── values
│ └── strings.xml
├── build.gradle.kts
├── gradle.properties
├── gradle
└── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
└── settings.gradle.kts
/.gitattributes:
--------------------------------------------------------------------------------
1 | app/src/main/jniLibs/arm64-v8a/libskia.a filter=lfs diff=lfs merge=lfs -text
2 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | *.iml
2 | .gradle
3 | /local.properties
4 | # IntelliJ
5 | /.idea/
6 | /.idea/*
7 | /.idea/caches
8 | /.idea/libraries
9 | /.idea/modules.xml
10 | /.idea/workspace.xml
11 | /.idea/navEditor.xml
12 | /.idea/assetWizardSettings.xml
13 | /.idea/vcs.xml
14 | .DS_Store
15 | /build
16 | /captures
17 | .externalNativeBuild
18 | .cxx
19 | local.properties
20 | /app/src/main/jniLibs/arm64-v8a
21 | /app/src/main/jniLibs/x86_64
22 | /.kotlin/*
23 |
--------------------------------------------------------------------------------
/app/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/app/example.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tanpuer/SkiaUI2/d894a500b2b9649174fb994f0b1ab8a0adc7bb43/app/example.png
--------------------------------------------------------------------------------
/app/example1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tanpuer/SkiaUI2/d894a500b2b9649174fb994f0b1ab8a0adc7bb43/app/example1.png
--------------------------------------------------------------------------------
/app/example2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tanpuer/SkiaUI2/d894a500b2b9649174fb994f0b1ab8a0adc7bb43/app/example2.png
--------------------------------------------------------------------------------
/app/example3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tanpuer/SkiaUI2/d894a500b2b9649174fb994f0b1ab8a0adc7bb43/app/example3.png
--------------------------------------------------------------------------------
/app/example4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tanpuer/SkiaUI2/d894a500b2b9649174fb994f0b1ab8a0adc7bb43/app/example4.png
--------------------------------------------------------------------------------
/app/example5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tanpuer/SkiaUI2/d894a500b2b9649174fb994f0b1ab8a0adc7bb43/app/example5.png
--------------------------------------------------------------------------------
/app/example6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tanpuer/SkiaUI2/d894a500b2b9649174fb994f0b1ab8a0adc7bb43/app/example6.png
--------------------------------------------------------------------------------
/app/example7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tanpuer/SkiaUI2/d894a500b2b9649174fb994f0b1ab8a0adc7bb43/app/example7.png
--------------------------------------------------------------------------------
/app/example8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tanpuer/SkiaUI2/d894a500b2b9649174fb994f0b1ab8a0adc7bb43/app/example8.png
--------------------------------------------------------------------------------
/app/example9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tanpuer/SkiaUI2/d894a500b2b9649174fb994f0b1ab8a0adc7bb43/app/example9.png
--------------------------------------------------------------------------------
/app/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # You can control the set of applied configuration files using the
3 | # proguardFiles setting in build.gradle.
4 | #
5 | # For more details, see
6 | # http://developer.android.com/guide/developing/tools/proguard.html
7 |
8 | # If your project uses WebView with JS, uncomment the following
9 | # and specify the fully qualified class name to the JavaScript interface
10 | # class:
11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
12 | # public *;
13 | #}
14 |
15 | # Uncomment this to preserve the line number information for
16 | # debugging stack traces.
17 | #-keepattributes SourceFile,LineNumberTable
18 |
19 | # If you keep the line number information, uncomment this to
20 | # hide the original source file name.
21 | #-renamesourcefileattribute SourceFile
--------------------------------------------------------------------------------
/app/src/main/assets/bird.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tanpuer/SkiaUI2/d894a500b2b9649174fb994f0b1ab8a0adc7bb43/app/src/main/assets/bird.gif
--------------------------------------------------------------------------------
/app/src/main/assets/feng.mp4:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tanpuer/SkiaUI2/d894a500b2b9649174fb994f0b1ab8a0adc7bb43/app/src/main/assets/feng.mp4
--------------------------------------------------------------------------------
/app/src/main/assets/font/AlimamaFangYuanTiVF-Thin.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tanpuer/SkiaUI2/d894a500b2b9649174fb994f0b1ab8a0adc7bb43/app/src/main/assets/font/AlimamaFangYuanTiVF-Thin.ttf
--------------------------------------------------------------------------------
/app/src/main/assets/font/NotoColorEmoji.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tanpuer/SkiaUI2/d894a500b2b9649174fb994f0b1ab8a0adc7bb43/app/src/main/assets/font/NotoColorEmoji.ttf
--------------------------------------------------------------------------------
/app/src/main/assets/font/iconfont.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tanpuer/SkiaUI2/d894a500b2b9649174fb994f0b1ab8a0adc7bb43/app/src/main/assets/font/iconfont.woff
--------------------------------------------------------------------------------
/app/src/main/assets/gl_transition_window_slice.glsl:
--------------------------------------------------------------------------------
1 | uniform float2 iResolution;
2 | uniform float iTime;
3 | uniform float count; // = 10.0
4 | uniform float smoothness; // = 0.5
5 | uniform shader iChannel0;
6 | uniform shader iChannel1;
7 | uniform float2 iChannel0Resolution;
8 | uniform float2 iChannel1Resolution;
9 | uniform float shaderTouchX;
10 |
11 | float4 main(float2 coord) {
12 | float progress = shaderTouchX < 0 ? mod(iTime * 80, iResolution.x) : shaderTouchX;
13 | float pr = smoothstep(-smoothness, 0.0, coord.x - progress * (1.0 + smoothness));
14 | float s = step(pr, fract(count * coord.x));
15 | float4 fromColor = iChannel0.eval(coord / iResolution * iChannel0Resolution);
16 | float4 toColor = iChannel1.eval(coord / iResolution * iChannel1Resolution);
17 | return mix(fromColor, toColor, s);
18 | }
--------------------------------------------------------------------------------
/app/src/main/assets/materials/baked_color.filamat:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tanpuer/SkiaUI2/d894a500b2b9649174fb994f0b1ab8a0adc7bb43/app/src/main/assets/materials/baked_color.filamat
--------------------------------------------------------------------------------
/app/src/main/assets/music/bg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tanpuer/SkiaUI2/d894a500b2b9649174fb994f0b1ab8a0adc7bb43/app/src/main/assets/music/bg.png
--------------------------------------------------------------------------------
/app/src/main/assets/music/ic_next.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tanpuer/SkiaUI2/d894a500b2b9649174fb994f0b1ab8a0adc7bb43/app/src/main/assets/music/ic_next.png
--------------------------------------------------------------------------------
/app/src/main/assets/music/ic_pause.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tanpuer/SkiaUI2/d894a500b2b9649174fb994f0b1ab8a0adc7bb43/app/src/main/assets/music/ic_pause.png
--------------------------------------------------------------------------------
/app/src/main/assets/music/ic_play.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tanpuer/SkiaUI2/d894a500b2b9649174fb994f0b1ab8a0adc7bb43/app/src/main/assets/music/ic_play.png
--------------------------------------------------------------------------------
/app/src/main/assets/music/ic_previous.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tanpuer/SkiaUI2/d894a500b2b9649174fb994f0b1ab8a0adc7bb43/app/src/main/assets/music/ic_previous.png
--------------------------------------------------------------------------------
/app/src/main/assets/music/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tanpuer/SkiaUI2/d894a500b2b9649174fb994f0b1ab8a0adc7bb43/app/src/main/assets/music/logo.png
--------------------------------------------------------------------------------
/app/src/main/assets/music/record_player_dark_arm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tanpuer/SkiaUI2/d894a500b2b9649174fb994f0b1ab8a0adc7bb43/app/src/main/assets/music/record_player_dark_arm.png
--------------------------------------------------------------------------------
/app/src/main/assets/music/record_player_verydark_highlight.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tanpuer/SkiaUI2/d894a500b2b9649174fb994f0b1ab8a0adc7bb43/app/src/main/assets/music/record_player_verydark_highlight.png
--------------------------------------------------------------------------------
/app/src/main/assets/raining.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tanpuer/SkiaUI2/d894a500b2b9649174fb994f0b1ab8a0adc7bb43/app/src/main/assets/raining.png
--------------------------------------------------------------------------------
/app/src/main/assets/skia_nv12_fragment_shader.glsl:
--------------------------------------------------------------------------------
1 | uniform shader y_tex;
2 | uniform shader uv_tex;
3 | uniform float widthRatio;
4 | uniform float heightRatio;
5 | uniform float rotation;
6 | half4 main(float2 coord) {
7 | float2 texCoord = float2(coord.x / widthRatio, coord.y / heightRatio);
8 | float2 uv_coord = float2(texCoord.x / 2.0, texCoord.y / 2.0);
9 | half y = y_tex.eval(texCoord).r;
10 | half2 uv = uv_tex.eval(uv_coord).rg - 0.5;
11 | half u = uv.x;
12 | half v = uv.y;
13 | half r = y + 1.402 * v;
14 | half g = y - 0.344 * u - 0.714 * v;
15 | half b = y + 1.772 * u;
16 | return half4(r, g, b, 1.0);
17 | }
--------------------------------------------------------------------------------
/app/src/main/assets/skia_video_black_white.glsl:
--------------------------------------------------------------------------------
1 | uniform float2 iResolution;
2 | uniform float iTime;
3 | uniform shader iChannel0;
4 |
5 | float4 main(float2 coord) {
6 | float4 color = iChannel0.eval(coord);
7 | float luminance = dot(color.rgb, float3(0.299, 0.587, 0.114));
8 | float3 grayscale = mix(color.rgb, float3(luminance), 1.0);
9 | return float4(grayscale, color.a);
10 | }
--------------------------------------------------------------------------------
/app/src/main/assets/skia_video_bright_shader.glsl:
--------------------------------------------------------------------------------
1 | uniform float2 iResolution;
2 | uniform float iTime;
3 | uniform shader iChannel0;
4 |
5 | float4 main(float2 coord) {
6 | float uBrightness = 0.5;
7 | float4 textureColor = iChannel0.eval(coord);
8 | return float4((textureColor.rgb + float3(uBrightness)), textureColor.w);
9 | }
--------------------------------------------------------------------------------
/app/src/main/assets/skia_video_lightning_shader.glsl:
--------------------------------------------------------------------------------
1 | uniform float2 iResolution;
2 | uniform float iTime;
3 | uniform shader iChannel0;
4 |
5 | float4 main(float2 coord) {
6 | float4 color = iChannel0.eval(coord);
7 | return float4(1.0 - color.r, 1.0 - color.g, 1.0 - color.b, color.a);
8 | }
--------------------------------------------------------------------------------
/app/src/main/assets/skia_yuv420p_camera_shader.glsl:
--------------------------------------------------------------------------------
1 | uniform shader y_tex;
2 | uniform shader u_tex;
3 | uniform shader v_tex;
4 | uniform float widthRatio;
5 | uniform float heightRatio;
6 | uniform float rotation;
7 | half4 main(float2 coord) {
8 | float2 texCoord = float2(coord.x / widthRatio, coord.y / heightRatio);
9 | float2 uv_coord = texCoord / 2.0;
10 | half y = y_tex.eval(texCoord).r;
11 | half u = u_tex.eval(uv_coord).r - 0.5;
12 | half v = v_tex.eval(uv_coord).r - 0.5;
13 | half r = y + 1.402 * v;
14 | half g = y - 0.344 * u - 0.714 * v;
15 | half b = y + 1.772 * u;
16 | return half4(r, g, b, 1.0);
17 | }
--------------------------------------------------------------------------------
/app/src/main/assets/skia_yuv420p_fragment_shader.glsl:
--------------------------------------------------------------------------------
1 | uniform shader y_tex;
2 | uniform shader u_tex;
3 | uniform shader v_tex;
4 | uniform float widthRatio;
5 | uniform float heightRatio;
6 | half4 main(float2 coord) {
7 | float2 texCoord = float2(coord.x / widthRatio, coord.y / heightRatio);
8 | float2 uv_coord = texCoord / 2.0;
9 | half y = y_tex.eval(texCoord).r;
10 | half u = u_tex.eval(uv_coord).r - 0.5;
11 | half v = v_tex.eval(uv_coord).r - 0.5;
12 | half r = y + 1.402 * v;
13 | half g = y - 0.344 * u - 0.714 * v;
14 | half b = y + 1.772 * u;
15 | return half4(r, g, b, 1.0);
16 | }
--------------------------------------------------------------------------------
/app/src/main/assets/transition1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tanpuer/SkiaUI2/d894a500b2b9649174fb994f0b1ab8a0adc7bb43/app/src/main/assets/transition1.png
--------------------------------------------------------------------------------
/app/src/main/assets/transition2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tanpuer/SkiaUI2/d894a500b2b9649174fb994f0b1ab8a0adc7bb43/app/src/main/assets/transition2.png
--------------------------------------------------------------------------------
/app/src/main/assets/vue.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/app/src/main/assets/yiluxiangbei.mp4:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tanpuer/SkiaUI2/d894a500b2b9649174fb994f0b1ab8a0adc7bb43/app/src/main/assets/yiluxiangbei.mp4
--------------------------------------------------------------------------------
/app/src/main/cpp/anim/LinearAnimator.h:
--------------------------------------------------------------------------------
1 | #pragma once
2 |
3 | #include "IAnimator.h"
4 | #include "View.h"
5 |
6 | namespace HYSkiaUI {
7 |
8 | class LinearAnimator : public IAnimator {
9 |
10 | public:
11 |
12 | LinearAnimator(View *view, float startValue, float endValue);
13 |
14 | void update(SkRect &rect) override;
15 |
16 | void setUpdateListener(std::function &&listener);
17 |
18 | public:
19 |
20 | v8::Persistent> jsUpdateCallback;
21 |
22 | private:
23 |
24 | float startValue = 0.0f;
25 |
26 | float endValue = 0.0f;
27 |
28 | View *targetView = nullptr;
29 |
30 | std::function updateListener = nullptr;
31 |
32 | void updateInner();
33 |
34 | };
35 |
36 | }
37 |
--------------------------------------------------------------------------------
/app/src/main/cpp/anim/TranslateAnimator.h:
--------------------------------------------------------------------------------
1 | #pragma once
2 |
3 | #include "IAnimator.h"
4 | #include "View.h"
5 |
6 | namespace HYSkiaUI {
7 |
8 | class TranslateAnimator : public IAnimator {
9 |
10 | public:
11 |
12 | TranslateAnimator(View *view,
13 | float animStartX, float animEndX,
14 | float animStartY, float animEndY);
15 |
16 | virtual ~TranslateAnimator();
17 |
18 | virtual void update(SkRect &rect) override;
19 |
20 | virtual void start() override;
21 |
22 | private:
23 |
24 | float animEndX, animEndY = 0.0f;
25 |
26 | float animStartX, animStartY = 0.0f;
27 |
28 | View *targetView = nullptr;
29 |
30 | };
31 |
32 | }
33 |
--------------------------------------------------------------------------------
/app/src/main/cpp/app/FrontEngineType.h:
--------------------------------------------------------------------------------
1 | #pragma once
2 |
3 | namespace HYSkiaUI {
4 |
5 | enum FrontEngineType {
6 | Cpp = 0,
7 | JS = 1,
8 | Compose = 2,
9 | React = 3,
10 | Vue = 4
11 | };
12 |
13 | }
14 |
--------------------------------------------------------------------------------
/app/src/main/cpp/app/SkiaGLApp.h:
--------------------------------------------------------------------------------
1 | #pragma once
2 |
3 | #include "jni.h"
4 | #include "jni.h"
5 | #include "EGLCore.h"
6 | #include "memory"
7 | #include "AssetManager.h"
8 | #include "IFilter.h"
9 |
10 | namespace HYSkiaUI {
11 |
12 | class SkiaGLApp {
13 |
14 | public:
15 |
16 | explicit SkiaGLApp(JNIEnv *env);
17 |
18 | ~SkiaGLApp();
19 |
20 | void create(ANativeWindow *window);
21 |
22 | void change(int width, int height, long time);
23 |
24 | void destroy();
25 |
26 | void doFrame(long pic, long time);
27 |
28 | long MakeHardwareBufferToSkImage(JNIEnv *env, jobject hardwareBuffer);
29 |
30 | void deleteSkImage(JNIEnv *env, long skImagePtr);
31 |
32 | long attachSurfaceTexture(JNIEnv* env, int width, int height, jobject surfaceTexture);
33 |
34 | void updateTexImage(JNIEnv* env, jobject surfaceTexture, long skImagePtr);
35 |
36 | private:
37 |
38 | std::unique_ptr mEGLCore;
39 | std::unique_ptr mFilter;
40 | int mWidth = 0, mHeight = 0;
41 | JNIEnv *env = nullptr;
42 | };
43 |
44 | }
45 |
--------------------------------------------------------------------------------
/app/src/main/cpp/base/AssetManager.h:
--------------------------------------------------------------------------------
1 | #pragma once
2 |
3 | #include
4 |
5 | struct ImageData {
6 | const unsigned char *content;
7 | off_t length;
8 | };
9 |
10 | class AssetManager {
11 |
12 | public:
13 |
14 | AssetManager(JNIEnv *env, jobject javaAssetManager);
15 |
16 |
17 | char *readFile(const char *path);
18 |
19 | ImageData *readImage(const char *path);
20 |
21 | bool exist(const char *path);
22 |
23 | private:
24 |
25 | AAssetManager *asset_manager = nullptr;
26 |
27 | };
28 |
--------------------------------------------------------------------------------
/app/src/main/cpp/base/EGLCore.h:
--------------------------------------------------------------------------------
1 | #pragma once
2 |
3 | #include "EGL/egl.h"
4 | #include "GLES3/gl3.h"
5 | #include "GLES3/gl3ext.h"
6 | #include "EGL/eglext.h"
7 |
8 | class EGLCore {
9 |
10 | public:
11 |
12 | EGLCore();
13 |
14 | ~EGLCore();
15 |
16 | /**
17 | * sharedCtx, 共享egl上下文
18 | * nativeWindow == nullptr 离屏
19 | * @param nativeWindow
20 | */
21 | int createGLEnv(EGLContext sharedCtx, ANativeWindow *nativeWindow, int width, int height, bool offScreen);
22 |
23 | void releaseGLEnv();
24 |
25 | EGLSurface getEGLSurface();
26 |
27 | EGLContext getEGLContext();
28 |
29 | EGLDisplay getEGLDisplay();
30 |
31 | void swapBuffer();
32 |
33 | void makeCurrent();
34 |
35 | private:
36 |
37 | EGLConfig mEGLConf;
38 | EGLSurface mEGLSurface;
39 | EGLContext mEGLCtx;
40 | EGLDisplay mEGLDisplay;
41 |
42 | };
43 |
--------------------------------------------------------------------------------
/app/src/main/cpp/base/MeasureTime.h:
--------------------------------------------------------------------------------
1 | #pragma once
2 |
3 | #include "string"
4 | #include
5 | #include "native_log.h"
6 |
7 | class MeasureTime {
8 |
9 | public:
10 | MeasureTime() = delete;
11 |
12 | MeasureTime(const std::string& name, int minvalue = 0)
13 | : _name(name), _start(std::chrono::high_resolution_clock::now()), minValue(minvalue) {}
14 |
15 | ~MeasureTime() {
16 | auto stop = std::chrono::high_resolution_clock::now();
17 | auto duration = std::chrono::duration_cast(stop - _start).count();
18 | if (duration > minValue) {
19 | ALOGD("MeasureTime %s: %lld ms\n", _name.c_str(), duration)
20 | }
21 | }
22 |
23 | private:
24 | std::string _name;
25 | int minValue = -1;
26 | std::chrono::time_point _start;
27 |
28 | };
29 |
--------------------------------------------------------------------------------
/app/src/main/cpp/base/gl_utils.h:
--------------------------------------------------------------------------------
1 | #pragma once
2 |
3 | #ifdef __cplusplus
4 | extern "C" {
5 | #endif
6 |
7 | #include
8 | #include
9 | #include
10 | #include
11 | #include
12 |
13 | #include "native_log.h"
14 |
15 | GLuint createProgram(const char *vertexShader, const char *fragShader);
16 |
17 | GLuint loadShader(GLenum type, const char *shaderSrc);
18 |
19 | void checkActiveUniform(GLuint program);
20 |
21 | GLuint createTexture(GLenum type);
22 |
23 | GLuint createTextureWithBytes(unsigned char *bytes, int width, int height);
24 |
25 | GLuint createTextureWithOldTexture(GLuint texture, unsigned char *bytes, int width, int height);
26 |
27 | void createFrameBuffer(GLuint *framebuffer, GLuint *texture, int width, int height);
28 |
29 | void createFrameBuffers(GLuint *frambuffers, GLuint *textures, int width, int height, int size);
30 |
31 | void checkGLError(const char *op);
32 |
33 | #define SHADER_STRING(s) #s
34 |
35 | GLuint createShaderProgram(GLuint vertexShader, GLuint fragmentShader);
36 |
37 | #ifdef __cplusplus
38 | }
39 | #endif
40 |
--------------------------------------------------------------------------------
/app/src/main/cpp/base/native_log.h:
--------------------------------------------------------------------------------
1 | #pragma once
2 |
3 | #include
4 |
5 | #define Android 1
6 | #define JNI_DEBUG 1
7 | #define JNI_TAG "SkiaUI"
8 |
9 | #ifdef Android
10 | #define ALOGE(format, ...) if (JNI_DEBUG) { __android_log_print(ANDROID_LOG_ERROR, JNI_TAG, format, ##__VA_ARGS__); }
11 | #define ALOGI(format, ...) if (JNI_DEBUG) { __android_log_print(ANDROID_LOG_INFO, JNI_TAG, format, ##__VA_ARGS__); }
12 | #define ALOGD(format, ...) if (JNI_DEBUG) { __android_log_print(ANDROID_LOG_DEBUG, JNI_TAG, format, ##__VA_ARGS__); }
13 | #define ALOGW(format, ...) if (JNI_DEBUG) { __android_log_print(ANDROID_LOG_WARN, JNI_TAG, format, ##__VA_ARGS__); }
14 | #else
15 |
16 | #endif
17 |
--------------------------------------------------------------------------------
/app/src/main/cpp/compose/ComposeButtonJNI.h:
--------------------------------------------------------------------------------
1 | #pragma once
2 |
3 | #include "jni.h"
4 | #include "Button.h"
5 | #include "native_log.h"
6 |
7 | using namespace HYSkiaUI;
8 |
9 | const char *HYComposeButton = "com/temple/skiaui/compose/ui/HYComposeButton";
10 |
11 | static JNINativeMethod g_ComposeButtonMethods[] = {
12 | };
13 |
14 | static int RegisterComposeButtonMethods(JNIEnv *env) {
15 | return JNI_TRUE;
16 | }
17 |
18 | static void UnRegisterComposeButtonMethods(JNIEnv *env) {
19 | jclass clazz = env->FindClass(HYComposeButton);
20 | if (clazz == nullptr) {
21 | ALOGD("UnRegisterComposeButtonMethods fail clazz == null")
22 | }
23 | env->UnregisterNatives(clazz);
24 | }
--------------------------------------------------------------------------------
/app/src/main/cpp/compose/ComposeCanvas.cpp:
--------------------------------------------------------------------------------
1 | #include "ComposeCanvas.h"
2 |
3 | namespace HYSkiaUI {
4 |
5 | ComposeCanvas::ComposeCanvas() {
6 |
7 | }
8 |
9 | ComposeCanvas::~ComposeCanvas() {
10 |
11 | }
12 |
13 | void ComposeCanvas::draw(SkCanvas *canvas) {
14 | this->canvas = canvas;
15 | canvas->save();
16 | canvas->translate(static_cast(left), static_cast(top));
17 | callComposeDraw(canvas);
18 | canvas->restore();
19 | }
20 |
21 | void ComposeCanvas::setContext(std::shared_ptr &context) {
22 | View::setContext(context);
23 | auto jniEnv = context->getJniEnv();
24 | auto jClazz = jniEnv->FindClass("com/temple/skiaui/compose/ui/HYComposeCanvas");
25 | onDrawMethodId = jniEnv->GetMethodID(jClazz, "onDrawFromJNI", "()V");
26 | }
27 |
28 | void ComposeCanvas::callComposeDraw(SkCanvas *canvas) {
29 | auto jniEnv = context->getJniEnv();
30 | jniEnv->CallVoidMethod(globalJavaViewRef, onDrawMethodId);
31 | }
32 |
33 | SkCanvas *ComposeCanvas::getCanvas() {
34 | return canvas;
35 | }
36 |
37 | }
38 |
--------------------------------------------------------------------------------
/app/src/main/cpp/compose/ComposeCanvas.h:
--------------------------------------------------------------------------------
1 | #pragma once
2 |
3 | #include "View.h"
4 |
5 | namespace HYSkiaUI {
6 |
7 | class ComposeCanvas : public View {
8 |
9 | public:
10 |
11 | ComposeCanvas();
12 |
13 | ~ComposeCanvas();
14 |
15 | void draw(SkCanvas *canvas) override;
16 |
17 | void setContext(std::shared_ptr &context) override;
18 |
19 | SkCanvas* getCanvas();
20 |
21 | private:
22 |
23 | SkCanvas *canvas = nullptr;
24 |
25 | void callComposeDraw(SkCanvas *canvas);
26 |
27 | jmethodID onDrawMethodId = nullptr;
28 |
29 | };
30 |
31 | }
32 |
--------------------------------------------------------------------------------
/app/src/main/cpp/compose/ComposeContext.h:
--------------------------------------------------------------------------------
1 | #pragma once
2 |
3 | #include "SkiaUIContext.h"
4 | #include "unordered_map"
5 | #include "thread"
6 |
7 | namespace HYSkiaUI {
8 |
9 | class ComposeContext {
10 |
11 | public:
12 |
13 | static ComposeContext *getInstance() {
14 | static ComposeContext context;
15 | return &context;
16 | }
17 |
18 | std::shared_ptr &getUIContext() {
19 | return uiContextMap[std::this_thread::get_id()];
20 | }
21 |
22 | void saveContext(std::shared_ptr &uiContext) {
23 | uiContextMap[std::this_thread::get_id()] = uiContext;
24 | }
25 |
26 | void clearContext() {
27 | uiContextMap.erase(std::this_thread::get_id());
28 | }
29 |
30 | private:
31 |
32 | ComposeContext() {}
33 |
34 | ComposeContext(ComposeContext &other) = delete;
35 |
36 | ComposeContext &operator=(ComposeContext &other) = delete;
37 |
38 | ~ComposeContext() {}
39 |
40 | std::unordered_map> uiContextMap;
41 |
42 | };
43 |
44 | }
45 |
--------------------------------------------------------------------------------
/app/src/main/cpp/compose/ComposeFilamentJNI.h:
--------------------------------------------------------------------------------
1 | #pragma once
2 |
3 | #include "jni.h"
4 | #include "native_log.h"
5 | #include "FilamentView.h"
6 |
7 | using namespace HYSkiaUI;
8 |
9 | const char *HYComposeFilament = "com/temple/skiaui/compose/ui/HYComposeFilament";
10 |
11 | static JNINativeMethod g_ComposeFilamentViewMethods[] = {
12 | };
13 |
14 | static int RegisterComposeFilamentMethods(JNIEnv *env) {
15 | ALOGD("RegisterComposeCameraMethods start %s", HYComposeFilament)
16 | jclass clazz = env->FindClass(HYComposeFilament);
17 | if (clazz == nullptr) {
18 | ALOGD("RegisterComposeCameraMethods fail clazz == null")
19 | return JNI_FALSE;
20 | }
21 | // if (env->RegisterNatives(clazz, g_ComposeFilamentViewMethods,
22 | // std::size(g_ComposeFilamentViewMethods)) < 0) {
23 | // ALOGD("RegisterComposeCameraMethods fail")
24 | // return JNI_FALSE;
25 | // }
26 | return JNI_TRUE;
27 | }
28 |
29 | static void UnRegisterComposeFilamentMethods(JNIEnv *env) {
30 | jclass clazz = env->FindClass(HYComposeFilament);
31 | if (clazz == nullptr) {
32 | ALOGD("UnRegisterComposeCameraMethods fail clazz == null")
33 | }
34 | env->UnregisterNatives(clazz);
35 | }
36 |
--------------------------------------------------------------------------------
/app/src/main/cpp/compose/ComposeFlexboxLayoutJNI.h:
--------------------------------------------------------------------------------
1 | #pragma once
2 |
3 | #include "jni.h"
4 | #include "native_log.h"
5 | #include "FlexboxLayout.h"
6 | #include "w3c_util.h"
7 |
8 | using namespace HYSkiaUI;
9 |
10 | const char *HYComposeFlexboxLayout = "com/temple/skiaui/compose/ui/HYComposeFlexboxLayout";
11 |
12 | static JNINativeMethod g_ComposeFlexboxMethods[] = {
13 | };
14 |
15 | static int RegisterComposeFlexboxLayoutMethods(JNIEnv *env) {
16 | ALOGD("RegisterComposeFlexboxLayoutMethods start %s", HYComposeFlexboxLayout)
17 | return JNI_TRUE;
18 | }
19 |
20 | static void UnRegisterComposeFlexboxLayoutMethods(JNIEnv *env) {
21 | ALOGD("UnRegisterComposeFlexboxLayoutMethods")
22 | }
23 |
--------------------------------------------------------------------------------
/app/src/main/cpp/compose/ComposeRecyclerView.h:
--------------------------------------------------------------------------------
1 | #pragma once
2 |
3 | #include "RecyclerView.h"
4 |
5 | namespace HYSkiaUI {
6 |
7 | class ComposeRecyclerView : public RecyclerView {
8 |
9 | public:
10 |
11 | ComposeRecyclerView();
12 |
13 | ~ComposeRecyclerView();
14 |
15 | View *onCreateView(uint32_t index) override;
16 |
17 | void onBindView(uint32_t index, HYSkiaUI::View *view) override;
18 |
19 | uint32_t getViewType(uint32_t index) override;
20 |
21 | void checkJavaViewRef(jobject instance) override;
22 |
23 | private:
24 |
25 | jmethodID createViewMethodId = nullptr;
26 | jmethodID bindViewMethodId = nullptr;
27 | jmethodID viewTypeMethodId = nullptr;
28 |
29 | };
30 |
31 | }
32 |
--------------------------------------------------------------------------------
/app/src/main/cpp/custom/LyricScrollView.h:
--------------------------------------------------------------------------------
1 | #pragma once
2 |
3 | #include "ScrollView.h"
4 |
5 | namespace HYSkiaUI {
6 |
7 | enum class LyricType {
8 | Lrc,
9 | Srt,
10 | };
11 |
12 | struct Lyric {
13 | std::string content;
14 | uint32_t type; //0=lrc; 1=srt
15 | std::vector timeMills;
16 | std::vector contentList; //逐字专用
17 | uint32_t lineIndex;
18 | };
19 |
20 | class LyricScrollView : public ScrollView {
21 |
22 | public:
23 |
24 | LyricScrollView();
25 |
26 | void setSourceSRT(const char *source);
27 |
28 | void draw(SkCanvas *canvas) override;
29 |
30 | void setCurrPositionFunc(std::function &&func);
31 |
32 | void pause();
33 |
34 | void start();
35 |
36 | private:
37 |
38 | View *initItem(int index);
39 |
40 | std::vector result;
41 |
42 | long startTimeMills = 0L;
43 |
44 | std::function currentPositionFunc = nullptr;
45 |
46 | int currentIndex = -1;
47 |
48 | bool paused = false;
49 |
50 | bool lastIndexFlag = false;
51 |
52 | };
53 |
54 | }
55 |
--------------------------------------------------------------------------------
/app/src/main/cpp/filter/GrAHardwareBufferUtils.h:
--------------------------------------------------------------------------------
1 | #pragma once
2 |
3 | #include "include/core/SkTypes.h"
4 |
5 | #include "include/gpu/ganesh/GrBackendSurface.h"
6 | #include "include/gpu/ganesh/GrTypes.h"
7 |
8 | class GrDirectContext;
9 |
10 | extern "C" {
11 | typedef struct AHardwareBuffer AHardwareBuffer;
12 | }
13 |
14 | typedef void *TexImageCtx;
15 |
16 | typedef void (*DeleteImageProc)(TexImageCtx);
17 |
18 | typedef void (*UpdateImageProc)(TexImageCtx, GrDirectContext *);
19 |
20 | GrBackendTexture
21 | MakeGLBackendTexture(GrDirectContext *dContext, AHardwareBuffer *hardwareBuffer,
22 | int width, int height, DeleteImageProc *deleteProc,
23 | UpdateImageProc *updateProc, TexImageCtx *imageCtx,
24 | bool isProtectedContent,
25 | const GrBackendFormat &backendFormat, bool isRenderable);
26 |
27 | GrBackendFormat GetGLBackendFormat(GrDirectContext *dContext,
28 | uint32_t bufferFormat,
29 | bool requireKnownFormat);
30 |
--------------------------------------------------------------------------------
/app/src/main/cpp/filter/IFilter.h:
--------------------------------------------------------------------------------
1 | #pragma once
2 |
3 | #include
4 |
5 | class SkPicture;
6 |
7 | namespace HYSkiaUI {
8 |
9 | class IFilter {
10 |
11 | public:
12 |
13 | IFilter() = default;
14 |
15 | virtual ~IFilter() = default;
16 |
17 | virtual void setWindowSize(int width, int height) = 0;
18 |
19 | virtual void render(SkPicture *picture) = 0;
20 |
21 | virtual long MakeHardwareBufferToSkImage(JNIEnv *env, jobject hardwareBuffer) = 0;
22 |
23 | virtual void deleteSkImage(JNIEnv *env, long skImagePtr) = 0;
24 |
25 | virtual long attachSurfaceTexture(JNIEnv* env, int width, int height, jobject surfaceTexture) = 0;
26 |
27 | virtual void updateTexImage(JNIEnv* env, jobject surfaceTexture, long skImagePtr) = 0;
28 |
29 | protected:
30 |
31 | int width = 0;
32 | int height = 0;
33 |
34 | long time = 0L;
35 |
36 | };
37 |
38 | }
--------------------------------------------------------------------------------
/app/src/main/cpp/filter/PersistentCache.h:
--------------------------------------------------------------------------------
1 | #pragma once
2 |
3 | #include "gpu/ganesh/GrContextOptions.h"
4 | #include "jni.h"
5 |
6 | namespace HYSkiaUI {
7 |
8 | class PersistentCache : public GrContextOptions::PersistentCache {
9 |
10 | public:
11 |
12 | explicit PersistentCache(JNIEnv *env);
13 |
14 | ~PersistentCache();
15 |
16 | sk_sp load(const SkData &key) override;
17 |
18 | void store(const SkData &key, const SkData &data) override;
19 |
20 | private:
21 |
22 | JNIEnv *jniEnv;
23 |
24 | jobject javaCache = nullptr;
25 |
26 | jmethodID storeMethodId = nullptr;
27 |
28 | jmethodID loadMethodId = nullptr;
29 |
30 | };
31 |
32 | }
33 |
--------------------------------------------------------------------------------
/app/src/main/cpp/inspect/Inspector.h:
--------------------------------------------------------------------------------
1 | #pragma once
2 |
3 | #include
4 | #include
5 | #include
6 | #include "v8-platform.h"
7 | #include "v8.h"
8 | #include "V8InspectorListener.h"
9 | #include "WebSocketServer.h"
10 | #include "V8InspectorClientImpl.h"
11 | #include "SkiaUIContext.h"
12 |
13 | namespace HYSkiaUI {
14 |
15 | class Inspector {
16 | public:
17 | Inspector(std::shared_ptr &context, int webSocketPort);
18 |
19 | void startAgent();
20 |
21 | void printLogInChrome(std::string& log);
22 |
23 | private:
24 | void onMessage(const std::string &message);
25 |
26 | void sendMessage(const std::string &message);
27 |
28 | int waitForFrontendMessage();
29 |
30 | v8::Handle context;
31 | std::unique_ptr websocketServer;
32 | std::unique_ptr inspectorClient;
33 | std::vector scripts = {};
34 | std::shared_ptr runtime;
35 | std::shared_ptr uiContext;
36 | };
37 |
38 | }
39 |
--------------------------------------------------------------------------------
/app/src/main/cpp/inspect/V8InspctprChannelImpl.cpp:
--------------------------------------------------------------------------------
1 | #include "V8InspctprChannelImpl.h"
2 | #include
3 | #include "inspect_utils.h"
4 |
5 | namespace HYSkiaUI {
6 |
7 | V8InspectorChannelImp::V8InspectorChannelImp(
8 | std::shared_ptr &runtime,
9 | const std::function &onResponse) {
10 | this->runtime = runtime;
11 | this->onResponse = onResponse;
12 | }
13 |
14 | void V8InspectorChannelImp::sendResponse(
15 | int callId,
16 | std::unique_ptr message) {
17 | runtime->enterContext([this, &message](v8::Isolate *isolate, v8::Local skiaUI) {
18 | const std::string response = convertToString(isolate, message->string());
19 | onResponse(response);
20 | });
21 | }
22 |
23 | void V8InspectorChannelImp::sendNotification(std::unique_ptr message) {
24 | runtime->enterContext([this, &message](v8::Isolate *isolate, v8::Local skiaUI) {
25 | const std::string notification = convertToString(isolate, message->string());
26 | onResponse(notification);
27 | });
28 | }
29 |
30 | void V8InspectorChannelImp::flushProtocolNotifications() {
31 | // flush protocol notification
32 | }
33 |
34 | }
35 |
--------------------------------------------------------------------------------
/app/src/main/cpp/inspect/V8InspctprChannelImpl.h:
--------------------------------------------------------------------------------
1 | #pragma once
2 |
3 | #include
4 | #include
5 | #include
6 | #include "js/V8Runtime.h"
7 |
8 | namespace HYSkiaUI {
9 |
10 | class V8InspectorChannelImp final : public v8_inspector::V8Inspector::Channel {
11 | public:
12 | V8InspectorChannelImp(std::shared_ptr &runtime,
13 | const std::function &onResponse);
14 |
15 | void sendResponse(int callId, std::unique_ptr message) override;
16 |
17 | void sendNotification(std::unique_ptr message) override;
18 |
19 | void flushProtocolNotifications() override;
20 |
21 | private:
22 | std::shared_ptr runtime;
23 | std::function onResponse;
24 | };
25 |
26 | }
27 |
--------------------------------------------------------------------------------
/app/src/main/cpp/inspect/V8InspectorListener.h:
--------------------------------------------------------------------------------
1 | #pragma once
2 |
3 | #include "v8.h"
4 |
5 | namespace HYSkiaUI {
6 |
7 | struct V8InspectorListener {
8 | virtual void onConnected(const v8::Local &context) = 0;
9 | };
10 |
11 | }
12 |
--------------------------------------------------------------------------------
/app/src/main/cpp/inspect/WebSocketServer.h:
--------------------------------------------------------------------------------
1 | #pragma once
2 |
3 | #include "functional"
4 | #include "SkiaUIContext.h"
5 |
6 | namespace HYSkiaUI {
7 |
8 | class WebSocketServer {
9 | public:
10 | WebSocketServer(std::shared_ptr &uiContext, int port,
11 | std::function onMessage);
12 |
13 | ~WebSocketServer();
14 |
15 | void run();
16 |
17 | void sendMessage(const std::string &message);
18 |
19 | void receiveMessage(const std::string &message);
20 |
21 | void waitForFrontendMessageOnPause();
22 |
23 | void printLogInChrome(std::string& log);
24 |
25 | private:
26 | void startListening();
27 |
28 | void printListeningMessage();
29 |
30 | void waitFrontendMessage();
31 |
32 | int port;
33 | std::function onMessage;
34 |
35 | std::shared_ptr uiContext;
36 |
37 | jmethodID runMethodId = nullptr;
38 | jmethodID sendMessageMethodId = nullptr;
39 | jmethodID startListeningMethodId = nullptr;
40 | jmethodID waitFrontendMessageMethodId = nullptr;
41 | jmethodID releaseMethodId = nullptr;
42 | jmethodID printLogInChromeMethodId = nullptr;
43 | jobject javaWSServer = nullptr;
44 |
45 | };
46 |
47 | }
48 |
--------------------------------------------------------------------------------
/app/src/main/cpp/js/File.cpp:
--------------------------------------------------------------------------------
1 | #include "File.h"
2 | #include "native_log.h"
3 |
4 | namespace HYSkiaUI {
5 |
6 | File::File(std::string path, std::shared_ptr &context) : path(std::move(path)) {
7 | this->context = context;
8 | ALOGD("File:: new File %s", path.c_str())
9 | }
10 |
11 | bool File::exist() {
12 | if (context == nullptr) {
13 | return false;
14 | }
15 | ALOGD("File:: exist")
16 | return context->getAssetManager()->exist(path.c_str());
17 | }
18 |
19 | std::string File::read() {
20 | if (context == nullptr) {
21 | return "";
22 | }
23 | ALOGD("File:: read %s", path.c_str())
24 | return context->getAssetManager()->readFile(path.c_str());
25 | }
26 |
27 | }
28 |
--------------------------------------------------------------------------------
/app/src/main/cpp/js/File.h:
--------------------------------------------------------------------------------
1 | #pragma once
2 |
3 | #include "string"
4 | #include "memory"
5 | #include "SkiaUIContext.h"
6 |
7 | namespace HYSkiaUI {
8 |
9 | class File {
10 |
11 | public:
12 |
13 | File() = delete;
14 |
15 | File(File &file) = delete;
16 |
17 | void operator=(File &file) = delete;
18 |
19 | File(std::string path, std::shared_ptr &context);
20 |
21 | bool exist();
22 |
23 | std::string read();
24 |
25 | private:
26 |
27 | std::string path;
28 |
29 | std::shared_ptr context = nullptr;
30 |
31 | };
32 |
33 | }
34 |
--------------------------------------------------------------------------------
/app/src/main/cpp/js/JSAudioPlayer.h:
--------------------------------------------------------------------------------
1 | #pragma once
2 |
3 | #include "SkiaUIContext.h"
4 |
5 | namespace HYSkiaUI {
6 |
7 | class JSAudioPlayer {
8 |
9 | public:
10 |
11 | JSAudioPlayer(std::shared_ptr &context, std::string& path);
12 |
13 | ~JSAudioPlayer();
14 |
15 | void start();
16 |
17 | void pause();
18 |
19 | void release();
20 |
21 | long getCurrPosition();
22 |
23 | long getDuration();
24 |
25 | void seek(long position);
26 |
27 | private:
28 |
29 | std::shared_ptr context = nullptr;
30 |
31 | jclass javaAudioPlayerClass = nullptr;
32 |
33 | jmethodID javaAudioPlayerConstructor = nullptr;
34 |
35 | jmethodID getFFTDataMethodID = nullptr;
36 |
37 | jmethodID startMethodID = nullptr;
38 |
39 | jmethodID pauseMethodID = nullptr;
40 |
41 | jmethodID currentPositionMethodID = nullptr;
42 |
43 | jmethodID releaseMethodID = nullptr;
44 |
45 | jmethodID getDurationMethodID = nullptr;
46 |
47 | jmethodID seekMethodID = nullptr;
48 |
49 | jmethodID isPlayingMethodID = nullptr;
50 |
51 | jobject audioPlayer = nullptr;
52 |
53 | };
54 |
55 | }
56 |
--------------------------------------------------------------------------------
/app/src/main/cpp/js/JSAudioPlayerBinding.h:
--------------------------------------------------------------------------------
1 | #pragma once
2 |
3 | #include "JSBinding.h"
4 |
5 | namespace HYSkiaUI {
6 |
7 | class JSAudioPlayerBinding : public JSBinding {
8 |
9 | public:
10 |
11 | explicit JSAudioPlayerBinding(std::shared_ptr &context): JSBinding(context) {}
12 |
13 | v8::Local
14 | registerJSView(v8::Isolate *isolate, v8::Local skiaUI,
15 | v8::Local inherit,
16 | v8::Local external) override;
17 |
18 | };
19 |
20 | }
--------------------------------------------------------------------------------
/app/src/main/cpp/js/JSButtonBinding.cpp:
--------------------------------------------------------------------------------
1 | #include "JSButtonBinding.h"
2 | #include "Button.h"
3 |
4 | namespace HYSkiaUI {
5 |
6 | v8::Local
7 | JSButtonBinding::registerJSView(v8::Isolate *isolate, v8::Local skiaUI,
8 | v8::Local inherit,
9 | v8::Local external) {
10 | auto buttonConstructor = MakeJSViewConstructor