OLD | NEW |
1 Tips & FAQ | 1 Tips & FAQ |
2 ========== | 2 ========== |
3 | 3 |
4 + [Gyp Options](#gypdefines) | 4 + [Gyp Options](#gypdefines) |
5 + [Bitmap Subsetting](#bitmap-subsetting) | 5 + [Bitmap Subsetting](#bitmap-subsetting) |
6 + [Capture a `.skp` file on a web page in Chromium](#skp-capture) | 6 + [Capture a `.skp` file on a web page in Chromium](#skp-capture) |
7 + [Capture a `.mskp` file on a web page in Chromium](#mskp-capture) | 7 + [Capture a `.mskp` file on a web page in Chromium](#mskp-capture) |
8 + [How to add hardware acceleration in Skia](#hw-acceleration) | 8 + [How to add hardware acceleration in Skia](#hw-acceleration) |
9 + [Does Skia support Font hinting?](#font-hinting) | 9 + [Does Skia support Font hinting?](#font-hinting) |
10 + [Does Skia shape text (kerning)?](#kerning) | 10 + [Does Skia shape text (kerning)?](#kerning) |
11 + [How do I add drop shadow on text?](#text-shadow) | 11 + [How do I add drop shadow on text?](#text-shadow) |
12 | 12 |
13 * * * | 13 * * * |
14 | 14 |
15 <span id="gypdefines"></span> | 15 <span id="gypdefines">Gyp Options</span> |
16 | 16 ---------------------------------------- |
17 Gyp Options | |
18 ----------- | |
19 | 17 |
20 When running `sync-and-gyp`, the `GYP_DEFINES` environment variable can | 18 When running `sync-and-gyp`, the `GYP_DEFINES` environment variable can |
21 be used to change Skia’s compile-time settings, using a | 19 be used to change Skia’s compile-time settings, using a |
22 space-separated list of key=value pairs. For example, to disable both | 20 space-separated list of key=value pairs. For example, to disable both |
23 the Skia GPU backend and PDF backends, run it as follows: | 21 the Skia GPU backend and PDF backends, run it as follows: |
24 | 22 |
25 <!--?prettify lang=sh?--> | 23 <!--?prettify lang=sh?--> |
26 | 24 |
27 GYP_DEFINES='skia_gpu=0 skia_pdf=0' python bin/sync-and-gyp | 25 GYP_DEFINES='skia_gpu=0 skia_pdf=0' python bin/sync-and-gyp |
28 ninja -C out/Debug | 26 ninja -C out/Debug |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
67 | 65 |
68 <!--?prettify lang=sh?--> | 66 <!--?prettify lang=sh?--> |
69 | 67 |
70 CC='clang' CXX='clang++' SKIA_OUT=~/build/skia_clang python bin/sync-and-gyp | 68 CC='clang' CXX='clang++' SKIA_OUT=~/build/skia_clang python bin/sync-and-gyp |
71 CC='gcc' CXX='g++' SKIA_OUT=~/build/skia_gcc python bin/sync-and-gyp | 69 CC='gcc' CXX='g++' SKIA_OUT=~/build/skia_gcc python bin/sync-and-gyp |
72 ninja -C ~/build/skia_clang/Debug | 70 ninja -C ~/build/skia_clang/Debug |
73 ninja -C ~/build/skia_gcc/Debug | 71 ninja -C ~/build/skia_gcc/Debug |
74 | 72 |
75 * * * | 73 * * * |
76 | 74 |
77 <span id="bitmap-subsetting"></span> | |
78 | 75 |
79 Bitmap Subsetting | 76 |
80 ----------------- | 77 <span id="bitmap-subsetting">Bitmap Subsetting</span> |
| 78 ----------------------------------------------------- |
81 | 79 |
82 Taking a subset of a bitmap is effectively free - no pixels are copied or | 80 Taking a subset of a bitmap is effectively free - no pixels are copied or |
83 memory is allocated. This allows Skia to offer an API that typically operates | 81 memory is allocated. This allows Skia to offer an API that typically operates |
84 on entire bitmaps; clients who want to operate on a subset of a bitmap can use | 82 on entire bitmaps; clients who want to operate on a subset of a bitmap can use |
85 the following pattern, here being used to magnify a portion of an image with | 83 the following pattern, here being used to magnify a portion of an image with |
86 drawBitmapNine(): | 84 drawBitmapNine(): |
87 | 85 |
88 SkBitmap subset; | 86 SkBitmap subset; |
89 bitmap.extractSubset(&subset, rect); | 87 bitmap.extractSubset(&subset, rect); |
90 canvas->drawBitmapNine(subset, ...); | 88 canvas->drawBitmapNine(subset, ...); |
91 | 89 |
92 [An example](https://fiddle.skia.org/c/@subset_example) | 90 [An example](https://fiddle.skia.org/c/@subset_example) |
93 | 91 |
94 | 92 |
95 * * * | 93 * * * |
96 | 94 |
97 <span id="skp-capture"></span> | 95 <span id="skp-capture">Capture a `.skp` file on a web page in Chromium</span> |
98 | 96 ----------------------------------------------------------------------------- |
99 Capture a `.skp` file on a web page in Chromium | |
100 ----------------------------------------------- | |
101 | 97 |
102 1. Launch Chrome or Chromium with `--no-sandbox --enable-gpu-benchmarking` | 98 1. Launch Chrome or Chromium with `--no-sandbox --enable-gpu-benchmarking` |
103 2. Open the JS console (ctrl-shift-J) | 99 2. Open the JS console (ctrl-shift-J) |
104 3. Execute: `chrome.gpuBenchmarking.printToSkPicture('/tmp')` | 100 3. Execute: `chrome.gpuBenchmarking.printToSkPicture('/tmp')` |
105 This returns "undefined" on success. | 101 This returns "undefined" on success. |
106 | 102 |
107 Open the resulting file in the [Skia Debugger](/dev/tools/debugger), rasterize i
t with `dm`, | 103 Open the resulting file in the [Skia Debugger](/dev/tools/debugger), rasterize i
t with `dm`, |
108 or use Skia's `SampleApp` to view it: | 104 or use Skia's `SampleApp` to view it: |
109 | 105 |
110 <!--?prettify lang=sh?--> | 106 <!--?prettify lang=sh?--> |
111 | 107 |
112 out/Release/dm --src skp --skps /tmp/layer_0.skp -w /tmp \ | 108 out/Release/dm --src skp --skps /tmp/layer_0.skp -w /tmp \ |
113 --config 8888 gpu pdf --verbose | 109 --config 8888 gpu pdf --verbose |
114 ls -l /tmp/*/skp/layer_0.skp.* | 110 ls -l /tmp/*/skp/layer_0.skp.* |
115 | 111 |
116 out/Release/SampleApp --picture /tmp/layer_0.skp | 112 out/Release/SampleApp --picture /tmp/layer_0.skp |
117 | 113 |
118 * * * | 114 * * * |
119 | 115 |
120 <span id="mskp-capture"></span> | 116 <span id="mskp-capture">Capture a `.mskp` file on a web page in Chromium</span> |
121 | 117 ------------------------------------------------------------------------------- |
122 Capture a `.mskp` file on a web page in Chromium | |
123 ----------------------------------------------- | |
124 | 118 |
125 Multipage Skia Picture files capture the commands sent to produce PDFs | 119 Multipage Skia Picture files capture the commands sent to produce PDFs |
126 and printed documents. | 120 and printed documents. |
127 | 121 |
128 1. Launch Chrome or Chromium with `--no-sandbox --enable-gpu-benchmarking` | 122 1. Launch Chrome or Chromium with `--no-sandbox --enable-gpu-benchmarking` |
129 2. Open the JS console (ctrl-shift-J) | 123 2. Open the JS console (ctrl-shift-J) |
130 3. Execute: `chrome.gpuBenchmarking.printPagesToSkPictures('/tmp/filename.mskp'
)` | 124 3. Execute: `chrome.gpuBenchmarking.printPagesToSkPictures('/tmp/filename.mskp'
)` |
131 This returns "undefined" on success. | 125 This returns "undefined" on success. |
132 | 126 |
133 Open the resulting file in the [Skia Debugger](/dev/tools/debugger) or | 127 Open the resulting file in the [Skia Debugger](/dev/tools/debugger) or |
134 process it with `dm`. | 128 process it with `dm`. |
135 | 129 |
136 <!--?prettify lang=sh?--> | 130 <!--?prettify lang=sh?--> |
137 | 131 |
138 experimental/tools/mskp_parser.py /tmp/filename.mskp /tmp/filename.mskp.skp | 132 experimental/tools/mskp_parser.py /tmp/filename.mskp /tmp/filename.mskp.skp |
139 ls -l /tmp/filename.mskp.skp | 133 ls -l /tmp/filename.mskp.skp |
140 # open filename.mskp.skp in the debugger. | 134 # open filename.mskp.skp in the debugger. |
141 | 135 |
142 out/Release/dm --src mskp --mskps /tmp/filename.mskp -w /tmp \ | 136 out/Release/dm --src mskp --mskps /tmp/filename.mskp -w /tmp \ |
143 --config pdf --verbose | 137 --config pdf --verbose |
144 ls -l /tmp/pdf/mskp/filename.mskp | 138 ls -l /tmp/pdf/mskp/filename.mskp.pdf |
145 | 139 |
146 * * * | 140 * * * |
147 | 141 |
148 <span id="hw-acceleration"></span> | 142 <span id="hw-acceleration">How to add hardware acceleration in Skia</span> |
149 | 143 -------------------------------------------------------------------------- |
150 How to add hardware acceleration in Skia | |
151 ---------------------------------------- | |
152 | 144 |
153 There are two ways Skia takes advantage of specific hardware. | 145 There are two ways Skia takes advantage of specific hardware. |
154 | 146 |
155 1. Subclass SkCanvas | 147 1. Subclass SkCanvas |
156 | 148 |
157 Since all drawing calls go through SkCanvas, those calls can be | 149 Since all drawing calls go through SkCanvas, those calls can be |
158 redirected to a different graphics API. SkGLCanvas has been | 150 redirected to a different graphics API. SkGLCanvas has been |
159 written to direct its drawing calls to OpenGL. See src/gl/ | 151 written to direct its drawing calls to OpenGL. See src/gl/ |
160 | 152 |
161 2. Custom bottleneck routines | 153 2. Custom bottleneck routines |
162 | 154 |
163 There are sets of bottleneck routines inside the blits of Skia | 155 There are sets of bottleneck routines inside the blits of Skia |
164 that can be replace on a platform in order to take advantage of | 156 that can be replace on a platform in order to take advantage of |
165 specific CPU features. One such example is the NEON SIMD | 157 specific CPU features. One such example is the NEON SIMD |
166 instructions on ARM v7 devices. See src/opts/ | 158 instructions on ARM v7 devices. See src/opts/ |
167 | 159 |
168 * * * | 160 * * * |
169 | 161 |
170 <span id="font-hinting"></span> | 162 <span id="font-hinting">Does Skia support Font hinting?</span> |
171 | 163 -------------------------------------------------------------- |
172 Does Skia support Font hinting? | |
173 ------------------------------- | |
174 | 164 |
175 Skia has a built-in font cache, but it does not know how to actual render font | 165 Skia has a built-in font cache, but it does not know how to actual render font |
176 files like TrueType into its cache. For that it relies on the platform to | 166 files like TrueType into its cache. For that it relies on the platform to |
177 supply an instance of SkScalerContext. This is Skia's abstract interface for | 167 supply an instance of SkScalerContext. This is Skia's abstract interface for |
178 communicating with a font scaler engine. In src/ports you can see support | 168 communicating with a font scaler engine. In src/ports you can see support |
179 files for FreeType, Mac OS X, and Windows GDI font engines. Other font | 169 files for FreeType, Mac OS X, and Windows GDI font engines. Other font |
180 engines can easily be supported in a like manner. | 170 engines can easily be supported in a like manner. |
181 | 171 |
182 | 172 |
183 * * * | 173 * * * |
184 | 174 |
185 <span id="kerning"></span> | 175 <span id="kerning">Does Skia shape text (kerning)?</span> |
186 | 176 --------------------------------------------------------- |
187 Does Skia shape text (kerning)? | |
188 ------------------------------- | |
189 | 177 |
190 No. Skia provides interfaces to draw glyphs, but does not implement a | 178 No. Skia provides interfaces to draw glyphs, but does not implement a |
191 text shaper. Skia's client's often use | 179 text shaper. Skia's client's often use |
192 [HarfBuzz](http://www.freedesktop.org/wiki/Software/HarfBuzz/) to | 180 [HarfBuzz](http://www.freedesktop.org/wiki/Software/HarfBuzz/) to |
193 generate the glyphs and their positions, including kerning. | 181 generate the glyphs and their positions, including kerning. |
194 | 182 |
195 [Here is an example of how to use Skia and HarfBuzz | 183 [Here is an example of how to use Skia and HarfBuzz |
196 together](https://github.com/aam/skiaex). In the example, a | 184 together](https://github.com/aam/skiaex). In the example, a |
197 `SkTypeface` and a `hb_face_t` are created using the same `mmap()`ed | 185 `SkTypeface` and a `hb_face_t` are created using the same `mmap()`ed |
198 `.ttf` font file. The HarfBuzz face is used to shape unicode text into | 186 `.ttf` font file. The HarfBuzz face is used to shape unicode text into |
199 a sequence of glyphs and positions, and the SkTypeface can then be | 187 a sequence of glyphs and positions, and the SkTypeface can then be |
200 used to draw those glyphs. | 188 used to draw those glyphs. |
201 | 189 |
202 * * * | 190 * * * |
203 | 191 |
204 <span id="text-shadow"></span> | 192 <span id="text-shadow">How do I add drop shadow on text?</span> |
205 | 193 --------------------------------------------------------------- |
206 How do I add drop shadow on text? | |
207 --------------------------------- | |
208 | 194 |
209 <!--?prettify lang=cc?--> | 195 <!--?prettify lang=cc?--> |
210 | 196 |
211 void draw(SkCanvas* canvas) { | 197 void draw(SkCanvas* canvas) { |
212 const char text[] = "Skia"; | 198 const char text[] = "Skia"; |
213 const SkScalar radius = 2.0f; | 199 const SkScalar radius = 2.0f; |
214 const SkScalar xDrop = 2.0f; | 200 const SkScalar xDrop = 2.0f; |
215 const SkScalar yDrop = 2.0f; | 201 const SkScalar yDrop = 2.0f; |
216 const SkScalar x = 8.0f; | 202 const SkScalar x = 8.0f; |
217 const SkScalar y = 52.0f; | 203 const SkScalar y = 52.0f; |
(...skipping 10 matching lines...) Expand all Loading... |
228 SkBlurMaskFilter::ConvertRadiusToSigma(radius), 0)); | 214 SkBlurMaskFilter::ConvertRadiusToSigma(radius), 0)); |
229 canvas->drawText(text, strlen(text), x + xDrop, y + yDrop, blur); | 215 canvas->drawText(text, strlen(text), x + xDrop, y + yDrop, blur); |
230 canvas->drawText(text, strlen(text), x, y, paint); | 216 canvas->drawText(text, strlen(text), x, y, paint); |
231 } | 217 } |
232 | 218 |
233 <a href='https://fiddle.skia.org/c/@text_shadow'><img src='https://fiddle.skia.o
rg/i/@text_shadow_raster.png'></a> | 219 <a href='https://fiddle.skia.org/c/@text_shadow'><img src='https://fiddle.skia.o
rg/i/@text_shadow_raster.png'></a> |
234 | 220 |
235 * * * | 221 * * * |
236 | 222 |
237 <div style="margin-bottom:99%"></div> | 223 <div style="margin-bottom:99%"></div> |
OLD | NEW |