skia2/gyp
caryclark feff7d2d77 Draw more accurate thick-stroked Beziers (disabled)
Draw thick-stroked Beziers by computing the outset quadratic, measuring the error, and subdividing until the error is within a predetermined limit.

To try this CL out, change src/core/SkStroke.h:18 to

  #define QUAD_STROKE_APPROXIMATION 1

or from the command line: CPPFLAGS="-D QUAD_STROKE_APPROXIMATION=1" ./gyp_skia

Here's what's in this CL:

bench/BezierBench.cpp : a microbench for examining where the time is going
gm/beziers.cpp        : random Beziers with various thicknesses
gm/smallarc.cpp       : a distillation of bug skia:2769
samplecode/SampleRotateCircles.cpp : controls added for error, limit, width
src/core/SkStroke.cpp : the new stroke implementation (disabled)
tests/StrokerTest.cpp : a stroke torture test that checks normal and extreme values

The new stroke algorithm has a tweakable parameter:

  stroker.setError(1);  (SkStrokeRec.cpp:112)

The stroke error is the allowable gap between the midpoint of the stroke quadratic and the center Bezier. As the projection from the quadratic approaches the endpoints, the error is decreased proportionally so that it is always inside the quadratic curve.

An overview of how this works:
- For a given T range of a Bezier, compute the perpendiculars and find the points outset and inset for some radius.
- Construct tangents for the quadratic stroke.
- If the tangent don't intersect between them (may happen with cubics), subdivide.
- If the quadratic stroke end points are close (again, may happen with cubics), draw a line between them.
- Compute the quadratic formed by the intersecting tangents.
- If the midpoint of the quadratic is close to the midpoint of the Bezier perpendicular, return the quadratic.
- If the end of the stroke at the Bezier midpoint doesn't intersect the quad's bounds, subdivide.
- Find where the Bezier midpoint ray intersects the quadratic.
- If the intersection is too close to the quad's endpoints, subdivide.
- If the error is large proportional to the intersection's distance to the quad's endpoints, subdivide.

BUG=skia:723,skia:2769

Review URL: https://codereview.chromium.org/558163005
2014-10-09 05:36:04 -07:00
..
android_deps.gyp Reland "Gyp file changes for the android framework." 2014-02-05 16:35:12 +00:00
android_framework_lib.gyp Updates to gyp files for building Android.mk 2014-02-28 16:07:39 +00:00
android_system.gyp Update DEPS and GYP to use the copy of Android in platform_tools. 2013-05-02 12:27:21 +00:00
angle.gyp Try to roll angle again. 2014-06-17 17:28:17 -04:00
animator.gyp rename SkPaintParts.* to SkPaintPart.* 2014-04-18 15:14:25 +00:00
apptype_console.gypi Process Statistics header, add max RSS to render_pdfs 2014-08-11 11:33:51 -07:00
bench.gyp Revert of nanobench: lazily decode bitmaps from SKPs (patchset #1 id:1 of https://codereview.chromium.org/572933006/) 2014-09-17 06:58:39 -07:00
bench.gypi Draw more accurate thick-stroked Beziers (disabled) 2014-10-09 05:36:04 -07:00
canvas_state_lib.gyp Run CanvasState test across a library boundary. 2014-07-22 12:38:55 -07:00
chromeos_deps.gyp GYP Changes and Scripts for Compiling Skia for ChromeOS 2013-06-11 15:52:19 +00:00
common_conditions.gypi Add -Wno-invalid-offsetof to Mac and iOS builds too. 2014-10-07 09:54:18 -07:00
common_variables.gypi Add support for EGL on linux 2014-10-01 10:52:52 -07:00
common.gypi Disable discardable memory for the resource cache until tests pass. 2014-09-11 11:08:50 -07:00
core.gyp SkImage::NewFromGenerator(SkImageGenerator*), and a unit test. 2014-08-18 08:27:09 -07:00
core.gypi Add SkCachedData and use it for SkMipMap 2014-10-08 05:17:12 -07:00
debugger.gyp Move BenchTimer to tools as Timer 2014-06-20 11:29:21 -07:00
dm.gyp share dm and command flags 2014-07-22 10:15:35 -07:00
dm.gypi Remove expectations / -r from DM entirely. 2014-09-09 07:36:57 -07:00
effects.gyp Remove the comments settings for vim tab width and expansion variables. 2013-12-02 22:23:03 +00:00
effects.gypi Adding 3D lut color filter 2014-10-09 05:27:23 -07:00
etc1.gyp Simple PKM image decoder. 2014-05-22 18:40:29 +00:00
everything.gyp No need to include ../tools/flags in include_dirs when depending on flags target. 2014-06-22 16:13:00 -07:00
experimental.gyp Implement C path functions 2014-10-08 06:04:35 -07:00
FileReaderApp.gyp Remove the comments settings for vim tab width and expansion variables. 2013-12-02 22:23:03 +00:00
flags.gyp share dm and command flags 2014-07-22 10:15:35 -07:00
freetype.gyp Build Skia for a bare-bones embedded Linux system. 2014-02-24 20:22:34 +00:00
freetype.gypi Sanitizing source files in Housekeeper-Nightly 2013-08-21 07:01:29 +00:00
giflib.gyp Sanitizing source files in Housekeeper-Nightly 2014-02-25 03:05:18 +00:00
gm.gyp Print max RSS in GM and nanobench too. 2014-08-19 15:55:55 -07:00
gmslides.gypi Draw more accurate thick-stroked Beziers (disabled) 2014-10-09 05:36:04 -07:00
gpu.gyp Add support for EGL on linux 2014-10-01 10:52:52 -07:00
gpu.gypi Make the Sk GL context class an abstract base class 2014-10-09 05:24:15 -07:00
gputest.gyp Remove the comments settings for vim tab width and expansion variables. 2013-12-02 22:23:03 +00:00
images.gyp Disable bitmap decoders for GPU specific formats on Android framework 2014-08-28 05:41:21 -07:00
iOSShell.gyp Revert of nanobench: lazily decode bitmaps from SKPs (patchset #1 id:1 of https://codereview.chromium.org/572933006/) 2014-09-17 06:58:39 -07:00
jsoncpp.gyp Roll jsoncpp, drop dependency on Chromium overrides. 2014-08-19 07:21:00 -07:00
ktx.gyp Pass compressed blitters to our mask drawing algorithm 2014-08-07 08:15:14 -07:00
libjpeg.gyp Build Skia for a bare-bones embedded Linux system. 2014-02-24 20:22:34 +00:00
libpng.gyp Build Skia for a bare-bones embedded Linux system. 2014-02-24 20:22:34 +00:00
libwebp.gyp Have Clang builders build in C++11 mode. 2014-06-30 12:33:11 -07:00
lua.gyp Build Skia for a bare-bones embedded Linux system. 2014-02-24 20:22:34 +00:00
most.gyp Stop building tests. 2014-08-04 09:36:16 -07:00
nacl.gyp Prepare skia for shared library build on android 2013-06-03 12:10:19 +00:00
nanomsg.gyp disable all warnings from nanomsg 2014-08-04 13:11:19 -07:00
opts.gyp Enable the SSSE3 compile time check on all platforms (4th attempt) 2014-07-24 13:53:56 -07:00
pathops_skpclip.gyp SkThreadPool ~~> SkTaskGroup 2014-09-03 15:34:37 -07:00
pathops_unittest.gyp fix battlefield website by disallowing very small coordinates 2014-09-18 10:32:57 -07:00
pathops_unittest.gypi add pathops tight bounds; conform path ops' gyp to unit tests 2014-06-24 07:55:12 -07:00
pathops.gypi path ops work in progress 2013-09-16 15:55:01 +00:00
pdf.gyp Revert of Switch SkPDFStream's internal storage from SkStream to SkData (https://codereview.chromium.org/340783013/) 2014-06-26 14:31:06 -07:00
pdf.gypi Remove the comments settings for vim tab width and expansion variables. 2013-12-02 22:23:03 +00:00
pdfviewer_lib.gyp move some headers out of public 2014-06-17 09:04:45 -07:00
pdfviewer.gyp Remove the comments settings for vim tab width and expansion variables. 2013-12-02 22:23:03 +00:00
pixman_test.gyp Remove the comments settings for vim tab width and expansion variables. 2013-12-02 22:23:03 +00:00
poppler.gyp Since we're only using it on Linux now, just require poppler as a system dependency. 2014-05-20 15:07:53 +00:00
ports.gyp Add a working SkFontMgr_fontconfig. 2014-08-25 12:00:49 -07:00
public_headers.gypi Make the Sk GL context class an abstract base class 2014-10-09 05:24:15 -07:00
record.gypi Add EXPERIMENTAL_beginRecording() for SkRecord-based recording. 2014-06-17 12:08:16 -07:00
SampleApp.gyp add an animated test to verify that high-quality identity scaling doesn't change the image 2014-08-08 12:11:33 -07:00
sfnt.gyp Better rendering detection with DirectWrite. 2014-06-23 08:29:23 -07:00
shapeops_demo.gyp Remove the comments settings for vim tab width and expansion variables. 2013-12-02 22:23:03 +00:00
shapeops_edge.gyp Remove the comments settings for vim tab width and expansion variables. 2013-12-02 22:23:03 +00:00
shapeops_tool.gyp Remove the comments settings for vim tab width and expansion variables. 2013-12-02 22:23:03 +00:00
SimpleCocoaApp.gyp Remove the comments settings for vim tab width and expansion variables. 2013-12-02 22:23:03 +00:00
SimpleiOSApp.gyp get iOS building again 2014-04-05 01:13:43 +00:00
skflate.gyp Build Skia for a bare-bones embedded Linux system. 2014-02-24 20:22:34 +00:00
skia_for_android_framework_defines.gypi Add GrAASmallPathRenderer. 2014-10-06 05:59:05 -07:00
skia_for_chromium_defines.gypi Add GrAASmallPathRenderer. 2014-10-06 05:59:05 -07:00
skia_launcher.gyp Move BenchTimer to tools as Timer 2014-06-20 11:29:21 -07:00
skia_lib.gyp Force linking as C++ library. 2014-08-04 12:51:20 -07:00
svg.gyp Remove the comments settings for vim tab width and expansion variables. 2013-12-02 22:23:03 +00:00
tests.gypi Draw more accurate thick-stroked Beziers (disabled) 2014-10-09 05:36:04 -07:00
tools.gyp Clean up old custom tools now subsumed by nanobench. 2014-09-10 12:11:23 -07:00
utils.gyp Add ETC1 format to SkTextureCompressor 2014-08-05 07:37:27 -07:00
utils.gypi SkThreadPool ~~> SkTaskGroup 2014-09-03 15:34:37 -07:00
v8.gyp No need to include ../tools/flags in include_dirs when depending on flags target. 2014-06-22 16:13:00 -07:00
views_animated.gyp Remove dependency of views on angle 2014-04-29 00:38:39 +00:00
views.gyp Remove dependency of views on angle 2014-04-29 00:38:39 +00:00
webtry.gyp Add pathops and capture stderr so we can get SkDebugf output. 2014-04-28 14:56:32 +00:00
xml.gyp Remove the comments settings for vim tab width and expansion variables. 2013-12-02 22:23:03 +00:00
xps.gyp Remove the comments settings for vim tab width and expansion variables. 2013-12-02 22:23:03 +00:00
zlib.gyp Fix valgrind bot errors introduced in f84722e477. 2014-02-25 18:01:37 +00:00