diff --git a/site/docs/dev/contrib/SuggestedReviewers.png b/site/docs/dev/contrib/SuggestedReviewers.png new file mode 100644 index 0000000000..e633114e8a Binary files /dev/null and b/site/docs/dev/contrib/SuggestedReviewers.png differ diff --git a/site/docs/dev/design/PdfLogicalDocumentStructure.png b/site/docs/dev/design/PdfLogicalDocumentStructure.png new file mode 100644 index 0000000000..90840e501b Binary files /dev/null and b/site/docs/dev/design/PdfLogicalDocumentStructure.png differ diff --git a/site/docs/dev/design/conical/_index.md b/site/docs/dev/design/conical/_index.md index 0f8978d163..8d7ff413e3 100644 --- a/site/docs/dev/design/conical/_index.md +++ b/site/docs/dev/design/conical/_index.md @@ -15,11 +15,12 @@ MathJax.Hub.Config({ (Please refresh the page if you see a lot of dollars instead of math symbols.) -We present a fast shading algorithm (compared to bruteforcely solving the quadratic equation of -gradient $t$) for computing the two-point conical gradient (i.e., `createRadialGradient` in +We present a fast shading algorithm (compared to bruteforcely solving the +quadratic equation of gradient $t$) for computing the two-point conical gradient +(i.e., `createRadialGradient` in [spec](https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-createradialgradient)). -It reduced the number of multiplications per pixel from ~10 down to 3, and brought a speedup of up to -26% in our nanobenches. +It reduced the number of multiplications per pixel from ~10 down to 3, and +brought a speedup of up to 26% in our nanobenches. This document has 3 parts: @@ -27,16 +28,19 @@ This document has 3 parts: 2. [Algorithm](#algorithm) 3. [Appendix](#appendix) -Part 1 and 2 are self-explanatory. Part 3 shows how to geometrically proves our Theorem 1 in part -2; it's more complicated but it gives us a nice picture about what's going on. +Part 1 and 2 are self-explanatory. Part 3 shows how to geometrically proves our +Theorem 1 in part 2; it's more complicated but it gives us a nice picture about +what's going on. ## Problem Statement and Setup -Let two circles be $C_0, r_0$ and $C_1, r_1$ where $C$ is the center and $r$ is the radius. For any -point $P = (x, y)$ we want the shader to quickly compute a gradient $t \in \mathbb R$ such that $p$ -is on the linearly interpolated circle with center $C_t = (1-t) \cdot C_0 + t \cdot C_1$ and radius -$r_t = (1-t) \cdot r_0 + t \cdot r_1 > 0$ (note that radius $r_t$ has to be _positive_). If -there are multiple (at most 2) solutions of $t$, choose the bigger one. +Let two circles be $C_0, r_0$ and $C_1, r_1$ where $C$ is the center and $r$ is +the radius. For any point $P = (x, y)$ we want the shader to quickly compute a +gradient $t \in \mathbb R$ such that $p$ is on the linearly interpolated circle +with center $C_t = (1-t) \cdot C_0 + t \cdot C_1$ and radius +$r_t = (1-t) \cdot r_0 + t \cdot r_1 > 0$ (note that radius $r_t$ has to be +_positive_). If there are multiple (at most 2) solutions of $t$, choose the +bigger one. There are two degenerated cases: @@ -45,90 +49,109 @@ There are two degenerated cases: -They are easy to handle so we won't cover them here. From now on, we assume $C_0 \neq C_1$ and $r_0 +They are easy to handle so we won't cover them here. From now on, we assume +$C_0 \neq C_1$ and $r_0 \neq r_1$. -As $r_0 \neq r_1$, we can find a focal point $C_f = (1-f) \cdot C_0 + f \cdot C_1$ where its -corresponding linearly interpolated radius $r_f = (1-f) \cdot r_0 + f \cdot r_1 = 0$. -Solving the latter equation gets us $f = r_0 / (r_0 - r_1)$. +As $r_0 \neq r_1$, we can find a focal point +$C_f = (1-f) \cdot C_0 + f \cdot C_1$ where its corresponding linearly +interpolated radius $r_f = (1-f) \cdot r_0 + f \cdot r_1 = 0$. Solving the +latter equation gets us $f = r_0 / (r_0 - r_1)$. -As $C_0 \neq C_1$, focal point $C_f$ is different from $C_1$ unless $r_1 = 0$. If $r_1 = 0$, we can -swap $C_0, r_0$ with $C_1, r_1$, compute swapped gradient $t_s$ as if $r_1 \neq 0$, and finally set -$t = 1 - t_s$. The only catch here is that with multiple solutions of $t_s$, we shall choose the -smaller one (so $t$ could be the bigger one). +As $C_0 \neq C_1$, focal point $C_f$ is different from $C_1$ unless $r_1 = 0$. +If $r_1 = 0$, we can swap $C_0, r_0$ with $C_1, r_1$, compute swapped gradient +$t_s$ as if $r_1 \neq 0$, and finally set $t = 1 - t_s$. The only catch here is +that with multiple solutions of $t_s$, we shall choose the smaller one (so $t$ +could be the bigger one). -Assuming that we've done swapping if necessary so $C_1 \neq C_f$, we can then do a linear -transformation to map $C_f, C_1$ to $(0, 0), (1, 0)$. After the transformation: +Assuming that we've done swapping if necessary so $C_1 \neq C_f$, we can then do +a linear transformation to map $C_f, C_1$ to $(0, 0), (1, 0)$. After the +transformation: 1. All centers $C_t = (x_t, 0)$ must be on the $x$ axis 2. The radius $r_t$ is $x_t r_1$. 3. Given $x_t$ , we can derive $t = f + (1 - f) x_t$ -From now on, we'll focus on how to quickly computes $x_t$. Note that $r_t > 0$ so we're only -interested positive solution $x_t$. Again, if there are multiple $x_t$ solutions, we may want to -find the bigger one if $1 - f > 0$, and smaller one if $1 - f < 0$, so the corresponding $t$ is -always the bigger one (note that $f \neq 1$, otherwise we'll swap $C_0, r_0$ with $C_1, r_1$). +From now on, we'll focus on how to quickly computes $x_t$. Note that $r_t > 0$ +so we're only interested positive solution $x_t$. Again, if there are multiple +$x_t$ solutions, we may want to find the bigger one if $1 - f > 0$, and smaller +one if $1 - f < 0$, so the corresponding $t$ is always the bigger one (note that +$f \neq 1$, otherwise we'll swap $C_0, r_0$ with $C_1, r_1$). ## Algorithm **Theorem 1.** The solution to $x_t$ is 1. $\frac{x^2 + y^2}{(1 + r_1) x} = \frac{x^2 + y^2}{2 x}$ if $r_1 = 1$ -2. $\left(\sqrt{(r_1^2 - 1) y ^2 + r_1^2 x^2} - x\right) / (r_1^2 - 1)$ if $r_1 > 1$ -3. $\left(\pm \sqrt{(r_1^2 - 1) y ^2 + r_1^2 x^2} - x\right) / (r_1^2 - 1)$ if $r_1 < 1$. +2. $\left(\sqrt{(r_1^2 - 1) y ^2 + r_1^2 x^2} - x\right) / (r_1^2 - 1)$ if + $r_1 > 1$ +3. $\left(\pm \sqrt{(r_1^2 - 1) y ^2 + r_1^2 x^2} - x\right) / (r_1^2 - 1)$ if + $r_1 < 1$. -Case 2 always produces a valid $x_t$. Case 1 and 3 requires $x > 0$ to produce valid $x_t > 0$. Case -3 may have no solution at all if $(r_1^2 - 1) y^2 + r_1^2 x^2 < 0$. +Case 2 always produces a valid $x_t$. Case 1 and 3 requires $x > 0$ to produce +valid $x_t > 0$. Case 3 may have no solution at all if +$(r_1^2 - 1) y^2 + r_1^2 x^2 < 0$. -_Proof._ Algebriacally, solving the quadratic equation $(x_t - x)^2 + y^2 = (x_t r_1)^2$ and -eliminate negative $x_t$ solutions get us the theorem. +_Proof._ Algebriacally, solving the quadratic equation +$(x_t - x)^2 + y^2 = (x_t r_1)^2$ and eliminate negative $x_t$ solutions get us +the theorem. -Alternatively, we can also combine Corollary 2., 3., and Lemma 4. in the Appendix to geometrically -prove the theorem. $\square$ +Alternatively, we can also combine Corollary 2., 3., and Lemma 4. in the +Appendix to geometrically prove the theorem. $\square$ Theorem 1 by itself is not sufficient for our shader algorithm because: 1. we still need to compute $t$ from $x_t$ (remember that $t = f + (1-f) x_t$); 2. we still need to handle cases of choosing the bigger/smaller $x_t$; -3. we still need to handle the swapped case (we swap $C_0, r_0$ with $C_1, r_1$ if $r_1 = 0$); -4. there are way too many multiplications and divisions in Theorem 1 that would slow our shader. +3. we still need to handle the swapped case (we swap $C_0, r_0$ with $C_1, r_1$ + if $r_1 = 0$); +4. there are way too many multiplications and divisions in Theorem 1 that would + slow our shader. -Issue 2 and 3 are solved by generating different shader code based on different situations. So they -are mainly correctness issues rather than performance issues. Issue 1 and 4 are performance -critical, and they will affect how we handle issue 2 and 3. +Issue 2 and 3 are solved by generating different shader code based on different +situations. So they are mainly correctness issues rather than performance +issues. Issue 1 and 4 are performance critical, and they will affect how we +handle issue 2 and 3. -The key to handle 1 and 4 efficiently is to fold as many multiplications and divisions into the -linear transformation matrix, which the shader has to do anyway (remember our linear transformation -to map $C_f, C_1$ to $(0, 0), (1, 0)$). +The key to handle 1 and 4 efficiently is to fold as many multiplications and +divisions into the linear transformation matrix, which the shader has to do +anyway (remember our linear transformation to map $C_f, C_1$ to +$(0, 0), (1, 0)$). -For example, let $\hat x, \hat y = |1-f|x, |1-f|y$. Computing $\hat x_t$ with respect to $\hat x, -\hat y$ allow us to have $t = f + (1 - f)x_t = f + \text{sign}(1-f) \cdot \hat x_t$. That saves us -one multiplication. Applying similar techniques to Theorem 1 gets us: +For example, let $\hat x, \hat y = |1-f|x, |1-f|y$. Computing $\hat x_t$ with +respect to $\hat x, +\hat y$ allow us to have +$t = f + (1 - f)x_t = f + \text{sign}(1-f) \cdot \hat x_t$. That saves us one +multiplication. Applying similar techniques to Theorem 1 gets us: 1. If $r_1 = 1$, let $x' = x/2,~ y' = y/2$, then $x_t = (x'^2 + y'^2) / x'$. -2. If $r_1 > 1$, let $x' = r_1 / (r_1^2 - 1) x,~ y' = \frac{\sqrt{r_1^2 - 1}}{r_1^2 - 1} y$, then +2. If $r_1 > 1$, let + $x' = r_1 / (r_1^2 - 1) x,~ y' = \frac{\sqrt{r_1^2 - 1}}{r_1^2 - 1} y$, then $x_t = \sqrt{x'^2 + y'^2} - x' / r_1$ -3. If $r_1 < 1$, let $x' = r_1 / (r_1^2 - 1) x,~ y' = \frac{\sqrt{1 - r_1^2}}{r_1^2 - 1} y$, then +3. If $r_1 < 1$, let + $x' = r_1 / (r_1^2 - 1) x,~ y' = \frac{\sqrt{1 - r_1^2}}{r_1^2 - 1} y$, then $x_t = \pm\sqrt{x'^2 - y'^2} - x' / r_1$ -Combining it with the swapping, the equation $t = f + (1-f) x_t$, and the fact that we only want -positive $x_t > 0$ and bigger $t$, we have our final algorithm: +Combining it with the swapping, the equation $t = f + (1-f) x_t$, and the fact +that we only want positive $x_t > 0$ and bigger $t$, we have our final +algorithm: **Algorithm 1.** -1. Let $C'_0, r'_0, C'_1, r'_1 = C_0, r_0, C_1, r_1$ if there is no swapping and $C'_0, +1. Let $C'_0, r'_0, C'_1, r'_1 = C_0, r_0, C_1, r_1$ if there is no swapping and + $C'_0, r'_0, C'_1, r'_1 = C_1, r_1, C_0, r_0$ if there is swapping. 2. Let $f = r'_0 / (r'_0 - r'_1)$ and $1 - f = r'_1 / (r'_1 - r'_0)$ 3. Let $x' = x/2,~ y' = y/2$ if $r_1 = 1$, and - $x' = r_1 / (r_1^2 - 1) x,~ y' = \sqrt{|r_1^2 - 1|} / (r_1^2 - 1) y$ if $r_1 \neq 1$ + $x' = r_1 / (r_1^2 - 1) x,~ y' = \sqrt{|r_1^2 - 1|} / (r_1^2 - 1) y$ if + $r_1 \neq 1$ 4. Let $\hat x = |1 - f|x', \hat y = |1 - f|y'$ 5. If $r_1 = 1$, let $\hat x_t = (\hat x^2 + \hat y^2) / \hat x$ -6. If $r_1 > 1$, - let $\hat x_t = \sqrt{\hat x^2 + \hat y^2} - \hat x / r_1$ +6. If $r_1 > 1$, let $\hat x_t = \sqrt{\hat x^2 + \hat y^2} - \hat x / r_1$ 7. If $r_1 < 1$ 8. return invalid if $\hat x^2 - \hat y^2 < 0$ -9. let $\hat x_t = -\sqrt{\hat x^2 - \hat y^2} - \hat x / r_1$ if we've swapped $r_0, r_1$, - or if $1 - f < 0$ +9. let $\hat x_t = -\sqrt{\hat x^2 - \hat y^2} - \hat x / r_1$ if we've swapped + $r_0, r_1$, or if $1 - f < 0$ 10. let $\hat x_t = \sqrt{\hat x^2 - \hat y^2} - \hat x / r_1$ otherwise @@ -136,74 +159,87 @@ positive $x_t > 0$ and bigger $t$, we have our final algorithm: 12. Let $t = f + \text{sign}(1 - f) \hat x_t$ 13. If swapped, let $t = 1 - t$ -In step 7, we try to select either the smaller or bigger $\hat x_t$ based on whether the final $t$ -has a negative or positive relationship with $\hat x_t$. It's negative if we've swapped, or if -$\text{sign}(1 - f)$ is negative (these two cannot both happen). +In step 7, we try to select either the smaller or bigger $\hat x_t$ based on +whether the final $t$ has a negative or positive relationship with $\hat x_t$. +It's negative if we've swapped, or if $\text{sign}(1 - f)$ is negative (these +two cannot both happen). -Note that all the computations and if decisions not involving $\hat x, \hat y$ can be precomputed -before the shading stage. The two if decisions $\hat x^2 - \hat y^2 < 0$ and $\hat x^t < 0$ can -also be omitted by precomputing the shading area that never violates those conditions. +Note that all the computations and if decisions not involving $\hat x, \hat y$ +can be precomputed before the shading stage. The two if decisions +$\hat x^2 - \hat y^2 < 0$ and $\hat x^t < 0$ can also be omitted by precomputing +the shading area that never violates those conditions. The number of operations per shading is thus: - 1 addition, 2 multiplications, and 1 division if $r_1 = 1$ -- 2 additions, 3 multiplications, and 1 sqrt for $r_1 \neq 1$ (count subtraction as addition; - dividing $r_1$ is multiplying $1/r_1$) +- 2 additions, 3 multiplications, and 1 sqrt for $r_1 \neq 1$ (count subtraction + as addition; dividing $r_1$ is multiplying $1/r_1$) - 1 more addition operation if $f \neq 0$ - 1 more addition operation if swapped. -In comparison, for $r_1 \neq 1$ case, our current raster pipeline shading algorithm (which shall -hopefully soon be upgraded to the algorithm described here) mainly uses formula $$t = 0.5 \cdot -(1/a) \cdot \left(-b \pm \sqrt{b^2 - 4ac}\right)$$ It precomputes $a = 1 - (r_1 - r_0)^2, 1/a, r1 - -r0$. Number $b = -2 \cdot (x + (r1 - r0) \cdot r0)$ costs 2 multiplications and 1 addition. Number -$c = x^2 + y^2 - r_0^2$ costs 3 multiplications and 2 additions. And the final $t$ costs 5 more -multiplications, 1 more sqrt, and 2 more additions. That's a total of 5 additions, 10 -multiplications, and 1 sqrt. (Our algorithm has 2-4 additions, 3 multiplications, and 1 sqrt.) Even -if it saves the $0.5 \cdot (1/a), 4a, r_0^2$ and $(r_1 - r_0) r_0$ multiplications, there are still -6 multiplications. Moreover, it sends in 4 unitofmrs to the shader while our algorithm only needs 2 -uniforms ($1/r_1$ and $f$). +In comparison, for $r_1 \neq 1$ case, our current raster pipeline shading +algorithm (which shall hopefully soon be upgraded to the algorithm described +here) mainly uses formula +$$t = 0.5 \cdot +(1/a) \cdot \left(-b \pm \sqrt{b^2 - 4ac}\right)$$ It precomputes +$a = 1 - (r_1 - r_0)^2, 1/a, r1 - +r0$. Number +$b = -2 \cdot (x + (r1 - r0) \cdot r0)$ costs 2 multiplications and 1 addition. +Number $c = x^2 + y^2 - r_0^2$ costs 3 multiplications and 2 additions. And the +final $t$ costs 5 more multiplications, 1 more sqrt, and 2 more additions. +That's a total of 5 additions, 10 multiplications, and 1 sqrt. (Our algorithm +has 2-4 additions, 3 multiplications, and 1 sqrt.) Even if it saves the +$0.5 \cdot (1/a), 4a, r_0^2$ and $(r_1 - r_0) r_0$ multiplications, there are +still 6 multiplications. Moreover, it sends in 4 unitofmrs to the shader while +our algorithm only needs 2 uniforms ($1/r_1$ and $f$). ## Appendix **Lemma 1.** Draw a ray from $C_f = (0, 0)$ to $P = (x, y)$. For every -intersection points $P_1$ between that ray and circle $C_1 = (1, 0), r_1$, there exists an $x_t$ -that equals to the length of segment $C_f P$ over length of segment $C_f P_1$. That is, -$x_t = || C_f P || / ||C_f P_1||$ +intersection points $P_1$ between that ray and circle $C_1 = (1, 0), r_1$, there +exists an $x_t$ that equals to the length of segment $C_f P$ over length of +segment $C_f P_1$. That is, $x_t = || C_f P || / ||C_f P_1||$ -_Proof._ Draw a line from $P$ that's parallel to $C_1 P_1$. Let it intersect with $x$-axis on point -$C = (x', y')$. +_Proof._ Draw a line from $P$ that's parallel to $C_1 P_1$. Let it intersect +with $x$-axis on point $C = (x', y')$. - + Triangle $\triangle C_f C P$ is similar to triangle $\triangle C_f C_1 P_1$. -Therefore $||P C|| = ||P_1 C_1|| \cdot (||C_f C|| / ||C_f C_1||) = r_1 x'$. Thus $x'$ is a solution -to $x_t$. Because triangle $\triangle C_f C P$ and triangle $\triangle C_f C_1 P_1$ are similar, $x' -= ||C_f C_1|| \cdot (||C_f P|| / ||C_f P_1||) = ||C_f P|| / ||C_f P_1||$. $\square$ +Therefore $||P C|| = ||P_1 C_1|| \cdot (||C_f C|| / ||C_f C_1||) = r_1 x'$. Thus +$x'$ is a solution to $x_t$. Because triangle $\triangle C_f C P$ and triangle +$\triangle C_f C_1 P_1$ are similar, +$x' += ||C_f C_1|| \cdot (||C_f P|| / ||C_f P_1||) = ||C_f P|| / ||C_f P_1||$. +$\square$ -**Lemma 2.** For every solution $x_t$, if we extend/shrink segment $C_f P$ to $C_f P_1$ with ratio -$1 / x_t$ (i.e., find $P_1$ on ray $C_f P$ such that $||C_f P_1|| / ||C_f P|| = 1 / x_t$), then -$P_1$ must be on circle $C_1, r_1$. +**Lemma 2.** For every solution $x_t$, if we extend/shrink segment $C_f P$ to +$C_f P_1$ with ratio $1 / x_t$ (i.e., find $P_1$ on ray $C_f P$ such that +$||C_f P_1|| / ||C_f P|| = 1 / x_t$), then $P_1$ must be on circle $C_1, r_1$. -_Proof._ Let $C_t = (x_t, 0)$. Triangle $\triangle C_f C_t P$ is similar to $C_f C_1 P_1$. Therefore -$||C_1 P_1|| = r_1$ and $P_1$ is on circle $C_1, r_1$. $\square$ +_Proof._ Let $C_t = (x_t, 0)$. Triangle $\triangle C_f C_t P$ is similar to +$C_f C_1 P_1$. Therefore $||C_1 P_1|| = r_1$ and $P_1$ is on circle $C_1, r_1$. +$\square$ -**Corollary 1.** By lemma 1. and 2., we conclude that the number of solutions $x_t$ is equal to the -number of intersections between ray $C_f P$ and circle $C_1, r_1$. Therefore +**Corollary 1.** By lemma 1. and 2., we conclude that the number of solutions +$x_t$ is equal to the number of intersections between ray $C_f P$ and circle +$C_1, r_1$. Therefore -- when $r_1 > 1$, there's always one unique intersection/solution; we call this "well-behaved"; this - was previously known as the "inside" case; -- when $r_1 = 1$, there's either one or zero intersection/solution (excluding $C_f$ which is always - on the circle); we call this "focal-on-circle"; this was previously known as the "edge" case; +- when $r_1 > 1$, there's always one unique intersection/solution; we call this + "well-behaved"; this was previously known as the "inside" case; +- when $r_1 = 1$, there's either one or zero intersection/solution (excluding + $C_f$ which is always on the circle); we call this "focal-on-circle"; this was + previously known as the "edge" case; - - + + -- when $r_1 < 1$, there may be $0, 1$, or $2$ solutions; this was also previously as the "outside" - case. +- when $r_1 < 1$, there may be $0, 1$, or $2$ solutions; this was also + previously as the "outside" case. - - - + + + **Lemma 3.** When solution exists, one such solution is @@ -211,47 +247,48 @@ $$ x_t = {|| C_f P || \over ||C_f P_1||} = \frac{x^2 + y^2}{x + \sqrt{(r_1^2 - 1) y^2 + r_1^2 x^2}} $$ -_Proof._ As $C_f = (0, 0), P = (x, y)$, we have $||C_f P|| = \sqrt(x^2 + y^2)$. So we'll mainly -focus on how to compute $||C_f P_1||$. +_Proof._ As $C_f = (0, 0), P = (x, y)$, we have $||C_f P|| = \sqrt(x^2 + y^2)$. +So we'll mainly focus on how to compute $||C_f P_1||$. **When $x \geq 0$:** - + -Let $X_P = (x, 0)$ and $H$ be a point on $C_f P_1$ such that $C_1 H$ is perpendicular to $C_1 -P_1$. Triangle $\triangle C_1 H C_f$ is similar to triangle $\triangle P X_P C_f$. Thus +Let $X_P = (x, 0)$ and $H$ be a point on $C_f P_1$ such that $C_1 H$ is +perpendicular to $C_1 +P_1$. Triangle $\triangle C_1 H C_f$ is similar to triangle +$\triangle P X_P C_f$. Thus $$||C_f H|| = ||C_f C_1|| \cdot (||C_f X_P|| / ||C_f P||) = x / \sqrt{x^2 + y^2}$$ $$||C_1 H|| = ||C_f C_1|| \cdot (||P X_P|| / ||C_f P||) = y / \sqrt{x^2 + y^2}$$ Triangle $\triangle C_1 H P_1$ is a right triangle with hypotenuse $r_1$. Hence $$ ||H P_1|| = \sqrt{r_1^2 - ||C_1 H||^2} = \sqrt{r_1^2 - y^2 / (x^2 + y^2)} $$ -We have -\begin{align} -||C_f P_1|| &= ||C_f H|| + ||H P_1|| \\\\\\ -&= x / \sqrt{x^2 + y^2} + \sqrt{r_1^2 - y^2 / (x^2 + y^2)} \\\\\\ -&= \frac{x + \sqrt{r_1^2 (x^2 + y^2) - y^2}}{\sqrt{x^2 + y^2}} \\\\\\ -&= \frac{x + \sqrt{(r_1^2 - 1) y^2 + r_1^2 x^2}}{\sqrt{x^2 + y^2}} -\end{align} +We have \begin{align} ||C_f P_1|| &= ||C_f H|| + ||H P_1|| \\\\\\ &= x / +\sqrt{x^2 + y^2} + \sqrt{r_1^2 - y^2 / (x^2 + y^2)} \\\\\\ &= \frac{x + +\sqrt{r_1^2 (x^2 + y^2) - y^2}}{\sqrt{x^2 + y^2}} \\\\\\ &= \frac{x + +\sqrt{(r_1^2 - 1) y^2 + r_1^2 x^2}}{\sqrt{x^2 + y^2}} \end{align} **When $x < 0$:** -Define $X_P$ and $H$ similarly as before except that now $H$ is on ray $P_1 C_f$ instead of -$C_f P_1$. +Define $X_P$ and $H$ similarly as before except that now $H$ is on ray $P_1 C_f$ +instead of $C_f P_1$. - + -As before, triangle $\triangle C_1 H C_f$ is similar to triangle $\triangle P X_P C_f$, and triangle -$\triangle C_1 H P_1$ is a right triangle, so we have +As before, triangle $\triangle C_1 H C_f$ is similar to triangle +$\triangle P X_P C_f$, and triangle $\triangle C_1 H P_1$ is a right triangle, +so we have $$||C_f H|| = ||C_f C_1|| \cdot (||C_f X_P|| / ||C_f P||) = -x / \sqrt{x^2 + y^2}$$ $$||C_1 H|| = ||C_f C_1|| \cdot (||P X_P|| / ||C_f P||) = y / \sqrt{x^2 + y^2}$$ $$ ||H P_1|| = \sqrt{r_1^2 - ||C_1 H||^2} = \sqrt{r_1^2 - y^2 / (x^2 + y^2)} $$ Note that the only difference is changing $x$ to $-x$ because $x$ is negative. -Also note that now $||C_f P_1|| = -||C_f H|| + ||H P_1||$ and we have $-||C_f H||$ instead of -$||C_f H||$. That negation cancels out the negation of $-x$ so we get the same equation -of $||C_f P_1||$ for both $x \geq 0$ and $x < 0$ cases: +Also note that now $||C_f P_1|| = -||C_f H|| + ||H P_1||$ and we have +$-||C_f H||$ instead of $||C_f H||$. That negation cancels out the negation of +$-x$ so we get the same equation of $||C_f P_1||$ for both $x \geq 0$ and +$x < 0$ cases: $$ ||C_f P_1|| = \frac{x + \sqrt{(r_1^2 - 1) y^2 + r_1^2 x^2}}{\sqrt{x^2 + y^2}} @@ -312,7 +349,7 @@ $x_t > 0 \Leftrightarrow x > 0$ if the solution exists.) *Proof.* Case 1 follows naturally from Lemma 3. and Corollary 1. - + For case 2, we notice that $||C_f P_1||$ could be diff --git a/site/docs/dev/design/conical/corollary2.2.1.svg b/site/docs/dev/design/conical/corollary2.2.1.svg new file mode 100644 index 0000000000..624540502c --- /dev/null +++ b/site/docs/dev/design/conical/corollary2.2.1.svg @@ -0,0 +1,233 @@ + + + + +Creator: FreeHEP Graphics2D Driver Producer: geogebra.export.SVGExtensions Revision: 12753 Source: Date: Friday, December 22, 2017 4:11:08 PM EST + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/site/docs/dev/design/conical/corollary2.2.2.svg b/site/docs/dev/design/conical/corollary2.2.2.svg new file mode 100644 index 0000000000..b32cabd781 --- /dev/null +++ b/site/docs/dev/design/conical/corollary2.2.2.svg @@ -0,0 +1,213 @@ + + + + +Creator: FreeHEP Graphics2D Driver Producer: geogebra.export.SVGExtensions Revision: 12753 Source: Date: Friday, December 22, 2017 4:12:44 PM EST + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/site/docs/dev/design/conical/corollary2.3.1.svg b/site/docs/dev/design/conical/corollary2.3.1.svg new file mode 100644 index 0000000000..1a458eddd8 --- /dev/null +++ b/site/docs/dev/design/conical/corollary2.3.1.svg @@ -0,0 +1,213 @@ + + + + +Creator: FreeHEP Graphics2D Driver Producer: geogebra.export.SVGExtensions Revision: 12753 Source: Date: Friday, December 22, 2017 4:14:25 PM EST + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/site/docs/dev/design/conical/corollary2.3.2.svg b/site/docs/dev/design/conical/corollary2.3.2.svg new file mode 100644 index 0000000000..ed5e61bd6d --- /dev/null +++ b/site/docs/dev/design/conical/corollary2.3.2.svg @@ -0,0 +1,233 @@ + + + + +Creator: FreeHEP Graphics2D Driver Producer: geogebra.export.SVGExtensions Revision: 12753 Source: Date: Friday, December 22, 2017 4:15:24 PM EST + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/site/docs/dev/design/conical/corollary2.3.3.svg b/site/docs/dev/design/conical/corollary2.3.3.svg new file mode 100644 index 0000000000..cfef0b068d --- /dev/null +++ b/site/docs/dev/design/conical/corollary2.3.3.svg @@ -0,0 +1,253 @@ + + + + +Creator: FreeHEP Graphics2D Driver Producer: geogebra.export.SVGExtensions Revision: 12753 Source: Date: Friday, December 22, 2017 4:23:26 PM EST + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/site/docs/dev/design/conical/lemma1.svg b/site/docs/dev/design/conical/lemma1.svg new file mode 100644 index 0000000000..8aa566ba84 --- /dev/null +++ b/site/docs/dev/design/conical/lemma1.svg @@ -0,0 +1,298 @@ + + + + +Creator: FreeHEP Graphics2D Driver Producer: geogebra.export.SVGExtensions Revision: 12753 Source: Date: Friday, December 22, 2017 3:02:35 PM EST + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/site/docs/dev/design/conical/lemma3.1.svg b/site/docs/dev/design/conical/lemma3.1.svg new file mode 100644 index 0000000000..2d4d2801eb --- /dev/null +++ b/site/docs/dev/design/conical/lemma3.1.svg @@ -0,0 +1,328 @@ + + + + +Creator: FreeHEP Graphics2D Driver Producer: geogebra.export.SVGExtensions Revision: 12753 Source: Date: Friday, December 22, 2017 4:53:23 PM EST + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/site/docs/dev/design/conical/lemma3.2.svg b/site/docs/dev/design/conical/lemma3.2.svg new file mode 100644 index 0000000000..a38bee0736 --- /dev/null +++ b/site/docs/dev/design/conical/lemma3.2.svg @@ -0,0 +1,328 @@ + + + + +Creator: FreeHEP Graphics2D Driver Producer: geogebra.export.SVGExtensions Revision: 12753 Source: Date: Wednesday, December 27, 2017 9:52:32 AM EST + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/site/docs/dev/design/conical/lemma4.svg b/site/docs/dev/design/conical/lemma4.svg new file mode 100644 index 0000000000..1930a8a328 --- /dev/null +++ b/site/docs/dev/design/conical/lemma4.svg @@ -0,0 +1,338 @@ + + + + +Creator: FreeHEP Graphics2D Driver Producer: geogebra.export.SVGExtensions Revision: 12753 Source: Date: Wednesday, December 27, 2017 4:17:43 PM EST + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/site/docs/dev/design/pdftheory.md b/site/docs/dev/design/pdftheory.md index c54daa9e78..e686026fa4 100644 --- a/site/docs/dev/design/pdftheory.md +++ b/site/docs/dev/design/pdftheory.md @@ -49,7 +49,7 @@ serializing the PDF file. ## PDF Objects and Document Structure -![PDF Logical Document Structure](/dev/design/PdfLogicalDocumentStructure.png) +![PDF Logical Document Structure](../PdfLogicalDocumentStructure.png) **Background**: The PDF file format has a header, a set of objects and then a footer that contains a table of contents for all of the objects in the document diff --git a/site/docs/dev/testing/BlameView.png b/site/docs/dev/testing/BlameView.png new file mode 100644 index 0000000000..8884dbcf25 Binary files /dev/null and b/site/docs/dev/testing/BlameView.png differ diff --git a/site/docs/dev/testing/ByTest.png b/site/docs/dev/testing/ByTest.png new file mode 100644 index 0000000000..75857f1674 Binary files /dev/null and b/site/docs/dev/testing/ByTest.png differ diff --git a/site/docs/dev/testing/Cluster.png b/site/docs/dev/testing/Cluster.png new file mode 100644 index 0000000000..caf8700b85 Binary files /dev/null and b/site/docs/dev/testing/Cluster.png differ diff --git a/site/docs/dev/testing/ClusterConfig.png b/site/docs/dev/testing/ClusterConfig.png new file mode 100644 index 0000000000..6854d9527d Binary files /dev/null and b/site/docs/dev/testing/ClusterConfig.png differ diff --git a/site/docs/dev/testing/Digests.png b/site/docs/dev/testing/Digests.png new file mode 100644 index 0000000000..efd811fb49 Binary files /dev/null and b/site/docs/dev/testing/Digests.png differ diff --git a/site/docs/dev/testing/DotDiagram.png b/site/docs/dev/testing/DotDiagram.png new file mode 100644 index 0000000000..7bf8b990b8 Binary files /dev/null and b/site/docs/dev/testing/DotDiagram.png differ diff --git a/site/docs/dev/testing/Grid.png b/site/docs/dev/testing/Grid.png new file mode 100644 index 0000000000..192d340a0b Binary files /dev/null and b/site/docs/dev/testing/Grid.png differ diff --git a/site/docs/dev/testing/Ignores.png b/site/docs/dev/testing/Ignores.png new file mode 100644 index 0000000000..a4200ca36d Binary files /dev/null and b/site/docs/dev/testing/Ignores.png differ diff --git a/site/docs/dev/testing/Isolate.png b/site/docs/dev/testing/Isolate.png new file mode 100644 index 0000000000..b6330b9f68 Binary files /dev/null and b/site/docs/dev/testing/Isolate.png differ diff --git a/site/docs/dev/testing/IssueHighlight.png b/site/docs/dev/testing/IssueHighlight.png new file mode 100644 index 0000000000..c21fda9b99 Binary files /dev/null and b/site/docs/dev/testing/IssueHighlight.png differ diff --git a/site/docs/dev/testing/Perf.png b/site/docs/dev/testing/Perf.png new file mode 100644 index 0000000000..a6885a898c Binary files /dev/null and b/site/docs/dev/testing/Perf.png differ diff --git a/site/docs/dev/testing/Regression.png b/site/docs/dev/testing/Regression.png new file mode 100644 index 0000000000..b9f7ac50bb Binary files /dev/null and b/site/docs/dev/testing/Regression.png differ diff --git a/site/docs/dev/testing/Search.png b/site/docs/dev/testing/Search.png new file mode 100644 index 0000000000..4e8491e3c9 Binary files /dev/null and b/site/docs/dev/testing/Search.png differ diff --git a/site/docs/dev/testing/Status.png b/site/docs/dev/testing/Status.png new file mode 100644 index 0000000000..4b835eb2da Binary files /dev/null and b/site/docs/dev/testing/Status.png differ diff --git a/site/docs/dev/testing/download.md b/site/docs/dev/testing/download.md index 45f8e215c8..2f81b0cff6 100644 --- a/site/docs/dev/testing/download.md +++ b/site/docs/dev/testing/download.md @@ -19,13 +19,13 @@ Add the checkout location to your $PATH. To download the isolated files for a test first visit the build status page and find the "isolated output" link: - + Follow that link to find the hash of the isolated outputs: - + Then run `isolateserver.py` with --isolated set to that hash: diff --git a/site/docs/dev/testing/skiagold.md b/site/docs/dev/testing/skiagold.md index 6acf078d33..ad98c7eec0 100644 --- a/site/docs/dev/testing/skiagold.md +++ b/site/docs/dev/testing/skiagold.md @@ -48,14 +48,14 @@ Solution today: - Blame is not sorted in any particular order - Digests are clustered by runs and the most minimal set of blame - +
- Select digests for triage - Digests will be listed in order with largest difference first - Click to open the digest view with detailed information - +
- Open bugs for identified owner(s) @@ -65,7 +65,7 @@ Solution today: - The URL reference to the digest in Issue Tracker will link the bug to the digest in Gold - +

@@ -88,7 +88,7 @@ To find your results: - Note: It is not yet implemented in the UI but possible to filter the view by CL. Delete hashes in the URL to only include the hash for your CL. - +
To rebaseline images: @@ -96,7 +96,7 @@ To rebaseline images: - Access the Ignores view and create a new, short-interval (hours) ignore for the most affected configuration(s) - +
- Click on the Ignore to bring up a search view filtered by the affected @@ -141,7 +141,7 @@ Solution: - Access the By Test view - +
- Click the magnifier to filter by configuration @@ -150,12 +150,12 @@ Solution: - Click on configurations under “parameters” to highlight data points and compare - +
- Access the Grid view to see NxN diffs - +
- Access the Dot diagram to see history of commits for the trace @@ -163,7 +163,7 @@ Solution: - Each line represents a configuration - Dot colors distinguish between digests - +

@@ -181,5 +181,5 @@ Solution: - Access the Search view - Select any parameters desired to search across tests - +
diff --git a/site/docs/dev/testing/skiaperf.md b/site/docs/dev/testing/skiaperf.md index 1e33148981..62b810b17e 100644 --- a/site/docs/dev/testing/skiaperf.md +++ b/site/docs/dev/testing/skiaperf.md @@ -9,7 +9,7 @@ linkTitle: "Skia Perf" [Skia Perf](https://perf.skia.org) is a web application for analyzing and viewing performance metrics produced by Skia's testing infrastructure. -
+
Skia tests across a large number of platforms and configurations, and each commit to Skia generates more than 400,000 individual values that are sent to @@ -18,11 +18,11 @@ memory and coverage data. Perf offers clustering, which is a tool to pick out trends and patterns in large sets of traces. -
+
And can generate alerts when those trends spot a regression: -
+
## Calculations diff --git a/site/docs/dev/tools/buttons.png b/site/docs/dev/tools/buttons.png new file mode 100644 index 0000000000..917069a0f7 Binary files /dev/null and b/site/docs/dev/tools/buttons.png differ diff --git a/site/docs/dev/tools/crosshair.png b/site/docs/dev/tools/crosshair.png new file mode 100644 index 0000000000..d231eee5c0 Binary files /dev/null and b/site/docs/dev/tools/crosshair.png differ diff --git a/site/docs/dev/tools/debugger.md b/site/docs/dev/tools/debugger.md index 3e21e557bc..ced53452e2 100644 --- a/site/docs/dev/tools/debugger.md +++ b/site/docs/dev/tools/debugger.md @@ -20,7 +20,7 @@ Features: - Android offscreen layer visualization - Shared resource viewer - + ## User Guide @@ -33,8 +33,8 @@ capture one from an android device using the ### Command Playback and Filters Try playing back the commands within the current frame using the lower play -button , -(the one not in a circle) You should see the image built up one draw at a time. +button , (the +one not in a circle) You should see the image built up one draw at a time. Many commands manipulate the matrix or clip but don't make any visible change when run. Try filtering these out by pasting @@ -52,18 +52,18 @@ using `,` (comma) and `.` (period). > at the beginning. Any command can be expanded using the - icon to see -all of the parameters that were recorded with that command. + icon to see all of +the parameters that were recorded with that command. Commands can be disabled or enabled with the checkbox that becomes available after expanding the command's detail view. Jog the command playhead to the end of the list with the - button. + button. ### Frame playback - + The sample file contains multiple frames. Use the encircled play button to play back the frames. The current frame is indictated by the slider position, and the @@ -77,7 +77,7 @@ the end of its list. If the command playhead is somewhere in the middle, say ### Resources Tab - + Any resources that were referenced by commands in the file appear here. As of Dec 2019, this only shows images. @@ -97,7 +97,7 @@ ids in the process that recorded the SKP. ### Android Layers - + When MSKPs are recorded in Android, Extra information about offscreen hardware layers is recorded. The sample google calendar mskp linked above contains this @@ -121,7 +121,7 @@ by clicking the `Exit` button on the layer box. ### Crosshair and Breakpoints - + Clicking any point in the main view will toggle a red crosshair for selecting pixels. the selected pixel's color is shown in several formats on the right @@ -135,12 +135,12 @@ command that draws something you see in the viewer. ### GPU Op Bounds and Other settings - + Each of the filtered commands from above has a colored number to its right -. This is the -GPU operation id. When multiple commands share a GPU op id, this indicates that -they were batched together when sent to the GPU. In the WASM debugger, this goes +. This is the GPU +operation id. When multiple commands share a GPU op id, this indicates that they +were batched together when sent to the GPU. In the WASM debugger, this goes though WebGL. There is a "Display GPU Op Bounds" toggle in the upper right of the interface. @@ -162,7 +162,7 @@ the pixel was drawn to more than once. ### Image fit and download buttons. - + These buttons resize the main view. they are, from left to right: diff --git a/site/docs/dev/tools/debugger.png b/site/docs/dev/tools/debugger.png new file mode 100644 index 0000000000..3659f7584a Binary files /dev/null and b/site/docs/dev/tools/debugger.png differ diff --git a/site/docs/dev/tools/end.png b/site/docs/dev/tools/end.png new file mode 100644 index 0000000000..3d9fa2f52e Binary files /dev/null and b/site/docs/dev/tools/end.png differ diff --git a/site/docs/dev/tools/expand.png b/site/docs/dev/tools/expand.png new file mode 100644 index 0000000000..45f6574a0f Binary files /dev/null and b/site/docs/dev/tools/expand.png differ diff --git a/site/docs/dev/tools/frameplayback.png b/site/docs/dev/tools/frameplayback.png new file mode 100644 index 0000000000..e58a2c3025 Binary files /dev/null and b/site/docs/dev/tools/frameplayback.png differ diff --git a/site/docs/dev/tools/gpuop.png b/site/docs/dev/tools/gpuop.png new file mode 100644 index 0000000000..88aa3bf8ea Binary files /dev/null and b/site/docs/dev/tools/gpuop.png differ diff --git a/site/docs/dev/tools/image.png b/site/docs/dev/tools/image.png new file mode 100644 index 0000000000..24b1dcf1e9 Binary files /dev/null and b/site/docs/dev/tools/image.png differ diff --git a/site/docs/dev/tools/layers.png b/site/docs/dev/tools/layers.png new file mode 100644 index 0000000000..af56d1cce7 Binary files /dev/null and b/site/docs/dev/tools/layers.png differ diff --git a/site/docs/dev/tools/onlinedebugger.png b/site/docs/dev/tools/onlinedebugger.png new file mode 100644 index 0000000000..39cb7f1211 Binary files /dev/null and b/site/docs/dev/tools/onlinedebugger.png differ diff --git a/site/docs/dev/tools/playcommands.png b/site/docs/dev/tools/playcommands.png new file mode 100644 index 0000000000..75cb5f63f9 Binary files /dev/null and b/site/docs/dev/tools/playcommands.png differ diff --git a/site/docs/dev/tools/resources.png b/site/docs/dev/tools/resources.png new file mode 100644 index 0000000000..8fe810e0e4 Binary files /dev/null and b/site/docs/dev/tools/resources.png differ diff --git a/site/docs/dev/tools/settings.png b/site/docs/dev/tools/settings.png new file mode 100644 index 0000000000..35857a6d63 Binary files /dev/null and b/site/docs/dev/tools/settings.png differ diff --git a/site/docs/dev/tools/tracing.md b/site/docs/dev/tools/tracing.md index ad7057c771..3d20a9394c 100644 --- a/site/docs/dev/tools/tracing.md +++ b/site/docs/dev/tools/tracing.md @@ -35,13 +35,13 @@ clutter and slowdown in the interface), it's best to run a small number of tests tracing. Once you have generated a file in this way, go to [chrome://tracing](chrome://tracing), click Load: -![Load Button](tracing_load.png) +![Load Button](../tracing_load.png) ... then select the JSON file. The data will be loaded and can be navigated/inspected using the tracing tools. Tip: press '?' for a help screen explaining the available keyboard and mouse controls. -![Tracing interface](tracing.png) +![Tracing interface](../tracing.png) Android ATrace -------------- diff --git a/site/docs/dev/tools/tracing.png b/site/docs/dev/tools/tracing.png new file mode 100644 index 0000000000..a971fba5cf Binary files /dev/null and b/site/docs/dev/tools/tracing.png differ diff --git a/site/docs/dev/tools/tracing_load.png b/site/docs/dev/tools/tracing_load.png new file mode 100644 index 0000000000..35e5c28b00 Binary files /dev/null and b/site/docs/dev/tools/tracing_load.png differ diff --git a/site/docs/user/modules/PathKit_effects.png b/site/docs/user/modules/PathKit_effects.png new file mode 100644 index 0000000000..1dbbb72cdf Binary files /dev/null and b/site/docs/user/modules/PathKit_effects.png differ