| // 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]; | |
| } |