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