# Copyright © SixtyFPS GmbH <info@slint.dev>
# SPDX-License-Identifier: GPL-3.0-only OR LicenseRef-Slint-Royalty-free-2.0 OR LicenseRef-Slint-Software-3.0

[package]
name = "i-slint-core"
description = "Internal Slint Runtime Library."
authors.workspace = true
documentation.workspace = true
edition = "2024"
homepage.workspace = true
keywords.workspace = true
license.workspace = true
repository.workspace = true
rust-version.workspace = true
version.workspace = true
categories = ["gui", "development-tools", "no-std"]

[lib]
path = "lib.rs"

[features]
ffi = ["dep:static_assertions"]           # Expose C ABI
libm = ["num-traits/libm", "euclid/libm"]
# Allow the viewer to query at runtime information about item types
rtti = []
# Use the standard library
std = [
  "euclid/std",
  "once_cell/std",
  "dep:scoped-tls-hkt",
  "dep:web-time",
  "dep:lyon_extra",
  "image-decoders",
  "svg",
  "path",
  "raw-window-handle-06?/std",
  "chrono/std",
  "chrono/wasmbind",
  "chrono/clock",
  "dep:sys-locale",
  "shared-fontique",
  "i-slint-common/color-parsing",
  "i-slint-common/markdown",
  "taffy/std",
]
# Unsafe feature meaning that there is only one core running and all thread_local are static.
# You can only enable this feature if you are sure that any API of this crate is only called
# from a single core, and not in a interrupt or signal handler.
unsafe-single-threaded = []

unicode = ["unicode-script", "unicode-linebreak"]

image-decoders = ["dep:image", "dep:clru"]
image-default-formats = ["image?/default-formats"]
svg = ["dep:resvg"]

box-shadow-cache = []

testing = []

shared-fontique = ["i-slint-common/shared-fontique"]

raw-window-handle-06 = ["dep:raw-window-handle-06"]

# The wgpu-{27,28} features enable the internal wgpu module (SurfaceTarget, init helpers)
# without exposing public API types (GraphicsAPI::WGPU*, WGPUTexture, WGPUConfiguration).
# The unstable-wgpu-* features additionally enable those public API types.
wgpu-27 = ["dep:wgpu-27"]

unstable-wgpu-27 = ["wgpu-27"]
wgpu-28 = ["dep:wgpu-28"]

unstable-wgpu-28 = ["wgpu-28"]

tr = ["dep:tr"]

32-bit-color = []
default = ["std", "unicode", "shared-parley"]

shared-parley = ["shared-fontique", "dep:parley", "dep:skrifa", "dep:icu_normalizer"]

shared-swash = ["dep:swash"]

path = ["dep:auto_enums", "dep:lyon_path", "dep:lyon_geom", "dep:lyon_algorithms"]

[dependencies]
i-slint-common = { workspace = true, features = ["default"] }
i-slint-core-macros = { workspace = true, features = ["default"] }

const-field-offset = { version = "0.2.0", path = "../../helper_crates/const-field-offset" }
vtable = { workspace = true }

portable-atomic = { version = "1", features = ["critical-section"] }
auto_enums = { version = "0.8.0", optional = true }
cfg-if = "1"
derive_more = { workspace = true, features = ["error"] }
euclid = { workspace = true }
lyon_algorithms = { version = "1.0", optional = true, default-features = false }
lyon_geom = { version = "1.0", optional = true, default-features = false }
lyon_path = { workspace = true, optional = true, default-features = false }
lyon_extra = { version = "1.0.1", optional = true, default-features = false }
num-traits = { version = "0.2", default-features = false }
once_cell = { version = "1.5", default-features = false, features = ["critical-section"] }
pin-project = "1"
pin-weak = { version = "1.1", default-features = false }
# Note: the rgb version is extracted in ci.yaml for rustdoc builds
rgb = "0.8.27"
scoped-tls-hkt = { version = "0.1", optional = true }
scopeguard = { version = "1.1.0", default-features = false }
slab = { version = "0.4.3", default-features = false }
static_assertions = { version = "1.1", optional = true }
strum = { workspace = true }

# Note: We're migrating our unicode handling over to the icu family of crates.
# Prefer using icu crates over adding more unicode-* dependencies
# parley uses the icu crates internally as well, so we'll share the dependency there.
unicode-segmentation = { workspace = true }
unicode-linebreak = { version = "0.1.5", optional = true }
unicode-script = { version = "0.5.7", optional = true }
icu_normalizer = { workspace = true, optional = true }
sys-locale = { version = "0.3.2", optional = true, features = ["js"] }
parley = { version = "0.8.0", optional = true }

image = { workspace = true, optional = true, default-features = false }
clru = { workspace = true, optional = true }

resvg = { workspace = true, optional = true }
serde = { workspace = true, optional = true }

raw-window-handle-06 = { workspace = true, optional = true }
bitflags = { version = "2.4.2" }

chrono = { version = "0.4", default-features = false, features = ["alloc"] }
skrifa = { workspace = true, optional = true }
swash = { workspace = true, optional = true, features = ["scale"] }

wgpu-27 = { workspace = true, optional = true }
wgpu-28 = { workspace = true, optional = true }

tr = { workspace = true, optional = true }

taffy = { version = "0.9", default-features = false, features = ["flexbox", "taffy_tree", "alloc"] }

[target.'cfg(target_family = "unix")'.dependencies]
gettext-rs = { version = "0.7.1", optional = true, features = ["gettext-system"] }

[target.'cfg(target_arch = "wasm32")'.dependencies]
web-time = { version = "1.0", optional = true }
wasm-bindgen = { version = "0.2" }
web-sys = { workspace = true, features = ["HtmlImageElement", "Navigator"] }


[dev-dependencies]
slint = { path = "../../api/rs/slint", default-features = false, features = ["std", "compat-1-2", "renderer-software"] }
i-slint-backend-testing = { path = "../backends/testing" }
rustybuzz = { workspace = true }
ttf-parser = { workspace = true }
serde_json = { workspace = true }
tiny-skia = "0.12.0"
tokio = { version = "1.35", features = ["rt-multi-thread", "macros", "time", "net", "io-util"] }
async-compat = { version = "0.2.4" }
tempfile = { version = "3.12.0" }
fontique = { workspace = true }

[lints.rust]
unexpected_cfgs = { level = "warn", check-cfg = ["cfg(slint_debug_property)", "cfg(cbindgen)", "cfg(slint_int_coord)", "cfg(slint_nightly_test)"] }

[lints.clippy]
# Coord is an alias for f32 in most architectures, but not always, so the cast
# to f32 *is* necessary.
unnecessary_cast = { level = "allow" }

[package.metadata.docs.rs]
rustdoc-args = ["--generate-link-to-definition"]
