LibGfx is Ladybird’s 2D graphics library that handles everything from basic shapes and colors to image decoding, font rendering, and hardware-accelerated painting.
Core graphics primitives
LibGfx provides fundamental types for 2D graphics operations.
Geometric types
// Points
Gfx ::IntPoint point { 10 , 20 };
Gfx ::FloatPoint float_point { 10.5 f , 20.5 f };
// Rectangles
Gfx ::IntRect rect { 0 , 0 , 100 , 50 };
rect . intersected (other_rect);
rect . united (other_rect);
// Sizes
Gfx ::IntSize size { 800 , 600 };
IntPoint / FloatPoint 2D coordinate positions with integer or floating-point precision
IntRect / FloatRect Rectangles with position and dimensions, plus intersection/union operations
IntSize / FloatSize Width and height dimensions
Quad Arbitrary four-sided polygon
Color
Comprehensive color support with multiple representations:
// RGB colors
auto red = Gfx :: Color ( 255 , 0 , 0 );
auto blue = Gfx :: Color :: from_rgb ( 0x 0000ff );
// Named colors
auto white = Gfx :: Color ::White;
auto black = Gfx :: Color ::Black;
// Alpha transparency
auto translucent = Gfx :: Color ( 255 , 0 , 0 , 128 ); // 50% opacity
// Color manipulation
auto lighter = color . lightened ( 1.2 f );
auto darker = color . darkened ( 0.8 f );
auto inverted = color . inverted ();
LibGfx supports multiple color spaces including sRGB, Display P3, and custom ICC profiles through the ColorSpace class.
Bitmap handling
Bitmap creation and manipulation
Bitmap is the core image storage class:
// Create bitmap
auto bitmap = TRY ( Gfx :: Bitmap :: create (
Gfx :: BitmapFormat ::RGBA8888,
Gfx ::IntSize { 800 , 600 }
));
// Access pixels
auto color = bitmap -> get_pixel (x, y);
bitmap -> set_pixel (x, y, Gfx :: Color ::Red);
// Scanline access for performance
auto * scanline = bitmap -> scanline (y);
Supported formats:
RGBA8888 - 32-bit with alpha
RGB888 - 24-bit without alpha
BGRx8888 - 32-bit BGR format
BGRA8888 - 32-bit BGRA with alpha
ImmutableBitmap
Read-only, shareable bitmap optimized for multi-process usage:
auto immutable = TRY ( Gfx :: ImmutableBitmap :: create (
move (bitmap)
));
// Can be safely shared across processes
Image decoding
LibGfx includes decoders for common image formats:
PNG Full PNG support with transparency
JPEG Baseline and progressive JPEG
// Load and decode image
auto image_data = TRY ( read_file ( "/path/to/image.png" ));
auto decoded = TRY ( Gfx :: ImageDecoder :: try_create (image_data));
if ( decoded -> is_animated ()) {
auto frame_count = decoded -> frame_count ();
for ( size_t i = 0 ; i < frame_count; ++ i) {
auto frame = TRY ( decoded -> frame (i));
// Process frame bitmap
}
}
Font rendering
Font system
LibGfx provides font loading and text rendering:
// Load font
auto font = TRY ( Gfx :: Font :: try_load_from_file ( "/fonts/Katica.ttf" ));
// Get font metrics
int height = font -> pixel_size ();
int ascent = font -> pixel_size_rounded_up ();
// Measure text
int width = font -> width ( "Hello, World!" sv );
// Glyph-level access
auto glyph_id = font -> glyph_id_for_code_point ( 'A' );
Text layout
Complex text shaping and layout:
auto shaped_text = TRY ( Gfx :: shape_text (
{ 0 , 0 , 500 , 100 },
"Text to shape" sv ,
font,
Gfx :: TextAlignment ::CenterLeft
));
// Access positioned glyphs
for ( auto const & glyph : shaped_text . glyphs ()) {
// Render individual glyphs
}
Painting
LibGfx uses Skia for high-performance 2D rendering.
Painter interface
Painter provides the main drawing API:
Gfx ::Painter painter { bitmap };
// Basic shapes
painter . fill_rect (rect, Gfx :: Color ::Red);
painter . draw_rect (rect, Gfx :: Color ::Black);
painter . draw_line (point1, point2, Gfx :: Color ::Blue);
painter . draw_ellipse (rect, Gfx :: Color ::Green);
// Text rendering
painter . draw_text (rect, "Hello" sv , font,
Gfx :: TextAlignment ::Center);
// Image drawing
painter . blit (position, source_bitmap, source_rect);
painter . draw_scaled_bitmap (dest_rect, source_bitmap, source_rect);
Advanced painting
// Gradients
Gfx ::LinearGradient gradient;
gradient . add_color_stop ( 0.0 f , Gfx :: Color ::White);
gradient . add_color_stop ( 1.0 f , Gfx :: Color ::Black);
painter . fill_rect_with_gradient (rect, gradient);
// Transformations
painter . save ();
painter . translate (offset);
painter . rotate (angle);
painter . scale (scale_x, scale_y);
// ... drawing operations ...
painter . restore ();
// Clipping
painter . add_clip_rect (clip_rect);
// Only draws within clip region
painter . clear_clip_rect ();
Painting operations are not thread-safe. Each painter instance must only be used from a single thread.
Paths and vector graphics
Path construction
Gfx ::Path path;
// Build path
path . move_to ({ 10 , 10 });
path . line_to ({ 100 , 10 });
path . quadratic_bezier_curve_to (
{ 150 , 50 }, // control point
{ 100 , 100 } // end point
);
path . close ();
// Fill or stroke
painter . fill_path (path, Gfx :: Color ::Red);
painter . stroke_path (path, Gfx :: Color ::Black, 2 );
AffineTransform provides 2D matrix transformations:
Gfx ::AffineTransform transform;
transform . translate ( 100 , 50 );
transform . rotate ( Math ::Pi < float > / 4 ); // 45 degrees
transform . scale ( 2.0 f , 2.0 f );
auto transformed_point = transform . map (original_point);
auto transformed_rect = transform . map (original_rect);
Hardware acceleration
LibGfx supports multiple rendering backends:
Skia backend
Default high-performance backend using Skia:
// PainterSkia automatically uses GPU when available
Gfx ::PainterSkia painter { painting_surface };
painter . fill_rect (rect, color);
Platform-specific GPU acceleration:
Vulkan : Cross-platform GPU rendering (VulkanContext)
Metal : macOS/iOS GPU rendering (MetalContext)
LibGfx automatically selects the best available rendering backend based on platform and hardware capabilities.
Filters and effects
Image filtering and effects:
// Apply filters
auto blurred = TRY ( Gfx :: Filter :: apply_blur (bitmap, radius));
auto sharpened = TRY ( Gfx :: Filter :: apply_sharpen (bitmap));
// Color adjustments
Gfx :: Filter :: apply_brightness (bitmap, 1.2 f );
Gfx :: Filter :: apply_contrast (bitmap, 1.5 f );
System theme integration
// Access system theme colors
auto & theme = Gfx :: SystemTheme :: current ();
auto window_bg = theme . color ( Gfx :: ColorRole ::Window);
auto text_color = theme . color ( Gfx :: ColorRole ::WindowText);
Source location
Repository : ~/workspace/source/Libraries/LibGfx/
Key headers : Bitmap.h, Color.h, Painter.h, Rect.h, Point.h, Font.h
Image formats : LibGfx/ImageFormats/
Fonts : LibGfx/Font/
LibGfx is designed to be backend-agnostic. While it currently uses Skia as the primary rendering engine, the API abstracts the underlying implementation.