| Skia Update | 
 |  | 
 | Skia : Access | 
 | - https://skia.org | 
 | - https://skia.googlesource.com/skia | 
 |  | 
 | Skia : Overview | 
 | - portable graphics engine | 
 | - 2D transformations + perspective | 
 | - primitives: text, geometry, images | 
 | - effects: shaders, filters, antialiasing, blending | 
 |  | 
 | Skia : Porting | 
 | - C++ and some SIMD assembly | 
 | - Fonts : CoreText, FreeType, GDI, DirectWrite | 
 | - Threads : wrappers for native apis | 
 | - Memory : wrappers for [new, malloc, discardable] | 
 |  | 
 | Skia : Backends | 
 | - Surface | 
 | -- raster : ARGB, RGB16, A8 in software | 
 | -- gpu : transcribe to OpenGL | 
 | - Document | 
 | -- transcribe to PDF or XPS | 
 | - Record and Playback | 
 | -- Picture | 
 | -- Pipe | 
 |  | 
 | Skia : Clients | 
 | - Blink : under the GraphicsContext hood | 
 | - Chrome : ui/gfx and compositor | 
 | - Android : framework | 
 | - third parties : e.g. Mozilla | 
 |  | 
 | Skia In Blink | 
 |  | 
 | Skia In Blink : Fonts | 
 | - SkTypeface and SkFontMgr : platform agnostic | 
 | - Runtime switch between GDI and DirectWrite | 
 | - SkTextBlob to encapsulate runs of text | 
 | - Push LCD decision-making out of Blink | 
 |  | 
 | Skia In Blink : Record-Time-Rasterization | 
 | - What? : direct rendering during “Paint” pass | 
 | -- Image scaling, filters | 
 | -- SVG patterns, masks | 
 | - Problematic in modern Blink | 
 | -- CTM not always known/knowable | 
 | -- Rendering backend not always known (gpu or cpu) | 
 | -- Rasterization takes (too much) time | 
 |  | 
 | Skia In Blink : RTR response | 
 | - SkImageFilter w/ CPU and GPU implementations | 
 | - Bitmap scaling : bilerp, mipmaps, fancy | 
 | - SkPicture for caching SVG | 
 | - SkPicture + saveLayer() for masks | 
 | -- PathOps for resolving complex paths | 
 | - SkPictureShader for device-independent patterns | 
 |  | 
 | Skia In Blink : Recording | 
 | - GraphicsContext (now) backed by SkPicture | 
 | -- draw commands are recorded for later playback | 
 | -- all parameters must be copied or (safely) ref'd | 
 | -- may record more than is currently visible | 
 | - Resulting picture may be replayed multiple times | 
 | -- from different thread(s) | 
 |  | 
 | Skia In Blink : Recording response | 
 | - New implementation | 
 | - Optimized for recording speed | 
 | -- shallow copies whenever possible | 
 | -- rearchitect all Skia effects to be immutable | 
 | - Reentrant-safe for playback in multiple threads | 
 | -- also affected effect subclasses | 
 |  | 
 | Skia In Blink : Playback | 
 | - Separate pass for optimizations (optional) | 
 | -- peep-holes rewrites | 
 | -- compute bounding-box hierarchy for faster tiling | 
 | -- can be done outside of Blink thread | 
 | - GPU optimizations | 
 | -- layer "hoisting" | 
 | -- distance fields : fonts and concave paths | 
 |  | 
 | Skia In Blink : multi-picture-draw | 
 | - mpd(canvas[], picture[], matrix[], paint[]) | 
 | - Requires independent canvas objects | 
 | -- all other parameters can be shared | 
 | -- draw order is unspecified | 
 | - Examples | 
 | -- 1 picture drawing to multiple tiles (canvases) | 
 | -- multiple pictures each drawing to its own layer | 
 |  | 
 | Skia In Blink : MPD optimizations* | 
 | - GPU | 
 | -- "layer hoisting" to reduce rendertarget switching | 
 | -- layer atlasing (also applies to imagefilters) | 
 | -- pre-uploading of textures | 
 | -- atlas yuv (from jpeg) to convert on gpu | 
 | - CPU | 
 | -- parallel execution using thread pool | 
 | -- pre-decoding of images based on visibility | 
 |  | 
 | Skia : Roadmap | 
 |  | 
 | Skia : Roadmap - performance | 
 | - GPU | 
 | -- extended OpenGL features (e.g. geometry shaders) | 
 | -- reordering for increased batching | 
 | -- support for new low-level OpenGL APIs | 
 | - CPU | 
 | -- SIMD applied to floats | 
 | -- smarter culling in pictures | 
 |  | 
 | Skia : Roadmap - API | 
 | - Cross process support | 
 | - Direct support for sRGB | 
 | - Robust file format | 
 | - Support PDF viewing | 
 | - Stable C ABI | 
 | -- bindings for JS, Go, Python, Lua | 
 |  | 
 | Demo |