moui_skia

MoonBit bindings for the Skia Graphics Library

skia
graphics
bindings
moon add wzzc-dev/moui_skia@0.1.10
Download zip
Author
Version
0.1.10
License
Apache-2.0
Last updated
2 days ago
Downloads
728

Dependencies

README

#wzzc-dev/moui_skia

MoonBit bindings for the Skia Graphics Library, structured after rust-skia/rust-skia.

The public API is organized in the same spirit as skia-safe: start with safe value-layer drawing types, opt into native handles through the native subpackage, and treat resource planning/frame submission contracts as backend integration APIs.

  • Safe drawing values: geometry, colors, image metadata, transforms, paint, sampling, and portable paths are available directly from @moui_skia.
  • Native drawing handles: @native.Surface, @native.Canvas, @native.Image, @native.Path, @native.Font, shaders, filters, and codecs are opt-in and return None on the fallback build instead of exposing unavailable handles.
  • Backend planning contracts: SurfaceTargetDescriptor, RenderCommandList, RenderFrameDescriptor, RendererResourcePlan, and related descriptors are for GUI/runtime integrations that need replay, cache preflight, presentation, or future GPU admission checks.

The current package exposes the following value-layer API surface:

  • geometry: Point, IPoint, Size, ISize, Rect, IRect, RRect, including point vector helpers, rectangle constructors, sortedness, centers, offsets, and integer rounding helpers
  • color: Color, Color4f
  • image metadata and pixel layout: ColorInfo, ImageInfo
  • copied pixel snapshots: Pixmap
  • transforms: Matrix, including member access, finite and affine queries, pre/post concat helpers, and point/vector/radius/rect mapping
  • paint state: Paint, PaintStyle, StrokeCap, StrokeJoin, BlendMode
  • canvas point drawing modes: PointMode
  • image sampling: SamplingOptions, FilterMode, MipmapMode, CubicResampler
  • surface contracts: SurfaceDescriptor, SurfaceTargetDescriptor, SurfacePresentDescriptor, SurfaceFinalizationDescriptor, WindowSurfaceDescriptor, SurfaceBackend, SurfaceOrigin, SurfaceBudget, SurfacePresentMode, GpuContextBackend, and GpuContextDescriptor for raster, window, and future GPU render targets, with stable window target identity plus typed resource descriptors for backend surface, present scheduling, finalization, and GPU context caches
  • renderer resource cache: ResourceCache and ResourceCacheStats provide a deterministic byte-budgeted LRU boundary for images, shaders, typefaces, and other backend-owned resources, including cache preflight splits for resident and missing cacheable resource plans
  • renderer resource identity: RendererResourceKind, RendererResourceKey, RendererResourceDescriptor, and RendererResourcePlan give those caches typed keys and auditable resource requirements for images, shaders, filters, text runs, paths, surfaces, and future GPU resources, including GPU-backed resource subplans for backend admission checks plus cacheable/uncacheable subplans for separating reusable handles from one-shot frame work
  • shader and filter resource recipes: ShaderDescriptor, ColorFilterDescriptor, ImageFilterDescriptor, and MaskFilterDescriptor provide stable cache keys for native shader/filter handles before a backend allocates them
  • render pass contracts: RenderPassDescriptor, RenderPassLoadOp, and RenderPassStoreOp define target bounds plus load/clear/store/present semantics before a concrete backend records draw commands, including defaults derived from SurfaceTargetDescriptor and resource descriptors for target surfaces
  • render command contracts: RenderCommandList, RenderCommand, and RenderCommandStats provide the backend-neutral command stream boundary a GUI renderer can validate before replaying into a native Canvas, including current-clip color/paint and shader fills, rounded-rectangle and path clipping, cacheable text-run and shaped glyph-run draw commands, explicit shader/filter/image resource declarations, and target-bound resource plans for backend caches
  • render frame contracts: RenderFrameDescriptor, RenderFrameSubmissionDescriptor, RenderFrameFinalizationDescriptor, and RenderFrameValidationStatus combine a target, finalized command stream, resource plan, readiness diagnostics, cache population boundary, optional present scheduling descriptor, and auditable per-frame submission/finalization resource plans with GPU-backed plus cacheable/uncacheable subsets for backend admission, cache staging, and resident/missing preflight
  • text layout and fallback contracts: TextRunDescriptor, TextMeasurementDescriptor, MeasuredTextRunDescriptor, TextShapingDescriptor, ShapedTextRunDescriptor, ShapedGlyphRunDescriptor, FontDescriptor, FontFallbackRequest, FontFallbackMatchDescriptor, FontFallbackResolutionDescriptor, FontFallbackChain, and FontStyleRequest define the value-layer input and resolved-match metadata for native shaping and font fallback, including deterministic byte-range text-run, text-measurement, measured-result, text-shaping, shaped-result, detailed shaped-glyph, font, fallback request, fallback match, and fallback resolution resource keys, with invalid measured/shaped/fallback-request/result metadata kept uncacheable without downstream cache dependencies, and plans for backend measurement, shaping, font-handle, and typeface-resolution caches
  • portable paths: Path, PathLine, PathRect, PathVerb, PathFillType, PathDirection, PathSegmentMask, including verb/point counts, contour closed queries, rectangle, oval, circle, rounded-rectangle and polyline/polygon contours, control-point and tight bounds, append/extend path modes, path appends, resource descriptors, reset, and rewind

Native Skia object handles are intentionally staged behind a separate FFI plan so ownership, ref-counting, and linker configuration can be validated package by package.

The native subpackage contains the first opt-in native boundary:

  • @native.skia_available() reports whether the stub was compiled with real Skia headers and libraries;
  • @native.skia_shaper_available() reports whether the SkShaper boundary was compiled and linked;
  • @native.skia_paragraph_available() reports whether the SkParagraph boundary was compiled and linked; use MOUI_SKIA_REQUIRE_SKPARAGRAPH=1 for smoke/proof runs that should fail when SkParagraph, SkShaper, SkUnicode, HarfBuzz, or ICU support is missing;
  • @native.Surface::raster_n32_premul(size) is the first raster surface entry;
  • @native.Surface::gpu_context_support_status(context) reports the native GPU-context readiness gate for a value-layer context descriptor. macOS Metal probing is opt-in with MOUI_SKIA_ENABLE_GPU_METAL=1; it checks the Skia Ganesh Metal headers plus real GrDirectContext creation;
  • @native.GpuContext::metal(context) creates an explicit native Metal/Ganesh context when the opt-in readiness gate is available;
  • @native.Surface::gpu_n32_premul(context, descriptor) and @native.Surface::for_target_with_gpu_context(target, context) allocate offscreen GPU-backed Skia surfaces for matching GPU target/context pairs;
  • @native.Surface::target_support_status(target) reports whether a target can be allocated as a native surface, including empty, unavailable Skia, window-unsupported, and GPU-unsupported decisions;
  • @native.Surface::for_target(target) allocates supported raster targets from value-layer SurfaceTargetDescriptor values. This default path remains raster-only; GPU targets must use the explicit target+context API;
  • @native.Surface::descriptor() reports the value-layer surface contract satisfied by the native raster surface;
  • @native.Surface::image_snapshot() returns an immutable @native.Image handle when a surface is available;
  • @native.Surface::image_snapshot_with_bounds(bounds) snapshots a bounded surface rectangle and rejects rectangles outside the surface bounds;
  • @native.Surface::flush_and_submit() establishes an explicit finalization boundary for native surfaces; raster surfaces treat it as a no-op, while GPU-backed surfaces flush through their owning direct context;
  • @native.Surface::render_frame(frame) and render_frame_with_resources(...) return SurfaceFrameReplayStats, whose status() classifies validation, surface mismatch, replay skip, finalization failure, and complete outcomes; the stats also expose the value-layer frame finalization descriptor and resource plan used for the native flush/submit boundary;
  • @native.NativeReplayResources::stats() reports aggregate cache slots, resident resources, byte budgets, hits, misses, and evictions across the native replay caches used by Canvas and Surface frame replay;
  • @native.Surface::read_pixels(bounds) reads N32 premultiplied surface pixels into an owned @moui_skia.Pixmap, rejecting rectangles outside the surface bounds;
  • @native.Image::encode_to_data(format, quality) returns immutable @native.Data bytes for PNG/JPEG output, with WEBP enabled only when the linked native Skia build exposes the encoder capability, rejecting unsupported native encode formats and clamping quality to Skia's 0..100 range;
  • @native.Image::from_bitmap(bitmap) snapshots a native bitmap into an immutable image;
  • @native.Data::from_bytes(bytes) and @native.Image::from_encoded_bytes(bytes) provide the first in-memory image decode path;
  • @native.Codec::from_data(data) and @native.Codec::from_bytes(bytes) expose encoded image metadata and decode to an N32 premultiplied Bitmap;
  • @native.Bitmap::alloc_n32_premul(size) owns raster pixel storage and can export a copied @moui_skia.Pixmap;
  • @native.FontMgr::default() enumerates native font families and matches a family plus Skia-style weight/width/slant values to a typeface; @native.Typeface::default() / from_name(family, weight, width, slant) and @native.Font::default(size) / from_typeface(typeface, size) create the first native text handles for drawing and measurement; native typefaces can report their Skia family name; native font sizes, shaping widths, and glyph position origins are finite-checked before crossing into Skia; FontStyleRequest and FontFallbackRequest can be passed through the native FontMgr/Typeface adapters, including Skia character fallback when the request includes BCP47 language tags and a code point, then recorded with FontFallbackMatchDescriptor metadata for cache planning;
  • @native.Shader::color(color), linear_gradient(start, end, colors...), and radial_gradient(center, radius, colors...) create the first native shader handles for shader-backed paint calls, with degenerate linear-gradient inputs plus non-finite linear/radial-gradient geometry rejected before native replay/resource planning;
  • @native.ColorFilter, ImageFilter, and MaskFilter reject non-finite parameters before native handle creation and value-layer resource planning, with native FFI stubs also nulling non-finite matrix/sigma inputs;
  • direct invalid shader/filter descriptor variants produce uncacheable resource descriptors, preserving cache safety even when constructors are bypassed;
  • native replay skips invalid shader/filter descriptor commands without touching or populating shader, color-filter, image-filter, or mask-filter caches;
  • native replay skips undecodable or empty encoded image draw commands without touching or populating image caches;
  • native replay keeps empty path draw, clip, and path-shader commands out of path cache lookups, with zero path-cache resources/misses/hits while still replaying harmless empty native paths;
  • non-finite value-layer paths produce uncacheable resource descriptors, are filtered out of command-list resource plans, and skip native replay without touching path caches;
  • native path appends skip non-finite portable paths or matrices without mutating existing @native.Path geometry;
  • direct native path verb, shape, transform, and offset mutations skip non-finite inputs without mutating existing @native.Path geometry;
  • @native.Path supports the first path construction calls: new, reset, rewind, set_fill_type, fill_type, move_to, line_to, quad_to, cubic_to, conic_to, close, count_points, count_verbs, segment_masks, is_finite, is_inverse_fill_type, is_last_contour_closed, last_point, is_line, is_rect, is_oval, contains, bounds, compute_tight_bounds, add_path_value, add_poly, add_rect, add_oval, add_circle, add_round_rect, add_rrect, transform, offset, and is_empty;
  • @native.Path::from_value(path) replays a finite portable @moui_skia.Path into a native path when Skia is linked and rejects non-finite paths;
  • @native.Canvas supports clear, draw_color, draw_paint, draw_point, draw_line, draw_points, draw_rect, draw_oval, draw_circle, draw_arc, draw_round_rect, draw_rrect, draw_drrect, draw_path, draw_image, and draw_image_rect with explicit SamplingOptions, plus portable path drawing through draw_path_value, render command replay through replay with CanvasReplayStats::status() diagnostics that distinguish complete Canvas work, deferred surface present commands, and skipped replay commands, plus command/resource category counters for declarations, images, shaders, filters, paths, and text resources, UTF-8 text through draw_text_utf8, text-run replay that honors descriptor byte ranges and skips empty ranges without populating text caches, positioned glyph runs through draw_glyphs, invalid shaped glyph replay skips without cacheable dependency planning, optional shaped glyph runs through Font::shape_text_utf8 when SkShaper is linked, shaped-run metadata through TextShapingDescriptor and ShapedTextRunDescriptor, detailed shaped glyph-run metadata through ShapedGlyphRunDescriptor, optional paragraph layout through Paragraph::layout_utf8 with line metrics, UTF-8 range text boxes, and UTF-8 hit-test offsets when SkParagraph is linked, font measurement through Font::measure_text_utf8, glyph IDs through Font::count_text_utf8 / Font::text_to_glyphs_utf8, glyph advances through Font::glyph_width / Font::glyph_widths, glyph positions through Font::glyph_positions / Font::glyph_x_positions and Font::text_glyph_positions_utf8 / Font::text_glyph_x_positions_utf8, glyph bounds through Font::glyph_bounds / Font::glyph_bounds_many, text bounds through Font::measure_text_bounds_utf8, font metrics through Font::metrics, and color-shader paint through draw_paint_shader / draw_rect_shader;
  • direct Canvas geometry, clip, image placement, and text/glyph positioning calls skip non-finite coordinates without mutating pixels;
  • native Canvas paint forwarding sanitizes non-finite stroke scalars, and save_layer treats non-finite bounds as an unbounded layer;
  • native Canvas image sampling disables cubic resampling when cubic coefficients are non-finite, preserving the image draw with ordinary filter/mipmap sampling;
  • @native.Canvas also exposes the first state and transform calls: save, save_layer, restore, restore_to_count, save_count, translate, scale, rotate, skew, concat, reset_matrix, and discard;
  • @native.Canvas exposes clipping with clip_rect, clip_rrect, and clip_path using ClipOp, local/device clip bound queries, and rect/path quick rejection;
  • without Skia link flags it compiles as a safe fallback and returns None.

#Native smoke test

The regular test suite keeps the no-Skia fallback build green by skipping the real-backend-only assertions. A real native Skia build should additionally pass the dedicated smoke test:

The fallback gate also verifies that each target-specific native MoonBit file has an unavailable fallback twin in native/moon.pkg, so new native bindings do not accidentally compile only on the linked Skia path. CI also runs moon check --target all to keep the wasm/js fallback and native/LLVM target maps compileable together.

cd scripts/native_smoke moon run --target native .

The smoke module is intentionally separate from the default test suite. Without real Skia link flags it fails fast instead of silently exercising the fallback.

For the fallback-only validation gate, run:

.\scripts\check-fallback.ps1

That script formats/checks the root module, runs moon info, runs the default tests, and builds the native smoke module without real Skia link flags so the smoke entry stays compileable while remaining opt-in at runtime.

The GitHub Actions fallback workflow mirrors this gate on Windows and Linux. Real Skia smoke tests are intentionally separate until the repository owns a repeatable Skia binary/build source for CI.

The optional shaped-text boundary is off by default so small Skia builds remain usable. On macOS, pass --enable-skshaper to scripts/macos-skia-smoke.sh when the Skia library directory also contains libskshaper, libskunicode_core, libskunicode_icu, libharfbuzz, and libicu. The wrapper adds -DMOUI_SKIA_HAS_SKSHAPER, links those module libraries, and verifies the native smoke log contains the shaped-run marker.

The default real-Skia binary provider is now the wzzc-dev/skia GitHub release locked by skia-provider-lock.json to tag dev-6d73578a36 and commit 6d73578a36506d10bc044e920cc71037982e481d. The fetch helpers cache packages under .skia-cache/release and print the include/lib/flag values consumed by the existing native package configurators. The default link mode is static; on routes that support them, dynamic libraries are selected explicitly with MOUI_SKIA_LINK_MODE=dynamic or --link-mode dynamic:

bash scripts/fetch-release-skia.sh --platform auto --arch auto --print-env

HarmonyOS uses a platform-specific harmonyos_release provider entry because the first accepted HarmonyOS assets live on release dev-fcb9c18e54 rather than the default desktop/mobile provider release. HarmonyOS auto / skia-gpu must use the complete static asset because the locked libskia.so hides Ganesh internal symbols referenced by libskia_ganesh_ext.a. Dynamic remains valid only for explicit skia-raster. Select the GPU-capable asset with:

bash scripts/fetch-release-skia.sh --platform harmonyos --arch arm64 --link-mode static --print-env

.\scripts\fetch-release-skia.ps1 -Platform auto -Arch auto -PrintEnv

Use REAL_SKIA_SMOKE.md as the acceptance checklist for real-backend artifacts. A passing fallback build, dry-run, or syntax check is not enough to claim real Skia acceptance.

The smoke test requires @native.skia_available() to be true. It creates a 32x32 raster N32 premul surface, clears it to white, draws red, green, and blue rectangles, exercises draw_points in point, line, and polygon modes, draws a positioned glyph run, checks canvas save/restore state, clip bounds, quick rejection, and clipped drawing, reads pixels back, checks representative BGRA N32 pixels, snapshots the surface, encodes the snapshot as PNG, verifies the encoded PNG signature, decodes those bytes back into an image, and decodes an N32 bitmap whose pixels still match the drawn scene and N32 channel layout.

On Windows with a MinGW-compatible Skia build, use the acceptance wrapper to temporarily inject the native link flags, run the smoke test, save logs, and verify the temporary package rewrites were restored afterwards:

.\scripts\windows-accept-real-skia-smoke.ps1 -LogDir logs ` -SkiaInclude C:\path\to\skia ` -SkiaLibDir C:\path\to\skia\out\Static

Pass -ExtraCcFlags or -ExtraLinkFlags if your Skia build needs additional defines or dependent libraries. The helper checks that the Skia headers and a MinGW-compatible libskia.a or skia.lib are present before rewriting package configuration. The Windows Real Skia Smoke workflow exposes the same helper as a manual job for runners that already have such a Skia build available.

On Linux, use the acceptance wrapper. With an existing Skia build visible to the system compiler, pass its include and library paths:

bash scripts/linux-accept-real-skia-smoke.sh --log-dir logs \ --skia-provider existing \ --skia-include /path/to/skia \ --skia-lib-dir /path/to/skia/out/Static

Pass --extra-cc-flags or --extra-link-flags for Skia builds that need additional defines, rpaths, or dependent libraries. Add --dry-run-config to print the selected mode and effective build/smoke arguments without fetching or building Skia or rewriting native/moon.pkg; in source-build mode it prints the resolved checkout/build paths and GN args, and with existing Skia paths it also checks for the Skia header and library files and prints the exact native flags that would be injected. When libskia.so is used, the Linux smoke helper adds the supplied library directory to LD_LIBRARY_PATH before running the smoke executable. Pass --smoke-log logs/linux-native-smoke-output.log to keep the native smoke executable's stdout/stderr separate from the wrapper log.

On macOS with an existing Skia build, use the acceptance wrapper:

bash scripts/macos-accept-real-skia-smoke.sh --log-dir logs \ --skia-provider existing \ --skia-include /path/to/skia \ --skia-lib-dir /path/to/skia/out/Static

The macOS helper adds common CoreFoundation/CoreGraphics/CoreText/ImageIO frameworks by default; pass --extra-link-flags for additional Skia build dependencies. Use --link-mode dynamic|static or MOUI_SKIA_LINK_MODE=dynamic|static when you need to force libskia.dylib or libskia.a; auto chooses the mode based on available library files.

The package prebuild hook now enables native real-Skia configuration by default for native builds. Set MOUI_SKIA_ENABLE_PREBUILD_SKIA=0 or MOUI_SKIA_DISABLE_PREBUILD_SKIA=1 when you need the fallback-unavailable compile path. Environment values for MOUI_SKIA_SKIA_INCLUDE, MOUI_SKIA_SKIA_LIB_DIR, MOUI_SKIA_SKIA_LIB, MOUI_SKIA_EXTRA_CC_FLAGS, MOUI_SKIA_EXTRA_LINK_FLAGS, and MOUI_SKIA_LINK_MODE take precedence over the release provider defaults. For cross-builds, set MOUI_SKIA_PLATFORM (macos, linux, windows, android, ios, iosSim, harmonyos, tvos, tvosSim, or wasm), MOUI_SKIA_ARCH (arm64, x64, or riscv64), and optionally MOUI_SKIA_CONFIG=Release|Debug. Android builds should set MOUI_SKIA_PLATFORM=android explicitly so the prebuild uses the locked Android artifact rather than the current desktop host platform. HarmonyOS GPU cross-builds must resolve to static; dynamic is supported only for explicit skia-raster.

To build a small CPU-only Skia from source for the macOS smoke test, run:

bash scripts/macos-accept-real-skia-smoke.sh --log-dir logs \ --skia-provider source \ --work-dir .skia-cache/macos

The macOS Real Skia Smoke workflow exposes the same path as a manual GitHub Actions job.

To build a small CPU-only Skia from source and run the Linux smoke test in one locally with acceptance checks, run:

bash scripts/install-linux-smoke-deps.sh bash scripts/linux-accept-real-skia-smoke.sh --work-dir .skia-cache/linux

On an already prepared Ubuntu runner, bash scripts/install-linux-smoke-deps.sh --check verifies the same apt package set that the workflow installs before spending time on native smoke work. This includes libwayland-dev, libwayland-bin, and wayland-protocols, which wzzc-dev/window needs while preparing the native smoke dependency graph and generating the xdg-shell client header. The Linux source-build defaults install clang plus fontconfig/FreeType/HarfBuzz development headers and pass cc="clang" / cxx="clang++" to Skia GN so the smoke build does not depend on the runner's default C++ compiler.

When --skia-rev is omitted, the Linux source-build helpers read skia-revision.txt. Keep that file on a known-good Skia commit after the first successful real runner, or override it with --skia-rev while testing a new Skia revision. The acceptance summary log records the resolved skia_commit; use the guarded pin helpers below to write that value after a passing source-built run. Do not write release-provider commits into skia-revision.txt; they are tracked in skia-provider-lock.json.

For the first source-built Linux acceptance, the guarded pinning wrapper runs the smoke, verifies the artifact bundle with a required full commit hash, pins skia-revision.txt, and verifies the pin:

bash scripts/linux-accept-and-pin-skia.sh --work-dir .skia-cache/linux

It rejects dry runs and existing-build Skia paths so only a real source-built Linux acceptance can establish the initial repository pin. It checks Ubuntu smoke dependencies before starting the expensive build; pass --install-deps to install them first, or --skip-deps-check for a runner managed elsewhere.

Without --skia-include / --skia-lib-dir, the acceptance wrapper checks out and builds Skia through scripts/linux-real-skia-smoke.sh, captures wrapper and native executable logs, verifies native/moon.pkg was restored, and checks that the executable prints moui_skia native smoke test passed, proving the real smoke reached its final assertion. The Linux Real Skia Smoke workflow uses the same acceptance wrapper for real runs; its optional inputs can either build Skia from skia_rev or reuse an existing skia_include / skia_lib_dir pair with extra compile/link flags. It also runs weekly as an expensive real-backend canary. The workflow runs a dry-run preflight before installing build dependencies or compiling Skia, then uploads the preflight log, logs/linux-skia-build.log for source-built runs, wrapper log, and dedicated native executable log, plus the acceptance summary log, as a linux-real-skia-smoke-log artifact on success or failure. On real runs, it also greps logs/linux-native-smoke-output.log for moui_skia native smoke test passed and records the marker check in the workflow summary. The same artifact check can be rerun manually with scripts/verify-native-smoke-log.sh logs/linux-native-smoke-output.log. The summary records the selected mode, dry-run setting, artifact name, key Skia inputs, expected log paths, the marker check, plus whether the temporary package rewrites were restored after the run. Set the workflow's dry_run_config input to print the resolved build/smoke arguments without installing MoonBit/build dependencies, building Skia, restoring the Skia cache, or rewriting package files; with existing Skia paths it also checks for the Skia header and library files. The workflow only restores the Skia source-build cache when it is building Skia from source; extra_gn_args is ignored for existing builds.

///|
test {
let point = @moui_skia.Point::new(3, 4)
let rect = @moui_skia.Rect::from_point_and_size(
@moui_skia.Point::new(2, 3),
@moui_skia.Size::new(4, 5),
)
let sorted = @moui_skia.Rect::new(5, 4, 1, 2).sorted()
let fractional = @moui_skia.Rect::new(1.2, -2.8, 5.7, 3.1)
let wide = @moui_skia.IRect::new(-2000000000, 0, 2000000000, 1)

assert_true(point.is_finite())
assert_eq(point.length_squared(), 25.0)
assert_eq(point.dot(@moui_skia.Point::new(-2, 5)), 14.0)
assert_eq(point.cross(@moui_skia.Point::new(-2, 5)), 23.0)
assert_true(point.with_length(10) == Some(@moui_skia.Point::new(6, 8)))
assert_true(point.rotate_cw() == @moui_skia.Point::new(4, -3))
assert_true(rect == @moui_skia.Rect::from_ltrb(2, 3, 6, 8))
assert_eq(rect.left(), 2.0)
assert_eq(rect.bottom(), 8.0)
assert_true(rect.tl() == @moui_skia.Point::new(2, 3))
assert_true(rect.intersects(@moui_skia.Rect::from_xywh(5, 7, 3, 3)))
assert_true(
@moui_skia.Rect::from_points([point, @moui_skia.Point::new(8, -1)]) ==
Some(@moui_skia.Rect::new(3, -1, 8, 4)),
)
assert_true(
rect.to_quad() ==
[
@moui_skia.Point::new(2, 3),
@moui_skia.Point::new(6, 3),
@moui_skia.Point::new(6, 8),
@moui_skia.Point::new(2, 8),
],
)
assert_true(
rect.with_offset_to(@moui_skia.Point::new(10, -1)) ==
@moui_skia.Rect::from_xywh(10, -1, 4, 5),
)
assert_true(sorted.is_sorted())
assert_true(sorted.center() == @moui_skia.Point::new(3, 3))
assert_eq(wide.width_64(), 4000000000L)
assert_true(!wide.is_empty_64())
assert_true(fractional.round_in() == @moui_skia.IRect::new(2, -2, 5, 3))
assert_true(fractional.round_out() == @moui_skia.IRect::new(1, -3, 6, 4))
}

///|
test {
let info = @moui_skia.ImageInfo::n32_premul(@moui_skia.ISize::new(1, 1))
let pixmap = @moui_skia.Pixmap::new(info, 4, b"\xff\x00\x00\xff")

assert_true(pixmap is Some(_))
assert_eq(info.shift_per_pixel(), 2)
assert_eq(info.compute_min_byte_size64(), 4L)
}

///|
test {
let paint = @moui_skia.Paint::new(
color=@moui_skia.Color::from_rgb(0xff, 0, 0),
anti_alias=true,
)
.set_stroke(true)
.set_stroke_width(4)
let path = @moui_skia.Path::new().add_rect(
@moui_skia.Rect::from_xywh(0, 0, 8, 8),
)

assert_true(paint.style == Stroke)
assert_true(paint.color == @moui_skia.Color::red())
assert_true(
path.stroke_bounds(paint) == Some(@moui_skia.Rect::new(-2, -2, 10, 10)),
)
}

///|
test {
let sampling = @moui_skia.SamplingOptions::new(filter=Linear, mipmap=Linear)

assert_eq(sampling.filter_ordinal(), 1)
assert_eq(sampling.mipmap_ordinal(), 2)
assert_true(!sampling.uses_cubic())
}

///|
test {
let matrix = @moui_skia.Matrix::translate(10, 20).concat(
@moui_skia.Matrix::scale(2, 3),
)
let rect = matrix.map_rect(@moui_skia.Rect::from_xywh(0, 0, 4, 5))
let points = @moui_skia.Matrix::translate(1, 2).map_points([
@moui_skia.Point::new(0, 0),
@moui_skia.Point::new(3, 4),
])

assert_true(matrix.is_invertible())
assert_true(rect == @moui_skia.Rect::from_xywh(10, 20, 8, 15))
assert_true(
points == [@moui_skia.Point::new(1, 2), @moui_skia.Point::new(4, 6)],
)
}

///|
test {
let path = @moui_skia.Path::new(fill_type=EvenOdd).add_circle(
@moui_skia.Point::new(5, 5),
5,
direction=CCW,
)

let shifted = path.offset(10, 20)

assert_eq(path.verb_count(), 6)
assert_true(path.fill_type == EvenOdd)
assert_true(
shifted.bounds() == Some(@moui_skia.Rect::from_xywh(10, 20, 10, 10)),
)
}

///|
test {
let triangle = @moui_skia.Path::new().add_poly(
[
@moui_skia.Point::new(0, 0),
@moui_skia.Point::new(10, 0),
@moui_skia.Point::new(10, 10),
],
close=true,
)

assert_true(triangle.is_last_contour_closed())
assert_eq(triangle.count_points(), 3)
assert_true(
triangle.bounds() == Some(@moui_skia.Rect::from_xywh(0, 0, 10, 10)),
)
}

///|
test {
let base = @moui_skia.Path::new().add_rect(
@moui_skia.Rect::from_xywh(0, 0, 2, 2),
)
let triangle = @moui_skia.Path::new().add_poly(
[
@moui_skia.Point::new(0, 0),
@moui_skia.Point::new(10, 0),
@moui_skia.Point::new(10, 10),
],
close=true,
)

let combined = base.add_path(
triangle,
matrix=@moui_skia.Matrix::translate(10, 0),
)
let shifted = base.add_path_offset(triangle, @moui_skia.Point::new(10, 0))

assert_eq(combined.count_verbs(), 9)
assert_true(combined.bounds() == Some(@moui_skia.Rect::new(0, 0, 20, 10)))
assert_true(shifted == combined)
}

///|
test {
let rrect = @moui_skia.RRect::new(
@moui_skia.Rect::from_xywh(0, 0, 10, 8),
@moui_skia.Size::new(2, 2),
@moui_skia.Size::new(3, 1),
@moui_skia.Size::new(1, 2),
@moui_skia.Size::empty(),
)
let path = @moui_skia.Path::new().add_rrect(rrect)

assert_true(!rrect.is_rect())
assert_true(
rrect.with_offset_to(@moui_skia.Point::new(10, 20)).bounds() ==
@moui_skia.Rect::from_xywh(10, 20, 10, 8),
)
assert_true(rrect.contains_rect(@moui_skia.Rect::from_xywh(3, 3, 4, 2)))
assert_eq(path.verb_count(), 10)
assert_true(path.bounds() == Some(rrect.bounds()))
}

#
Scalar

type Scalar = Float

Skia uses single-precision scalar values for most geometry.

#
AddPathMode

pub(all) enum AddPathMode {
Append
Extend
} derive(Eq,
Debug
)

How path appends connect the source path to the destination path.

#
AlphaType

pub(all) enum AlphaType {
Unknown
Opaque
Premul
Unpremul
} derive(Eq,
Debug
)

Interpretation of alpha in pixel data.

#
AlphaType::is_opaque

fn AlphaType::is_opaque(self : AlphaType) -> Bool

#
BlendMode

pub(all) enum BlendMode {
Clear
Src
Dst
SrcOver
DstOver
SrcIn
DstIn
SrcOut
DstOut
SrcATop
DstATop
Xor
Plus
Modulate
Screen
Overlay
Darken
Lighten
ColorDodge
ColorBurn
HardLight
SoftLight
Difference
Exclusion
Multiply
Hue
Saturation
Color
Luminosity
} derive(Eq,
Debug
)

Porter-Duff and extended blend modes mirrored from Skia.

#
BlendMode::to_skia_ordinal

fn BlendMode::to_skia_ordinal(self : BlendMode) -> Int

#
ClipOp

pub(all) enum ClipOp {
Difference
Intersect
} derive(Eq,
Debug
)

How a new clip geometry combines with the current canvas clip.
impl Default for ClipOp

#
ClipOp::to_skia_ordinal

fn ClipOp::to_skia_ordinal(self : ClipOp) -> Int

#
Color

pub(all) struct Color(UInt) derive(Eq,
Debug
)

Packed Skia ARGB color in 0xAARRGGBB order.
impl Default for Color

#
Color::a

fn Color::a(self : Color) -> Byte

#
Color::argb

fn Color::argb(self : Color) -> UInt

#
Color::b

fn Color::b(self : Color) -> Byte

#
Color::black

fn Color::black() -> Color

#
Color::blue

fn Color::blue() -> Color

#
Color::cyan

fn Color::cyan() -> Color

#
Color::dark_gray

fn Color::dark_gray() -> Color

#
Color::from_argb

fn Color::from_argb(a : Byte, r : Byte, g : Byte, b : Byte) -> Color

#
Color::from_rgb

fn Color::from_rgb(r : Byte, g : Byte, b : Byte) -> Color

#
Color::g

fn Color::g(self : Color) -> Byte

#
Color::gray

fn Color::gray() -> Color

#
Color::green

fn Color::green() -> Color

#
Color::light_gray

fn Color::light_gray() -> Color

#
Color::magenta

fn Color::magenta() -> Color

#
Color::new

fn Color::new(argb : UInt) -> Color

#
Color::r

fn Color::r(self : Color) -> Byte

#
Color::red

fn Color::red() -> Color

#
Color::to_color4f

fn Color::to_color4f(self : Color) -> Color4f

#
Color::transparent

fn Color::transparent() -> Color

#
Color::white

fn Color::white() -> Color

#
Color::with_alpha

fn Color::with_alpha(self : Color, alpha : Byte) -> Color

#
Color::yellow

fn Color::yellow() -> Color

#
Color4f

pub(all) struct Color4f {
r : Float
g : Float
b : Float
a : Float
} derive(Eq,
Debug
)

Floating-point RGBA color in linear component order.
impl Default for Color4f

#
Color4f::from_color

fn Color4f::from_color(color : Color) -> Color4f

#
Color4f::from_opaque

fn Color4f::from_opaque(r : Float, g : Float, b : Float) -> Color4f

#
Color4f::new

fn Color4f::new(r : Float, g : Float, b : Float, a : Float) -> Color4f

#
Color4f::scale

fn Color4f::scale(self : Color4f, scale : Float) -> Color4f

#
Color4f::transparent

fn Color4f::transparent() -> Color4f

#
Color4f::with_alpha

fn Color4f::with_alpha(self : Color4f, alpha : Float) -> Color4f

#
ColorFilterDescriptor

pub(all) enum ColorFilterDescriptor {
ColorMatrixFilter(Array[Float])
SaturationFilter(Float)
BrightnessFilter(Float)
ContrastFilter(Float)
} derive(Eq,
Debug
)

Portable color-filter recipes that mirror the native filter constructors.

#
ColorFilterDescriptor::brightness

fn ColorFilterDescriptor::brightness(amount : Float) -> ColorFilterDescriptor?

#
ColorFilterDescriptor::contrast

fn ColorFilterDescriptor::contrast(amount : Float) -> ColorFilterDescriptor?

#
ColorFilterDescriptor::is_valid

fn ColorFilterDescriptor::is_valid(self : ColorFilterDescriptor) -> Bool

#
ColorFilterDescriptor::matrix

fn ColorFilterDescriptor::matrix(values : Array[Float]) -> ColorFilterDescriptor?

#
ColorFilterDescriptor::resource_descriptor

fn ColorFilterDescriptor::resource_descriptor(self : ColorFilterDescriptor, byte_size? : Int64) -> RendererResourceDescriptor

#
ColorFilterDescriptor::resource_key

#
ColorFilterDescriptor::saturation

fn ColorFilterDescriptor::saturation(amount : Float) -> ColorFilterDescriptor?

#
ColorInfo

pub(all) struct ColorInfo {
color_type : ColorType
alpha_type : AlphaType
} derive(Eq,
Debug
)

Color storage metadata without a concrete color space handle.

The native layer will attach real Skia ColorSpace handles; this value layer keeps the stable pieces needed by surfaces, pixmaps, and images.

#
ColorInfo::bytes_per_pixel

fn ColorInfo::bytes_per_pixel(self : ColorInfo) -> Int

#
ColorInfo::is_opaque

fn ColorInfo::is_opaque(self : ColorInfo) -> Bool

#
ColorInfo::new

fn ColorInfo::new(color_type? : ColorType, alpha_type? : AlphaType) -> ColorInfo

#
ColorInfo::shift_per_pixel

fn ColorInfo::shift_per_pixel(self : ColorInfo) -> Int

#
ColorInfo::with_alpha_type

fn ColorInfo::with_alpha_type(self : ColorInfo, alpha_type : AlphaType) -> ColorInfo

#
ColorInfo::with_color_type

fn ColorInfo::with_color_type(self : ColorInfo, color_type : ColorType) -> ColorInfo

#
ColorType

pub(all) enum ColorType {
Unknown
Alpha8
RGB565
ARGB4444
RGBA8888
RGB888x
BGRA8888
RGBA1010102
RGB101010x
Gray8
RGBAF16
RGBAF32
} derive(Eq,
Debug
)

Pixel storage formats common in Skia surfaces and images.

#
ColorType::bytes_per_pixel

fn ColorType::bytes_per_pixel(self : ColorType) -> Int

#
ColorType::is_always_opaque

fn ColorType::is_always_opaque(self : ColorType) -> Bool

#
ColorType::shift_per_pixel

fn ColorType::shift_per_pixel(self : ColorType) -> Int

#
CubicResampler

pub(all) struct CubicResampler {
b : Float
c : Float
} derive(Eq,
Debug
)

Cubic resampler coefficients for high-quality image scaling.

#
CubicResampler::catmull_rom

fn CubicResampler::catmull_rom() -> CubicResampler

Catmull-Rom cubic resampler.

#
CubicResampler::mitchell

fn CubicResampler::mitchell() -> CubicResampler

Mitchell-Netravali cubic resampler.

#
CubicResampler::new

fn CubicResampler::new(b : Float, c : Float) -> CubicResampler

#
EncodedImageFormat

pub(all) enum EncodedImageFormat {
BMP
GIF
ICO
JPEG
PNG
WBMP
WEBP
PKM
KTX
ASTC
DNG
HEIF
AVIF
JPEGXL
} derive(Eq,
Debug
)

Encoded image container formats accepted by Skia encoders.

#
EncodedImageFormat::from_skia_ordinal

fn EncodedImageFormat::from_skia_ordinal(ordinal : Int) -> EncodedImageFormat?

#
EncodedImageFormat::to_skia_ordinal

fn EncodedImageFormat::to_skia_ordinal(self : EncodedImageFormat) -> Int

#
FilterMode

pub(all) enum FilterMode {
Nearest
Linear
} derive(Eq,
Debug
)

Pixel reconstruction filter used when images are sampled.

#
FilterMode::to_skia_ordinal

fn FilterMode::to_skia_ordinal(self : FilterMode) -> Int

#
FontDescriptor

pub(all) struct FontDescriptor {
typeface_key : RendererResourceKey
size : Float
scale_x : Float
skew_x : Float
} derive(Eq,
Debug
)

Value-layer description of a native font handle derived from a typeface.

#
FontDescriptor::default

fn FontDescriptor::default(size? : Float) -> FontDescriptor

#
FontDescriptor::from_typeface

fn FontDescriptor::from_typeface(typeface_key : RendererResourceKey, size? : Float) -> FontDescriptor

#
FontDescriptor::is_valid

fn FontDescriptor::is_valid(self : FontDescriptor) -> Bool

#
FontDescriptor::new

fn FontDescriptor::new(typeface_key? : RendererResourceKey, size? : Float, scale_x? : Float, skew_x? : Float) -> FontDescriptor

#
FontDescriptor::resource_descriptor

fn FontDescriptor::resource_descriptor(self : FontDescriptor, byte_size? : Int64) -> RendererResourceDescriptor

#
FontDescriptor::resource_key

#
FontDescriptor::with_scale_x

fn FontDescriptor::with_scale_x(self : FontDescriptor, scale_x : Float) -> FontDescriptor

#
FontDescriptor::with_size

fn FontDescriptor::with_size(self : FontDescriptor, size : Float) -> FontDescriptor

#
FontDescriptor::with_skew_x

fn FontDescriptor::with_skew_x(self : FontDescriptor, skew_x : Float) -> FontDescriptor

#
FontDescriptor::with_typeface_key

fn FontDescriptor::with_typeface_key(self : FontDescriptor, typeface_key : RendererResourceKey) -> FontDescriptor

#
FontFallbackChain

pub(all) struct FontFallbackChain {
primary_family : Bytes
fallback_families : Array[Bytes]
} derive(Eq,
Debug
)

Ordered family list used before asking a native font manager for fallback.

#
FontFallbackChain::contains_family

fn FontFallbackChain::contains_family(self : FontFallbackChain, family : Bytes) -> Bool

#
FontFallbackChain::family_at

fn FontFallbackChain::family_at(self : FontFallbackChain, index : Int) -> Bytes?

#
FontFallbackChain::is_empty

fn FontFallbackChain::is_empty(self : FontFallbackChain) -> Bool

#
FontFallbackChain::length

fn FontFallbackChain::length(self : FontFallbackChain) -> Int

#
FontFallbackChain::new

fn FontFallbackChain::new(primary_family? : Bytes, fallback_families? : Array[Bytes]) -> FontFallbackChain

#
FontFallbackChain::with_family

fn FontFallbackChain::with_family(self : FontFallbackChain, family : Bytes) -> FontFallbackChain

#
FontFallbackMatchDescriptor

pub(all) struct FontFallbackMatchDescriptor {
request : FontFallbackRequest
matched_family : Bytes
fallback_index : Int
synthetic : Bool
} derive(Eq,
Debug
)

Value-layer metadata for a native font fallback/typeface match result.

#
FontFallbackMatchDescriptor::font_descriptor

fn FontFallbackMatchDescriptor::font_descriptor(self : FontFallbackMatchDescriptor, size? : Float, scale_x? : Float, skew_x? : Float) -> FontDescriptor

Font descriptor derived from a resolved fallback/typeface match.

#
FontFallbackMatchDescriptor::is_valid

#
FontFallbackMatchDescriptor::matched_in_request

fn FontFallbackMatchDescriptor::matched_in_request(self : FontFallbackMatchDescriptor) -> Bool

#
FontFallbackMatchDescriptor::new

fn FontFallbackMatchDescriptor::new(request? : FontFallbackRequest, matched_family? : Bytes, fallback_index? : Int, synthetic? : Bool) -> FontFallbackMatchDescriptor

#
FontFallbackMatchDescriptor::resource_descriptor

fn FontFallbackMatchDescriptor::resource_descriptor(self : FontFallbackMatchDescriptor, byte_size? : Int64) -> RendererResourceDescriptor

Cache descriptor for resolved fallback/typeface match metadata.

#
FontFallbackMatchDescriptor::resource_key

Deterministic renderer cache key for a resolved native fallback match.

#
FontFallbackMatchDescriptor::resource_plan

fn FontFallbackMatchDescriptor::resource_plan(self : FontFallbackMatchDescriptor, size? : Float, scale_x? : Float, skew_x? : Float, match_byte_size? : Int64, font_byte_size? : Int64) -> RendererResourcePlan

Combined resource plan for retaining a fallback match and derived font.

#
FontFallbackMatchDescriptor::source_family

fn FontFallbackMatchDescriptor::source_family(self : FontFallbackMatchDescriptor) -> Bytes?

#
FontFallbackRequest

pub(all) struct FontFallbackRequest {
families : FontFallbackChain
bcp47 : Array[Bytes]
character : Int
style : FontStyleRequest
} derive(Eq,
Debug
)

Font fallback query for one character or run.

#
FontFallbackRequest::font_descriptor

fn FontFallbackRequest::font_descriptor(self : FontFallbackRequest, size? : Float, scale_x? : Float, skew_x? : Float) -> FontDescriptor

Font descriptor derived from a native fallback/typeface match result.

#
FontFallbackRequest::has_character

fn FontFallbackRequest::has_character(self : FontFallbackRequest) -> Bool

#
FontFallbackRequest::is_empty

fn FontFallbackRequest::is_empty(self : FontFallbackRequest) -> Bool

#
FontFallbackRequest::language_at

fn FontFallbackRequest::language_at(self : FontFallbackRequest, index : Int) -> Bytes?

#
FontFallbackRequest::language_count

fn FontFallbackRequest::language_count(self : FontFallbackRequest) -> Int

#
FontFallbackRequest::match_descriptor

fn FontFallbackRequest::match_descriptor(self : FontFallbackRequest, matched_family : Bytes, fallback_index? : Int, synthetic? : Bool) -> FontFallbackMatchDescriptor

#
FontFallbackRequest::new

fn FontFallbackRequest::new(families? : FontFallbackChain, bcp47? : Array[Bytes], character? : Int, style? : FontStyleRequest) -> FontFallbackRequest

#
FontFallbackRequest::resolution_descriptor

fn FontFallbackRequest::resolution_descriptor(self : FontFallbackRequest, matched_family : Bytes, fallback_index? : Int, synthetic? : Bool) -> FontFallbackResolutionDescriptor

#
FontFallbackRequest::resource_descriptor

fn FontFallbackRequest::resource_descriptor(self : FontFallbackRequest, byte_size? : Int64) -> RendererResourceDescriptor

Cache descriptor for a native font fallback/typeface match result.

#
FontFallbackRequest::resource_key

Deterministic renderer cache key for native font fallback/typeface matching.

#
FontFallbackRequest::resource_plan

fn FontFallbackRequest::resource_plan(self : FontFallbackRequest, size? : Float, scale_x? : Float, skew_x? : Float, fallback_byte_size? : Int64, font_byte_size? : Int64) -> RendererResourcePlan

Combined resource plan for matching a fallback typeface and creating a font.

#
FontFallbackRequest::with_character

fn FontFallbackRequest::with_character(self : FontFallbackRequest, character : Int) -> FontFallbackRequest

#
FontFallbackRequest::with_style

#
FontFallbackResolutionDescriptor

pub(all) struct FontFallbackResolutionDescriptor {
request : FontFallbackRequest
resolved_match : FontFallbackMatchDescriptor
} derive(Eq,
Debug
)

Value-layer metadata for a completed font fallback resolution.

#
FontFallbackResolutionDescriptor::font_descriptor

fn FontFallbackResolutionDescriptor::font_descriptor(self : FontFallbackResolutionDescriptor, size? : Float, scale_x? : Float, skew_x? : Float) -> FontDescriptor

#
FontFallbackResolutionDescriptor::is_valid

#
FontFallbackResolutionDescriptor::matched_in_request

#
FontFallbackResolutionDescriptor::new

#
FontFallbackResolutionDescriptor::resource_descriptor

#
FontFallbackResolutionDescriptor::resource_key

#
FontFallbackResolutionDescriptor::resource_plan

fn FontFallbackResolutionDescriptor::resource_plan(self : FontFallbackResolutionDescriptor, size? : Float, scale_x? : Float, skew_x? : Float, request_byte_size? : Int64, resolution_byte_size? : Int64, match_byte_size? : Int64, font_byte_size? : Int64) -> RendererResourcePlan

#
FontFallbackResolutionDescriptor::source_family

#
FontStyleRequest

pub(all) struct FontStyleRequest {
weight : Int
width : Int
slant : Int
} derive(Eq,
Debug
)

Skia-style font style request shared by native typeface matching and fallback.

#
FontStyleRequest::bold

#
FontStyleRequest::is_bold

fn FontStyleRequest::is_bold(self : FontStyleRequest) -> Bool

#
FontStyleRequest::is_italic

fn FontStyleRequest::is_italic(self : FontStyleRequest) -> Bool

#
FontStyleRequest::italic

#
FontStyleRequest::new

fn FontStyleRequest::new(weight? : Int, width? : Int, slant? : Int) -> FontStyleRequest

#
FontStyleRequest::normal

#
GpuContextBackend

pub(all) enum GpuContextBackend {
MockGpuContext
MetalGpuContext
VulkanGpuContext
Direct3D12GpuContext
OpenGLGpuContext
} derive(Eq,
Debug
)

Future GPU context families that can back a GPU surface target.

#
GpuContextBackend::is_mock

fn GpuContextBackend::is_mock(self : GpuContextBackend) -> Bool

#
GpuContextBackend::is_native_window_backend

fn GpuContextBackend::is_native_window_backend(self : GpuContextBackend) -> Bool

#
GpuContextDescriptor

pub(all) struct GpuContextDescriptor {
backend : GpuContextBackend
id : Bytes
adapter_id : Bytes
device_id : Bytes
queue_family_index : Int
protected_context : Bool
} derive(Eq,
Debug
)

Stable identity for a GPU context or device queue a future native backend can use when creating GPU-backed surfaces.

#
GpuContextDescriptor::direct3d12

fn GpuContextDescriptor::direct3d12(id : Bytes, adapter_id? : Bytes, device_id? : Bytes) -> GpuContextDescriptor

#
GpuContextDescriptor::is_anonymous

fn GpuContextDescriptor::is_anonymous(self : GpuContextDescriptor) -> Bool

#
GpuContextDescriptor::metal

fn GpuContextDescriptor::metal(id : Bytes, adapter_id? : Bytes, device_id? : Bytes) -> GpuContextDescriptor

#
GpuContextDescriptor::mock

#
GpuContextDescriptor::new

fn GpuContextDescriptor::new(backend? : GpuContextBackend, id? : Bytes, adapter_id? : Bytes, device_id? : Bytes, queue_family_index? : Int, protected_context? : Bool) -> GpuContextDescriptor

#
GpuContextDescriptor::opengl

fn GpuContextDescriptor::opengl(id : Bytes, adapter_id? : Bytes, device_id? : Bytes) -> GpuContextDescriptor

#
GpuContextDescriptor::resource_descriptor

fn GpuContextDescriptor::resource_descriptor(self : GpuContextDescriptor, byte_size? : Int64) -> RendererResourceDescriptor

#
GpuContextDescriptor::resource_key

#
GpuContextDescriptor::vulkan

fn GpuContextDescriptor::vulkan(id : Bytes, adapter_id? : Bytes, device_id? : Bytes, queue_family_index? : Int) -> GpuContextDescriptor

#
GpuContextDescriptor::with_protected_context

fn GpuContextDescriptor::with_protected_context(self : GpuContextDescriptor, protected_context : Bool) -> GpuContextDescriptor

#
IPoint

pub(all) struct IPoint {
x : Int
y : Int
} derive(Eq,
Debug
)

Integer point or vector.
impl Default for IPoint

#
IPoint::equals

fn IPoint::equals(self : IPoint, x : Int, y : Int) -> Bool

#
IPoint::is_zero

fn IPoint::is_zero(self : IPoint) -> Bool

#
IPoint::new

fn IPoint::new(x : Int, y : Int) -> IPoint

#
IPoint::offset

fn IPoint::offset(self : IPoint, dx : Int, dy : Int) -> IPoint

#
IPoint::to_point

fn IPoint::to_point(self : IPoint) -> Point

#
IPoint::zero

fn IPoint::zero() -> IPoint

#
IRect

pub(all) struct IRect {
left : Int
top : Int
right : Int
bottom : Int
} derive(Eq,
Debug
)

Integer rectangle stored as left/top/right/bottom bounds.
impl Default for IRect

#
IRect::bottom

fn IRect::bottom(self : IRect) -> Int

#
IRect::contains_point

fn IRect::contains_point(self : IRect, point : IPoint) -> Bool

#
IRect::contains_rect

fn IRect::contains_rect(self : IRect, other : IRect) -> Bool

#
IRect::empty

fn IRect::empty() -> IRect

#
IRect::from_ltrb

fn IRect::from_ltrb(left : Int, top : Int, right : Int, bottom : Int) -> IRect

#
IRect::from_point_and_size

fn IRect::from_point_and_size(point : IPoint, size : ISize) -> IRect

#
IRect::from_size

fn IRect::from_size(size : ISize) -> IRect

#
IRect::from_wh

fn IRect::from_wh(width : Int, height : Int) -> IRect

#
IRect::from_xywh

fn IRect::from_xywh(x : Int, y : Int, width : Int, height : Int) -> IRect

#
IRect::height

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

#
IRect::height_64

fn IRect::height_64(self : IRect) -> Int64

#
IRect::inset

fn IRect::inset(self : IRect, dx : Int, dy : Int) -> IRect

#
IRect::intersect

fn IRect::intersect(self : IRect, other : IRect) -> IRect?

#
IRect::intersects

fn IRect::intersects(self : IRect, other : IRect) -> Bool

#
IRect::is_empty

fn IRect::is_empty(self : IRect) -> Bool

#
IRect::is_empty_64

fn IRect::is_empty_64(self : IRect) -> Bool

#
IRect::is_sorted

fn IRect::is_sorted(self : IRect) -> Bool

#
IRect::join

fn IRect::join(self : IRect, other : IRect) -> IRect

#
IRect::left

fn IRect::left(self : IRect) -> Int

#
IRect::new

fn IRect::new(left : Int, top : Int, right : Int, bottom : Int) -> IRect

#
IRect::offset

fn IRect::offset(self : IRect, dx : Int, dy : Int) -> IRect

#
IRect::outset

fn IRect::outset(self : IRect, dx : Int, dy : Int) -> IRect

#
IRect::right

fn IRect::right(self : IRect) -> Int

#
IRect::size

fn IRect::size(self : IRect) -> ISize

#
IRect::sorted

fn IRect::sorted(self : IRect) -> IRect

#
IRect::to_rect

fn IRect::to_rect(self : IRect) -> Rect

#
IRect::top

fn IRect::top(self : IRect) -> Int

#
IRect::width

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

#
IRect::width_64

fn IRect::width_64(self : IRect) -> Int64

#
IRect::with_adjustment

fn IRect::with_adjustment(self : IRect, delta_left : Int, delta_top : Int, delta_right : Int, delta_bottom : Int) -> IRect

#
IRect::with_inset

fn IRect::with_inset(self : IRect, inset : ISize) -> IRect

#
IRect::with_offset

fn IRect::with_offset(self : IRect, offset : IPoint) -> IRect

#
IRect::with_offset_to

fn IRect::with_offset_to(self : IRect, point : IPoint) -> IRect

#
IRect::with_outset

fn IRect::with_outset(self : IRect, outset : ISize) -> IRect

#
IRect::x

fn IRect::x(self : IRect) -> Int

#
IRect::y

fn IRect::y(self : IRect) -> Int

#
ISize

pub(all) struct ISize {
width : Int
height : Int
} derive(Eq,
Debug
)

Integer width and height.
impl Default for ISize

#
ISize::area

fn ISize::area(self : ISize) -> Int64

#
ISize::empty

fn ISize::empty() -> ISize

#
ISize::is_empty

fn ISize::is_empty(self : ISize) -> Bool

#
ISize::is_zero

fn ISize::is_zero(self : ISize) -> Bool

#
ISize::new

fn ISize::new(width : Int, height : Int) -> ISize

#
ISize::to_size

fn ISize::to_size(self : ISize) -> Size

#
ImageDescriptor

pub(all) enum ImageDescriptor {
EncodedImage(Bytes, EncodedImageFormat?, ISize?)
} derive(Eq,
Debug
)

Portable image recipes that can be planned before native Skia images are decoded or uploaded.

#
ImageDescriptor::byte_size

fn ImageDescriptor::byte_size(self : ImageDescriptor) -> Int64

#
ImageDescriptor::dimensions

fn ImageDescriptor::dimensions(self : ImageDescriptor) -> ISize?

#
ImageDescriptor::encoded

fn ImageDescriptor::encoded(bytes : Bytes, format? : EncodedImageFormat?, dimensions? : ISize?) -> ImageDescriptor?

#
ImageDescriptor::encoded_bytes

fn ImageDescriptor::encoded_bytes(self : ImageDescriptor) -> Bytes

#
ImageDescriptor::resource_descriptor

fn ImageDescriptor::resource_descriptor(self : ImageDescriptor, byte_size? : Int64) -> RendererResourceDescriptor

#
ImageDescriptor::resource_key

#
ImageFilterDescriptor

pub(all) enum ImageFilterDescriptor {
BlurImageFilter(Float, Float)
} derive(Eq,
Debug
)

Portable image-filter recipes that can be mapped to native Skia filters.

#
ImageFilterDescriptor::blur

fn ImageFilterDescriptor::blur(sigma_x : Float, sigma_y : Float) -> ImageFilterDescriptor?

#
ImageFilterDescriptor::is_valid

fn ImageFilterDescriptor::is_valid(self : ImageFilterDescriptor) -> Bool

#
ImageFilterDescriptor::resource_descriptor

fn ImageFilterDescriptor::resource_descriptor(self : ImageFilterDescriptor, byte_size? : Int64) -> RendererResourceDescriptor

#
ImageFilterDescriptor::resource_key

#
ImageInfo

pub(all) struct ImageInfo {
dimensions : ISize
color_info : ColorInfo
} derive(Eq,
Debug
)

Dimensions plus color metadata for images, bitmaps, pixmaps, and surfaces.

#
ImageInfo::a8

fn ImageInfo::a8(dimensions : ISize) -> ImageInfo

#
ImageInfo::alpha_type

fn ImageInfo::alpha_type(self : ImageInfo) -> AlphaType

#
ImageInfo::bounds

fn ImageInfo::bounds(self : ImageInfo) -> IRect

#
ImageInfo::bytes_per_pixel

fn ImageInfo::bytes_per_pixel(self : ImageInfo) -> Int

#
ImageInfo::color_type

fn ImageInfo::color_type(self : ImageInfo) -> ColorType

#
ImageInfo::compute_byte_size

fn ImageInfo::compute_byte_size(self : ImageInfo, row_bytes : Int) -> Int

#
ImageInfo::compute_byte_size64

fn ImageInfo::compute_byte_size64(self : ImageInfo, row_bytes : Int) -> Int64

#
ImageInfo::compute_min_byte_size

fn ImageInfo::compute_min_byte_size(self : ImageInfo) -> Int

#
ImageInfo::compute_min_byte_size64

fn ImageInfo::compute_min_byte_size64(self : ImageInfo) -> Int64

#
ImageInfo::compute_offset

fn ImageInfo::compute_offset(self : ImageInfo, point : IPoint, row_bytes : Int) -> Int

#
ImageInfo::from_color_info

fn ImageInfo::from_color_info(dimensions : ISize, color_info : ColorInfo) -> ImageInfo

#
ImageInfo::height

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

#
ImageInfo::is_empty

fn ImageInfo::is_empty(self : ImageInfo) -> Bool

#
ImageInfo::is_opaque

fn ImageInfo::is_opaque(self : ImageInfo) -> Bool

#
ImageInfo::min_row_bytes

fn ImageInfo::min_row_bytes(self : ImageInfo) -> Int

#
ImageInfo::min_row_bytes64

fn ImageInfo::min_row_bytes64(self : ImageInfo) -> Int64

#
ImageInfo::n32_premul

fn ImageInfo::n32_premul(dimensions : ISize) -> ImageInfo

#
ImageInfo::new

fn ImageInfo::new(dimensions : ISize, color_type? : ColorType, alpha_type? : AlphaType) -> ImageInfo

#
ImageInfo::shift_per_pixel

fn ImageInfo::shift_per_pixel(self : ImageInfo) -> Int

#
ImageInfo::unknown

fn ImageInfo::unknown(dimensions? : ISize) -> ImageInfo

#
ImageInfo::valid_pixels

fn ImageInfo::valid_pixels(self : ImageInfo, row_bytes : Int) -> Bool

#
ImageInfo::valid_row_bytes

fn ImageInfo::valid_row_bytes(self : ImageInfo, row_bytes : Int) -> Bool

#
ImageInfo::width

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

#
ImageInfo::with_alpha_type

fn ImageInfo::with_alpha_type(self : ImageInfo, alpha_type : AlphaType) -> ImageInfo

#
ImageInfo::with_color_type

fn ImageInfo::with_color_type(self : ImageInfo, color_type : ColorType) -> ImageInfo

#
ImageInfo::with_dimensions

fn ImageInfo::with_dimensions(self : ImageInfo, dimensions : ISize) -> ImageInfo

#
MaskFilterDescriptor

pub(all) enum MaskFilterDescriptor {
BlurMaskFilter(Float)
} derive(Eq,
Debug
)

Portable mask-filter recipes that can be mapped to native Skia filters.

#
MaskFilterDescriptor::blur

fn MaskFilterDescriptor::blur(sigma : Float) -> MaskFilterDescriptor?

#
MaskFilterDescriptor::is_valid

fn MaskFilterDescriptor::is_valid(self : MaskFilterDescriptor) -> Bool

#
MaskFilterDescriptor::resource_descriptor

fn MaskFilterDescriptor::resource_descriptor(self : MaskFilterDescriptor, byte_size? : Int64) -> RendererResourceDescriptor

#
MaskFilterDescriptor::resource_key

#
Matrix

pub(all) struct Matrix {
scale_x : Float
skew_x : Float
trans_x : Float
skew_y : Float
scale_y : Float
trans_y : Float
persp_0 : Float
persp_1 : Float
persp_2 : Float
} derive(Eq,
Debug
)

Row-major 3x3 transform matrix matching Skia's public member layout.
impl Default for Matrix

#
Matrix::concat

fn Matrix::concat(self : Matrix, other : Matrix) -> Matrix

#
Matrix::determinant

fn Matrix::determinant(self : Matrix) -> Float

#
Matrix::from_affine

fn Matrix::from_affine(values : Array[Float]) -> Matrix?

#
Matrix::get

fn Matrix::get(self : Matrix, field : MatrixMember) -> Float

#
Matrix::has_perspective

fn Matrix::has_perspective(self : Matrix) -> Bool

#
Matrix::identity

fn Matrix::identity() -> Matrix

#
Matrix::invert

fn Matrix::invert(self : Matrix) -> Matrix?

#
Matrix::is_finite

fn Matrix::is_finite(self : Matrix) -> Bool

#
Matrix::is_identity

fn Matrix::is_identity(self : Matrix) -> Bool

#
Matrix::is_invertible

fn Matrix::is_invertible(self : Matrix) -> Bool

#
Matrix::is_scale_translate

fn Matrix::is_scale_translate(self : Matrix) -> Bool

#
Matrix::is_translate

fn Matrix::is_translate(self : Matrix) -> Bool

#
Matrix::map_origin

fn Matrix::map_origin(self : Matrix) -> Point

#
Matrix::map_point

fn Matrix::map_point(self : Matrix, point : Point) -> Point

#
Matrix::map_point_affine

fn Matrix::map_point_affine(self : Matrix, point : Point) -> Point?

#
Matrix::map_points

fn Matrix::map_points(self : Matrix, points : Array[Point]) -> Array[Point]

#
Matrix::map_radius

fn Matrix::map_radius(self : Matrix, radius : Float) -> Float?

#
Matrix::map_rect

fn Matrix::map_rect(self : Matrix, rect : Rect) -> Rect

#
Matrix::map_rect_scale_translate

fn Matrix::map_rect_scale_translate(self : Matrix, rect : Rect) -> Rect?

#
Matrix::map_rect_to_quad

fn Matrix::map_rect_to_quad(self : Matrix, rect : Rect) -> Array[Point]

#
Matrix::map_vector

fn Matrix::map_vector(self : Matrix, vector : Point) -> Point

#
Matrix::map_vectors

fn Matrix::map_vectors(self : Matrix, vectors : Array[Point]) -> Array[Point]

#
Matrix::map_xy

fn Matrix::map_xy(self : Matrix, x : Float, y : Float) -> Point

#
Matrix::new_all

fn Matrix::new_all(scale_x : Float, skew_x : Float, trans_x : Float, skew_y : Float, scale_y : Float, trans_y : Float, persp_0 : Float, persp_1 : Float, persp_2 : Float) -> Matrix

#
Matrix::persp_x

fn Matrix::persp_x(self : Matrix) -> Float

#
Matrix::persp_y

fn Matrix::persp_y(self : Matrix) -> Float

#
Matrix::post_concat

fn Matrix::post_concat(self : Matrix, other : Matrix) -> Matrix

#
Matrix::post_rotate_degrees

fn Matrix::post_rotate_degrees(self : Matrix, degrees : Float) -> Matrix

#
Matrix::post_scale

fn Matrix::post_scale(self : Matrix, sx : Float, sy : Float) -> Matrix

#
Matrix::post_skew

fn Matrix::post_skew(self : Matrix, kx : Float, ky : Float) -> Matrix

#
Matrix::post_translate

fn Matrix::post_translate(self : Matrix, dx : Float, dy : Float) -> Matrix

#
Matrix::pre_concat

fn Matrix::pre_concat(self : Matrix, other : Matrix) -> Matrix

#
Matrix::pre_rotate_degrees

fn Matrix::pre_rotate_degrees(self : Matrix, degrees : Float) -> Matrix

#
Matrix::pre_scale

fn Matrix::pre_scale(self : Matrix, sx : Float, sy : Float) -> Matrix

#
Matrix::pre_skew

fn Matrix::pre_skew(self : Matrix, kx : Float, ky : Float) -> Matrix

#
Matrix::pre_translate

fn Matrix::pre_translate(self : Matrix, dx : Float, dy : Float) -> Matrix

#
Matrix::rotate_degrees

fn Matrix::rotate_degrees(degrees : Float) -> Matrix

#
Matrix::scale

fn Matrix::scale(sx : Float, sy : Float) -> Matrix

#
Matrix::scale_translate

fn Matrix::scale_translate(sx : Float, sy : Float, tx : Float, ty : Float) -> Matrix

#
Matrix::scale_x

fn Matrix::scale_x(self : Matrix) -> Float

#
Matrix::scale_y

fn Matrix::scale_y(self : Matrix) -> Float

#
Matrix::skew

fn Matrix::skew(kx : Float, ky : Float) -> Matrix

#
Matrix::skew_x

fn Matrix::skew_x(self : Matrix) -> Float

#
Matrix::skew_y

fn Matrix::skew_y(self : Matrix) -> Float

#
Matrix::to_affine

fn Matrix::to_affine(self : Matrix) -> Array[Float]?

#
Matrix::translate

fn Matrix::translate(dx : Float, dy : Float) -> Matrix

#
Matrix::translate_x

fn Matrix::translate_x(self : Matrix) -> Float

#
Matrix::translate_y

fn Matrix::translate_y(self : Matrix) -> Float

#
Matrix::values

fn Matrix::values(self : Matrix) -> Array[Float]

#
MatrixMember

pub(all) enum MatrixMember {
ScaleX
SkewX
TransX
SkewY
ScaleY
TransY
Persp0
Persp1
Persp2
} derive(Eq,
Debug
)

Member positions in a 3x3 Skia matrix.

#
MeasuredTextRunDescriptor

pub(all) struct MeasuredTextRunDescriptor {
measurement : TextMeasurementDescriptor
advance : Float
bounds : Rect?
} derive(Eq,
Debug
)

Value-layer metadata for a native text measurement result.

#
MeasuredTextRunDescriptor::has_bounds

#
MeasuredTextRunDescriptor::is_valid

#
MeasuredTextRunDescriptor::new

fn MeasuredTextRunDescriptor::new(measurement? : TextMeasurementDescriptor, advance? : Float, bounds? : Rect?) -> MeasuredTextRunDescriptor

#
MeasuredTextRunDescriptor::resource_descriptor

fn MeasuredTextRunDescriptor::resource_descriptor(self : MeasuredTextRunDescriptor, text : Bytes, byte_size? : Int64) -> RendererResourceDescriptor

#
MeasuredTextRunDescriptor::resource_key

#
MeasuredTextRunDescriptor::resource_plan

fn MeasuredTextRunDescriptor::resource_plan(self : MeasuredTextRunDescriptor, text : Bytes, measured_byte_size? : Int64, measurement_byte_size? : Int64, text_byte_size? : Int64, font_byte_size? : Int64, fallback_byte_size? : Int64) -> RendererResourcePlan

#
MipmapMode

pub(all) enum MipmapMode {
None
Nearest
Linear
} derive(Eq,
Debug
)

Mipmap sampling mode used together with FilterMode.

#
MipmapMode::to_skia_ordinal

fn MipmapMode::to_skia_ordinal(self : MipmapMode) -> Int

#
Paint

pub(all) struct Paint {
color : Color
anti_alias : Bool
dither : Bool
style : PaintStyle
stroke_width : Float
stroke_miter : Float
stroke_cap : StrokeCap
stroke_join : StrokeJoin
blend_mode : BlendMode
} derive(Eq,
Debug
)

Value-layer paint state modeled after skia_safe::Paint.

Native Skia paints will use a separate handle type once the C++ FFI layer is wired to real Skia binaries.
impl Default for Paint

#
Paint::alpha

fn Paint::alpha(self : Paint) -> Byte

#
Paint::blend_mode_ordinal

fn Paint::blend_mode_ordinal(self : Paint) -> Int

#
Paint::color_argb

fn Paint::color_argb(self : Paint) -> UInt

#
Paint::new

fn Paint::new(color? : Color, anti_alias? : Bool, dither? : Bool, style? : PaintStyle, stroke_width? : Float, stroke_miter? : Float, stroke_cap? : StrokeCap, stroke_join? : StrokeJoin, blend_mode? : BlendMode) -> Paint

#
Paint::reset

fn Paint::reset(self : Paint) -> Paint

#
Paint::set_alpha

fn Paint::set_alpha(self : Paint, alpha : Byte) -> Paint

#
Paint::set_anti_alias

fn Paint::set_anti_alias(self : Paint, anti_alias : Bool) -> Paint

#
Paint::set_argb

fn Paint::set_argb(self : Paint, a : Byte, r : Byte, g : Byte, b : Byte) -> Paint

#
Paint::set_blend_mode

fn Paint::set_blend_mode(self : Paint, blend_mode : BlendMode) -> Paint

#
Paint::set_color

fn Paint::set_color(self : Paint, color : Color) -> Paint

#
Paint::set_dither

fn Paint::set_dither(self : Paint, dither : Bool) -> Paint

#
Paint::set_stroke

fn Paint::set_stroke(self : Paint, stroke : Bool) -> Paint

#
Paint::set_stroke_cap

fn Paint::set_stroke_cap(self : Paint, stroke_cap : StrokeCap) -> Paint

#
Paint::set_stroke_join

fn Paint::set_stroke_join(self : Paint, stroke_join : StrokeJoin) -> Paint

#
Paint::set_stroke_miter

fn Paint::set_stroke_miter(self : Paint, stroke_miter : Float) -> Paint

#
Paint::set_stroke_width

fn Paint::set_stroke_width(self : Paint, stroke_width : Float) -> Paint

#
Paint::set_style

fn Paint::set_style(self : Paint, style : PaintStyle) -> Paint

#
Paint::stroke_cap_ordinal

fn Paint::stroke_cap_ordinal(self : Paint) -> Int

#
Paint::stroke_join_ordinal

fn Paint::stroke_join_ordinal(self : Paint) -> Int

#
Paint::style_ordinal

fn Paint::style_ordinal(self : Paint) -> Int

#
PaintStyle

pub(all) enum PaintStyle {
Fill
Stroke
StrokeAndFill
} derive(Eq,
Debug
)

How paint geometry is rasterized.

#
PaintStyle::to_skia_ordinal

fn PaintStyle::to_skia_ordinal(self : PaintStyle) -> Int

#
Path

pub(all) struct Path {
fill_type : PathFillType
verbs : Array[PathVerb]
current_point : Point?
} derive(Eq,
Debug
)

Cross-platform path value.

The native package owns real SkPath handles. This value layer keeps a portable path command stream that can be built, inspected, and tested on all MoonBit targets before being converted at a native boundary.
impl Default for Path

#
Path::add_circle

fn Path::add_circle(self : Path, center : Point, radius : Float, direction? : PathDirection) -> Path

#
Path::add_oval

fn Path::add_oval(self : Path, oval : Rect, direction? : PathDirection) -> Path

#
Path::add_path

fn Path::add_path(self : Path, path : Path, matrix? : Matrix, mode? : AddPathMode) -> Path

#
Path::add_path_matrix

fn Path::add_path_matrix(self : Path, path : Path, matrix : Matrix, mode? : AddPathMode) -> Path

#
Path::add_path_offset

fn Path::add_path_offset(self : Path, path : Path, offset : Point, mode? : AddPathMode) -> Path

#
Path::add_poly

fn Path::add_poly(self : Path, points : Array[Point], close? : Bool) -> Path

#
Path::add_rect

fn Path::add_rect(self : Path, rect : Rect, direction? : PathDirection) -> Path

#
Path::add_round_rect

fn Path::add_round_rect(self : Path, rect : Rect, rx : Float, ry : Float, direction? : PathDirection) -> Path

#
Path::add_rrect

fn Path::add_rrect(self : Path, rrect : RRect, direction? : PathDirection) -> Path

#
Path::bounds

fn Path::bounds(self : Path) -> Rect?

#
Path::close

fn Path::close(self : Path) -> Path

#
Path::compute_tight_bounds

fn Path::compute_tight_bounds(self : Path) -> Rect?

Computes a tighter geometric bound for quadratic, conic, and cubic curves.

bounds records the path's control-point bounds, matching Skia's cached path bounds. This method mirrors Skia's computeTightBounds distinction by adding only curve extrema that affect the actual drawn curve.

#
Path::conic_to

fn Path::conic_to(self : Path, control : Point, end : Point, weight : Float) -> Path

#
Path::contains

fn Path::contains(self : Path, point : Point) -> Bool

Returns whether point is inside the portable path approximation.

This value-layer implementation treats line segments exactly and uses curve endpoints for curved verbs. The native package delegates Path::contains to Skia for full curve-aware containment when Skia is linked.

#
Path::count_points

fn Path::count_points(self : Path) -> Int

#
Path::count_verbs

fn Path::count_verbs(self : Path) -> Int

#
Path::cubic_to

fn Path::cubic_to(self : Path, control0 : Point, control1 : Point, end : Point) -> Path

#
Path::is_empty

fn Path::is_empty(self : Path) -> Bool

#
Path::is_finite

fn Path::is_finite(self : Path) -> Bool

#
Path::is_inverse_fill_type

fn Path::is_inverse_fill_type(self : Path) -> Bool

#
Path::is_last_contour_closed

fn Path::is_last_contour_closed(self : Path) -> Bool

#
Path::is_line

fn Path::is_line(self : Path) -> PathLine?

#
Path::is_oval

fn Path::is_oval(self : Path) -> Rect?

#
Path::is_rect

fn Path::is_rect(self : Path) -> PathRect?

#
Path::last_point

fn Path::last_point(self : Path) -> Point?

#
Path::line_to

fn Path::line_to(self : Path, point : Point) -> Path

#
Path::move_to

fn Path::move_to(self : Path, point : Point) -> Path

#
Path::new

fn Path::new(fill_type? : PathFillType) -> Path

#
Path::offset

fn Path::offset(self : Path, dx : Float, dy : Float) -> Path

#
Path::quad_to

fn Path::quad_to(self : Path, control : Point, end : Point) -> Path

#
Path::reset

fn Path::reset(self : Path) -> Path

#
Path::resource_descriptor

fn Path::resource_descriptor(self : Path, byte_size? : Int64) -> RendererResourceDescriptor

#
Path::resource_key

fn Path::resource_key(self : Path) -> RendererResourceKey

#
Path::rewind

fn Path::rewind(self : Path) -> Path

#
Path::segment_masks

fn Path::segment_masks(self : Path) -> PathSegmentMask

#
Path::stroke_bounds

fn Path::stroke_bounds(self : Path, paint : Paint) -> Rect?

#
Path::transform

fn Path::transform(self : Path, matrix : Matrix) -> Path

#
Path::verb_count

fn Path::verb_count(self : Path) -> Int

#
Path::with_fill_type

fn Path::with_fill_type(self : Path, fill_type : PathFillType) -> Path

#
Path::with_offset

fn Path::with_offset(self : Path, offset : Point) -> Path

#
PathDirection

pub(all) enum PathDirection {
CW
CCW
} derive(Eq,
Debug
)

Direction used when adding closed contours.

#
PathDirection::to_skia_ordinal

fn PathDirection::to_skia_ordinal(self : PathDirection) -> Int

#
PathFillType

pub(all) enum PathFillType {
Winding
EvenOdd
InverseWinding
InverseEvenOdd
} derive(Eq,
Debug
)

Fill rule used when rasterizing a path.

#
PathFillType::is_inverse

fn PathFillType::is_inverse(self : PathFillType) -> Bool

#
PathFillType::to_skia_ordinal

fn PathFillType::to_skia_ordinal(self : PathFillType) -> Int

#
PathLine

pub(all) struct PathLine {
start : Point
end : Point
} derive(Eq,
Debug
)

A single line segment recognized from a path.

#
PathLine::new

fn PathLine::new(start : Point, end : Point) -> PathLine

#
PathRect

pub(all) struct PathRect {
rect : Rect
is_closed : Bool
direction : PathDirection
} derive(Eq,
Debug
)

Rectangle recognized from a path, plus Skia's closed and direction metadata.

#
PathRect::new

fn PathRect::new(rect : Rect, is_closed : Bool, direction : PathDirection) -> PathRect

#
PathSegmentMask

pub(all) struct PathSegmentMask(Int) derive(Eq,
Debug
)

Bitmask of path segment kinds, matching Skia's public segment-mask values.

#
PathSegmentMask::bits

fn PathSegmentMask::bits(self : PathSegmentMask) -> Int

#
PathSegmentMask::conic

#
PathSegmentMask::contains

fn PathSegmentMask::contains(self : PathSegmentMask, other : PathSegmentMask) -> Bool

#
PathSegmentMask::cubic

#
PathSegmentMask::empty

#
PathSegmentMask::line

#
PathSegmentMask::new

fn PathSegmentMask::new(value : Int) -> PathSegmentMask

#
PathSegmentMask::quad

#
PathVerb

pub(all) enum PathVerb {
MoveTo(Point)
LineTo(Point)
QuadTo(Point, Point)
ConicTo(Point, Point, Float)
CubicTo(Point, Point, Point)
Close
} derive(Eq,
Debug
)

Cross-platform path verb data modeled after Skia path commands.

#
Pixmap

pub(all) struct Pixmap {
image_info : ImageInfo
row_bytes : Int
pixels : Bytes
} derive(Eq,
Debug
)

Immutable pixel snapshot plus layout metadata.

This mirrors the lightweight role of Skia's SkPixmap, but owns the copied bytes on the MoonBit side so it is safe across backend boundaries.

#
Pixmap::alpha_type

fn Pixmap::alpha_type(self : Pixmap) -> AlphaType

#
Pixmap::bounds

fn Pixmap::bounds(self : Pixmap) -> IRect

#
Pixmap::byte_size

fn Pixmap::byte_size(self : Pixmap) -> Int

#
Pixmap::byte_size64

fn Pixmap::byte_size64(self : Pixmap) -> Int64

#
Pixmap::bytes_per_pixel

fn Pixmap::bytes_per_pixel(self : Pixmap) -> Int

#
Pixmap::color_type

fn Pixmap::color_type(self : Pixmap) -> ColorType

#
Pixmap::contains

fn Pixmap::contains(self : Pixmap, point : IPoint) -> Bool

#
Pixmap::dimensions

fn Pixmap::dimensions(self : Pixmap) -> ISize

#
Pixmap::height

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

#
Pixmap::is_empty

fn Pixmap::is_empty(self : Pixmap) -> Bool

#
Pixmap::matches_sample

fn Pixmap::matches_sample(self : Pixmap, point : IPoint, sample : Bytes) -> Bool

Check that one pixel has exactly the expected stored channel bytes.

#
Pixmap::new

fn Pixmap::new(image_info : ImageInfo, row_bytes : Int, pixels : Bytes) -> Pixmap?

#
Pixmap::offset

fn Pixmap::offset(self : Pixmap, point : IPoint) -> Int?

#
Pixmap::row_bytes

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

#
Pixmap::sample

fn Pixmap::sample(self : Pixmap, point : IPoint) -> Bytes?

Copy the stored channel bytes for one pixel.

#
Pixmap::shift_per_pixel

fn Pixmap::shift_per_pixel(self : Pixmap) -> Int

#
Pixmap::width

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

#
Point

pub(all) struct Point {
x : Float
y : Float
} derive(Eq,
Debug
)

Floating-point point or vector.
impl Default for Point

#
Point::cross

fn Point::cross(self : Point, other : Point) -> Float

#
Point::distance_to

fn Point::distance_to(self : Point, other : Point) -> Float

#
Point::distance_to_origin

fn Point::distance_to_origin(self : Point) -> Float

#
Point::distance_to_origin_squared

fn Point::distance_to_origin_squared(self : Point) -> Float

#
Point::distance_to_squared

fn Point::distance_to_squared(self : Point, other : Point) -> Float

#
Point::dot

fn Point::dot(self : Point, other : Point) -> Float

#
Point::equals

fn Point::equals(self : Point, x : Float, y : Float) -> Bool

#
Point::is_finite

fn Point::is_finite(self : Point) -> Bool

#
Point::is_zero

fn Point::is_zero(self : Point) -> Bool

#
Point::length

fn Point::length(self : Point) -> Float

#
Point::length_squared

fn Point::length_squared(self : Point) -> Float

#
Point::new

fn Point::new(x : Float, y : Float) -> Point

#
Point::normalized

fn Point::normalized(self : Point) -> Point?

#
Point::offset

fn Point::offset(self : Point, dx : Float, dy : Float) -> Point

#
Point::rotate_ccw

fn Point::rotate_ccw(self : Point) -> Point

#
Point::rotate_cw

fn Point::rotate_cw(self : Point) -> Point

#
Point::scale

fn Point::scale(self : Point, scale : Float) -> Point

#
Point::to_ipoint_round

fn Point::to_ipoint_round(self : Point) -> IPoint

#
Point::with_length

fn Point::with_length(self : Point, length : Float) -> Point?

#
Point::zero

fn Point::zero() -> Point

#
PointMode

pub(all) enum PointMode {
Points
Lines
Polygon
} derive(Eq,
Debug
)

How Canvas::draw_points interprets a point array.

#
PointMode::to_skia_ordinal

fn PointMode::to_skia_ordinal(self : PointMode) -> Int

#
RRect

pub(all) struct RRect {
rect : Rect
upper_left : Size
upper_right : Size
lower_right : Size
lower_left : Size
} derive(Eq,
Debug
)

Rounded rectangle bounds plus per-corner x/y radii.

Corners are stored in Skia order: upper-left, upper-right, lower-right, lower-left.
impl Default for RRect

#
RRect::bounds

fn RRect::bounds(self : RRect) -> Rect

#
RRect::contains_rect

fn RRect::contains_rect(self : RRect, rect : Rect) -> Bool

#
RRect::empty

fn RRect::empty() -> RRect

#
RRect::from_oval

fn RRect::from_oval(oval : Rect) -> RRect

#
RRect::from_rect

fn RRect::from_rect(rect : Rect) -> RRect

#
RRect::from_rect_xy

fn RRect::from_rect_xy(rect : Rect, rx : Float, ry : Float) -> RRect

#
RRect::height

fn RRect::height(self : RRect) -> Float

#
RRect::is_empty

fn RRect::is_empty(self : RRect) -> Bool

#
RRect::is_oval

fn RRect::is_oval(self : RRect) -> Bool

#
RRect::is_rect

fn RRect::is_rect(self : RRect) -> Bool

#
RRect::is_simple

fn RRect::is_simple(self : RRect) -> Bool

#
RRect::new

fn RRect::new(rect : Rect, upper_left : Size, upper_right : Size, lower_right : Size, lower_left : Size) -> RRect

#
RRect::offset

fn RRect::offset(self : RRect, dx : Float, dy : Float) -> RRect

#
RRect::width

fn RRect::width(self : RRect) -> Float

#
RRect::with_inset

fn RRect::with_inset(self : RRect, inset : Size) -> RRect

#
RRect::with_offset

fn RRect::with_offset(self : RRect, delta : Point) -> RRect

#
RRect::with_offset_to

fn RRect::with_offset_to(self : RRect, point : Point) -> RRect

#
RRect::with_outset

fn RRect::with_outset(self : RRect, outset : Size) -> RRect

#
Rect

pub(all) struct Rect {
left : Float
top : Float
right : Float
bottom : Float
} derive(Eq,
Debug
)

Floating-point rectangle stored as left/top/right/bottom bounds.
impl Default for Rect

#
Rect::bl

fn Rect::bl(self : Rect) -> Point

#
Rect::bottom

fn Rect::bottom(self : Rect) -> Float

#
Rect::bottom_left

fn Rect::bottom_left(self : Rect) -> Point

#
Rect::bottom_right

fn Rect::bottom_right(self : Rect) -> Point

#
Rect::br

fn Rect::br(self : Rect) -> Point

#
Rect::center

fn Rect::center(self : Rect) -> Point

#
Rect::center_x

fn Rect::center_x(self : Rect) -> Float

#
Rect::center_y

fn Rect::center_y(self : Rect) -> Float

#
Rect::contains_point

fn Rect::contains_point(self : Rect, point : Point) -> Bool

#
Rect::contains_rect

fn Rect::contains_rect(self : Rect, other : Rect) -> Bool

#
Rect::empty

fn Rect::empty() -> Rect

#
Rect::from_irect

fn Rect::from_irect(rect : IRect) -> Rect

#
Rect::from_isize

fn Rect::from_isize(size : ISize) -> Rect

#
Rect::from_iwh

fn Rect::from_iwh(width : Int, height : Int) -> Rect

#
Rect::from_ltrb

fn Rect::from_ltrb(left : Float, top : Float, right : Float, bottom : Float) -> Rect

#
Rect::from_point_and_size

fn Rect::from_point_and_size(point : Point, size : Size) -> Rect

#
Rect::from_points

fn Rect::from_points(points : Array[Point]) -> Rect?

#
Rect::from_points_or_empty

fn Rect::from_points_or_empty(points : Array[Point]) -> Rect

#
Rect::from_size

fn Rect::from_size(size : Size) -> Rect

#
Rect::from_wh

fn Rect::from_wh(width : Float, height : Float) -> Rect

#
Rect::from_xywh

fn Rect::from_xywh(x : Float, y : Float, width : Float, height : Float) -> Rect

#
Rect::height

fn Rect::height(self : Rect) -> Float

#
Rect::inset

fn Rect::inset(self : Rect, dx : Float, dy : Float) -> Rect

#
Rect::intersect

fn Rect::intersect(self : Rect, other : Rect) -> Rect?

#
Rect::intersects

fn Rect::intersects(self : Rect, other : Rect) -> Bool

#
Rect::is_empty

fn Rect::is_empty(self : Rect) -> Bool

#
Rect::is_finite

fn Rect::is_finite(self : Rect) -> Bool

#
Rect::is_sorted

fn Rect::is_sorted(self : Rect) -> Bool

#
Rect::join

fn Rect::join(self : Rect, other : Rect) -> Rect

#
Rect::left

fn Rect::left(self : Rect) -> Float

#
Rect::new

fn Rect::new(left : Float, top : Float, right : Float, bottom : Float) -> Rect

#
Rect::offset

fn Rect::offset(self : Rect, dx : Float, dy : Float) -> Rect

#
Rect::outset

fn Rect::outset(self : Rect, dx : Float, dy : Float) -> Rect

#
Rect::right

fn Rect::right(self : Rect) -> Float

#
Rect::round

fn Rect::round(self : Rect) -> IRect

#
Rect::round_in

fn Rect::round_in(self : Rect) -> IRect

#
Rect::round_out

fn Rect::round_out(self : Rect) -> IRect

#
Rect::size

fn Rect::size(self : Rect) -> Size

#
Rect::sorted

fn Rect::sorted(self : Rect) -> Rect

#
Rect::tl

fn Rect::tl(self : Rect) -> Point

#
Rect::to_irect_round

fn Rect::to_irect_round(self : Rect) -> IRect

#
Rect::to_quad

fn Rect::to_quad(self : Rect, direction? : PathDirection) -> Array[Point]

#
Rect::top

fn Rect::top(self : Rect) -> Float

#
Rect::top_left

fn Rect::top_left(self : Rect) -> Point

#
Rect::top_right

fn Rect::top_right(self : Rect) -> Point

#
Rect::tr

fn Rect::tr(self : Rect) -> Point

#
Rect::width

fn Rect::width(self : Rect) -> Float

#
Rect::with_inset

fn Rect::with_inset(self : Rect, inset : Size) -> Rect

#
Rect::with_offset

fn Rect::with_offset(self : Rect, offset : Point) -> Rect

#
Rect::with_offset_to

fn Rect::with_offset_to(self : Rect, point : Point) -> Rect

#
Rect::with_outset

fn Rect::with_outset(self : Rect, outset : Size) -> Rect

#
Rect::x

fn Rect::x(self : Rect) -> Float

#
Rect::y

fn Rect::y(self : Rect) -> Float

#
RenderCommand

pub(all) enum RenderCommand {
SaveCanvas
RestoreCanvas
SaveCanvasLayer(Rect?, Paint, ColorFilterDescriptor?, ImageFilterDescriptor?, MaskFilterDescriptor?)
TranslateCanvas(Point)
ScaleCanvas(Size)
RotateCanvas(Float)
SkewCanvas(Point)
ConcatCanvas(Matrix)
ResetCanvasMatrix
ClearCanvas(Color)
ClipCanvasRect(Rect, ClipOp)
ClipCanvasRRect(RRect, ClipOp)
ClipCanvasPath(Path, ClipOp)
DrawCanvasColor(Color, BlendMode)
DrawCanvasPaint(Paint)
DrawCanvasPaintShader(ShaderDescriptor, Paint)
DrawCanvasPoint(Point, Paint)
DrawCanvasLine(Point, Point, Paint)
DrawCanvasPoints(Array[Point], PointMode, Paint)
DrawCanvasRect(Rect, Paint)
DrawCanvasOval(Rect, Paint)
DrawCanvasCircle(Point, Float, Paint)
DrawCanvasArc(Rect, Float, Float, Bool, Paint)
DrawCanvasRoundRect(Rect, Float, Float, Paint)
DrawCanvasRRect(RRect, Paint)
DrawCanvasDRRect(RRect, RRect, Paint)
DrawCanvasRectShader(Rect, ShaderDescriptor, Paint)
DrawCanvasRoundRectShader(Rect, Float, Float, ShaderDescriptor, Paint)
DrawCanvasPath(Path, Paint)
DrawCanvasPathShader(Path, ShaderDescriptor, Paint)
DrawCanvasImage(ImageDescriptor, Point)
DrawCanvasImageRect(ImageDescriptor, Rect, Rect, Paint, SamplingOptions)
DrawCanvasTextUtf8(Bytes, Point, Paint)
DrawCanvasTextRunUtf8(Bytes, TextRunDescriptor, RendererResourceKey, Point, Paint)
DrawCanvasShapedGlyphRunUtf8(Bytes, ShapedGlyphRunDescriptor, Point, Paint)
DeclareRenderResource(RendererResourceDescriptor)
PresentSurface
} derive(Eq,
Debug
)

Portable render command recorded before a concrete backend turns it into native Canvas calls.

#
RenderCommand::clear

fn RenderCommand::clear(color : Color) -> RenderCommand

#
RenderCommand::clip_path

fn RenderCommand::clip_path(path : Path, op? : ClipOp) -> RenderCommand

#
RenderCommand::clip_rect

fn RenderCommand::clip_rect(rect : Rect, op? : ClipOp) -> RenderCommand

#
RenderCommand::clip_rrect

fn RenderCommand::clip_rrect(rrect : RRect, op? : ClipOp) -> RenderCommand

#
RenderCommand::concat

fn RenderCommand::concat(matrix : Matrix) -> RenderCommand

#
RenderCommand::declare_resource

fn RenderCommand::declare_resource(descriptor : RendererResourceDescriptor) -> RenderCommand

#
RenderCommand::draw_arc

fn RenderCommand::draw_arc(oval : Rect, start_angle : Float, sweep_angle : Float, use_center : Bool, paint? : Paint) -> RenderCommand

#
RenderCommand::draw_circle

fn RenderCommand::draw_circle(center : Point, radius : Float, paint? : Paint) -> RenderCommand

#
RenderCommand::draw_color

fn RenderCommand::draw_color(color : Color, blend_mode? : BlendMode) -> RenderCommand

#
RenderCommand::draw_drrect

fn RenderCommand::draw_drrect(outer : RRect, inner : RRect, paint? : Paint) -> RenderCommand

#
RenderCommand::draw_image

fn RenderCommand::draw_image(image : ImageDescriptor, top_left : Point) -> RenderCommand

#
RenderCommand::draw_image_rect

fn RenderCommand::draw_image_rect(image : ImageDescriptor, src : Rect, dst : Rect, paint? : Paint, sampling? : SamplingOptions) -> RenderCommand

#
RenderCommand::draw_line

fn RenderCommand::draw_line(start : Point, end : Point, paint? : Paint) -> RenderCommand

#
RenderCommand::draw_oval

fn RenderCommand::draw_oval(oval : Rect, paint? : Paint) -> RenderCommand

#
RenderCommand::draw_paint

fn RenderCommand::draw_paint(paint : Paint) -> RenderCommand

#
RenderCommand::draw_paint_shader

fn RenderCommand::draw_paint_shader(shader : ShaderDescriptor, paint? : Paint) -> RenderCommand

#
RenderCommand::draw_path

fn RenderCommand::draw_path(path : Path, paint? : Paint) -> RenderCommand

#
RenderCommand::draw_path_shader

fn RenderCommand::draw_path_shader(path : Path, shader : ShaderDescriptor, paint? : Paint) -> RenderCommand

#
RenderCommand::draw_point

fn RenderCommand::draw_point(point : Point, paint? : Paint) -> RenderCommand

#
RenderCommand::draw_points

fn RenderCommand::draw_points(points : Array[Point], paint? : Paint, mode? : PointMode) -> RenderCommand

#
RenderCommand::draw_rect

fn RenderCommand::draw_rect(rect : Rect, paint? : Paint) -> RenderCommand

#
RenderCommand::draw_rect_shader

fn RenderCommand::draw_rect_shader(rect : Rect, shader : ShaderDescriptor, paint? : Paint) -> RenderCommand

#
RenderCommand::draw_round_rect

fn RenderCommand::draw_round_rect(rect : Rect, rx : Float, ry : Float, paint? : Paint) -> RenderCommand

#
RenderCommand::draw_round_rect_shader

fn RenderCommand::draw_round_rect_shader(rect : Rect, rx : Float, ry : Float, shader : ShaderDescriptor, paint? : Paint) -> RenderCommand

#
RenderCommand::draw_rrect

fn RenderCommand::draw_rrect(rrect : RRect, paint? : Paint) -> RenderCommand

#
RenderCommand::draw_shaped_glyph_run_utf8

fn RenderCommand::draw_shaped_glyph_run_utf8(text : Bytes, glyph_run : ShapedGlyphRunDescriptor, origin : Point, paint? : Paint) -> RenderCommand

#
RenderCommand::draw_text_run_utf8

fn RenderCommand::draw_text_run_utf8(text : Bytes, origin : Point, descriptor? : TextRunDescriptor?, font_key? : RendererResourceKey, paint? : Paint) -> RenderCommand

#
RenderCommand::draw_text_utf8

fn RenderCommand::draw_text_utf8(text : Bytes, origin : Point, paint? : Paint) -> RenderCommand

#
RenderCommand::filter_resource_count

fn RenderCommand::filter_resource_count(self : RenderCommand) -> Int

#
RenderCommand::is_clear

fn RenderCommand::is_clear(self : RenderCommand) -> Bool

#
RenderCommand::is_clip

fn RenderCommand::is_clip(self : RenderCommand) -> Bool

#
RenderCommand::is_draw

fn RenderCommand::is_draw(self : RenderCommand) -> Bool

#
RenderCommand::is_present

fn RenderCommand::is_present(self : RenderCommand) -> Bool

#
RenderCommand::is_resource_declaration

fn RenderCommand::is_resource_declaration(self : RenderCommand) -> Bool

#
RenderCommand::is_state

fn RenderCommand::is_state(self : RenderCommand) -> Bool

#
RenderCommand::is_text

fn RenderCommand::is_text(self : RenderCommand) -> Bool

#
RenderCommand::is_transform

fn RenderCommand::is_transform(self : RenderCommand) -> Bool

#
RenderCommand::reset_matrix

fn RenderCommand::reset_matrix() -> RenderCommand

#
RenderCommand::resource_count_for_kind

fn RenderCommand::resource_count_for_kind(self : RenderCommand, kind : RendererResourceKind) -> Int

#
RenderCommand::resource_descriptor

fn RenderCommand::resource_descriptor(self : RenderCommand) -> RendererResourceDescriptor?

#
RenderCommand::resource_descriptors

fn RenderCommand::resource_descriptors(self : RenderCommand) -> Array[RendererResourceDescriptor]

#
RenderCommand::rotate

fn RenderCommand::rotate(degrees : Float) -> RenderCommand

#
RenderCommand::save_layer

fn RenderCommand::save_layer(bounds? : Rect?, paint? : Paint, color_filter? : ColorFilterDescriptor?, image_filter? : ImageFilterDescriptor?, mask_filter? : MaskFilterDescriptor?) -> RenderCommand

#
RenderCommand::scale

fn RenderCommand::scale(scale : Size) -> RenderCommand

#
RenderCommand::skew

fn RenderCommand::skew(skew : Point) -> RenderCommand

#
RenderCommand::text_resource_count

fn RenderCommand::text_resource_count(self : RenderCommand) -> Int

#
RenderCommand::text_run_resource_key

fn RenderCommand::text_run_resource_key(self : RenderCommand) -> RendererResourceKey?

#
RenderCommand::translate

fn RenderCommand::translate(delta : Point) -> RenderCommand

#
RenderCommandList

pub(all) struct RenderCommandList {
pass : RenderPassDescriptor
commands : Array[RenderCommand]
} derive(Eq,
Debug
)

Command stream for one render pass. This is the value-layer boundary a GUI renderer can build and inspect before handing commands to native Skia.

#
RenderCommandList::append

#
RenderCommandList::clear

#
RenderCommandList::clip_path

fn RenderCommandList::clip_path(self : RenderCommandList, path : Path, op? : ClipOp) -> RenderCommandList

#
RenderCommandList::clip_rect

fn RenderCommandList::clip_rect(self : RenderCommandList, rect : Rect, op? : ClipOp) -> RenderCommandList

#
RenderCommandList::clip_rrect

fn RenderCommandList::clip_rrect(self : RenderCommandList, rrect : RRect, op? : ClipOp) -> RenderCommandList

#
RenderCommandList::concat

#
RenderCommandList::declare_resource

#
RenderCommandList::declare_resources

#
RenderCommandList::draw_arc

fn RenderCommandList::draw_arc(self : RenderCommandList, oval : Rect, start_angle : Float, sweep_angle : Float, use_center : Bool, paint? : Paint) -> RenderCommandList

#
RenderCommandList::draw_circle

fn RenderCommandList::draw_circle(self : RenderCommandList, center : Point, radius : Float, paint? : Paint) -> RenderCommandList

#
RenderCommandList::draw_color

fn RenderCommandList::draw_color(self : RenderCommandList, color : Color, blend_mode? : BlendMode) -> RenderCommandList

#
RenderCommandList::draw_drrect

fn RenderCommandList::draw_drrect(self : RenderCommandList, outer : RRect, inner : RRect, paint? : Paint) -> RenderCommandList

#
RenderCommandList::draw_image

fn RenderCommandList::draw_image(self : RenderCommandList, image : ImageDescriptor, top_left : Point) -> RenderCommandList

#
RenderCommandList::draw_image_rect

fn RenderCommandList::draw_image_rect(self : RenderCommandList, image : ImageDescriptor, src : Rect, dst : Rect, paint? : Paint, sampling? : SamplingOptions) -> RenderCommandList

#
RenderCommandList::draw_line

fn RenderCommandList::draw_line(self : RenderCommandList, start : Point, end : Point, paint? : Paint) -> RenderCommandList

#
RenderCommandList::draw_oval

fn RenderCommandList::draw_oval(self : RenderCommandList, oval : Rect, paint? : Paint) -> RenderCommandList

#
RenderCommandList::draw_paint

fn RenderCommandList::draw_paint(self : RenderCommandList, paint? : Paint) -> RenderCommandList

#
RenderCommandList::draw_paint_shader

fn RenderCommandList::draw_paint_shader(self : RenderCommandList, shader : ShaderDescriptor, paint? : Paint) -> RenderCommandList

#
RenderCommandList::draw_path

fn RenderCommandList::draw_path(self : RenderCommandList, path : Path, paint? : Paint) -> RenderCommandList

#
RenderCommandList::draw_path_shader

fn RenderCommandList::draw_path_shader(self : RenderCommandList, path : Path, shader : ShaderDescriptor, paint? : Paint) -> RenderCommandList

#
RenderCommandList::draw_point

fn RenderCommandList::draw_point(self : RenderCommandList, point : Point, paint? : Paint) -> RenderCommandList

#
RenderCommandList::draw_points

fn RenderCommandList::draw_points(self : RenderCommandList, points : Array[Point], paint? : Paint, mode? : PointMode) -> RenderCommandList

#
RenderCommandList::draw_rect

fn RenderCommandList::draw_rect(self : RenderCommandList, rect : Rect, paint? : Paint) -> RenderCommandList

#
RenderCommandList::draw_rect_shader

fn RenderCommandList::draw_rect_shader(self : RenderCommandList, rect : Rect, shader : ShaderDescriptor, paint? : Paint) -> RenderCommandList

#
RenderCommandList::draw_round_rect

fn RenderCommandList::draw_round_rect(self : RenderCommandList, rect : Rect, rx : Float, ry : Float, paint? : Paint) -> RenderCommandList

#
RenderCommandList::draw_round_rect_shader

fn RenderCommandList::draw_round_rect_shader(self : RenderCommandList, rect : Rect, rx : Float, ry : Float, shader : ShaderDescriptor, paint? : Paint) -> RenderCommandList

#
RenderCommandList::draw_rrect

fn RenderCommandList::draw_rrect(self : RenderCommandList, rrect : RRect, paint? : Paint) -> RenderCommandList

#
RenderCommandList::draw_shaped_glyph_run_utf8

fn RenderCommandList::draw_shaped_glyph_run_utf8(self : RenderCommandList, text : Bytes, glyph_run : ShapedGlyphRunDescriptor, origin : Point, paint? : Paint) -> RenderCommandList

#
RenderCommandList::draw_text_run_utf8

fn RenderCommandList::draw_text_run_utf8(self : RenderCommandList, text : Bytes, origin : Point, descriptor? : TextRunDescriptor?, font_key? : RendererResourceKey, paint? : Paint) -> RenderCommandList

#
RenderCommandList::draw_text_utf8

fn RenderCommandList::draw_text_utf8(self : RenderCommandList, text : Bytes, origin : Point, paint? : Paint) -> RenderCommandList

#
RenderCommandList::finish

#
RenderCommandList::for_target

fn RenderCommandList::for_target(target : SurfaceTargetDescriptor, bounds? : IRect?, load_op? : RenderPassLoadOp, clear_color? : Color?, store_op? : RenderPassStoreOp?) -> RenderCommandList

#
RenderCommandList::frame_descriptor

#
RenderCommandList::has_present

fn RenderCommandList::has_present(self : RenderCommandList) -> Bool

#
RenderCommandList::is_empty

fn RenderCommandList::is_empty(self : RenderCommandList) -> Bool

#
RenderCommandList::is_state_balanced

fn RenderCommandList::is_state_balanced(self : RenderCommandList) -> Bool

#
RenderCommandList::length

fn RenderCommandList::length(self : RenderCommandList) -> Int

#
RenderCommandList::new

#
RenderCommandList::present

#
RenderCommandList::reset_matrix

#
RenderCommandList::resource_descriptors

#
RenderCommandList::resource_plan

#
RenderCommandList::restore

#
RenderCommandList::rotate

fn RenderCommandList::rotate(self : RenderCommandList, degrees : Float) -> RenderCommandList

#
RenderCommandList::save

#
RenderCommandList::save_layer

fn RenderCommandList::save_layer(self : RenderCommandList, bounds? : Rect?, paint? : Paint, color_filter? : ColorFilterDescriptor?, image_filter? : ImageFilterDescriptor?, mask_filter? : MaskFilterDescriptor?) -> RenderCommandList

#
RenderCommandList::scale

#
RenderCommandList::skew

#
RenderCommandList::stats

#
RenderCommandList::text_run_resource_keys

fn RenderCommandList::text_run_resource_keys(self : RenderCommandList) -> Array[RendererResourceKey]

#
RenderCommandList::touched_bounds

fn RenderCommandList::touched_bounds(self : RenderCommandList) -> Rect?

#
RenderCommandList::translate

#
RenderCommandStats

pub(all) struct RenderCommandStats {
command_count : Int
draw_count : Int
state_count : Int
transform_count : Int
clip_count : Int
clear_count : Int
present_count : Int
text_count : Int
resource_declaration_count : Int
image_resource_count : Int
shader_resource_count : Int
filter_resource_count : Int
path_resource_count : Int
text_resource_count : Int
max_save_depth : Int
final_save_depth : Int
unbalanced_restore_count : Int
} derive(Eq,
Debug
)

#
RenderCommandStats::empty

#
RenderCommandStats::is_state_balanced

fn RenderCommandStats::is_state_balanced(self : RenderCommandStats) -> Bool

#
RenderFrameDescriptor

pub(all) struct RenderFrameDescriptor {
target : SurfaceTargetDescriptor
command_list : RenderCommandList
resource_plan : RendererResourcePlan
stats : RenderCommandStats
touched_bounds : Rect?
} derive(Eq,
Debug
)

Frame-level value boundary for a target plus its finalized render commands.

#
RenderFrameDescriptor::cache_resources

#
RenderFrameDescriptor::cacheable_resource_plan

#
RenderFrameDescriptor::cached_cacheable_resource_plan

#
RenderFrameDescriptor::empty

#
RenderFrameDescriptor::finalization_descriptor

fn RenderFrameDescriptor::finalization_descriptor(self : RenderFrameDescriptor, frame_index? : Int) -> RenderFrameFinalizationDescriptor

#
RenderFrameDescriptor::finalization_resource_plan

fn RenderFrameDescriptor::finalization_resource_plan(self : RenderFrameDescriptor, frame_index? : Int) -> RendererResourcePlan

#
RenderFrameDescriptor::has_gpu_context

fn RenderFrameDescriptor::has_gpu_context(self : RenderFrameDescriptor) -> Bool

#
RenderFrameDescriptor::has_present

fn RenderFrameDescriptor::has_present(self : RenderFrameDescriptor) -> Bool

#
RenderFrameDescriptor::is_ready

fn RenderFrameDescriptor::is_ready(self : RenderFrameDescriptor) -> Bool

#
RenderFrameDescriptor::is_target_consistent

fn RenderFrameDescriptor::is_target_consistent(self : RenderFrameDescriptor) -> Bool

#
RenderFrameDescriptor::missing_cacheable_resource_plan

#
RenderFrameDescriptor::needs_present

fn RenderFrameDescriptor::needs_present(self : RenderFrameDescriptor) -> Bool

#
RenderFrameDescriptor::new

#
RenderFrameDescriptor::present_descriptor

fn RenderFrameDescriptor::present_descriptor(self : RenderFrameDescriptor, frame_index? : Int, buffer_index? : Int) -> SurfacePresentDescriptor?

#
RenderFrameDescriptor::present_resource_plan

fn RenderFrameDescriptor::present_resource_plan(self : RenderFrameDescriptor, frame_index? : Int, buffer_index? : Int) -> RendererResourcePlan

#
RenderFrameDescriptor::requires_gpu_context

fn RenderFrameDescriptor::requires_gpu_context(self : RenderFrameDescriptor) -> Bool

#
RenderFrameDescriptor::submission_descriptor

fn RenderFrameDescriptor::submission_descriptor(self : RenderFrameDescriptor, frame_index? : Int, buffer_index? : Int) -> RenderFrameSubmissionDescriptor

#
RenderFrameDescriptor::uncacheable_resource_plan

fn RenderFrameDescriptor::uncacheable_resource_plan(self : RenderFrameDescriptor) -> RendererResourcePlan

#
RenderFrameDescriptor::validation_status

#
RenderFrameFinalizationDescriptor

pub(all) struct RenderFrameFinalizationDescriptor {
frame : RenderFrameDescriptor
frame_index : Int
validation_status : RenderFrameValidationStatus
finalization : SurfaceFinalizationDescriptor?
resource_plan : RendererResourcePlan
} derive(Eq,
Debug
)

Auditable backend finalization boundary for a finalized frame before flush/submit is performed on its target surface.

#
RenderFrameFinalizationDescriptor::cache_resources

#
RenderFrameFinalizationDescriptor::cacheable_resource_plan

#
RenderFrameFinalizationDescriptor::cached_cacheable_resource_plan

#
RenderFrameFinalizationDescriptor::gpu_backed_resource_plan

#
RenderFrameFinalizationDescriptor::has_finalization

#
RenderFrameFinalizationDescriptor::is_ready

#
RenderFrameFinalizationDescriptor::missing_cacheable_resource_plan

#
RenderFrameFinalizationDescriptor::new

#
RenderFrameFinalizationDescriptor::requires_gpu_context

#
RenderFrameFinalizationDescriptor::uncacheable_resource_plan

#
RenderFrameSubmissionDescriptor

pub(all) struct RenderFrameSubmissionDescriptor {
frame : RenderFrameDescriptor
frame_index : Int
validation_status : RenderFrameValidationStatus
present : SurfacePresentDescriptor?
resource_plan : RendererResourcePlan
} derive(Eq,
Debug
)

Auditable backend submission boundary for a finalized frame plus any per-frame present resources.

#
RenderFrameSubmissionDescriptor::cache_resources

#
RenderFrameSubmissionDescriptor::cacheable_resource_plan

#
RenderFrameSubmissionDescriptor::cached_cacheable_resource_plan

#
RenderFrameSubmissionDescriptor::gpu_backed_resource_plan

#
RenderFrameSubmissionDescriptor::has_present

#
RenderFrameSubmissionDescriptor::is_ready

#
RenderFrameSubmissionDescriptor::missing_cacheable_resource_plan

#
RenderFrameSubmissionDescriptor::new

fn RenderFrameSubmissionDescriptor::new(frame : RenderFrameDescriptor, frame_index? : Int, buffer_index? : Int) -> RenderFrameSubmissionDescriptor

#
RenderFrameSubmissionDescriptor::uncacheable_resource_plan

#
RenderFrameValidationStatus

pub(all) enum RenderFrameValidationStatus {
FrameReady
FrameTargetMismatch
FrameUnbalancedState
FrameMissingGpuContext
FrameMissingPresent
} derive(Eq,
Debug
)

Validation outcome for a finalized render frame.

#
RenderFrameValidationStatus::is_ready

#
RenderPassDescriptor

pub(all) struct RenderPassDescriptor {
surface : SurfaceDescriptor
target_key : RendererResourceKey?
bounds : IRect
load_op : RenderPassLoadOp
clear_color : Color?
store_op : RenderPassStoreOp
} derive(Eq,
Debug
)

Value-layer boundary for a single render pass.

#
RenderPassDescriptor::clear

fn RenderPassDescriptor::clear(surface : SurfaceDescriptor, color : Color, bounds? : IRect?, store_op? : RenderPassStoreOp) -> RenderPassDescriptor

#
RenderPassDescriptor::clear_target

fn RenderPassDescriptor::clear_target(target : SurfaceTargetDescriptor, color : Color, bounds? : IRect?, store_op? : RenderPassStoreOp?) -> RenderPassDescriptor

#
RenderPassDescriptor::for_target

fn RenderPassDescriptor::for_target(target : SurfaceTargetDescriptor, bounds? : IRect?, load_op? : RenderPassLoadOp, clear_color? : Color?, store_op? : RenderPassStoreOp?) -> RenderPassDescriptor

#
RenderPassDescriptor::has_target_binding

fn RenderPassDescriptor::has_target_binding(self : RenderPassDescriptor) -> Bool

#
RenderPassDescriptor::is_bound_to_target

fn RenderPassDescriptor::is_bound_to_target(self : RenderPassDescriptor, target : SurfaceTargetDescriptor) -> Bool

#
RenderPassDescriptor::is_empty

fn RenderPassDescriptor::is_empty(self : RenderPassDescriptor) -> Bool

#
RenderPassDescriptor::is_msaa

fn RenderPassDescriptor::is_msaa(self : RenderPassDescriptor) -> Bool

#
RenderPassDescriptor::keeps_pixels

fn RenderPassDescriptor::keeps_pixels(self : RenderPassDescriptor) -> Bool

#
RenderPassDescriptor::needs_clear

fn RenderPassDescriptor::needs_clear(self : RenderPassDescriptor) -> Bool

#
RenderPassDescriptor::needs_present

fn RenderPassDescriptor::needs_present(self : RenderPassDescriptor) -> Bool

#
RenderPassDescriptor::new

fn RenderPassDescriptor::new(surface : SurfaceDescriptor, target_key? : RendererResourceKey?, bounds? : IRect?, load_op? : RenderPassLoadOp, clear_color? : Color?, store_op? : RenderPassStoreOp) -> RenderPassDescriptor

#
RenderPassDescriptor::present

fn RenderPassDescriptor::present(surface : SurfaceDescriptor, bounds? : IRect?, clear_color? : Color?) -> RenderPassDescriptor

#
RenderPassDescriptor::resource_descriptor

#
RenderPassDescriptor::with_bounds

#
RenderPassDescriptor::with_clear_color

fn RenderPassDescriptor::with_clear_color(self : RenderPassDescriptor, color : Color) -> RenderPassDescriptor

#
RenderPassDescriptor::with_load_op

#
RenderPassDescriptor::with_store_op

#
RenderPassDescriptor::without_clear

#
RenderPassLoadOp

pub(all) enum RenderPassLoadOp {
LoadExisting
ClearBeforeDraw
DontCareLoad
} derive(Eq,
Debug
)

How a render pass should initialize its target pixels.

#
RenderPassLoadOp::needs_clear

fn RenderPassLoadOp::needs_clear(self : RenderPassLoadOp) -> Bool

#
RenderPassLoadOp::preserves_existing_pixels

fn RenderPassLoadOp::preserves_existing_pixels(self : RenderPassLoadOp) -> Bool

#
RenderPassStoreOp

pub(all) enum RenderPassStoreOp {
StorePixels
DiscardPixels
PresentPixels
} derive(Eq,
Debug
)

How a render pass should finish target pixels after drawing.

#
RenderPassStoreOp::keeps_pixels

fn RenderPassStoreOp::keeps_pixels(self : RenderPassStoreOp) -> Bool

#
RenderPassStoreOp::needs_present

fn RenderPassStoreOp::needs_present(self : RenderPassStoreOp) -> Bool

#
RendererResourceDescriptor

pub(all) struct RendererResourceDescriptor {
key : RendererResourceKey
byte_size : Int64
cacheable : Bool
} derive(Eq,
Debug
)

Cache metadata for one backend resource. Empty keys are automatically marked non-cacheable so anonymous one-shot resources do not collide in an LRU map.

#
RendererResourceDescriptor::color_filter

fn RendererResourceDescriptor::color_filter(id : Bytes, byte_size? : Int64) -> RendererResourceDescriptor

#
RendererResourceDescriptor::filter

fn RendererResourceDescriptor::filter(id : Bytes, byte_size? : Int64) -> RendererResourceDescriptor

#
RendererResourceDescriptor::font

fn RendererResourceDescriptor::font(id : Bytes, byte_size? : Int64) -> RendererResourceDescriptor

#
RendererResourceDescriptor::gpu_context

fn RendererResourceDescriptor::gpu_context(id : Bytes, byte_size? : Int64) -> RendererResourceDescriptor

#
RendererResourceDescriptor::gpu_surface

fn RendererResourceDescriptor::gpu_surface(id : Bytes, byte_size? : Int64) -> RendererResourceDescriptor

#
RendererResourceDescriptor::image

fn RendererResourceDescriptor::image(id : Bytes, byte_size? : Int64) -> RendererResourceDescriptor

#
RendererResourceDescriptor::image_filter

fn RendererResourceDescriptor::image_filter(id : Bytes, byte_size? : Int64) -> RendererResourceDescriptor

#
RendererResourceDescriptor::is_cacheable

#
RendererResourceDescriptor::is_gpu_backed

fn RendererResourceDescriptor::is_gpu_backed(self : RendererResourceDescriptor) -> Bool

#
RendererResourceDescriptor::mask_filter

fn RendererResourceDescriptor::mask_filter(id : Bytes, byte_size? : Int64) -> RendererResourceDescriptor

#
RendererResourceDescriptor::new

fn RendererResourceDescriptor::new(key : RendererResourceKey, byte_size? : Int64, cacheable? : Bool) -> RendererResourceDescriptor

#
RendererResourceDescriptor::of_kind

fn RendererResourceDescriptor::of_kind(kind : RendererResourceKind, id : Bytes, byte_size? : Int64, cacheable? : Bool) -> RendererResourceDescriptor

#
RendererResourceDescriptor::path

fn RendererResourceDescriptor::path(id : Bytes, byte_size? : Int64) -> RendererResourceDescriptor

#
RendererResourceDescriptor::shader

fn RendererResourceDescriptor::shader(id : Bytes, byte_size? : Int64) -> RendererResourceDescriptor

#
RendererResourceDescriptor::surface

fn RendererResourceDescriptor::surface(id : Bytes, byte_size? : Int64) -> RendererResourceDescriptor

#
RendererResourceDescriptor::text_run

fn RendererResourceDescriptor::text_run(id : Bytes, byte_size? : Int64) -> RendererResourceDescriptor

#
RendererResourceDescriptor::typeface

fn RendererResourceDescriptor::typeface(id : Bytes, byte_size? : Int64) -> RendererResourceDescriptor

#
RendererResourceDescriptor::uncacheable

#
RendererResourceDescriptor::with_byte_size

#
RendererResourceKey

pub(all) struct RendererResourceKey {
kind : RendererResourceKind
id : Bytes
} derive(Eq, Hash,
Debug
)

Stable key for renderer-owned resources. The id is intentionally bytes so callers can use hashes, URLs, font family bytes, or serialized descriptors.

#
RendererResourceKey::color_filter

fn RendererResourceKey::color_filter(id : Bytes) -> RendererResourceKey

#
RendererResourceKey::font

#
RendererResourceKey::gpu_context

fn RendererResourceKey::gpu_context(id : Bytes) -> RendererResourceKey

#
RendererResourceKey::gpu_surface

fn RendererResourceKey::gpu_surface(id : Bytes) -> RendererResourceKey

#
RendererResourceKey::image

fn RendererResourceKey::image(id : Bytes) -> RendererResourceKey

#
RendererResourceKey::image_filter

fn RendererResourceKey::image_filter(id : Bytes) -> RendererResourceKey

#
RendererResourceKey::is_empty

fn RendererResourceKey::is_empty(self : RendererResourceKey) -> Bool

#
RendererResourceKey::is_gpu_backed

fn RendererResourceKey::is_gpu_backed(self : RendererResourceKey) -> Bool

#
RendererResourceKey::mask_filter

fn RendererResourceKey::mask_filter(id : Bytes) -> RendererResourceKey

#
RendererResourceKey::new

#
RendererResourceKey::path

#
RendererResourceKey::shader

fn RendererResourceKey::shader(id : Bytes) -> RendererResourceKey

#
RendererResourceKey::surface

fn RendererResourceKey::surface(id : Bytes) -> RendererResourceKey

#
RendererResourceKey::text_run

fn RendererResourceKey::text_run(id : Bytes) -> RendererResourceKey

#
RendererResourceKey::typeface

fn RendererResourceKey::typeface(id : Bytes) -> RendererResourceKey

#
RendererResourceKind

pub(all) enum RendererResourceKind {
ImageResource
ShaderResource
ColorFilterResource
ImageFilterResource
MaskFilterResource
TypefaceResource
FontResource
PathResource
TextRunResource
SurfaceResource
GpuContextResource
GpuSurfaceResource
} derive(Eq, Hash,
Debug
)

Renderer-owned resource families that commonly need backend caches.

#
RendererResourceKind::is_filter

fn RendererResourceKind::is_filter(self : RendererResourceKind) -> Bool

#
RendererResourceKind::is_gpu_backed

fn RendererResourceKind::is_gpu_backed(self : RendererResourceKind) -> Bool

#
RendererResourceKind::is_surface

fn RendererResourceKind::is_surface(self : RendererResourceKind) -> Bool

#
RendererResourceKind::is_text

fn RendererResourceKind::is_text(self : RendererResourceKind) -> Bool

#
RendererResourcePlan

pub(all) struct RendererResourcePlan {
descriptors : Array[RendererResourceDescriptor]
byte_size : Int64
cacheable_count : Int
uncacheable_count : Int
gpu_backed_count : Int
} derive(Eq,
Debug
)

Auditable resource requirements for a backend render step.

#
RendererResourcePlan::byte_size_for_kind

fn RendererResourcePlan::byte_size_for_kind(self : RendererResourcePlan, kind : RendererResourceKind) -> Int64

#
RendererResourcePlan::cacheable_descriptors

#
RendererResourcePlan::cacheable_resource_plan

fn RendererResourcePlan::cacheable_resource_plan(self : RendererResourcePlan) -> RendererResourcePlan

#
RendererResourcePlan::contains_key

fn RendererResourcePlan::contains_key(self : RendererResourcePlan, key : RendererResourceKey) -> Bool

#
RendererResourcePlan::count_kind

fn RendererResourcePlan::count_kind(self : RendererResourcePlan, kind : RendererResourceKind) -> Int

#
RendererResourcePlan::descriptor_for_key

#
RendererResourcePlan::descriptors_of_kind

#
RendererResourcePlan::empty

#
RendererResourcePlan::gpu_backed_descriptors

#
RendererResourcePlan::gpu_backed_resource_plan

fn RendererResourcePlan::gpu_backed_resource_plan(self : RendererResourcePlan) -> RendererResourcePlan

#
RendererResourcePlan::has_cacheable_resources

fn RendererResourcePlan::has_cacheable_resources(self : RendererResourcePlan) -> Bool

#
RendererResourcePlan::has_gpu_backed_resources

fn RendererResourcePlan::has_gpu_backed_resources(self : RendererResourcePlan) -> Bool

#
RendererResourcePlan::has_uncacheable_resources

fn RendererResourcePlan::has_uncacheable_resources(self : RendererResourcePlan) -> Bool

#
RendererResourcePlan::is_empty

fn RendererResourcePlan::is_empty(self : RendererResourcePlan) -> Bool

#
RendererResourcePlan::length

fn RendererResourcePlan::length(self : RendererResourcePlan) -> Int

#
RendererResourcePlan::new

#
RendererResourcePlan::uncacheable_descriptors

#
RendererResourcePlan::uncacheable_resource_plan

fn RendererResourcePlan::uncacheable_resource_plan(self : RendererResourcePlan) -> RendererResourcePlan

#
ResourceCache

pub(all) struct ResourceCache[K, V] {
// private fields
}

Small deterministic LRU cache for renderer-owned resources.

#
ResourceCache::byte_size

fn[K, V] ResourceCache::byte_size(self : ResourceCache[K, V]) -> Int64

#
ResourceCache::cached_cacheable_resource_plan

#
ResourceCache::clear

fn[K, V] ResourceCache::clear(self : ResourceCache[K, V]) -> Unit

#
ResourceCache::contains

fn[K : Hash + Eq, V] ResourceCache::contains(self : ResourceCache[K, V], key : K) -> Bool

#
ResourceCache::contains_resource_descriptor

fn ResourceCache::contains_resource_descriptor(self : ResourceCache[RendererResourceKey, RendererResourceDescriptor], descriptor : RendererResourceDescriptor) -> Bool

#
ResourceCache::contains_resource_plan

#
ResourceCache::get

fn[K : Hash + Eq, V] ResourceCache::get(self : ResourceCache[K, V], key : K) -> V?

#
ResourceCache::insert

fn[K : Hash + Eq, V] ResourceCache::insert(self : ResourceCache[K, V], key : K, value : V, byte_size? : Int64) -> Bool

#
ResourceCache::insert_resource_descriptor

fn ResourceCache::insert_resource_descriptor(self : ResourceCache[RendererResourceKey, RendererResourceDescriptor], descriptor : RendererResourceDescriptor) -> Bool

#
ResourceCache::insert_resource_plan

#
ResourceCache::is_empty

fn[K, V] ResourceCache::is_empty(self : ResourceCache[K, V]) -> Bool

#
ResourceCache::length

fn[K, V] ResourceCache::length(self : ResourceCache[K, V]) -> Int

#
ResourceCache::max_bytes

fn[K, V] ResourceCache::max_bytes(self : ResourceCache[K, V]) -> Int64

#
ResourceCache::missing_cacheable_resource_plan

#
ResourceCache::new

fn[K, V] ResourceCache::new(max_bytes? : Int64) -> ResourceCache[K, V]

#
ResourceCache::peek

fn[K : Hash + Eq, V] ResourceCache::peek(self : ResourceCache[K, V], key : K) -> V?

#
ResourceCache::remove

fn[K : Hash + Eq, V] ResourceCache::remove(self : ResourceCache[K, V], key : K) -> Bool

#
ResourceCache::set_max_bytes

fn[K : Hash + Eq, V] ResourceCache::set_max_bytes(self : ResourceCache[K, V], max_bytes : Int64) -> Unit

#
ResourceCache::stats

fn[K, V] ResourceCache::stats(self : ResourceCache[K, V]) -> ResourceCacheStats

#
ResourceCacheStats

pub(all) struct ResourceCacheStats {
count : Int
byte_size : Int64
max_bytes : Int64
hits : Int
misses : Int
evictions : Int
} derive(Eq,
Debug
)

Observable counters for a resource cache.

#
SamplingOptions

pub(all) struct SamplingOptions {
filter : FilterMode
mipmap : MipmapMode
cubic : CubicResampler?
} derive(Eq,
Debug
)

Image sampling options modeled after Skia's SkSamplingOptions.

#
SamplingOptions::catmull_rom

fn SamplingOptions::catmull_rom() -> SamplingOptions

#
SamplingOptions::cubic_b

fn SamplingOptions::cubic_b(self : SamplingOptions) -> Float

#
SamplingOptions::cubic_c

fn SamplingOptions::cubic_c(self : SamplingOptions) -> Float

#
SamplingOptions::filter_ordinal

fn SamplingOptions::filter_ordinal(self : SamplingOptions) -> Int

#
SamplingOptions::from_cubic

#
SamplingOptions::linear

#
SamplingOptions::mipmap_ordinal

fn SamplingOptions::mipmap_ordinal(self : SamplingOptions) -> Int

#
SamplingOptions::mitchell

#
SamplingOptions::new

fn SamplingOptions::new(filter? : FilterMode, mipmap? : MipmapMode) -> SamplingOptions

#
SamplingOptions::uses_cubic

fn SamplingOptions::uses_cubic(self : SamplingOptions) -> Bool

#
ShaderDescriptor

pub(all) enum ShaderDescriptor {
ColorShader(Color)
LinearGradientShader(Point, Point, Color, Color, TileMode)
RadialGradientShader(Point, Float, Color, Color, TileMode)
} derive(Eq,
Debug
)

Portable shader recipes that can be planned before native Skia handles are created.

#
ShaderDescriptor::color

#
ShaderDescriptor::is_valid

fn ShaderDescriptor::is_valid(self : ShaderDescriptor) -> Bool

#
ShaderDescriptor::linear_gradient

fn ShaderDescriptor::linear_gradient(start : Point, end : Point, start_color : Color, end_color : Color, tile_mode? : TileMode) -> ShaderDescriptor?

#
ShaderDescriptor::radial_gradient

fn ShaderDescriptor::radial_gradient(center : Point, radius : Float, inner_color : Color, outer_color : Color, tile_mode? : TileMode) -> ShaderDescriptor?

#
ShaderDescriptor::resource_descriptor

fn ShaderDescriptor::resource_descriptor(self : ShaderDescriptor, byte_size? : Int64) -> RendererResourceDescriptor

#
ShaderDescriptor::resource_key

#
ShapedGlyphRunDescriptor

pub(all) struct ShapedGlyphRunDescriptor {
shaped_run : ShapedTextRunDescriptor
glyph_ids : Array[Int]
positions : Array[Point]
clusters : Array[Int]
} derive(Eq,
Debug
)

Detailed glyph IDs, positions, and clusters for a shaped text run.

#
ShapedGlyphRunDescriptor::cluster_count

fn ShapedGlyphRunDescriptor::cluster_count(self : ShapedGlyphRunDescriptor) -> Int

#
ShapedGlyphRunDescriptor::glyph_count

fn ShapedGlyphRunDescriptor::glyph_count(self : ShapedGlyphRunDescriptor) -> Int

#
ShapedGlyphRunDescriptor::is_empty

#
ShapedGlyphRunDescriptor::is_valid

#
ShapedGlyphRunDescriptor::new

fn ShapedGlyphRunDescriptor::new(shaped_run? : ShapedTextRunDescriptor, glyph_ids? : Array[Int], positions? : Array[Point], clusters? : Array[Int]) -> ShapedGlyphRunDescriptor

#
ShapedGlyphRunDescriptor::resource_descriptor

fn ShapedGlyphRunDescriptor::resource_descriptor(self : ShapedGlyphRunDescriptor, text : Bytes, byte_size? : Int64) -> RendererResourceDescriptor

#
ShapedGlyphRunDescriptor::resource_key

#
ShapedGlyphRunDescriptor::resource_plan

fn ShapedGlyphRunDescriptor::resource_plan(self : ShapedGlyphRunDescriptor, text : Bytes, glyph_run_byte_size? : Int64, shaped_byte_size? : Int64, shaping_byte_size? : Int64, text_byte_size? : Int64, font_byte_size? : Int64, fallback_byte_size? : Int64) -> RendererResourcePlan

#
ShapedTextRunDescriptor

pub(all) struct ShapedTextRunDescriptor {
shaping : TextShapingDescriptor
glyph_count : Int
cluster_count : Int
advance : Point
} derive(Eq,
Debug
)

Value-layer metadata for a native shaped text run result.

#
ShapedTextRunDescriptor::glyph_run_descriptor

fn ShapedTextRunDescriptor::glyph_run_descriptor(self : ShapedTextRunDescriptor, glyph_ids? : Array[Int], positions? : Array[Point], clusters? : Array[Int]) -> ShapedGlyphRunDescriptor

#
ShapedTextRunDescriptor::is_valid

#
ShapedTextRunDescriptor::new

fn ShapedTextRunDescriptor::new(shaping? : TextShapingDescriptor, glyph_count? : Int, cluster_count? : Int, advance? : Point) -> ShapedTextRunDescriptor

#
ShapedTextRunDescriptor::resource_descriptor

fn ShapedTextRunDescriptor::resource_descriptor(self : ShapedTextRunDescriptor, text : Bytes, byte_size? : Int64) -> RendererResourceDescriptor

#
ShapedTextRunDescriptor::resource_key

fn ShapedTextRunDescriptor::resource_key(self : ShapedTextRunDescriptor, text : Bytes) -> RendererResourceKey

#
ShapedTextRunDescriptor::resource_plan

fn ShapedTextRunDescriptor::resource_plan(self : ShapedTextRunDescriptor, text : Bytes, shaped_byte_size? : Int64, shaping_byte_size? : Int64, text_byte_size? : Int64, font_byte_size? : Int64, fallback_byte_size? : Int64) -> RendererResourcePlan

#
Size

pub(all) struct Size {
width : Float
height : Float
} derive(Eq,
Debug
)

Floating-point width and height.
impl Default for Size

#
Size::empty

fn Size::empty() -> Size

#
Size::from_isize

fn Size::from_isize(size : ISize) -> Size

#
Size::is_empty

fn Size::is_empty(self : Size) -> Bool

#
Size::is_finite

fn Size::is_finite(self : Size) -> Bool

#
Size::is_zero

fn Size::is_zero(self : Size) -> Bool

#
Size::new

fn Size::new(width : Float, height : Float) -> Size

#
Size::scale

fn Size::scale(self : Size, scale : Float) -> Size

#
Size::to_isize_round

fn Size::to_isize_round(self : Size) -> ISize

#
StrokeCap

pub(all) enum StrokeCap {
Butt
Round
Square
} derive(Eq,
Debug
)

Shape used at the end of an open stroked contour.

#
StrokeCap::to_skia_ordinal

fn StrokeCap::to_skia_ordinal(self : StrokeCap) -> Int

#
StrokeJoin

pub(all) enum StrokeJoin {
Miter
Round
Bevel
} derive(Eq,
Debug
)

Shape used when two stroked segments meet.

#
StrokeJoin::to_skia_ordinal

fn StrokeJoin::to_skia_ordinal(self : StrokeJoin) -> Int

#
SurfaceBackend

pub(all) enum SurfaceBackend {
Raster
Window
Gpu
} derive(Eq,
Debug
)

Rendering target family for a surface descriptor.

#
SurfaceBackend::is_gpu

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

#
SurfaceBackend::is_presentable

fn SurfaceBackend::is_presentable(self : SurfaceBackend) -> Bool

#
SurfaceBackend::is_raster

fn SurfaceBackend::is_raster(self : SurfaceBackend) -> Bool

#
SurfaceBackend::is_window

fn SurfaceBackend::is_window(self : SurfaceBackend) -> Bool

#
SurfaceBudget

pub(all) enum SurfaceBudget {
Budgeted
Unbudgeted
} derive(Eq,
Debug
)

Whether a surface should count against an implementation resource budget.

#
SurfaceBudget::is_budgeted

fn SurfaceBudget::is_budgeted(self : SurfaceBudget) -> Bool

#
SurfaceDescriptor

pub(all) struct SurfaceDescriptor {
backend : SurfaceBackend
image_info : ImageInfo
origin : SurfaceOrigin
sample_count : Int
stencil_bits : Int
budget : SurfaceBudget
} derive(Eq,
Debug
)

Stable value-layer contract for raster, window, and future GPU surfaces.

#
SurfaceDescriptor::bounds

#
SurfaceDescriptor::dimensions

fn SurfaceDescriptor::dimensions(self : SurfaceDescriptor) -> ISize

#
SurfaceDescriptor::gpu_n32_premul

fn SurfaceDescriptor::gpu_n32_premul(size : ISize, origin? : SurfaceOrigin, sample_count? : Int, stencil_bits? : Int, budget? : SurfaceBudget) -> SurfaceDescriptor

#
SurfaceDescriptor::height

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

#
SurfaceDescriptor::is_budgeted

fn SurfaceDescriptor::is_budgeted(self : SurfaceDescriptor) -> Bool

#
SurfaceDescriptor::is_empty

fn SurfaceDescriptor::is_empty(self : SurfaceDescriptor) -> Bool

#
SurfaceDescriptor::is_gpu

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

#
SurfaceDescriptor::is_msaa

fn SurfaceDescriptor::is_msaa(self : SurfaceDescriptor) -> Bool

#
SurfaceDescriptor::is_presentable

fn SurfaceDescriptor::is_presentable(self : SurfaceDescriptor) -> Bool

#
SurfaceDescriptor::is_raster

fn SurfaceDescriptor::is_raster(self : SurfaceDescriptor) -> Bool

#
SurfaceDescriptor::is_window

fn SurfaceDescriptor::is_window(self : SurfaceDescriptor) -> Bool

#
SurfaceDescriptor::new

fn SurfaceDescriptor::new(backend : SurfaceBackend, image_info : ImageInfo, origin? : SurfaceOrigin, sample_count? : Int, stencil_bits? : Int, budget? : SurfaceBudget) -> SurfaceDescriptor

#
SurfaceDescriptor::raster_n32_premul

fn SurfaceDescriptor::raster_n32_premul(size : ISize) -> SurfaceDescriptor

#
SurfaceDescriptor::resource_descriptor

fn SurfaceDescriptor::resource_descriptor(self : SurfaceDescriptor, byte_size? : Int64) -> RendererResourceDescriptor

#
SurfaceDescriptor::resource_key

#
SurfaceDescriptor::width

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

#
SurfaceDescriptor::window_n32_premul

fn SurfaceDescriptor::window_n32_premul(size : ISize, origin? : SurfaceOrigin, sample_count? : Int, stencil_bits? : Int) -> SurfaceDescriptor

#
SurfaceDescriptor::with_backend

#
SurfaceDescriptor::with_budget

#
SurfaceDescriptor::with_dimensions

fn SurfaceDescriptor::with_dimensions(self : SurfaceDescriptor, dimensions : ISize) -> SurfaceDescriptor

#
SurfaceDescriptor::with_image_info

fn SurfaceDescriptor::with_image_info(self : SurfaceDescriptor, image_info : ImageInfo) -> SurfaceDescriptor

#
SurfaceDescriptor::with_origin

#
SurfaceDescriptor::with_sample_count

fn SurfaceDescriptor::with_sample_count(self : SurfaceDescriptor, sample_count : Int) -> SurfaceDescriptor

#
SurfaceDescriptor::with_stencil_bits

fn SurfaceDescriptor::with_stencil_bits(self : SurfaceDescriptor, stencil_bits : Int) -> SurfaceDescriptor

#
SurfaceFinalizationDescriptor

pub(all) struct SurfaceFinalizationDescriptor {
target : SurfaceTargetDescriptor
frame_index : Int
} derive(Eq,
Debug
)

Per-frame surface finalization metadata before a backend flushes/submits work.

#
SurfaceFinalizationDescriptor::is_finalizable

#
SurfaceFinalizationDescriptor::new

#
SurfaceFinalizationDescriptor::requires_gpu_context

fn SurfaceFinalizationDescriptor::requires_gpu_context(self : SurfaceFinalizationDescriptor) -> Bool

#
SurfaceFinalizationDescriptor::resource_descriptor

fn SurfaceFinalizationDescriptor::resource_descriptor(self : SurfaceFinalizationDescriptor, byte_size? : Int64) -> RendererResourceDescriptor

#
SurfaceFinalizationDescriptor::resource_descriptors

fn SurfaceFinalizationDescriptor::resource_descriptors(self : SurfaceFinalizationDescriptor, byte_size? : Int64) -> Array[RendererResourceDescriptor]

#
SurfaceFinalizationDescriptor::resource_key

#
SurfaceFinalizationDescriptor::resource_plan

#
SurfaceOrigin

pub(all) enum SurfaceOrigin {
TopLeft
BottomLeft
} derive(Eq,
Debug
)

Pixel origin used by a render target.

#
SurfacePresentDescriptor

pub(all) struct SurfacePresentDescriptor {
target : SurfaceTargetDescriptor
frame_index : Int
buffer_index : Int
present_mode : SurfacePresentMode?
} derive(Eq,
Debug
)

Per-frame presentation scheduling metadata for a presentable target.

#
SurfacePresentDescriptor::allows_tearing

fn SurfacePresentDescriptor::allows_tearing(self : SurfacePresentDescriptor) -> Bool

#
SurfacePresentDescriptor::is_presentable

fn SurfacePresentDescriptor::is_presentable(self : SurfacePresentDescriptor) -> Bool

#
SurfacePresentDescriptor::new

fn SurfacePresentDescriptor::new(target : SurfaceTargetDescriptor, frame_index? : Int, buffer_index? : Int) -> SurfacePresentDescriptor

#
SurfacePresentDescriptor::prefers_vsync

fn SurfacePresentDescriptor::prefers_vsync(self : SurfacePresentDescriptor) -> Bool

#
SurfacePresentDescriptor::resource_descriptor

fn SurfacePresentDescriptor::resource_descriptor(self : SurfacePresentDescriptor, byte_size? : Int64) -> RendererResourceDescriptor

#
SurfacePresentDescriptor::resource_descriptors

fn SurfacePresentDescriptor::resource_descriptors(self : SurfacePresentDescriptor, byte_size? : Int64) -> Array[RendererResourceDescriptor]

#
SurfacePresentDescriptor::resource_key

#
SurfacePresentDescriptor::resource_plan

fn SurfacePresentDescriptor::resource_plan(self : SurfacePresentDescriptor, byte_size? : Int64) -> RendererResourcePlan

#
SurfacePresentMode

pub(all) enum SurfacePresentMode {
ImmediatePresent
MailboxPresent
FifoPresent
} derive(Eq,
Debug
)

Presentation policy for a window or GPU-backed surface target.

#
SurfacePresentMode::allows_tearing

fn SurfacePresentMode::allows_tearing(self : SurfacePresentMode) -> Bool

#
SurfacePresentMode::prefers_vsync

fn SurfacePresentMode::prefers_vsync(self : SurfacePresentMode) -> Bool

#
SurfaceTargetDescriptor

pub(all) struct SurfaceTargetDescriptor {
surface : SurfaceDescriptor
target_id : Bytes
present_mode : SurfacePresentMode?
max_frames_in_flight : Int
gpu_context_key : RendererResourceKey?
} derive(Eq,
Debug
)

Stable value-layer contract for a renderable target and its presentation boundary. Raster targets are valid but never presentable.

#
SurfaceTargetDescriptor::bounds

#
SurfaceTargetDescriptor::dimensions

#
SurfaceTargetDescriptor::finalization_descriptor

fn SurfaceTargetDescriptor::finalization_descriptor(self : SurfaceTargetDescriptor, frame_index? : Int) -> SurfaceFinalizationDescriptor

#
SurfaceTargetDescriptor::gpu_context_resource_descriptor

fn SurfaceTargetDescriptor::gpu_context_resource_descriptor(self : SurfaceTargetDescriptor) -> RendererResourceDescriptor?

#
SurfaceTargetDescriptor::gpu_n32_premul

fn SurfaceTargetDescriptor::gpu_n32_premul(size : ISize, origin? : SurfaceOrigin, sample_count? : Int, stencil_bits? : Int, budget? : SurfaceBudget, present_mode? : SurfacePresentMode, max_frames_in_flight? : Int, gpu_context_key? : RendererResourceKey?, target_id? : Bytes) -> SurfaceTargetDescriptor

#
SurfaceTargetDescriptor::has_gpu_context

fn SurfaceTargetDescriptor::has_gpu_context(self : SurfaceTargetDescriptor) -> Bool

#
SurfaceTargetDescriptor::has_target_id

fn SurfaceTargetDescriptor::has_target_id(self : SurfaceTargetDescriptor) -> Bool

#
SurfaceTargetDescriptor::is_multibuffered

fn SurfaceTargetDescriptor::is_multibuffered(self : SurfaceTargetDescriptor) -> Bool

#
SurfaceTargetDescriptor::is_presentable

fn SurfaceTargetDescriptor::is_presentable(self : SurfaceTargetDescriptor) -> Bool

#
SurfaceTargetDescriptor::needs_present

fn SurfaceTargetDescriptor::needs_present(self : SurfaceTargetDescriptor) -> Bool

#
SurfaceTargetDescriptor::new

fn SurfaceTargetDescriptor::new(surface : SurfaceDescriptor, present_mode? : SurfacePresentMode?, max_frames_in_flight? : Int, gpu_context_key? : RendererResourceKey?, target_id? : Bytes) -> SurfaceTargetDescriptor

#
SurfaceTargetDescriptor::present_descriptor

fn SurfaceTargetDescriptor::present_descriptor(self : SurfaceTargetDescriptor, frame_index? : Int, buffer_index? : Int) -> SurfacePresentDescriptor

#
SurfaceTargetDescriptor::raster_n32_premul

fn SurfaceTargetDescriptor::raster_n32_premul(size : ISize) -> SurfaceTargetDescriptor

#
SurfaceTargetDescriptor::resource_descriptor

fn SurfaceTargetDescriptor::resource_descriptor(self : SurfaceTargetDescriptor, byte_size? : Int64) -> RendererResourceDescriptor

#
SurfaceTargetDescriptor::resource_descriptors

fn SurfaceTargetDescriptor::resource_descriptors(self : SurfaceTargetDescriptor, byte_size? : Int64) -> Array[RendererResourceDescriptor]

#
SurfaceTargetDescriptor::resource_key

#
SurfaceTargetDescriptor::resource_plan

fn SurfaceTargetDescriptor::resource_plan(self : SurfaceTargetDescriptor, byte_size? : Int64) -> RendererResourcePlan

#
SurfaceTargetDescriptor::window_n32_premul

fn SurfaceTargetDescriptor::window_n32_premul(size : ISize, origin? : SurfaceOrigin, sample_count? : Int, stencil_bits? : Int, present_mode? : SurfacePresentMode, max_frames_in_flight? : Int, target_id? : Bytes) -> SurfaceTargetDescriptor

#
SurfaceTargetDescriptor::with_dimensions

#
SurfaceTargetDescriptor::with_gpu_context

#
SurfaceTargetDescriptor::with_max_frames_in_flight

fn SurfaceTargetDescriptor::with_max_frames_in_flight(self : SurfaceTargetDescriptor, max_frames_in_flight : Int) -> SurfaceTargetDescriptor

#
SurfaceTargetDescriptor::with_present_mode

#
SurfaceTargetDescriptor::with_target_id

fn SurfaceTargetDescriptor::with_target_id(self : SurfaceTargetDescriptor, target_id : Bytes) -> SurfaceTargetDescriptor

#
SurfaceTargetDescriptor::without_gpu_context

#
SurfaceTargetDescriptor::without_present

#
SurfaceTargetDescriptor::without_target_id

#
TextDirection

pub(all) enum TextDirection {
LeftToRight
RightToLeft
} derive(Eq,
Debug
)

Lightweight text direction used by value-layer text layout contracts.

#
TextDirection::is_left_to_right

fn TextDirection::is_left_to_right(self : TextDirection) -> Bool

#
TextDirection::is_right_to_left

fn TextDirection::is_right_to_left(self : TextDirection) -> Bool

#
TextMeasurementDescriptor

pub(all) struct TextMeasurementDescriptor {
run : TextRunDescriptor
font_key : RendererResourceKey
width : Float
measure_bounds : Bool
shape : Bool
} derive(Eq,
Debug
)

Value-layer request for measuring or shaping a text run with stable cache identity and explicit font/fallback dependencies.

#
TextMeasurementDescriptor::is_shaped

#
TextMeasurementDescriptor::measured_run_descriptor

fn TextMeasurementDescriptor::measured_run_descriptor(self : TextMeasurementDescriptor, advance? : Float, bounds? : Rect?) -> MeasuredTextRunDescriptor

#
TextMeasurementDescriptor::new

fn TextMeasurementDescriptor::new(run? : TextRunDescriptor, font_key? : RendererResourceKey, width? : Float, measure_bounds? : Bool, shape? : Bool) -> TextMeasurementDescriptor

#
TextMeasurementDescriptor::resource_descriptor

fn TextMeasurementDescriptor::resource_descriptor(self : TextMeasurementDescriptor, text : Bytes, byte_size? : Int64) -> RendererResourceDescriptor

#
TextMeasurementDescriptor::resource_key

#
TextMeasurementDescriptor::resource_plan

fn TextMeasurementDescriptor::resource_plan(self : TextMeasurementDescriptor, text : Bytes, measurement_byte_size? : Int64, text_byte_size? : Int64, font_byte_size? : Int64, fallback_byte_size? : Int64) -> RendererResourcePlan

#
TextMeasurementDescriptor::with_font_key

#
TextMeasurementDescriptor::with_measure_bounds

fn TextMeasurementDescriptor::with_measure_bounds(self : TextMeasurementDescriptor, measure_bounds : Bool) -> TextMeasurementDescriptor

#
TextMeasurementDescriptor::with_run

#
TextMeasurementDescriptor::with_shape

#
TextMeasurementDescriptor::with_width

#
TextRange

pub(all) struct TextRange {
start : Int
end : Int
} derive(Eq,
Debug
)

Half-open byte range for a shaped text run.

#
TextRange::contains_offset

fn TextRange::contains_offset(self : TextRange, offset : Int) -> Bool

#
TextRange::is_empty

fn TextRange::is_empty(self : TextRange) -> Bool

#
TextRange::length

fn TextRange::length(self : TextRange) -> Int

#
TextRange::new

fn TextRange::new(start : Int, end : Int) -> TextRange

#
TextRunDescriptor

pub(all) struct TextRunDescriptor {
range : TextRange
direction : TextDirection
fallback : FontFallbackRequest
} derive(Eq,
Debug
)

Value-layer description of a text run before native shaping or fallback.

#
TextRunDescriptor::is_empty

fn TextRunDescriptor::is_empty(self : TextRunDescriptor) -> Bool

#
TextRunDescriptor::is_right_to_left

fn TextRunDescriptor::is_right_to_left(self : TextRunDescriptor) -> Bool

#
TextRunDescriptor::new

fn TextRunDescriptor::new(range? : TextRange, direction? : TextDirection, fallback? : FontFallbackRequest) -> TextRunDescriptor

#
TextRunDescriptor::resource_descriptor

fn TextRunDescriptor::resource_descriptor(self : TextRunDescriptor, text : Bytes, font_key? : RendererResourceKey, byte_size? : Int64) -> RendererResourceDescriptor

Cache descriptor for a shaped or measured text run resource.

#
TextRunDescriptor::resource_key

fn TextRunDescriptor::resource_key(self : TextRunDescriptor, text : Bytes, font_key? : RendererResourceKey) -> RendererResourceKey

Deterministic renderer cache key for a shaped or measured text run.

#
TextRunDescriptor::resource_plan

fn TextRunDescriptor::resource_plan(self : TextRunDescriptor, text : Bytes, font_key? : RendererResourceKey, text_byte_size? : Int64, font_byte_size? : Int64, fallback_byte_size? : Int64) -> RendererResourcePlan

#
TextRunDescriptor::with_direction

fn TextRunDescriptor::with_direction(self : TextRunDescriptor, direction : TextDirection) -> TextRunDescriptor

#
TextRunDescriptor::with_fallback

#
TextRunDescriptor::with_range

#
TextShapingDescriptor

pub(all) struct TextShapingDescriptor {
run : TextRunDescriptor
font_key : RendererResourceKey
width : Float
} derive(Eq,
Debug
)

Value-layer request for shaping a text run with stable cache identity and explicit font/fallback dependencies.

#
TextShapingDescriptor::measurement_descriptor

#
TextShapingDescriptor::new

#
TextShapingDescriptor::resource_descriptor

fn TextShapingDescriptor::resource_descriptor(self : TextShapingDescriptor, text : Bytes, byte_size? : Int64) -> RendererResourceDescriptor

#
TextShapingDescriptor::resource_key

fn TextShapingDescriptor::resource_key(self : TextShapingDescriptor, text : Bytes) -> RendererResourceKey

#
TextShapingDescriptor::resource_plan

fn TextShapingDescriptor::resource_plan(self : TextShapingDescriptor, text : Bytes, shaping_byte_size? : Int64, text_byte_size? : Int64, font_byte_size? : Int64, fallback_byte_size? : Int64) -> RendererResourcePlan

#
TextShapingDescriptor::shaped_run_descriptor

fn TextShapingDescriptor::shaped_run_descriptor(self : TextShapingDescriptor, glyph_count? : Int, cluster_count? : Int, advance? : Point) -> ShapedTextRunDescriptor

#
TextShapingDescriptor::with_font_key

#
TextShapingDescriptor::with_run

#
TextShapingDescriptor::with_width

fn TextShapingDescriptor::with_width(self : TextShapingDescriptor, width : Float) -> TextShapingDescriptor

#
TileMode

pub(all) enum TileMode {
Clamp
Repeat
Mirror
Decal
} derive(Eq,
Debug
)

Sampling behavior when coordinates land outside shader bounds.
impl Default for TileMode

#
TileMode::to_skia_ordinal

fn TileMode::to_skia_ordinal(self : TileMode) -> Int

#
WindowSurfaceDescriptor

pub(all) struct WindowSurfaceDescriptor {
window_id : Bytes
logical_size : Size
physical_size : ISize
device_pixel_ratio : Float
origin : SurfaceOrigin
sample_count : Int
stencil_bits : Int
present_mode : SurfacePresentMode
max_frames_in_flight : Int
} derive(Eq,
Debug
)

Stable value-layer contract for a native window-backed render target.

window_id is an owned, stable identity token chosen by the host GUI layer; it should identify the window/swapchain without borrowing a platform handle.

#
WindowSurfaceDescriptor::dimensions

#
WindowSurfaceDescriptor::from_physical_size

fn WindowSurfaceDescriptor::from_physical_size(window_id : Bytes, physical_size : ISize, device_pixel_ratio? : Float, origin? : SurfaceOrigin, sample_count? : Int, stencil_bits? : Int, present_mode? : SurfacePresentMode, max_frames_in_flight? : Int) -> WindowSurfaceDescriptor

#
WindowSurfaceDescriptor::gpu_target_descriptor

fn WindowSurfaceDescriptor::gpu_target_descriptor(self : WindowSurfaceDescriptor, budget? : SurfaceBudget, gpu_context_key? : RendererResourceKey?) -> SurfaceTargetDescriptor

#
WindowSurfaceDescriptor::has_window_id

fn WindowSurfaceDescriptor::has_window_id(self : WindowSurfaceDescriptor) -> Bool

#
WindowSurfaceDescriptor::is_empty

#
WindowSurfaceDescriptor::logical_dimensions

fn WindowSurfaceDescriptor::logical_dimensions(self : WindowSurfaceDescriptor) -> Size

#
WindowSurfaceDescriptor::new

fn WindowSurfaceDescriptor::new(window_id? : Bytes, logical_size? : Size, physical_size? : ISize, device_pixel_ratio? : Float, origin? : SurfaceOrigin, sample_count? : Int, stencil_bits? : Int, present_mode? : SurfacePresentMode, max_frames_in_flight? : Int) -> WindowSurfaceDescriptor

#
WindowSurfaceDescriptor::resource_descriptor

fn WindowSurfaceDescriptor::resource_descriptor(self : WindowSurfaceDescriptor, byte_size? : Int64) -> RendererResourceDescriptor

#
WindowSurfaceDescriptor::resource_key

#
WindowSurfaceDescriptor::resource_plan

fn WindowSurfaceDescriptor::resource_plan(self : WindowSurfaceDescriptor, byte_size? : Int64) -> RendererResourcePlan

#
WindowSurfaceDescriptor::surface_descriptor

#
WindowSurfaceDescriptor::target_descriptor

#
WindowSurfaceDescriptor::with_device_pixel_ratio

fn WindowSurfaceDescriptor::with_device_pixel_ratio(self : WindowSurfaceDescriptor, device_pixel_ratio : Float) -> WindowSurfaceDescriptor

#
WindowSurfaceDescriptor::with_logical_size

fn WindowSurfaceDescriptor::with_logical_size(self : WindowSurfaceDescriptor, logical_size : Size) -> WindowSurfaceDescriptor

#
WindowSurfaceDescriptor::with_max_frames_in_flight

fn WindowSurfaceDescriptor::with_max_frames_in_flight(self : WindowSurfaceDescriptor, max_frames_in_flight : Int) -> WindowSurfaceDescriptor

#
WindowSurfaceDescriptor::with_physical_size

fn WindowSurfaceDescriptor::with_physical_size(self : WindowSurfaceDescriptor, physical_size : ISize) -> WindowSurfaceDescriptor

#
WindowSurfaceDescriptor::with_present_mode

#
WindowSurfaceDescriptor::with_window_id

fn WindowSurfaceDescriptor::with_window_id(self : WindowSurfaceDescriptor, window_id : Bytes) -> WindowSurfaceDescriptor

#
binding_status

fn binding_status() -> String

Project status for the current package.

The value-layer types are usable today. Native Skia object bindings are introduced separately so their ownership and linker requirements stay explicit.