Keep 3D points in a quad coplanar when clamping them to reasonable values.

This is necessary because sending quads that aren't coplanar (or,
really, within rounding error of being coplanar) to the plane splitting
code (DrawPolygon::SplitPolygon) confuses the plane splitting code (for
good reason) and leads to incorrect splits that can leave some pieces
undrawn.

There are two major pieces to this change:

 * First, it changes the code that finds the appropriate transition
   point on an edge that passes between positive and negative w (as part
   of eliminating the parts of the quad with negative w) to choose a
   point that is appropriately-clamped rather than nearly-infinite.

 * Second, it adds new clamping code to clamp any remaining out-of-range
   values (or the results of the first part if rounding puts them
   slightly out of range) to clamp by moving them inwards within the
   plane.  Before doing this, if needed, it may also (if none of the
   plane is close enough to the origin at x=0 and y=0) to move z
   coordinates on all of the points in the plane a bit closer to z=0.

Fixed: 1202695
Change-Id: I82b9510710439a81135559ee7d686480cd1f30ff
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2877604
Reviewed-by: Robert Flack <flackr@chromium.org>
Reviewed-by: Kevin Ellis <kevers@chromium.org>
Commit-Queue: David Baron <dbaron@chromium.org>
Cr-Commit-Position: refs/heads/master@{#889969}
6 files changed
tree: e54146b07613d71268951ba2bfacdd630caf03c5
  1. android_webview/
  2. apps/
  3. ash/
  4. base/
  5. build/
  6. build_overrides/
  7. buildtools/
  8. cc/
  9. chrome/
  10. chromecast/
  11. chromeos/
  12. cloud_print/
  13. codelabs/
  14. components/
  15. content/
  16. courgette/
  17. crypto/
  18. dbus/
  19. device/
  20. docs/
  21. extensions/
  22. fuchsia/
  23. gin/
  24. google_apis/
  25. google_update/
  26. gpu/
  27. headless/
  28. infra/
  29. ios/
  30. ipc/
  31. jingle/
  32. media/
  33. mojo/
  34. native_client_sdk/
  35. net/
  36. pdf/
  37. ppapi/
  38. printing/
  39. remoting/
  40. rlz/
  41. sandbox/
  42. services/
  43. skia/
  44. sql/
  45. storage/
  46. styleguide/
  47. testing/
  48. third_party/
  49. tools/
  50. ui/
  51. url/
  52. weblayer/
  53. .clang-format
  54. .clang-tidy
  55. .eslintrc.js
  56. .git-blame-ignore-revs
  57. .gitattributes
  58. .gitignore
  59. .gn
  60. .mailmap
  61. .vpython
  62. .vpython3
  63. .yapfignore
  64. AUTHORS
  65. BUILD.gn
  66. CODE_OF_CONDUCT.md
  67. codereview.settings
  68. DEPS
  69. DIR_METADATA
  70. ENG_REVIEW_OWNERS
  71. LICENSE
  72. LICENSE.chromium_os
  73. OWNERS
  74. PRESUBMIT.py
  75. PRESUBMIT_test.py
  76. PRESUBMIT_test_mocks.py
  77. README.md
  78. WATCHLISTS
README.md

Logo Chromium

Chromium is an open-source browser project that aims to build a safer, faster, and more stable way for all users to experience the web.

The project's web site is https://www.chromium.org.

To check out the source code locally, don't use git clone! Instead, follow the instructions on how to get the code.

Documentation in the source is rooted in docs/README.md.

Learn how to Get Around the Chromium Source Code Directory Structure .

For historical reasons, there are some small top level directories. Now the guidance is that new top level directories are for product (e.g. Chrome, Android WebView, Ash). Even if these products have multiple executables, the code should be in subdirectories of the product.