Skia is a key part of several shipping products, and as such will continue to track those projects' needs and priorities. However, Skia is also a general purpose graphics engine, and as such there are a number of areas that need additional work.
Porting
Skia has a well-defined porting layer, consisting mostly of back-end support for services like threads, fonts, time, and IO.
- Fonts - skia has its own portable cache for drawing text, but the actual creation of individual glyph images and metrics are left to the porting layer. There are two classes that must be supplied by the port
- SkFontHost - this is a collection of static methods that are responsible for finding font files by name, and for providing read-access to them, most for the scaler context
- SkScalerContext - this is a class that is instantiated for each font strike, that is each combination of a typeface+pointsize+matrix+flags.
- Image Decoders - skia comes with a collection of wrappers for standard image codecs: jpeg, png, gif, bmp, ico, wbmp. These wrappers bind the existing open source codecs into skia's framework (i.e. they return an SkBitmap). The porting layer supplies the exact set of codecs that are available, by implementing SkImageDecoder::Factory.
- Threads - skia can be compiled w/o thread support. However, if support is needed (e.g. to make the font cache useable from multiple threads), then basic operations must be supplied (atomic inc/dec, mutex lock/unlock).
- File IO - as a backend for its stream class (see SkStream), the port needs to supply basic file io (open, read, write, close)
- Time - a port needs to implement a method to return a millisecond clock (not necessarily time of day).
Fortunately, all of the above has been done for several operating systems [Macintosh, Windows, Linux, Android], so it is usually pretty easy to begin with an existing port, and adapt it to a new environment. In particular, the image codecs are all very portable, as is the scaler context class written around FreeType, so often a new port is just an exercise in picking and choosing from existing modules.
Ports
- Android
- This work is taken care of by the android team
- Windows
- Some of this is part of the Chrome product, but more work remains to optimize the Font support
- Macintosh
- More work is needed for better integration with Fonts, and helper libraries to integrate with the windowing environment
- Linux
- fontconfig work is underway
- need someone to help with integration libraries or various windowing kits
- WinMo - TODO
- Symbian - TODO
- iPhone - TODO
Language Bindings
Skia is a C++ library. To expand its usefulness, bindings to other languages are needed
- Perl
- Python
- JavaScript
- C#
- Java (other than the android/dalvik bindings)
- C - a stable C interface that would explicitly hide the size of most complex types, making its more stable across versions (unlike C++)
Frontends
Skia's flexible API should make it viable to support existing APIs and graphc formats. We need readers/translators to parse the following into Skia API calls...
- SVG
- Postscript / PDF
- Flash
- Illustrator
Core Features
These core (missing) features are already planned for, but much of the work remains to be done.
- ICU Layout integration for complex-script support when drawing text
- ImageFilter (ala SkMaskFilter in full color)
- MipMaps (partial implementation exists)
- HitTesting (probably via a subclass of SkCanvas)
- Formalize API around hinting options
- More flexible font chaining
Testing
- Unit tests for bring up on a new port
- Rendering regression tests (comparing w/ a master image)
- Performance tests