xref: /aosp_15_r20/external/skia/site/docs/user/tips.md (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker---
2*c8dee2aaSAndroid Build Coastguard Workertitle: 'Tips & FAQ'
3*c8dee2aaSAndroid Build Coastguard WorkerlinkTitle: 'Tips & FAQ'
4*c8dee2aaSAndroid Build Coastguard Worker---
5*c8dee2aaSAndroid Build Coastguard Worker
6*c8dee2aaSAndroid Build Coastguard Worker## Capture a `.skp` file on a web page in Chromium
7*c8dee2aaSAndroid Build Coastguard Worker
8*c8dee2aaSAndroid Build Coastguard WorkerUse the script `experimental/tools/web_to_skp` , _or_ do the following:
9*c8dee2aaSAndroid Build Coastguard Worker
10*c8dee2aaSAndroid Build Coastguard Worker1.  Launch Chrome or Chromium with `--no-sandbox --enable-gpu-benchmarking`
11*c8dee2aaSAndroid Build Coastguard Worker2.  Open the JS console (Ctrl+Shift+J (Windows / Linux) or Cmd+Opt+J (MacOS))
12*c8dee2aaSAndroid Build Coastguard Worker3.  Execute: `chrome.gpuBenchmarking.printToSkPicture('/tmp')` This returns
13*c8dee2aaSAndroid Build Coastguard Worker    "undefined" on success.
14*c8dee2aaSAndroid Build Coastguard Worker
15*c8dee2aaSAndroid Build Coastguard WorkerOpen the resulting file in the [Skia Debugger](/docs/dev/tools/debugger),
16*c8dee2aaSAndroid Build Coastguard Workerrasterize it with `dm`, or use Skia's `viewer` to view it:
17*c8dee2aaSAndroid Build Coastguard Worker
18*c8dee2aaSAndroid Build Coastguard Worker<!--?prettify lang=sh?-->
19*c8dee2aaSAndroid Build Coastguard Worker
20*c8dee2aaSAndroid Build Coastguard Worker    out/Release/dm --src skp --skps /tmp/layer_0.skp -w /tmp \
21*c8dee2aaSAndroid Build Coastguard Worker        --config 8888 gpu pdf --verbose
22*c8dee2aaSAndroid Build Coastguard Worker    ls -l /tmp/*/skp/layer_0.skp.*
23*c8dee2aaSAndroid Build Coastguard Worker
24*c8dee2aaSAndroid Build Coastguard Worker    out/Release/viewer --skps /tmp --slide layer_0.skp
25*c8dee2aaSAndroid Build Coastguard Worker
26*c8dee2aaSAndroid Build Coastguard Worker---
27*c8dee2aaSAndroid Build Coastguard Worker
28*c8dee2aaSAndroid Build Coastguard Worker## Capture a `.mskp` file on a web page in Chromium
29*c8dee2aaSAndroid Build Coastguard Worker
30*c8dee2aaSAndroid Build Coastguard WorkerMultipage Skia Picture files capture the commands sent to produce PDFs and
31*c8dee2aaSAndroid Build Coastguard Workerprinted documents.
32*c8dee2aaSAndroid Build Coastguard Worker
33*c8dee2aaSAndroid Build Coastguard WorkerUse the script `experimental/tools/web_to_mskp` , _or_ do the following:
34*c8dee2aaSAndroid Build Coastguard Worker
35*c8dee2aaSAndroid Build Coastguard Worker1.  Launch Chrome or Chromium with `--no-sandbox --enable-gpu-benchmarking`
36*c8dee2aaSAndroid Build Coastguard Worker2.  Open the JS console (Ctrl+Shift+J (Windows / Linux) or Cmd+Opt+J (MacOS))
37*c8dee2aaSAndroid Build Coastguard Worker3.  Execute:
38*c8dee2aaSAndroid Build Coastguard Worker    `chrome.gpuBenchmarking.printPagesToSkPictures('/tmp/filename.mskp')` This
39*c8dee2aaSAndroid Build Coastguard Worker    returns "undefined" on success.
40*c8dee2aaSAndroid Build Coastguard Worker
41*c8dee2aaSAndroid Build Coastguard WorkerOpen the resulting file in the [Skia Debugger](/docs/dev/tools/debugger) or
42*c8dee2aaSAndroid Build Coastguard Workerprocess it with `dm`.
43*c8dee2aaSAndroid Build Coastguard Worker
44*c8dee2aaSAndroid Build Coastguard Worker<!--?prettify lang=sh?-->
45*c8dee2aaSAndroid Build Coastguard Worker
46*c8dee2aaSAndroid Build Coastguard Worker    experimental/tools/mskp_parser.py /tmp/filename.mskp /tmp/filename.mskp.skp
47*c8dee2aaSAndroid Build Coastguard Worker    ls -l /tmp/filename.mskp.skp
48*c8dee2aaSAndroid Build Coastguard Worker    # open filename.mskp.skp in the debugger.
49*c8dee2aaSAndroid Build Coastguard Worker
50*c8dee2aaSAndroid Build Coastguard Worker    out/Release/dm --src mskp --mskps /tmp/filename.mskp -w /tmp \
51*c8dee2aaSAndroid Build Coastguard Worker        --config pdf --verbose
52*c8dee2aaSAndroid Build Coastguard Worker    ls -l /tmp/pdf/mskp/filename.mskp.pdf
53*c8dee2aaSAndroid Build Coastguard Worker
54*c8dee2aaSAndroid Build Coastguard Worker---
55*c8dee2aaSAndroid Build Coastguard Worker
56*c8dee2aaSAndroid Build Coastguard Worker## How to add hardware acceleration in Skia
57*c8dee2aaSAndroid Build Coastguard Worker
58*c8dee2aaSAndroid Build Coastguard WorkerThere are two ways Skia takes advantage of specific hardware.
59*c8dee2aaSAndroid Build Coastguard Worker
60*c8dee2aaSAndroid Build Coastguard Worker1.  Custom bottleneck routines
61*c8dee2aaSAndroid Build Coastguard Worker
62*c8dee2aaSAndroid Build Coastguard Worker    There are sets of bottleneck routines inside the blits of Skia that can be
63*c8dee2aaSAndroid Build Coastguard Worker    replace on a platform in order to take advantage of specific CPU features.
64*c8dee2aaSAndroid Build Coastguard Worker    One such example is the NEON SIMD instructions on ARM v7 devices. See
65*c8dee2aaSAndroid Build Coastguard Worker    [src/opts/](https://skia.googlesource.com/skia/+/main/src/opts/)
66*c8dee2aaSAndroid Build Coastguard Worker
67*c8dee2aaSAndroid Build Coastguard Worker---
68*c8dee2aaSAndroid Build Coastguard Worker
69*c8dee2aaSAndroid Build Coastguard Worker## Does Skia support Font hinting?
70*c8dee2aaSAndroid Build Coastguard Worker
71*c8dee2aaSAndroid Build Coastguard WorkerSkia has a built-in font cache, but it does not know how to actually render font
72*c8dee2aaSAndroid Build Coastguard Workerfiles like TrueType into its cache. For that it relies on the platform to supply
73*c8dee2aaSAndroid Build Coastguard Workeran instance of `SkScalerContext`. This is Skia's abstract interface for
74*c8dee2aaSAndroid Build Coastguard Workercommunicating with a font scaler engine. In src/ports you can see support files
75*c8dee2aaSAndroid Build Coastguard Workerfor FreeType, macOS, and Windows GDI font engines. Other font engines can easily
76*c8dee2aaSAndroid Build Coastguard Workerbe supported in a like manner.
77*c8dee2aaSAndroid Build Coastguard Worker
78*c8dee2aaSAndroid Build Coastguard Worker---
79*c8dee2aaSAndroid Build Coastguard Worker
80*c8dee2aaSAndroid Build Coastguard Worker## Does Skia shape text (kerning)?
81*c8dee2aaSAndroid Build Coastguard Worker
82*c8dee2aaSAndroid Build Coastguard WorkerShaping is the process that translates a span of Unicode text into a span of
83*c8dee2aaSAndroid Build Coastguard Workerpositioned glyphs with the appropriate typefaces.
84*c8dee2aaSAndroid Build Coastguard Worker
85*c8dee2aaSAndroid Build Coastguard WorkerSkia does not shape text. Skia provides interfaces to draw glyphs, but does not
86*c8dee2aaSAndroid Build Coastguard Workerimplement a text shaper. Skia's client's often use
87*c8dee2aaSAndroid Build Coastguard Worker[HarfBuzz](http://www.freedesktop.org/wiki/Software/HarfBuzz/) to generate the
88*c8dee2aaSAndroid Build Coastguard Workerglyphs and their positions, including kerning.
89*c8dee2aaSAndroid Build Coastguard Worker
90*c8dee2aaSAndroid Build Coastguard Worker[Here is an example of how to use Skia and HarfBuzz together](https://github.com/aam/skiaex).
91*c8dee2aaSAndroid Build Coastguard WorkerIn the example, a `SkTypeface` and a `hb_face_t` are created using the same
92*c8dee2aaSAndroid Build Coastguard Worker`mmap()`ed `.ttf` font file. The HarfBuzz face is used to shape unicode text
93*c8dee2aaSAndroid Build Coastguard Workerinto a sequence of glyphs and positions, and the `SkTypeface` can then be used
94*c8dee2aaSAndroid Build Coastguard Workerto draw those glyphs.
95*c8dee2aaSAndroid Build Coastguard Worker
96*c8dee2aaSAndroid Build Coastguard Worker---
97*c8dee2aaSAndroid Build Coastguard Worker
98*c8dee2aaSAndroid Build Coastguard Worker## How do I add drop shadow on text?
99*c8dee2aaSAndroid Build Coastguard Worker
100*c8dee2aaSAndroid Build Coastguard Worker<fiddle-embed-sk name='1ff4da09e515087f7011c7caec2e98ae'></fiddle-embed-sk>
101