BLEND 2D

next generation 2d vector graphics engine

ROADMAP

Blend2D library is not finished at the moment, however, a working prototype is already functional and used for experimenting and benchmarking. The rendering context is nearly finished and the JIT backend already produces very impressive results.

ALPHA VERSION

Features expected to be implemented in alpha version on Blend2D:

Feature Status Comment
Rendering Architecture Finished State-based rendering architecture.

The rendering pipeline is divided into two parts - SWPipe and SWContext2DImpl. The SWPipe is a JIT code generation backend used by SWContext2DImpl. The latter just implements an interface used by Context2D, which is a high-level rendering context designed for Blend2D consumers.
Rendering to PRGB32 Finished Rendering to buffers that use PRGB32 pixel format.
Rendering to XRGB32 Incomplete Rendering to buffers that use XRGB32 pixel format.

The engine currently threats that pixel format as PRGB32, will be fixed soon.
Rendering to A8 Incomplete Rendering to buffers that use A8 pixel format.
Deferred Rendering Incomplete Ability to defer all rendering operations until they are flushed.
Layered Rendering Pending Allows to paint into a layer which can be then composited back to the parent layer.

Requires deferred rendering.
Rendering Modes / Slots Finished Allows to fill and stroke simple shapes or 2D paths.

The rendering architecture uses the concepts of separated fill and stroke slots. The user can specify fill and stroke styles and parameters independently, including their alpha values.
Gradient Styles Finished High-performance linear, radial, and conical gradients.
Pattern Styles Finished High-performance pattern blits that use nearest neighbor and bilinear filtering.
Affine Transforms Finished Allows to transform simple shapes, 2d graphics paths, and images.

SIMD optimized 2D vector and raster transformations optimized for various matrix types (translation, scaling, affine). Transforms are integrated with the rendering context, can be used independently and also be associated with gradients and patterns.
Composition and Blending Finished SSE2 optimized Porter&Duff compositing and SVG/CSS blending.
Image Rescaling Finished High quality and high performance image rescaling by using built-in or custom filters.
PNG Decoder Finished Ability to read PNG images from blend::Buffer.
PNG Decoder Acceleration Finished SSE2 acceleration of PNG reverse filter implementation.

Playground for experimenting with PNG reverse filtering is on kobalicek/simddepng
JPEG Decoder Finished Ability to read JPEG images from blend::Buffer.
JPEG Decoder Acceleration Finished SSE2 acceleration of IDCT, upsampling, and YCbCr to RGB conversion.
Font Management Pending Ability to load system fonts and custom points via blend::Buffer, and to query a font based on name and/or features.
Text Rendering Pending Ability to render text/glyph-runs via Blend's context.

BETA VERSION

Features expected to be delivered for a public beta testing; focus on asynchronous rendering and proper text support.

Feature Status Comment
AVX2 Pipeline Pending Fully optimized AVX2 rasterizer, compositing, and style fetchers.
Asynchronous Rendering Pending Ability to run an asynchronous worker in different thread while the rendering context is still in use.

Requires deferred rendering, has been implemented in FOG-Framework already.
Multithreaded Rendering Pending Ability to run more than one asynchronous worker to improve performance.

This has been already implemented in FOG-Framework, but the approach of division of the image into independent blocks will be different.
Rendering to RGB24 Pending Rendering to buffers that use RGB24 pixel format.
Non-Rectangular Clipping Pending Support for non-rectangular clipping (region-based and/or span-based).
Rasterizer Acceleration Pending Use the advantage of SSE2 in the analytic rasterizer itself (C++ part).
Gradient Dithering Pending High-performance dithered gradients that prevent banding artifacts.
PNG Encoder Pending Ability to write a PNG image into blend::Buffer.
JPEG Encoder Pending Ability to write a JPEG image into blend::Buffer.
Text Layouting Pending Ability to layout text by interpreting OTF tables and to convert text into a set of glyph-runs.

VERSION 1.0

Features expected to be delivered with 1.0 release; focus on image filtering and vector operations.

Feature Status Comment
Image Filters Pending Filters implementing Gaussian blur, generic convolution, erode, dilate, and displacement.
Color Filters Pending Filters implementing basic color adjustments and color matrix.
HSL Blending Pending Non-separable HSL blending (PDF specification, cairo/skia compatibility).
Render Filters Pending Filters generating turbulence and fractal noise.
Path Clipping Pending Ability to clip the current rendering into a region or graphics path, instead of just AABB.
Path Boolean Pending Ability to perform boolean operations with two or more graphics paths.
Path on Path Pending Ability to deform a path to be on another path, for implementing text-on-path like effects.

The implementation can be based on AGG's path-on-path, however, it flattens all curves to line segments.
Stroke to Path Pending Implement a new stroking algorithm that can stroke quadratic and cubic B├ęzier curves into curves without flattening them into line segments.

FUTURE

Features expected to be delivered after the 1.0 release, not a high priority at the moment.

Feature Status Comment
ARM Pipeline Pending Support for 32-bit and 64-bit ARM. Requires AsmJit #74 first.
Instruction Scheduling Pending Support for reordering and instruction scheduling, this feature has been moved to AsmJit #75.
Shaders & MPSL Pending Ability to use shader programs written in MPSL for pattern generation, custom blending, and custom transformations and/or deformations.

DISCLAIMER

Features are sorted by priority, but during the time they can be rescheduled if needed. All features listed have a different complexity; they can take a day or a month to implement. The idea is to make the rendering engine and the logic first, and then add features that are not strictly related to the pipeline, but makes the library more usable. All features that are just optimizations over a baseline functionality can be postponed in case they block a release.