blob: c477138fc8b3d631807065ba6d0c3f2ca25404d6 [file] [log] [blame] [view]
jcgregorio942262f2015-01-05 11:17:27 -08001Tips & FAQ
2==========
3
halcanary217a3332015-12-22 07:08:12 -08004+ [Bitmap Subsetting](#bitmap-subsetting)
5+ [Capture a `.skp` file on a web page in Chromium](#skp-capture)
halcanaryd39d6f32016-09-12 11:56:28 -07006+ [Capture a `.mskp` file on a web page in Chromium](#mskp-capture)
halcanary217a3332015-12-22 07:08:12 -08007+ [How to add hardware acceleration in Skia](#hw-acceleration)
8+ [Does Skia support Font hinting?](#font-hinting)
9+ [Does Skia shape text (kerning)?](#kerning)
halcanaryff659642016-04-26 04:49:45 -070010+ [How do I add drop shadow on text?](#text-shadow)
halcanary217a3332015-12-22 07:08:12 -080011
12* * *
13
halcanary75a171c2016-09-26 07:27:04 -070014<span id="bitmap-subsetting">Bitmap Subsetting</span>
15-----------------------------------------------------
jcgregorio942262f2015-01-05 11:17:27 -080016
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
jcgregorio1c2a2fe2016-04-22 11:25:43 -070027[An example](https://fiddle.skia.org/c/@subset_example)
28
halcanary217a3332015-12-22 07:08:12 -080029
halcanary8d3f7bd2015-07-09 06:58:06 -070030* * *
31
halcanary75a171c2016-09-26 07:27:04 -070032<span id="skp-capture">Capture a `.skp` file on a web page in Chromium</span>
33-----------------------------------------------------------------------------
halcanary8d3f7bd2015-07-09 06:58:06 -070034
halcanary5f0b0ad2015-07-08 10:56:01 -0700351. 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
pdr1e2a7022016-07-06 06:10:25 -070040Open the resulting file in the [Skia Debugger](/dev/tools/debugger), rasterize it with `dm`,
halcanary8d3f7bd2015-07-09 06:58:06 -070041or use Skia's `SampleApp` to view it:
42
43<!--?prettify lang=sh?-->
halcanary5f0b0ad2015-07-08 10:56:01 -070044
halcanary5f0b0ad2015-07-08 10:56:01 -070045 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
halcanary8d3f7bd2015-07-09 06:58:06 -070049 out/Release/SampleApp --picture /tmp/layer_0.skp
halcanary8d3f7bd2015-07-09 06:58:06 -070050
51* * *
52
halcanary75a171c2016-09-26 07:27:04 -070053<span id="mskp-capture">Capture a `.mskp` file on a web page in Chromium</span>
54-------------------------------------------------------------------------------
halcanaryd39d6f32016-09-12 11:56:28 -070055
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
halcanary75a171c2016-09-26 07:27:04 -070075 ls -l /tmp/pdf/mskp/filename.mskp.pdf
halcanaryd39d6f32016-09-12 11:56:28 -070076
77* * *
78
halcanary75a171c2016-09-26 07:27:04 -070079<span id="hw-acceleration">How to add hardware acceleration in Skia</span>
80--------------------------------------------------------------------------
jcgregorio942262f2015-01-05 11:17:27 -080081
halcanaryb5002392015-11-16 07:37:23 -080082There are two ways Skia takes advantage of specific hardware.
jcgregorio942262f2015-01-05 11:17:27 -080083
halcanaryb5002392015-11-16 07:37:23 -0800841. Subclass SkCanvas
jcgregorio942262f2015-01-05 11:17:27 -080085
halcanaryb5002392015-11-16 07:37:23 -080086 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/
jcgregorio942262f2015-01-05 11:17:27 -080089
halcanaryb5002392015-11-16 07:37:23 -0800902. Custom bottleneck routines
jcgregorio942262f2015-01-05 11:17:27 -080091
halcanaryb5002392015-11-16 07:37:23 -080092 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/
jcgregorio942262f2015-01-05 11:17:27 -080096
halcanary8d3f7bd2015-07-09 06:58:06 -070097* * *
98
halcanary75a171c2016-09-26 07:27:04 -070099<span id="font-hinting">Does Skia support Font hinting?</span>
100--------------------------------------------------------------
jcgregorio942262f2015-01-05 11:17:27 -0800101
102Skia has a built-in font cache, but it does not know how to actual render font
halcanarya58d6762015-12-14 09:50:15 -0800103files 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
jcgregorio942262f2015-01-05 11:17:27 -0800105communicating with a font scaler engine. In src/ports you can see support
halcanarya58d6762015-12-14 09:50:15 -0800106files for FreeType, Mac OS X, and Windows GDI font engines. Other font
jcgregorio942262f2015-01-05 11:17:27 -0800107engines can easily be supported in a like manner.
108
109
halcanarya58d6762015-12-14 09:50:15 -0800110* * *
111
halcanary75a171c2016-09-26 07:27:04 -0700112<span id="kerning">Does Skia shape text (kerning)?</span>
113---------------------------------------------------------
halcanarya58d6762015-12-14 09:50:15 -0800114
115No. Skia provides interfaces to draw glyphs, but does not implement a
halcanary7d1c3e62015-12-14 10:03:31 -0800116text 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.
halcanarya58d6762015-12-14 09:50:15 -0800119
halcanary5441e9f2016-05-03 10:18:30 -0700120[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
halcanaryff659642016-04-26 04:49:45 -0700127* * *
128
halcanary75a171c2016-09-26 07:27:04 -0700129<span id="text-shadow">How do I add drop shadow on text?</span>
130---------------------------------------------------------------
halcanaryff659642016-04-26 04:49:45 -0700131
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
halcanary5441e9f2016-05-03 10:18:30 -0700158* * *
159
halcanarya58d6762015-12-14 09:50:15 -0800160<div style="margin-bottom:99%"></div>