# Change Log
All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](http://keepachangelog.com/)
and this project adheres to [Semantic Versioning](http://semver.org/).

## [Unreleased]

## [0.12.0] - 2026-02-02
### Fixed
- Fixed a panic when drawing small anti-aliased rectangles. Thanks to [@nwhitehead](https://github.com/nwhitehead)

### Added
- 2-point conical gradient support for (`RadialGradient`).
  Thanks to [@wmedrano](https://github.com/wmedrano)
- Sweep gradient support (`SweepGradient`).
  Thanks to [@wmedrano](https://github.com/wmedrano)
- Support for a small number of color spaces. Thanks to [@danieldg](https://github.com/danieldg)
- Added the `is_empty` and `join` methods to `Rect`. Thanks to [@danieldg](https://github.com/danieldg)
- Implement `Hash` for `PathVerb`, `Rect` and `Size` and `IntSize`. Thanks to [@LaurenzV](https://github.com/LaurenzV)
- Add support for relaxed SIMD in WebAssembly. Thanks to [@CryZe](https://github.com/cryze)
- Add the `from_rgba_unchecked` method to `Color` so it can be created in `const` contexts. Thanks to [@jeffreyrosenbluth](https://github.com/jeffreyrosenbluth)
- Add the `scale_by` and `scale_to` method to `Size`. Thanks to  [@jermy](https://github.com/jermy)
- Add the `take_demultiplied` method to `Pixmap`. Thanks to [@JustForFun88](https://github.com/JustForFun88)
- Add the `take` method to `Mask`. Thanks to [@valadaptive](https://github.com/valadaptive)
- Add the `round_out` method to `Rect`. Thanks to [@valadaptive](https://github.com/valadaptive)

### Changed
- The `RadialGradient::new` requires a start radius now. Set the second argument
  to 0.0 to preserve the old behavior.


## [0.11.4] - 2024-02-04
### Fixed
- `Path::compute_tight_bounds` calculation.
  Thanks to [@qbcbyb](https://github.com/qbcbyb)

## [0.11.3] - 2023-12-03
### Added
- `Path::compute_tight_bounds`

## [0.11.2] - 2023-10-01
### Changed
- MSRV bumped to stable, because of the `flate2` crate.

### Fixed
- `Transform::is_valid` was treating 1/4096 as zero. We need a higher precision.
- Build failure on AVX2 with `--no-default-features`.
  Thanks to [@linkmauve](https://github.com/linkmauve)

## [0.11.1] - 2023-06-17
### Changed
- MSRV bumped to 1.60, because of the `log` crate.

### Fixed
- `LineJoin::MiterClip` handling with small `miter_limit`.
  Thanks to [@torokati44](https://github.com/torokati44)

## [0.11.0] - 2023-06-08
### Added
- `LineJoin::MiterClip`.
  Thanks to [@torokati44](https://github.com/torokati44)

### Changed
- `Rect::inset` and `Rect::outset` are no longer require a mutable `self`.
  Thanks to [@wezm](https://github.com/wezm)

## [0.10.0] - 2023-05-27
### Added
- `PathBuilder::push_path`
- `NonZeroRect`
- `Size`
- `Rect::transform`
- `Rect::bbox_transform`
- `Transform::from_bbox`
- `Transform::is_valid`
- `Transform::get_scale`
- `Transform::pre_rotate`
- `Transform::post_rotate`
- `Transform::pre_rotate_at`
- `Transform::post_rotate_at`
- `Transform::map_point`

### Changed
- `ColorU8` and `PremultipliedColorU8` are stored as `[u8; 4]` instead of `u32`.
  This fixes potential [alignment issues](https://github.com/linebender/tiny-skia/issues/70)
  and make the code easier to understand.
  Thanks to [@e00E](https://github.com/e00E)
- `PathBuilder::push_rect` accepts `Rect` and not `f32` numbers now.

### Removed
- `tiny_skia_path::ScreenIntRect`. It become private.
- `Path::is_empty`. `Path` cannot be empty by design.

### Removed
- `ColorU8::get` and `PremultipliedColorU8::get`. Use the getters instead.

## [0.9.1] - 2023-05-17
### Added
- Reexport `tiny_skia_path::PathStroker` in `tiny-skia`.

## [0.9.0] - 2023-04-23
### Added
- `Mask::from_vec`
- `Mask::from_pixmap` to convert `Pixmap` into `Mask` by extracting alpha or luminance.
- `Mask::width`
- `Mask::height`
- `Mask::data`
- `Mask::data_mut`
- `Mask::fill_path`
- `Mask::decode_png`
- `Mask::load_png`
- `Mask::encode_png`
- `Mask::save_png`
- `Mask::invert`
- `MaskType`
- `Pixmap::apply_mask`

### Changed
- Rename `ClipMask` into `Mask`.
- `Mask` is closer to a 8bit (A8) `Pixmap` now, rather than being its own thing.
- `Mask::new` requires width and height arguments now.
- Drawing on `Mask` using `Mask::fill_path` uses our SIMD pipeline now instead of a scalar code
  that should make it a bit faster.
- Painting API no longer returns `Option<()>`, but simply adds a warning to the log.
- `Paint::anti_alias` is set to `true` by default.

### Removed
- `Mask::set_path`. Use `Mask::fill_path` instead.
- `Mask::default()`. Mask cannot be empty anymore.

## [0.8.4] - 2023-04-22
### Added
- Implement `PartialEq` for `Paint` and subtypes. Thanks to [@hecrj](https://github.com/hecrj)

### Changed
- MSRV bumped to 1.57, mainly because of the `png` crate.

### Fixed
- `ClipMask`s larger than 8191x8191 pixels.
  Previously, the creation of a large mask via `ClipMask::set_path`
  would have created an empty mask.

## [0.8.3] - 2023-02-05
### Fixed
- Performance regression, probably due to LLVM update in Rust.
  Thanks to [@mostafa-khaled775](https://github.com/mostafa-khaled775)
- Big-endian targets support. Thanks to [@ids1024](https://github.com/ids1024)

## [0.8.2] - 2022-10-22
### Added
- `Pixmap::from_vec`.

### Fixed
- Increase Conic to Quad conversion precision. This allows us to produce nicer round caps.
  Previously, they were not as round as needed.

## [0.8.1] - 2022-08-29
### Fixed
- Conditional compilation of `FasterMinMax` on fallback platforms.
  Thanks to [@CryZe](https://github.com/CryZe)

## [0.8.0] - 2022-08-27
### Added
- AArch64 Neon SIMD support. Up to 3x faster on Apple M1.
  Thanks to [@CryZe](https://github.com/CryZe)

### Changed
- `FiniteF32`, `NormalizedF32` and `NonZeroPositiveF32` types have been moved
  to the `strict-num` crate.
- Rename `NormalizedF32::from_u8` into `NormalizedF32::new_u8`.
- Rename `NormalizedF32::new_bounded` into `NormalizedF32::new_clamped`.
- Use explicit SIMD intrinsic instead of relying on `safe_arch`.
- MSRV bumped to 1.51

## [0.7.0] - 2022-07-03
### Added
- `tiny-skia-path` dependency that can be used independently from `tiny-skia`.
  It contains the `tiny-skia` Bezier path implementation, including stroking and dashing.
  As well as all the geometry primitives (like `Point` and `Rect`).

### Changed
- When disabling the `std` feature, one have to enable `no-std-float` feature instead of `libm` now.

## [0.6.6] - 2022-06-23
### Fixed
- Panic in `Rect::round` and `Rect::round_out`.
  Thanks to [@Wardenfar](https://github.com/Wardenfar)

## [0.6.5] - 2022-06-10
### Fixed
- Minimum `arrayref` version.

## [0.6.4] - 2022-06-04
### Fixed
- Panic during non-aliased hairline stroking at the bottom edge of an image.

## [0.6.3] - 2022-02-01
### Fixed
- SourceOver blend mode must not be optimized to Source when ClipPath is present.

## [0.6.2] - 2021-12-30
### Fixed
- `ClipMask::intersect_path` alpha multiplying.

## [0.6.1] - 2021-08-28
### Added
- Support rendering on pixmaps larger than 8191x8191 pixels.
  From now, `Pixmap` is limited only by the amount of memory caller has.
- `Transform::map_points`
- `PathBuilder::push_oval`

## [0.6.0] - 2021-08-21
### Added
- WASM simd128 support. Thanks to [@CryZe](https://github.com/CryZe)

### Changed
- `Transform::post_scale` no longer requires `&mut self`.
- Update `png` crate.

## [0.5.1] - 2021-03-07
### Fixed
- Color memset optimizations should be ignored when clip mask is present.
- `ClipMask::intersect_path` logic.

## [0.5.0] - 2021-03-06
### Added
- `ClipMask::intersect_path`
- no_std support. Thanks to [@CryZe](https://github.com/CryZe)

### Changed
- Reduce `Transform` strictness. It's no longer guarantee to have only finite values,
  therefore we don't have to check each operation.

### Removed
- `Canvas`. Call `Pixmap`/`PixmapMut` drawing methods directly.

## [0.4.2] - 2021-01-23
### Fixed
- Panic during path filling with anti-aliasing because of incorrect edges processing.

## [0.4.1] - 2021-01-19
### Fixed
- Endless loop during stroke dashing.

## [0.4.0] - 2021-01-02
### Changed
- Remove almost all `unsafe`. No performance changes.

## [0.3.0] - 2020-12-20
### Added
- `PixmapRef` and `PixmapMut`, that can be created from `Pixmap` or from raw data.
- `Canvas::set_clip_mask`, `Canvas::get_clip_mask`, `Canvas::take_clip_mask`.

### Changed
- `Canvas` no longer owns a `Pixmap`.
- `Canvas::draw_pixmap` and `Pattern::new` accept `PixmapRef` instead of `&Pixmap` now.
- Improve clipping performance.
- The internal `ClipMask` type become public.

### Fixed
- Panic when path is drawn slightly past the `Pixmap` bounds.

### Removed
- `Canvas::new`

## 0.2.0 - 2020-11-16
### Changed
- Port to Rust.

## 0.1.0 - 2020-07-04
### Added
- Bindings to a stripped down Skia fork.

[Unreleased]: https://github.com/linebender/tiny-skia/compare/v0.12.0...HEAD
[0.12.0]: https://github.com/linebender/tiny-skia/compare/v0.11.4...v0.12.0
[0.11.4]: https://github.com/linebender/tiny-skia/compare/v0.11.3...v0.11.4
[0.11.3]: https://github.com/linebender/tiny-skia/compare/v0.11.2...v0.11.3
[0.11.2]: https://github.com/linebender/tiny-skia/compare/v0.11.1...v0.11.2
[0.11.1]: https://github.com/linebender/tiny-skia/compare/v0.11.0...v0.11.1
[0.11.0]: https://github.com/linebender/tiny-skia/compare/v0.10.0...v0.11.0
[0.10.0]: https://github.com/linebender/tiny-skia/compare/v0.9.1...v0.10.0
[0.9.1]: https://github.com/linebender/tiny-skia/compare/v0.9.0...v0.9.1
[0.9.0]: https://github.com/linebender/tiny-skia/compare/v0.8.4...v0.9.0
[0.8.4]: https://github.com/linebender/tiny-skia/compare/v0.8.3...v0.8.4
[0.8.3]: https://github.com/linebender/tiny-skia/compare/v0.8.2...v0.8.3
[0.8.2]: https://github.com/linebender/tiny-skia/compare/v0.8.1...v0.8.2
[0.8.1]: https://github.com/linebender/tiny-skia/compare/v0.8.0...v0.8.1
[0.8.0]: https://github.com/linebender/tiny-skia/compare/v0.7.0...v0.8.0
[0.7.0]: https://github.com/linebender/tiny-skia/compare/v0.6.6...v0.7.0
[0.6.6]: https://github.com/linebender/tiny-skia/compare/v0.6.5...v0.6.6
[0.6.5]: https://github.com/linebender/tiny-skia/compare/v0.6.4...v0.6.5
[0.6.4]: https://github.com/linebender/tiny-skia/compare/v0.6.3...v0.6.4
[0.6.3]: https://github.com/linebender/tiny-skia/compare/v0.6.2...v0.6.3
[0.6.2]: https://github.com/linebender/tiny-skia/compare/v0.6.1...v0.6.2
[0.6.1]: https://github.com/linebender/tiny-skia/compare/v0.6.0...v0.6.1
[0.6.0]: https://github.com/linebender/tiny-skia/compare/v0.5.1...v0.6.0
[0.5.1]: https://github.com/linebender/tiny-skia/compare/v0.5.0...v0.5.1
[0.5.0]: https://github.com/linebender/tiny-skia/compare/v0.4.2...v0.5.0
[0.4.2]: https://github.com/linebender/tiny-skia/compare/v0.4.1...v0.4.2
[0.4.1]: https://github.com/linebender/tiny-skia/compare/v0.4.0...v0.4.1
[0.4.0]: https://github.com/linebender/tiny-skia/compare/v0.3.0...v0.4.0
[0.3.0]: https://github.com/linebender/tiny-skia/compare/v0.2.0...v0.3.0
