• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1Tips & FAQ
2==========
3
4+   [Bitmap Subsetting](#bitmap-subsetting)
5+   [Capture a `.skp` file on a web page in Chromium](#skp-capture)
6+   [Capture a `.mskp` file on a web page in Chromium](#mskp-capture)
7+   [How to add hardware acceleration in Skia](#hw-acceleration)
8+   [Does Skia support Font hinting?](#font-hinting)
9+   [Does Skia shape text (kerning)?](#kerning)
10+   [How do I add drop shadow on text?](#text-shadow)
11
12* * *
13
14<span id="bitmap-subsetting">Bitmap Subsetting</span>
15-----------------------------------------------------
16
17Taking a subset of a bitmap is effectively free - no pixels are copied or
18memory is allocated. This allows Skia to offer an API that typically operates
19on entire bitmaps; clients who want to operate on a subset of a bitmap can use
20the following pattern, here being used to magnify a portion of an image with
21drawBitmapNine():
22
23    SkBitmap subset;
24    bitmap.extractSubset(&subset, rect);
25    canvas->drawBitmapNine(subset, ...);
26
27[An example](https://fiddle.skia.org/c/@subset_example)
28
29
30* * *
31
32<span id="skp-capture">Capture a `.skp` file on a web page in Chromium</span>
33-----------------------------------------------------------------------------
34
351.  Launch Chrome or Chromium with `--no-sandbox --enable-gpu-benchmarking`
362.  Open the JS console (ctrl-shift-J)
373.  Execute: `chrome.gpuBenchmarking.printToSkPicture('/tmp')`
38    This returns "undefined" on success.
39
40Open the resulting file in the [Skia Debugger](/dev/tools/debugger), rasterize it with `dm`,
41or use Skia's `SampleApp` to view it:
42
43<!--?prettify lang=sh?-->
44
45    out/Release/dm --src skp --skps /tmp/layer_0.skp -w /tmp \
46        --config 8888 gpu pdf --verbose
47    ls -l /tmp/*/skp/layer_0.skp.*
48
49    out/Release/SampleApp --picture /tmp/layer_0.skp
50
51* * *
52
53<span id="mskp-capture">Capture a `.mskp` file on a web page in Chromium</span>
54-------------------------------------------------------------------------------
55
56Multipage Skia Picture files capture the commands sent to produce PDFs
57and printed documents.
58
591.  Launch Chrome or Chromium with `--no-sandbox --enable-gpu-benchmarking`
602.  Open the JS console (ctrl-shift-J)
613.  Execute: `chrome.gpuBenchmarking.printPagesToSkPictures('/tmp/filename.mskp')`
62    This returns "undefined" on success.
63
64Open the resulting file in the [Skia Debugger](/dev/tools/debugger) or
65process it with `dm`.
66
67<!--?prettify lang=sh?-->
68
69    experimental/tools/mskp_parser.py /tmp/filename.mskp /tmp/filename.mskp.skp
70    ls -l /tmp/filename.mskp.skp
71    # open filename.mskp.skp in the debugger.
72
73    out/Release/dm --src mskp --mskps /tmp/filename.mskp -w /tmp \
74        --config pdf --verbose
75    ls -l /tmp/pdf/mskp/filename.mskp.pdf
76
77* * *
78
79<span id="hw-acceleration">How to add hardware acceleration in Skia</span>
80--------------------------------------------------------------------------
81
82There are two ways Skia takes advantage of specific hardware.
83
841.  Subclass SkCanvas
85
86    Since all drawing calls go through SkCanvas, those calls can be
87    redirected to a different graphics API. SkGLCanvas has been
88    written to direct its drawing calls to OpenGL. See src/gl/
89
902.  Custom bottleneck routines
91
92    There are sets of bottleneck routines inside the blits of Skia
93    that can be replace on a platform in order to take advantage of
94    specific CPU features. One such example is the NEON SIMD
95    instructions on ARM v7 devices. See src/opts/
96
97* * *
98
99<span id="font-hinting">Does Skia support Font hinting?</span>
100--------------------------------------------------------------
101
102Skia has a built-in font cache, but it does not know how to actual render font
103files like TrueType into its cache. For that it relies on the platform to
104supply an instance of SkScalerContext. This is Skia's abstract interface for
105communicating with a font scaler engine. In src/ports you can see support
106files for FreeType, Mac OS X, and Windows GDI font engines. Other font
107engines can easily be supported in a like manner.
108
109
110* * *
111
112<span id="kerning">Does Skia shape text (kerning)?</span>
113---------------------------------------------------------
114
115No.  Skia provides interfaces to draw glyphs, but does not implement a
116text shaper. Skia's client's often use
117[HarfBuzz](http://www.freedesktop.org/wiki/Software/HarfBuzz/) to
118generate the glyphs and their positions, including kerning.
119
120[Here is an example of how to use Skia and HarfBuzz
121together](https://github.com/aam/skiaex).  In the example, a
122`SkTypeface` and a `hb_face_t` are created using the same `mmap()`ed
123`.ttf` font file. The HarfBuzz face is used to shape unicode text into
124a sequence of glyphs and positions, and the SkTypeface can then be
125used to draw those glyphs.
126
127* * *
128
129<span id="text-shadow">How do I add drop shadow on text?</span>
130---------------------------------------------------------------
131
132<!--?prettify lang=cc?-->
133
134    void draw(SkCanvas* canvas) {
135        const char text[] = "Skia";
136        const SkScalar radius = 2.0f;
137        const SkScalar xDrop = 2.0f;
138        const SkScalar yDrop = 2.0f;
139        const SkScalar x = 8.0f;
140        const SkScalar y = 52.0f;
141        const SkScalar textSize = 48.0f;
142        const uint8_t blurAlpha = 127;
143        canvas->drawColor(SK_ColorWHITE);
144        SkPaint paint;
145        paint.setAntiAlias(true);
146        paint.setTextSize(textSize);
147        SkPaint blur(paint);
148        blur.setAlpha(blurAlpha);
149        blur.setMaskFilter(SkBlurMaskFilter::Make(
150            kNormal_SkBlurStyle,
151            SkBlurMaskFilter::ConvertRadiusToSigma(radius), 0));
152        canvas->drawText(text, strlen(text), x + xDrop, y + yDrop, blur);
153        canvas->drawText(text, strlen(text), x, y, paint);
154    }
155
156<a href='https://fiddle.skia.org/c/@text_shadow'><img src='https://fiddle.skia.org/i/@text_shadow_raster.png'></a>
157
158* * *
159
160<div style="margin-bottom:99%"></div>
161