Sign in

    moui_skia_renderer

    Native Skia renderer provider for MoUI

    moui
    renderer
    skia
    gui
    Download zip
    Author
    Version
    0.2.1
    License
    Apache-2.0
    Last updated
    5 days ago
    Downloads
    189

    #MoUI Skia Renderer

    Native Skia renderer provider for wzzc-dev/moui.

    NativePlatformSurface

    pub(open) trait NativePlatformSurface {
    fn surface_route(Self) -> SkiaSurfaceRoute
    fn gpu_promoted(Self) -> Bool
    fn platform_label(Self) -> String
    }

    SkiaRendererError

    pub(all) suberror SkiaRendererError {
    SkiaUnavailable
    SurfaceUnavailable
    CanvasUnavailable
    ReadPixelsUnavailable
    GpuContextUnavailable(String)
    PresentFailed(String)
    } derive(Eq, ToJson,
    Debug
    )

    SkiaRendererError::equal

    SkiaRendererError::message

    fn SkiaRendererError::message(self : SkiaRendererError) -> String

    SkiaRendererError::not_equal

    fn SkiaRendererError::not_equal(x : SkiaRendererError, y : SkiaRendererError) -> Bool

    SkiaRendererError::to_json

    HostGpuPresentOutcome

    pub(all) struct HostGpuPresentOutcome {
    // private fields
    }

    Outcome of a HostGpuPresentTarget::present_gpu call.

    • succeeded: whether the platform presented the drawable successfully.
    • next_surface: Some(surface) to swap the renderer's surface for the next frame (per-drawable GPU backends); None to keep the current surface (long-lived GPU backends).

    HostGpuPresentOutcome::new

    HostGpuPresentOutcome::next_surface

    HostGpuPresentOutcome::succeeded

    fn HostGpuPresentOutcome::succeeded(self : HostGpuPresentOutcome) -> Bool

    HostGpuPresentTarget

    pub struct HostGpuPresentTarget {
    // private fields
    }

    Present target for the direct host-GPU-surface route. The presenter takes a flushed @skia_native.Surface and lets the platform present its underlying drawable (Metal CAMetalDrawable, VkSwapchainKHR image, EGLSurface backbuffer, or D3D12 swapchain backbuffer). No SkiaPixelFrame, no Bytes, no CGImage/UIImage/NSImage/Bitmap/PixelMap intermediate.

    HostGpuPresentTarget is a sibling of SkiaPresentTarget; both are accepted by create_with_present_target_and_route. A renderer is bound to exactly one of them. When gpu_target = Some(_), target_kind() returns HostGpuSurface and the render loop bypasses read_frame.

    create_window_surface is invoked lazily immediately before the first render, after the native event loop can provide a drawable, and again on each resize after attachment. It receives the GpuContext the renderer created internally (via create_gpu_context) and the current surface metrics, and returns a window-backed Surface (e.g. one wrapping a Metal CAMetalDrawable's MTLTexture). When it returns None, the renderer raises SurfaceUnavailable. The constructor's offscreen GPU surface is a typed placeholder only; no commands are recorded into it, so the first rendered frame still goes directly to the host drawable with no readback.

    present_gpu is invoked each frame after flush_and_submit. It receives the same GpuContext and the flushed Surface. It returns the optional Surface to use for the next frame. GPU backends whose Skia Surface is bound to a per-frame drawable (Metal CAMetalDrawable, Vulkan swapchain image) return a fresh Surface; backends that reuse the same Surface (e.g. a long-lived EGLSurface/D3D12 swapchain backbuffer wrapped via SkSurfaces::WrapBackendSurface) return None to keep the current one. Returning Some(surface) causes the renderer to swap self.surface to the returned value before the next frame.

    HostGpuPresentTarget::description

    fn HostGpuPresentTarget::description(self : HostGpuPresentTarget) -> String

    NativeGpuPlatform

    pub(all) enum NativeGpuPlatform {
    MacOS
    Windows
    Linux
    Android
    IOS
    HarmonyOS
    } derive(Eq, ToJson,
    Debug
    )

    NativeGpuPlatform::equal

    NativeGpuPlatform::gpu_promoted

    fn NativeGpuPlatform::gpu_promoted(_self : NativeGpuPlatform) -> Bool

    NativeGpuPlatform::not_equal

    fn NativeGpuPlatform::not_equal(x : NativeGpuPlatform, y : NativeGpuPlatform) -> Bool

    NativeGpuPlatform::platform_label

    fn NativeGpuPlatform::platform_label(self : NativeGpuPlatform) -> String

    NativeGpuPlatform::surface_route

    NativeGpuPlatform::to_json

    NativeRendererMode

    pub(all) enum NativeRendererMode {
    Auto
    SkiaGpu
    SkiaRaster
    } derive(Eq, ToJson,
    Debug
    )

    NativeRendererMode::equal

    NativeRendererMode::label

    fn NativeRendererMode::label(self : NativeRendererMode) -> String

    NativeRendererMode::not_equal

    NativeRendererMode::parse

    fn NativeRendererMode::parse(value : String) -> NativeRendererMode?

    NativeRendererMode::to_json

    SkiaEmojiFontFallbackDiagnostic

    pub struct SkiaEmojiFontFallbackDiagnostic {
    // private fields
    } derive(Eq, ToJson,
    Debug
    )

    SkiaEmojiFontFallbackDiagnostic::cluster_count

    SkiaEmojiFontFallbackDiagnostic::deterministic_color_emoji_ready

    fn SkiaEmojiFontFallbackDiagnostic::deterministic_color_emoji_ready(self : SkiaEmojiFontFallbackDiagnostic) -> Bool

    SkiaEmojiFontFallbackDiagnostic::emoji_fallback_attempted

    fn SkiaEmojiFontFallbackDiagnostic::emoji_fallback_attempted(self : SkiaEmojiFontFallbackDiagnostic) -> Bool

    SkiaEmojiFontFallbackDiagnostic::emoji_hint

    SkiaEmojiFontFallbackDiagnostic::fallback_character

    SkiaEmojiFontFallbackDiagnostic::fallback_language_tag_count

    fn SkiaEmojiFontFallbackDiagnostic::fallback_language_tag_count(self : SkiaEmojiFontFallbackDiagnostic) -> Int

    SkiaEmojiFontFallbackDiagnostic::fallback_language_tags

    fn SkiaEmojiFontFallbackDiagnostic::fallback_language_tags(self : SkiaEmojiFontFallbackDiagnostic) -> Array[String]

    SkiaEmojiFontFallbackDiagnostic::fallback_request_language_count

    fn SkiaEmojiFontFallbackDiagnostic::fallback_request_language_count(self : SkiaEmojiFontFallbackDiagnostic) -> Int

    SkiaEmojiFontFallbackDiagnostic::fallback_request_ready

    fn SkiaEmojiFontFallbackDiagnostic::fallback_request_ready(self : SkiaEmojiFontFallbackDiagnostic) -> Bool

    SkiaEmojiFontFallbackDiagnostic::fallback_script_tag

    fn SkiaEmojiFontFallbackDiagnostic::fallback_script_tag(self : SkiaEmojiFontFallbackDiagnostic) -> String

    SkiaEmojiFontFallbackDiagnostic::font_family

    SkiaEmojiFontFallbackDiagnostic::font_source

    SkiaEmojiFontFallbackDiagnostic::glyph_count

    SkiaEmojiFontFallbackDiagnostic::glyph_format

    SkiaEmojiFontFallbackDiagnostic::glyph_height

    SkiaEmojiFontFallbackDiagnostic::glyph_key

    SkiaEmojiFontFallbackDiagnostic::glyph_width

    SkiaEmojiFontFallbackDiagnostic::missing_glyph_recovery_ready

    fn SkiaEmojiFontFallbackDiagnostic::missing_glyph_recovery_ready(self : SkiaEmojiFontFallbackDiagnostic) -> Bool

    SkiaEmojiFontFallbackDiagnostic::not_equal

    SkiaEmojiFontFallbackDiagnostic::resolved_font_name

    fn SkiaEmojiFontFallbackDiagnostic::resolved_font_name(self : SkiaEmojiFontFallbackDiagnostic) -> String

    SkiaEmojiFontFallbackDiagnostic::resolved_missing_glyph_count

    fn SkiaEmojiFontFallbackDiagnostic::resolved_missing_glyph_count(self : SkiaEmojiFontFallbackDiagnostic) -> Int

    SkiaEmojiFontFallbackDiagnostic::shaper

    SkiaEmojiFontFallbackDiagnostic::text

    SkiaEmojiFontFallbackDiagnostic::text_system_id

    SkiaEmojiFontFallbackDiagnostic::to_json

    SkiaFontResolution

    pub(all) enum SkiaFontResolution {
    SystemFontMgr
    EmptyTypeface
    } derive(Eq, ToJson,
    Debug
    )

    SkiaFontResolution::equal

    SkiaFontResolution::not_equal

    SkiaFontResolution::to_json

    SkiaHybridRenderer

    pub struct SkiaHybridRenderer {
    // private fields
    }

    A renderer owner that keeps the raster factory and GPU queue model under one lifecycle. Recorded queue completions are internal handoff signals; only the window-backed presenter can produce a public Presented completion.

    SkiaHybridRenderer::drain_present_completions

    SkiaHybridRenderer::fallback_to_raster

    fn SkiaHybridRenderer::fallback_to_raster(self : SkiaHybridRenderer) -> Bool

    SkiaHybridRenderer::requested_mode

    SkiaHybridRenderer::surface_route

    SkiaPixelFrame

    pub struct SkiaPixelFrame {
    // private fields
    } derive(Eq,
    Debug
    )

    SkiaPixelFrame::equal

    SkiaPixelFrame::height

    fn SkiaPixelFrame::height(self : SkiaPixelFrame) -> Int

    SkiaPixelFrame::not_equal

    fn SkiaPixelFrame::not_equal(x : SkiaPixelFrame, y : SkiaPixelFrame) -> Bool

    SkiaPixelFrame::pixels

    fn SkiaPixelFrame::pixels(self : SkiaPixelFrame) -> Bytes

    SkiaPixelFrame::row_bytes

    fn SkiaPixelFrame::row_bytes(self : SkiaPixelFrame) -> Int

    SkiaPixelFrame::scale_factor

    fn SkiaPixelFrame::scale_factor(self : SkiaPixelFrame) -> Double

    SkiaPixelFrame::width

    fn SkiaPixelFrame::width(self : SkiaPixelFrame) -> Int

    SkiaPresentKind

    pub(all) enum SkiaPresentKind {
    CpuPixelFrame
    HostGpuSurface
    } derive(Eq, ToJson,
    Debug
    )

    Discriminator for which present path a SkiaRasterRenderer is wired to.

    • CpuPixelFrame: the renderer reads pixels back via Surface::read_pixels and hands a SkiaPixelFrame to the platform presenter. This is the only path wired today on every platform and remains the default/test fallback per ADR 0006.
    • HostGpuSurface: the renderer is bound to a HostGpuPresentTarget. The platform presenter owns a window-backed GPU surface (Metal drawable, Vulkan swapchain, EGL surface, D3D12 swapchain) and Skia flushes the drawable directly. read_pixels and the second CPU copy are skipped.

    SkiaPresentKind::equal

    SkiaPresentKind::not_equal

    fn SkiaPresentKind::not_equal(x : SkiaPresentKind, y : SkiaPresentKind) -> Bool

    SkiaPresentKind::to_json

    SkiaPresentTarget

    pub struct SkiaPresentTarget {
    // private fields
    }

    SkiaPresentTarget::new

    fn SkiaPresentTarget::new(description~ : String, present~ : (SkiaPixelFrame) -> Bool) -> SkiaPresentTarget

    SkiaRasterRenderer

    pub struct SkiaRasterRenderer {
    // private fields
    }

    SkiaRasterRenderer::apply_image_resource_load_completion

    SkiaRasterRenderer::dispose

    fn SkiaRasterRenderer::dispose(self : SkiaRasterRenderer) -> Unit

    SkiaRasterRenderer::draw_platform_view_pixels

    fn SkiaRasterRenderer::draw_platform_view_pixels(self : SkiaRasterRenderer, pixels : Bytes, src_width : Int, src_height : Int, src_stride : Int, dst_x : Double, dst_y : Double, dst_width : Double, dst_height : Double) -> Unit

    This should be called after render_frame but before the window system presents

    SkiaRasterRenderer::gpu_target

    Returns the bound HostGpuPresentTarget when the renderer is on the direct GPU present path. Returns None for the legacy CPU pixel-frame route.

    SkiaRasterRenderer::last_frame

    SkiaRasterRenderer::present_count

    fn SkiaRasterRenderer::present_count(self : SkiaRasterRenderer) -> Int

    SkiaRasterRenderer::record_frame_picture

    Record a frame into an immutable picture for replay by a native renderer worker. No MoonBit object crosses the thread boundary.

    SkiaRasterRenderer::render

    SkiaRasterRenderer::resize

    SkiaRasterRenderer::set_platform_view_draw_fn

    fn SkiaRasterRenderer::set_platform_view_draw_fn(self : SkiaRasterRenderer, draw_fn : () -> Unit?) -> Unit

    Set a callback to draw platform view pixels after command rendering but before flush.

    SkiaRasterRenderer::surface_diagnostic_summary

    fn SkiaRasterRenderer::surface_diagnostic_summary(self : SkiaRasterRenderer) -> String

    SkiaRasterRenderer::surface_is_gpu

    fn SkiaRasterRenderer::surface_is_gpu(self : SkiaRasterRenderer) -> Bool

    SkiaRasterRenderer::surface_route

    SkiaRasterRenderer::target_kind

    Returns which present path the renderer is bound to. CpuPixelFrame reads pixels back via Surface::read_pixels and hands a SkiaPixelFrame to the platform presenter; HostGpuSurface lets the platform present a window-backed GPU drawable directly with no CPU readback.

    SkiaRasterRenderer::text_system

    SkiaRasterRenderer::to_renderer_session

    Adapt a live Skia renderer to the renderer-neutral host lifecycle.

    SkiaRasterRenderer::unsupported_command_count

    fn SkiaRasterRenderer::unsupported_command_count(self : SkiaRasterRenderer) -> Int

    SkiaRasterRenderer::unsupported_command_diagnostics

    fn SkiaRasterRenderer::unsupported_command_diagnostics(self : SkiaRasterRenderer) -> Array[SkiaUnsupportedCommandDiagnostic]

    SkiaSurfaceRoute

    pub(all) enum SkiaSurfaceRoute {
    RasterSurfaceRoute
    MetalGpuSurfaceRoute
    VulkanGpuSurfaceRoute
    EglGpuSurfaceRoute
    Direct3DGpuSurfaceRoute
    } derive(Eq, ToJson,
    Debug
    )

    Renderer-local route used to select the concrete Skia GPU API. Platform and graphics API names never cross the root moui/render boundary.

    SkiaSurfaceRoute::equal

    SkiaSurfaceRoute::is_gpu

    fn SkiaSurfaceRoute::is_gpu(self : SkiaSurfaceRoute) -> Bool

    SkiaSurfaceRoute::is_implemented

    fn SkiaSurfaceRoute::is_implemented(self : SkiaSurfaceRoute) -> Bool

    SkiaSurfaceRoute::label

    fn SkiaSurfaceRoute::label(self : SkiaSurfaceRoute) -> String

    SkiaSurfaceRoute::not_equal

    fn SkiaSurfaceRoute::not_equal(x : SkiaSurfaceRoute, y : SkiaSurfaceRoute) -> Bool

    SkiaSurfaceRoute::to_json

    SkiaTextSelectionGeometryDiagnostic

    pub struct SkiaTextSelectionGeometryDiagnostic {
    // private fields
    } derive(Eq, ToJson,
    Debug
    )

    SkiaTextSelectionGeometryDiagnostic::bidi_visual_order_observed

    fn SkiaTextSelectionGeometryDiagnostic::bidi_visual_order_observed(self : SkiaTextSelectionGeometryDiagnostic) -> Bool

    SkiaTextSelectionGeometryDiagnostic::hit_test_inside

    SkiaTextSelectionGeometryDiagnostic::hit_test_line_index

    SkiaTextSelectionGeometryDiagnostic::hit_test_offset

    SkiaTextSelectionGeometryDiagnostic::line_count

    SkiaTextSelectionGeometryDiagnostic::not_equal

    SkiaTextSelectionGeometryDiagnostic::selected_line_count

    SkiaTextSelectionGeometryDiagnostic::selection_range

    SkiaTextSelectionGeometryDiagnostic::selection_rect_count

    SkiaTextSelectionGeometryDiagnostic::text

    SkiaTextSelectionGeometryDiagnostic::to_json

    SkiaTextSelectionGeometryDiagnostic::visual_order_differs

    SkiaTextSelectionGeometryDiagnostic::visual_segment_count

    SkiaTextVisualOrderDiagnostic

    pub struct SkiaTextVisualOrderDiagnostic {
    // private fields
    } derive(Eq, ToJson,
    Debug
    )

    SkiaTextVisualOrderDiagnostic::glyph_count

    SkiaTextVisualOrderDiagnostic::logical_cluster_count

    fn SkiaTextVisualOrderDiagnostic::logical_cluster_count(self : SkiaTextVisualOrderDiagnostic) -> Int

    SkiaTextVisualOrderDiagnostic::logical_text

    SkiaTextVisualOrderDiagnostic::not_equal

    SkiaTextVisualOrderDiagnostic::segment_count

    SkiaTextVisualOrderDiagnostic::to_json

    SkiaTextVisualOrderDiagnostic::visual_cluster_count

    fn SkiaTextVisualOrderDiagnostic::visual_cluster_count(self : SkiaTextVisualOrderDiagnostic) -> Int

    SkiaTextVisualOrderDiagnostic::visual_order_differs

    fn SkiaTextVisualOrderDiagnostic::visual_order_differs(self : SkiaTextVisualOrderDiagnostic) -> Bool

    SkiaTextVisualOrderDiagnostic::visual_text

    SkiaTextVisualOrderDiagnostic::width

    SkiaUnsupportedCommandDiagnostic

    pub struct SkiaUnsupportedCommandDiagnostic {
    // private fields
    } derive(Eq, ToJson,
    Debug
    )

    SkiaUnsupportedCommandDiagnostic::command

    SkiaUnsupportedCommandDiagnostic::not_equal

    SkiaUnsupportedCommandDiagnostic::reason

    SkiaUnsupportedCommandDiagnostic::to_json

    create_hybrid_renderer

    fn create_hybrid_renderer(platform : NativeGpuPlatform, requested : NativeRendererMode, metrics :
    SurfaceMetrics
    , target : SkiaPresentTarget, gpu_available~ : Bool, gpu_promoted~ : Bool, gpu_target? : HostGpuPresentTarget?, font_resolution? : SkiaFontResolution, async_image_loading? : Bool) -> SkiaHybridRenderer raise SkiaRendererError

    create_with_present_target

    fn create_with_present_target(metrics :
    SurfaceMetrics
    , target : SkiaPresentTarget, font_resolution? : SkiaFontResolution, async_image_loading? : Bool) -> SkiaRasterRenderer raise SkiaRendererError

    create_with_present_target_and_route

    fn create_with_present_target_and_route(metrics :
    SurfaceMetrics
    , target : SkiaPresentTarget, surface_route? : SkiaSurfaceRoute, gpu_target? : HostGpuPresentTarget?, font_resolution? : SkiaFontResolution, async_image_loading? : Bool) -> SkiaRasterRenderer raise SkiaRendererError

    from_env

    Resolve the environment policy entirely inside the Skia renderer package.

    gpu

    Build a Skia direct GPU provider. The platform policy belongs to this renderer module and interprets the opaque native handles after binding.

    raster

    Build a Skia CPU raster provider from the renderer-neutral host contract.

    renderer_descriptor

    resolve_surface_route

    fn[P : NativePlatformSurface] resolve_surface_route(platform : P, requested : NativeRendererMode, gpu_available~ : Bool, gpu_promoted~ : Bool) -> SkiaSurfaceRoute

    skia_available

    fn skia_available() -> Bool

    skia_emoji_font_fallback_diagnostic

    fn skia_emoji_font_fallback_diagnostic(text? : String, font? :
    FontSpec
    , font_resolution? : SkiaFontResolution) -> SkiaEmojiFontFallbackDiagnostic?

    skia_gpu_metal_preflight_summary

    fn skia_gpu_metal_preflight_summary() -> String

    skia_gpu_native_descriptor

    skia_image_load_completion

    skia_image_load_completion_from_bytes

    fn skia_image_load_completion_from_bytes(source : String, bytes : Bytes, background_io? : Bool, background_decode? : Bool) ->
    ImageResourceLoadCompletion

    skia_provider_capabilities

    Skia owns the capability declarations used by both its raster and GPU providers. The backend enum is descriptive metadata; the id is the report identity used by composition roots.

    skia_raster_native_descriptor

    skia_text_selection_geometry_diagnostic

    fn skia_text_selection_geometry_diagnostic(text : String, selection? :
    TextRange
    ?, font? :
    FontSpec
    , max_width? : Double, font_resolution? : SkiaFontResolution) -> SkiaTextSelectionGeometryDiagnostic?

    skia_text_system

    fn skia_text_system(resolution? : SkiaFontResolution) ->
    TextSystem

    skia_text_visual_order_diagnostic

    fn skia_text_visual_order_diagnostic(text : String, font? :
    FontSpec
    , font_resolution? : SkiaFontResolution) -> SkiaTextVisualOrderDiagnostic?