blob: c72243c495eec6ecec2756434247211172674275 [file] [log] [blame] [edit]
// Skia CPU Backend Dataflow Diagram
// This helps show how data flows through the CPU backend during a draw.
//
// LEGEND:
//
// Colors:
// - Blue: Actors/Processors (Objects that perform actions)
// - Yellow: Data/Configuration (Objects that hold information)
//
// Line Styles:
// - Solid: Data Flow (Objects passed in as parameters in function calls)
// - Dashed: Owns (An object holds a smart pointer (sk_sp) to another)
// - Dotted: Borrows (An object holds a raw pointer or temporary view of another)
digraph SkiaCPUBackend {
rankdir=TB;
splines=ortho;
node [shape=box, style="rounded"];
subgraph cluster_api {
label="API Layer";
style="rounded";
SkCanvas [label="SkCanvas\n(e.g., drawPath)", style=filled, fillcolor=lightblue];
SkSurface [label="SkSurface", style=filled, fillcolor=lightblue];
SkPath [label="SkPath", style=filled, fillcolor=lightyellow];
SkPathRef [label="SkPathRef\n(Heap-allocated Geometry)", style=filled, fillcolor=lightyellow];
SkImage [label="SkImage\n(Immutable Pixels)", style=filled, fillcolor=lightyellow];
SkPaintRecord [
label="{SkPaint | { Color | Style | Stroke Width } | { Stroke Cap | Stroke Join | Stroke Miter Limit } | { <blender> SkBlender | <colorfilter> SkColorFilter | <patheffect> SkPathEffect } | { <maskfilter> SkMaskFilter\n(blur) | <shader> SkShader\n(gradients, etc) | <imagefilter> SkImageFilter\n(shadows, etc) }}",
shape=record,
style=filled,
fillcolor=lightyellow
];
}
subgraph cluster_font_management {
label="Font Management";
style="rounded";
SkFontMgr [label="SkFontMgr\n(Font Discovery)", style=filled, fillcolor=lightblue];
SkTypeface [label="SkTypeface\n(Font Data)", style=filled, fillcolor=lightyellow];
SkFont [label="SkFont\n(Text Style)", style=filled, fillcolor=lightyellow];
}
subgraph cluster_cpu_backend {
label="CPU Backend";
style="rounded";
SkDevice [label="SkBitmapDevice\n(Stateful)", style=filled, fillcolor=lightblue];
SkDraw [label="SkDraw\n(Stateless Orchestrator)", style=filled, fillcolor=lightblue];
SkScan [label="SkScan\n(Shape -> Scanlines)", style=filled, fillcolor=lightblue];
SkRasterPipelineBlitter [label="SkRasterPipelineBlitter", style=filled, fillcolor=lightblue];
SkRasterPipeline [label="SkRasterPipeline\n(Pixel Processing Stages)", style=filled, fillcolor=lightblue];
SkImage_Raster [label="SkImage_Raster\n(subclass)", style=filled, fillcolor=lightyellow];
SkBitmap [label="SkBitmap\n(Pixel Accessor)", style=filled, fillcolor=lightyellow];
SkPixmap [label="SkPixmap\n(Pixel View)", style=filled, fillcolor=lightyellow];
SkPixelRef [label="SkPixelRef\n(Pixel Owner)", style=filled, fillcolor=lightyellow];
}
// Relationships
SkSurface -> SkCanvas [style=dashed];
SkSurface -> SkImage;
SkCanvas -> SkDevice;
SkPath -> SkCanvas;
SkPath -> SkPathRef [style=dashed];
SkPaintRecord -> SkCanvas;
SkFont -> SkCanvas;
SkImage -> SkCanvas;
SkFontMgr -> SkTypeface;
SkFont -> SkTypeface [style=dashed];
SkDevice -> SkDraw;
SkDevice -> SkBitmap [style=dashed];
SkDraw -> SkScan;
SkDraw -> SkRasterPipelineBlitter;
SkScan -> SkRasterPipelineBlitter;
SkRasterPipelineBlitter -> SkRasterPipeline;
SkRasterPipeline -> SkPixmap;
// Pixel Ownership Story
SkImage -> SkImage_Raster [style=dashed];
SkImage_Raster -> SkBitmap [style=dashed];
SkBitmap -> SkPixelRef [style=dashed];
SkBitmap -> SkPixmap [style=dashed];
SkPixmap -> SkPixelRef [style=dotted];
}