linear-srgb 0.6.7

Fast linear↔sRGB color space conversion with FMA acceleration and LUT support
Documentation
name: CI

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

env:
  CARGO_TERM_COLOR: always

jobs:
  test:
    name: Test (${{ matrix.os }})
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        os: [ubuntu-latest, windows-latest, macos-latest, macos-26-intel, ubuntu-24.04-arm, windows-11-arm]

    steps:
      - uses: actions/checkout@v6

      - name: Install Rust
        uses: dtolnay/rust-toolchain@stable

      - name: Cache cargo
        uses: Swatinem/rust-cache@v2

      - name: Build (all features)
        run: cargo build --all-features

      - name: Run tests (all features)
        run: cargo test --all-features --release

  # NOTE: no_std is blocked by magetypes lacking libm fallbacks for
  # f32::sqrt, f32::mul_add, f64::log2, etc. in its scalar polyfill.
  # Re-enable no_std tests once magetypes adds a libm feature.
  # See: https://github.com/imazen/archmage/issues/XX
  #
  # test-no-std:
  #   ...
  #   cargo test --no-default-features --release
  #   cargo test --no-default-features --features alt --release

  feature-combos:
    name: Features (${{ matrix.features }})
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        features:
          - ""                          # no features (no_std, no avx512)
          - "std"                       # std only, no avx512
          - "std,avx512"               # default feature set
          - "std,transfer"             # transfer without avx512
          - "std,iec"                  # IEC legacy constants
          - "std,avx512,transfer"      # all runtime features
          - "std,avx512,transfer,alt,iec"  # everything

    steps:
      - uses: actions/checkout@v6

      - name: Install Rust
        uses: dtolnay/rust-toolchain@stable

      - name: Cache cargo
        uses: Swatinem/rust-cache@v2

      - name: Build
        run: cargo build --no-default-features --features "${{ matrix.features }}"

      - name: Test
        run: cargo test --no-default-features --features "${{ matrix.features }}" --release
        # no_std builds may fail tests if magetypes lacks libm fallbacks;
        # skip test for the empty-features case until that's resolved
        if: matrix.features != ''

      - name: Check (no_std build only)
        run: cargo check --no-default-features
        if: matrix.features == ''

  wasm:
    name: WASM SIMD128
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v6

      - name: Install Rust
        uses: dtolnay/rust-toolchain@stable
        with:
          targets: wasm32-unknown-unknown,wasm32-wasip1

      - name: Install wasmtime
        run: curl https://wasmtime.dev/install.sh -sSf | bash && echo "$HOME/.wasmtime/bin" >> $GITHUB_PATH

      - name: Cache cargo
        uses: Swatinem/rust-cache@v2

      - name: Check WASM (wasm32-unknown-unknown)
        run: cargo check --target wasm32-unknown-unknown --all-features
        env:
          RUSTFLAGS: -C target-feature=+simd128

      - name: Test WASM (wasm32-wasip1)
        run: cargo test --target wasm32-wasip1 --features "std,transfer" --release --lib
        env:
          RUSTFLAGS: -C target-feature=+simd128
          CARGO_TARGET_WASM32_WASIP1_RUNNER: wasmtime --dir=.

  cross-check:
    name: Cross-check (${{ matrix.target }})
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        target: [aarch64-unknown-linux-gnu, aarch64-unknown-linux-musl]

    steps:
      - uses: actions/checkout@v6

      - name: Install Rust
        uses: dtolnay/rust-toolchain@stable
        with:
          targets: ${{ matrix.target }}

      - name: Cache cargo
        uses: Swatinem/rust-cache@v2

      - name: Check (all features)
        run: cargo check --target ${{ matrix.target }} --all-features

  lint:
    name: Lint
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v6

      - name: Install Rust
        uses: dtolnay/rust-toolchain@stable
        with:
          components: clippy, rustfmt

      - name: Cache cargo
        uses: Swatinem/rust-cache@v2

      - name: Check formatting
        run: cargo fmt --check

      - name: Clippy (all features)
        run: cargo clippy --all-targets --all-features -- -D warnings

  bench:
    name: Benchmarks
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v6

      - name: Install Rust
        uses: dtolnay/rust-toolchain@stable

      - name: Cache cargo
        uses: Swatinem/rust-cache@v2

      - name: Build benchmarks
        run: cargo build --release --benches --all-features

  coverage:
    name: Coverage
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
      - uses: dtolnay/rust-toolchain@stable
        with:
          components: llvm-tools-preview
      - uses: Swatinem/rust-cache@v2
      - uses: taiki-e/install-action@cargo-llvm-cov
      - run: cargo llvm-cov --all-features --codecov --output-path codecov.json --release
      - uses: codecov/codecov-action@v5
        with:
          files: codecov.json
          fail_ci_if_error: false

  msrv:
    name: MSRV
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v6

      - name: Install Rust
        uses: dtolnay/rust-toolchain@stable

      - uses: taiki-e/install-action@cargo-hack

      - name: Cache cargo
        uses: Swatinem/rust-cache@v2

      - name: Check MSRV
        run: cargo hack check --rust-version

  docs:
    name: Documentation
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v6

      - name: Install Rust
        uses: dtolnay/rust-toolchain@stable

      - name: Cache cargo
        uses: Swatinem/rust-cache@v2

      - name: Build docs
        run: cargo doc --no-deps --all-features
        env:
          RUSTDOCFLAGS: -D warnings