aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbors-servo <lbergstrom+bors@mozilla.com>2019-06-03 11:05:56 -0400
committerGitHub <noreply@github.com>2019-06-03 11:05:56 -0400
commit657ed9f1ca0c389d6d668acbe9cf4d5aca18579e (patch)
tree0076b06155fe89f63d31557b1d38f51982443f24
parent22cbf5fd2ae04a496c3ba78f3baa588f2a91028d (diff)
parent8467c00cf3c1865b7ce6a4274b35501f81493c40 (diff)
downloadservo-657ed9f1ca0c389d6d668acbe9cf4d5aca18579e.tar.gz
servo-657ed9f1ca0c389d6d668acbe9cf4d5aca18579e.zip
Auto merge of #23451 - pylbrecht:canvas.rendering, r=Manishearth
Use raqote for 2D canvas rendering <!-- Please describe your changes on the following line: --> --- <!-- Thank you for contributing to Servo! Please replace each `[ ]` by `[X]` when the step is complete, and replace `___` with appropriate data: --> - [x] `./mach build -d` does not report any errors - [x] `./mach test-tidy` does not report any errors - [x] These changes fix (part of) #23431 and #23466 <!-- Either: --> <!-- Also, please make sure that "Allow edits from maintainers" checkbox is checked, so that we can help you if you get stuck somewhere along the way.--> <!-- Pull requests that do not address these steps are welcome, but they will require additional verification as part of the review process. --> <!-- Reviewable:start --> --- This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/23451) <!-- Reviewable:end -->
-rw-r--r--Cargo.lock189
-rw-r--r--components/canvas/Cargo.toml6
-rw-r--r--components/canvas/azure_backend.rs761
-rw-r--r--components/canvas/canvas_data.rs754
-rw-r--r--components/canvas/canvas_paint_thread.rs10
-rw-r--r--components/canvas/lib.rs6
-rw-r--r--components/canvas/raqote_backend.rs262
-rw-r--r--components/constellation/Cargo.toml6
-rw-r--r--components/servo/Cargo.toml10
-rw-r--r--etc/taskcluster/decision_task.py1
-rw-r--r--ports/glutin/Cargo.toml10
-rw-r--r--ports/libmlservo/Cargo.toml4
-rw-r--r--ports/libsimpleservo/api/Cargo.toml16
-rw-r--r--ports/libsimpleservo/capi/Cargo.toml14
-rw-r--r--ports/libsimpleservo/jniapi/Cargo.toml14
-rw-r--r--python/servo/build_commands.py3
-rw-r--r--python/servo/post_build_commands.py2
-rw-r--r--servo-tidy.toml2
18 files changed, 1597 insertions, 473 deletions
diff --git a/Cargo.lock b/Cargo.lock
index d9c547e5bd0..90825fcbf14 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -146,7 +146,7 @@ version = "0.36.0"
source = "git+https://github.com/servo/rust-azure#ca9cc643808f6f63576c5c2cd098e973406cc7f3"
dependencies = [
"cmake 0.1.38 (registry+https://github.com/rust-lang/crates.io-index)",
- "euclid 0.19.7 (registry+https://github.com/rust-lang/crates.io-index)",
+ "euclid 0.19.8 (registry+https://github.com/rust-lang/crates.io-index)",
"libc 0.2.53 (registry+https://github.com/rust-lang/crates.io-index)",
"servo-freetype-sys 4.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
"servo-skia 0.30000021.1 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -424,7 +424,7 @@ dependencies = [
"canvas_traits 0.0.1",
"compositing 0.0.1",
"cssparser 0.25.5 (registry+https://github.com/rust-lang/crates.io-index)",
- "euclid 0.19.7 (registry+https://github.com/rust-lang/crates.io-index)",
+ "euclid 0.19.8 (registry+https://github.com/rust-lang/crates.io-index)",
"fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
"gleam 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)",
"half 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -433,6 +433,7 @@ dependencies = [
"num-traits 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)",
"offscreen_gl_context 0.22.1 (registry+https://github.com/rust-lang/crates.io-index)",
"pixels 0.0.1",
+ "raqote 0.4.1-alpha.0 (git+https://github.com/jrmuizel/raqote)",
"serde_bytes 0.10.4 (registry+https://github.com/rust-lang/crates.io-index)",
"servo_config 0.0.1",
"webrender 0.60.0 (git+https://github.com/servo/webrender)",
@@ -444,7 +445,7 @@ name = "canvas_traits"
version = "0.0.1"
dependencies = [
"cssparser 0.25.5 (registry+https://github.com/rust-lang/crates.io-index)",
- "euclid 0.19.7 (registry+https://github.com/rust-lang/crates.io-index)",
+ "euclid 0.19.8 (registry+https://github.com/rust-lang/crates.io-index)",
"gleam 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)",
"ipc-channel 0.11.2 (registry+https://github.com/rust-lang/crates.io-index)",
"lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -621,7 +622,7 @@ version = "0.0.1"
dependencies = [
"crossbeam-channel 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
"embedder_traits 0.0.1",
- "euclid 0.19.7 (registry+https://github.com/rust-lang/crates.io-index)",
+ "euclid 0.19.8 (registry+https://github.com/rust-lang/crates.io-index)",
"gfx_traits 0.0.1",
"gleam 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)",
"image 0.21.0 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -661,7 +662,7 @@ dependencies = [
"debugger 0.0.1",
"devtools_traits 0.0.1",
"embedder_traits 0.0.1",
- "euclid 0.19.7 (registry+https://github.com/rust-lang/crates.io-index)",
+ "euclid 0.19.8 (registry+https://github.com/rust-lang/crates.io-index)",
"gaol 0.2.0 (git+https://github.com/servo/gaol)",
"gfx 0.0.1",
"gfx_traits 0.0.1",
@@ -721,7 +722,7 @@ dependencies = [
[[package]]
name = "core-text"
-version = "13.1.0"
+version = "13.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"core-foundation 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -1103,6 +1104,16 @@ dependencies = [
]
[[package]]
+name = "dwrote"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.53 (registry+https://github.com/rust-lang/crates.io-index)",
+ "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
name = "either"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1215,7 +1226,7 @@ dependencies = [
[[package]]
name = "euclid"
-version = "0.19.7"
+version = "0.19.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"euclid_macros 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -1244,7 +1255,7 @@ dependencies = [
[[package]]
name = "failure"
-version = "0.1.3"
+version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"backtrace 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -1279,11 +1290,40 @@ dependencies = [
]
[[package]]
+name = "float-ord"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
name = "fnv"
version = "1.0.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
+name = "font-kit"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "byteorder 1.2.7 (registry+https://github.com/rust-lang/crates.io-index)",
+ "core-foundation 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "core-graphics 0.17.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "core-text 13.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "dirs 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "dwrote 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "euclid 0.19.8 (registry+https://github.com/rust-lang/crates.io-index)",
+ "float-ord 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "freetype 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.53 (registry+https://github.com/rust-lang/crates.io-index)",
+ "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "lyon_path 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "memmap 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "servo-fontconfig 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "walkdir 2.2.7 (registry+https://github.com/rust-lang/crates.io-index)",
+ "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
name = "fontsan"
version = "0.4.0"
source = "git+https://github.com/servo/fontsan#29e879c870348c4b3fd51086e42dbb6365171479"
@@ -1308,7 +1348,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "freetype"
-version = "0.4.0"
+version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"libc 0.2.53 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -1405,12 +1445,12 @@ dependencies = [
"byteorder 1.2.7 (registry+https://github.com/rust-lang/crates.io-index)",
"core-foundation 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)",
"core-graphics 0.17.3 (registry+https://github.com/rust-lang/crates.io-index)",
- "core-text 13.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "core-text 13.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
"dwrote 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "euclid 0.19.7 (registry+https://github.com/rust-lang/crates.io-index)",
+ "euclid 0.19.8 (registry+https://github.com/rust-lang/crates.io-index)",
"fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
"fontsan 0.4.0 (git+https://github.com/servo/fontsan)",
- "freetype 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "freetype 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
"gfx_traits 0.0.1",
"harfbuzz-sys 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
"ipc-channel 0.11.2 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -1893,9 +1933,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"cmake 0.1.38 (registry+https://github.com/rust-lang/crates.io-index)",
"core-graphics 0.17.3 (registry+https://github.com/rust-lang/crates.io-index)",
- "core-text 13.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "core-text 13.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
"foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "freetype 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "freetype 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
"pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)",
]
@@ -2265,7 +2305,7 @@ dependencies = [
"canvas_traits 0.0.1",
"crossbeam-channel 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
"embedder_traits 0.0.1",
- "euclid 0.19.7 (registry+https://github.com/rust-lang/crates.io-index)",
+ "euclid 0.19.8 (registry+https://github.com/rust-lang/crates.io-index)",
"fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
"fxhash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
"gfx 0.0.1",
@@ -2311,7 +2351,7 @@ dependencies = [
"atomic_refcell 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
"crossbeam-channel 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
"embedder_traits 0.0.1",
- "euclid 0.19.7 (registry+https://github.com/rust-lang/crates.io-index)",
+ "euclid 0.19.8 (registry+https://github.com/rust-lang/crates.io-index)",
"fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
"fxhash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
"gfx 0.0.1",
@@ -2449,7 +2489,7 @@ dependencies = [
"devtools_traits 0.0.1",
"embedder_traits 0.0.1",
"env_logger 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "euclid 0.19.7 (registry+https://github.com/rust-lang/crates.io-index)",
+ "euclid 0.19.8 (registry+https://github.com/rust-lang/crates.io-index)",
"gaol 0.2.0 (git+https://github.com/servo/gaol)",
"gfx 0.0.1",
"gleam 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -2538,6 +2578,24 @@ dependencies = [
]
[[package]]
+name = "lyon_geom"
+version = "0.12.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "arrayvec 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "euclid 0.19.8 (registry+https://github.com/rust-lang/crates.io-index)",
+ "num-traits 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "lyon_path"
+version = "0.12.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "lyon_geom 0.12.6 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
name = "lzw"
version = "0.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2570,7 +2628,7 @@ dependencies = [
"app_units 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
"crossbeam-channel 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
"cssparser 0.25.5 (registry+https://github.com/rust-lang/crates.io-index)",
- "euclid 0.19.7 (registry+https://github.com/rust-lang/crates.io-index)",
+ "euclid 0.19.8 (registry+https://github.com/rust-lang/crates.io-index)",
"hashglobe 0.1.0",
"hyper 0.12.14 (registry+https://github.com/rust-lang/crates.io-index)",
"hyper_serde 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -2636,6 +2694,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "memmap"
+version = "0.6.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "libc 0.2.53 (registry+https://github.com/rust-lang/crates.io-index)",
+ "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "memmap"
version = "0.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
@@ -3061,7 +3128,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"cgl 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
"core-foundation 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "euclid 0.19.7 (registry+https://github.com/rust-lang/crates.io-index)",
+ "euclid 0.19.8 (registry+https://github.com/rust-lang/crates.io-index)",
"gl_generator 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
"gleam 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)",
"lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -3255,7 +3322,7 @@ dependencies = [
name = "pixels"
version = "0.0.1"
dependencies = [
- "euclid 0.19.7 (registry+https://github.com/rust-lang/crates.io-index)",
+ "euclid 0.19.8 (registry+https://github.com/rust-lang/crates.io-index)",
"malloc_size_of 0.0.1",
"malloc_size_of_derive 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
"serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -3272,7 +3339,7 @@ version = "0.13.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"binary-space-partition 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "euclid 0.19.7 (registry+https://github.com/rust-lang/crates.io-index)",
+ "euclid 0.19.8 (registry+https://github.com/rust-lang/crates.io-index)",
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
"num-traits 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)",
]
@@ -3501,6 +3568,19 @@ dependencies = [
]
[[package]]
+name = "raqote"
+version = "0.4.1-alpha.0"
+source = "git+https://github.com/jrmuizel/raqote#15748d146466bc1db09699fe149cc760b81cdf60"
+dependencies = [
+ "euclid 0.19.8 (registry+https://github.com/rust-lang/crates.io-index)",
+ "font-kit 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "lyon_geom 0.12.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "png 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "sw-composite 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "typed-arena 1.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
name = "rayon"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -3593,7 +3673,7 @@ version = "0.11.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"bindgen 0.49.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "euclid 0.19.7 (registry+https://github.com/rust-lang/crates.io-index)",
+ "euclid 0.19.8 (registry+https://github.com/rust-lang/crates.io-index)",
"gl_generator 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
"gleam 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)",
"glutin 0.21.0 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -3699,7 +3779,7 @@ dependencies = [
"embedder_traits 0.0.1",
"encoding_rs 0.8.12 (registry+https://github.com/rust-lang/crates.io-index)",
"enum-iterator 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "euclid 0.19.7 (registry+https://github.com/rust-lang/crates.io-index)",
+ "euclid 0.19.8 (registry+https://github.com/rust-lang/crates.io-index)",
"fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
"gleam 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)",
"headers-core 0.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -3777,7 +3857,7 @@ dependencies = [
"canvas_traits 0.0.1",
"crossbeam-channel 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
"cssparser 0.25.5 (registry+https://github.com/rust-lang/crates.io-index)",
- "euclid 0.19.7 (registry+https://github.com/rust-lang/crates.io-index)",
+ "euclid 0.19.8 (registry+https://github.com/rust-lang/crates.io-index)",
"gfx_traits 0.0.1",
"html5ever 0.23.0 (registry+https://github.com/rust-lang/crates.io-index)",
"ipc-channel 0.11.2 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -3817,7 +3897,7 @@ dependencies = [
name = "script_tests"
version = "0.0.1"
dependencies = [
- "euclid 0.19.7 (registry+https://github.com/rust-lang/crates.io-index)",
+ "euclid 0.19.8 (registry+https://github.com/rust-lang/crates.io-index)",
"keyboard-types 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)",
"script 0.0.1",
"servo_url 0.0.1",
@@ -3833,7 +3913,7 @@ dependencies = [
"crossbeam-channel 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
"devtools_traits 0.0.1",
"embedder_traits 0.0.1",
- "euclid 0.19.7 (registry+https://github.com/rust-lang/crates.io-index)",
+ "euclid 0.19.8 (registry+https://github.com/rust-lang/crates.io-index)",
"gfx_traits 0.0.1",
"http 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)",
"hyper 0.12.14 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -3935,7 +4015,7 @@ dependencies = [
"bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
"cc 1.0.35 (registry+https://github.com/rust-lang/crates.io-index)",
"crossbeam-channel 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
- "euclid 0.19.7 (registry+https://github.com/rust-lang/crates.io-index)",
+ "euclid 0.19.8 (registry+https://github.com/rust-lang/crates.io-index)",
"gleam 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)",
"glutin 0.21.0 (registry+https://github.com/rust-lang/crates.io-index)",
"image 0.21.0 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -4009,7 +4089,7 @@ source = "git+https://github.com/servo/media#2dabf1ab7e3b6d3b6764eebdf8855431367
dependencies = [
"boxfnonce 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
"byte-slice-cast 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "euclid 0.19.7 (registry+https://github.com/rust-lang/crates.io-index)",
+ "euclid 0.19.8 (registry+https://github.com/rust-lang/crates.io-index)",
"num-traits 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)",
"petgraph 0.4.13 (registry+https://github.com/rust-lang/crates.io-index)",
"serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -4126,7 +4206,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"cgl 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
"cmake 0.1.38 (registry+https://github.com/rust-lang/crates.io-index)",
- "euclid 0.19.7 (registry+https://github.com/rust-lang/crates.io-index)",
+ "euclid 0.19.8 (registry+https://github.com/rust-lang/crates.io-index)",
"expat-sys 2.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
"gleam 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)",
"glutin 0.21.0 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -4171,7 +4251,7 @@ dependencies = [
"dirs 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
"embedder_traits 0.0.1",
"env_logger 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "euclid 0.19.7 (registry+https://github.com/rust-lang/crates.io-index)",
+ "euclid 0.19.8 (registry+https://github.com/rust-lang/crates.io-index)",
"getopts 0.2.17 (registry+https://github.com/rust-lang/crates.io-index)",
"lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -4201,7 +4281,7 @@ name = "servo_geometry"
version = "0.0.1"
dependencies = [
"app_units 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "euclid 0.19.7 (registry+https://github.com/rust-lang/crates.io-index)",
+ "euclid 0.19.8 (registry+https://github.com/rust-lang/crates.io-index)",
"malloc_size_of 0.0.1",
"malloc_size_of_derive 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
"style_traits 0.0.1",
@@ -4471,7 +4551,7 @@ dependencies = [
"cssparser 0.25.5 (registry+https://github.com/rust-lang/crates.io-index)",
"derive_more 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)",
"encoding_rs 0.8.12 (registry+https://github.com/rust-lang/crates.io-index)",
- "euclid 0.19.7 (registry+https://github.com/rust-lang/crates.io-index)",
+ "euclid 0.19.8 (registry+https://github.com/rust-lang/crates.io-index)",
"fallible 0.0.1",
"fxhash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
"hashglobe 0.1.0",
@@ -4537,7 +4617,7 @@ dependencies = [
"app_units 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
"byteorder 1.2.7 (registry+https://github.com/rust-lang/crates.io-index)",
"cssparser 0.25.5 (registry+https://github.com/rust-lang/crates.io-index)",
- "euclid 0.19.7 (registry+https://github.com/rust-lang/crates.io-index)",
+ "euclid 0.19.8 (registry+https://github.com/rust-lang/crates.io-index)",
"html5ever 0.23.0 (registry+https://github.com/rust-lang/crates.io-index)",
"parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
"rayon 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -4560,7 +4640,7 @@ dependencies = [
"app_units 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
"bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
"cssparser 0.25.5 (registry+https://github.com/rust-lang/crates.io-index)",
- "euclid 0.19.7 (registry+https://github.com/rust-lang/crates.io-index)",
+ "euclid 0.19.8 (registry+https://github.com/rust-lang/crates.io-index)",
"lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
"malloc_size_of 0.0.1",
"malloc_size_of_derive 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -4575,6 +4655,11 @@ dependencies = [
]
[[package]]
+name = "sw-composite"
+version = "0.5.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
name = "swapper"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -4911,6 +4996,11 @@ version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
+name = "typed-arena"
+version = "1.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
name = "typenum"
version = "1.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -5165,7 +5255,7 @@ dependencies = [
"base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)",
"cookie 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
"crossbeam-channel 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
- "euclid 0.19.7 (registry+https://github.com/rust-lang/crates.io-index)",
+ "euclid 0.19.8 (registry+https://github.com/rust-lang/crates.io-index)",
"hyper 0.12.14 (registry+https://github.com/rust-lang/crates.io-index)",
"image 0.21.0 (registry+https://github.com/rust-lang/crates.io-index)",
"ipc-channel 0.11.2 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -5198,10 +5288,10 @@ dependencies = [
"cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
"core-foundation 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)",
"core-graphics 0.17.3 (registry+https://github.com/rust-lang/crates.io-index)",
- "core-text 13.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "core-text 13.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
"cstr 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
"dwrote 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "freetype 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "freetype 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
"fxhash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
"gleam 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)",
"image 0.21.0 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -5237,7 +5327,7 @@ dependencies = [
"core-foundation 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)",
"core-graphics 0.17.3 (registry+https://github.com/rust-lang/crates.io-index)",
"derive_more 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "euclid 0.19.7 (registry+https://github.com/rust-lang/crates.io-index)",
+ "euclid 0.19.8 (registry+https://github.com/rust-lang/crates.io-index)",
"ipc-channel 0.11.2 (registry+https://github.com/rust-lang/crates.io-index)",
"malloc_size_of_derive 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
"serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -5261,7 +5351,7 @@ version = "0.0.1"
dependencies = [
"canvas_traits 0.0.1",
"crossbeam-channel 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
- "euclid 0.19.7 (registry+https://github.com/rust-lang/crates.io-index)",
+ "euclid 0.19.8 (registry+https://github.com/rust-lang/crates.io-index)",
"gleam 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)",
"ipc-channel 0.11.2 (registry+https://github.com/rust-lang/crates.io-index)",
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -5295,7 +5385,7 @@ name = "which"
version = "2.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
- "failure 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
"libc 0.2.53 (registry+https://github.com/rust-lang/crates.io-index)",
]
@@ -5372,7 +5462,7 @@ version = "0.0.1"
source = "git+https://github.com/servo/webrender#e53aae02728e155e555b8baa9d180d90dac3b86f"
dependencies = [
"app_units 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "euclid 0.19.7 (registry+https://github.com/rust-lang/crates.io-index)",
+ "euclid 0.19.8 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
@@ -5537,7 +5627,7 @@ dependencies = [
"checksum core-foundation 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "58667b9a618a37ea8c4c4cb5298703e5dfadcd3698c79f54fc43e6a2e94733ea"
"checksum core-foundation-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e7ca8a5221364ef15ce201e8ed2f609fc312682a8f4e0e3d4aa5879764e0fa3b"
"checksum core-graphics 0.17.3 (registry+https://github.com/rust-lang/crates.io-index)" = "56790968ab1c8a1202a102e6de05fc6e1ec87da99e4e93e9a7d13efbfc1e95a9"
-"checksum core-text 13.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a6705907bc253cee90b8551017836ce50904be305c99fec5ea74a8d72d799e58"
+"checksum core-text 13.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d95a72b5e50e549969dd88eff3047495fe5b8c6f028635442c2b708be707e669"
"checksum crc 1.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d663548de7f5cca343f1e0a48d14dcfb0e9eb4e079ec58883b7251539fa10aeb"
"checksum crc32fast 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e91d5240c6975ef33aeb5f148f35275c25eda8e8a5f95abe421978b05b8bf192"
"checksum crossbeam-channel 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "0f0ed1a4de2235cabda8558ff5840bffb97fcb64c97827f354a451307df5f72b"
@@ -5568,6 +5658,7 @@ dependencies = [
"checksum dtoa 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "80c8b71fd71146990a9742fc06dcbbde19161a267e0ad4e572c35162f4578c90"
"checksum dtoa-short 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fe6f727b406462fd57c95fed84d1b0dbfb5f0136fcac005adba9ea0367c05cc8"
"checksum dwrote 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c31c624339dab99c223a4b26c2e803b7c248adaca91549ce654c76f39a03f5c8"
+"checksum dwrote 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0bd1369e02db5e9b842a9b67bce8a2fcc043beafb2ae8a799dd482d46ea1ff0d"
"checksum either 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "18785c1ba806c258137c937e44ada9ee7e69a37e3c72077542cd2f069d78562a"
"checksum encoding_rs 0.8.12 (registry+https://github.com/rust-lang/crates.io-index)" = "ca20350a7cb5aab5b9034731123d6d412caf3e92d4985e739e411ba0955fd0eb"
"checksum energy-monitor 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fe872d0664f1cc60db36349af245d892ee67d3c8f78055df0ebc43271fd4e05c"
@@ -5579,18 +5670,20 @@ dependencies = [
"checksum enum-iterator-derive 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "293ee6af5f9349c2594a7c867b7c89347fb939415508e6367a19bd246ffc08d8"
"checksum env_logger 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "afb070faf94c85d17d50ca44f6ad076bce18ae92f0037d350947240a36e9d42e"
"checksum error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "07e791d3be96241c77c43846b665ef1384606da2cd2a48730abe606a12906e02"
-"checksum euclid 0.19.7 (registry+https://github.com/rust-lang/crates.io-index)" = "6a8acd6a7f2740b7b936008acd58b1def492854254dc4af9d2b850ca01f4960e"
+"checksum euclid 0.19.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7a4719a544a67ed3fc33784c2bd2c6581663dfe83b719a6ae05c6dabc3b51c73"
"checksum euclid_macros 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fdcb84c18ea5037a1c5a23039b4ff29403abce2e0d6b1daa11cf0bde2b30be15"
"checksum expat-sys 2.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "658f19728920138342f68408b7cf7644d90d4784353d8ebc32e7e8663dbe45fa"
-"checksum failure 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6dd377bcc1b1b7ce911967e3ec24fa19c3224394ec05b54aa7b083d498341ac7"
+"checksum failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "795bd83d3abeb9220f257e597aa0080a508b27533824adf336529648f6abf7e2"
"checksum fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed"
"checksum fixedbitset 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "86d4de0081402f5e88cdac65c8dcdcc73118c1a7a465e2a05f0da05843a8ea33"
"checksum flate2 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9fac2277e84e5e858483756647a9d0aa8d9a2b7cba517fd84325a0aaa69a0909"
+"checksum float-ord 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7bad48618fdb549078c333a7a8528acb57af271d0433bdecd523eb620628364e"
"checksum fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2fad85553e09a6f881f739c29f0b00b0f01357c743266d478b68951ce23285f3"
+"checksum font-kit 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c5b784f7a48d718df8d9ee28f81f8afa0a7ffdd61038957cba1ec6837a836d46"
"checksum fontsan 0.4.0 (git+https://github.com/servo/fontsan)" = "<none>"
"checksum foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1"
"checksum foreign-types-shared 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b"
-"checksum freetype 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b659e75b7a7338fe75afd7f909fc2b71937845cffb6ebe54ba2e50f13d8e903d"
+"checksum freetype 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "11926b2b410b469d0e9399eca4cbbe237a9ef02176c485803b29216307e8e028"
"checksum fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba"
"checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82"
"checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7"
@@ -5687,6 +5780,8 @@ dependencies = [
"checksum lock_api 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "62ebf1391f6acad60e5c8b43706dde4582df75c06698ab44511d15016bc2442c"
"checksum lock_api 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ed946d4529956a20f2d63ebe1b69996d5a2137c91913fe3ebbeff957f5bca7ff"
"checksum log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c84ec4b527950aa83a329754b01dbe3f58361d1c5efacd1f6d68c494d08a17c6"
+"checksum lyon_geom 0.12.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0638070e85f0e8b5da3909d8c5c0a66785b18da96a1e8dc30acb0aea9770529a"
+"checksum lyon_path 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e9dc8e0746b7cca11960b602f7fe037bb067746a01eab4aa502fed1494544843"
"checksum lzw 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7d947cbb889ed21c2a84be6ffbaebf5b4e0f4340638cba0444907e38b56be084"
"checksum mac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4"
"checksum mach 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "86dd2487cdfea56def77b88438a2c915fb45113c5319bfe7e14306ca4cd0b0e1"
@@ -5695,6 +5790,7 @@ dependencies = [
"checksum markup5ever 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f1af46a727284117e09780d05038b1ce6fc9c76cc6df183c3dae5a8955a25e21"
"checksum matches 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "efd7622e3022e1a6eaa602c4cea8912254e5582c9c692e9167714182244801b1"
"checksum memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2efc7bc57c883d4a4d6e3246905283d8dae951bb3bd32f49d6ef297f546e1c39"
+"checksum memmap 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e2ffa2c986de11a9df78620c01eeaaf27d94d3ff02bf81bfcca953102dd0c6ff"
"checksum memmap 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6585fd95e7bb50d6cc31e20d4cf9afb4e2ba16c5846fc76793f11218da9c475b"
"checksum memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0f9dc261e2b62d7a622bf416ea3c5245cdd5d9a7fcc428c0d06804dfce1775b3"
"checksum mime 0.3.13 (registry+https://github.com/rust-lang/crates.io-index)" = "3e27ca21f40a310bd06d9031785f4801710d566c184a6e15bad4f1d9b65f9425"
@@ -5770,6 +5866,7 @@ dependencies = [
"checksum rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7b75f676a1e053fc562eafbb47838d67c84801e38fc1ba459e8f180deabd5071"
"checksum rand_pcg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "abf9b09b01790cfe0364f52bf32995ea3c39f4d2dd011eac241d2914146d0b44"
"checksum rand_xorshift 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cbf7e9e623549b0e21f6e97cf8ecf247c1a8fd2e8a992ae265314300b2455d5c"
+"checksum raqote 0.4.1-alpha.0 (git+https://github.com/jrmuizel/raqote)" = "<none>"
"checksum rayon 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "485541959c8ecc49865526fe6c4de9653dd6e60d829d6edf0be228167b60372d"
"checksum rayon-core 1.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b055d1e92aba6877574d8fe604a63c8b5df60f60e5982bf7ccbb1338ea527356"
"checksum rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2"
@@ -5833,6 +5930,7 @@ dependencies = [
"checksum string_cache_codegen 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1eea1eee654ef80933142157fdad9dd8bc43cf7c74e999e369263496f04ff4da"
"checksum string_cache_shared 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b1884d1bc09741d466d9b14e6d37ac89d6909cbcac41dd9ae982d4d063bbedfc"
"checksum strsim 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bb4f380125926a99e52bc279241539c018323fab05ad6368b56f93d9369ff550"
+"checksum sw-composite 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a1638f200d9594cad22e9e58baf046382d8f5a38d40878db1705dcaeae239093"
"checksum swapper 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e454d048db5527d000bfddb77bd072bbf3a1e2ae785f16d9bd116e07c2ab45eb"
"checksum syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)" = "a1393e4a97a19c01e900df2aec855a29f71cf02c402e2f443b8d2747c25c5dbe"
"checksum synstructure 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "73687139bf99285483c96ac0add482c3776528beac1d97d444f6e91f203a2015"
@@ -5864,6 +5962,7 @@ dependencies = [
"checksum toml 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "a7540f4ffc193e0d3c94121edb19b055670d369f77d5804db11ae053a45b6e7e"
"checksum truetype 0.26.0 (registry+https://github.com/rust-lang/crates.io-index)" = "acec30350633d6dac9dc1a625786b6cbe9150664be941aac2c35ad7199eab877"
"checksum try-lock 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e604eb7b43c06650e854be16a2a03155743d3752dd1c943f6829e26b7a36e382"
+"checksum typed-arena 1.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c6c06a92aef38bb4dc5b0df00d68496fc31307c5344c867bb61678c6e1671ec5"
"checksum typenum 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "612d636f949607bdf9b123b4a6f6d966dedf3ff669f7f045890d3a4a73948169"
"checksum ucd 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "fe4fa6e588762366f1eb4991ce59ad1b93651d0b769dfb4e4d1c5c4b943d1159"
"checksum ucd-util 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "fd2be2d6639d0f8fe6cdda291ad456e23629558d466e2789d2c3e9892bda285d"
diff --git a/components/canvas/Cargo.toml b/components/canvas/Cargo.toml
index 20fa3300aae..065ed01ca75 100644
--- a/components/canvas/Cargo.toml
+++ b/components/canvas/Cargo.toml
@@ -11,10 +11,13 @@ name = "canvas"
path = "lib.rs"
[features]
+azure_backend = ["azure"]
+default = ["azure_backend"]
webgl_backtrace = ["canvas_traits/webgl_backtrace"]
+raqote_backend = ["raqote"]
[dependencies]
-azure = {git = "https://github.com/servo/rust-azure"}
+azure = {git = "https://github.com/servo/rust-azure", optional = true}
byteorder = "1"
canvas_traits = {path = "../canvas_traits"}
compositing = {path = "../compositing"}
@@ -27,6 +30,7 @@ ipc-channel = "0.11"
log = "0.4"
num-traits = "0.2"
offscreen_gl_context = {version = "0.22", features = ["serde", "osmesa"]}
+raqote = {git = "https://github.com/jrmuizel/raqote", optional = true}
pixels = {path = "../pixels"}
serde_bytes = "0.10"
servo_config = {path = "../config"}
diff --git a/components/canvas/azure_backend.rs b/components/canvas/azure_backend.rs
new file mode 100644
index 00000000000..037809b5a05
--- /dev/null
+++ b/components/canvas/azure_backend.rs
@@ -0,0 +1,761 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
+
+use crate::canvas_data::{
+ Backend, CanvasPaintState, Color, CompositionOp, DrawOptions, ExtendMode, Filter,
+ GenericDrawTarget, GenericPathBuilder, GradientStop, GradientStops, Path, Pattern,
+ SourceSurface, StrokeOptions, SurfaceFormat,
+};
+use crate::canvas_paint_thread::AntialiasMode;
+use azure::azure::{AzFloat, AzGradientStop, AzPoint};
+use azure::azure_hl;
+use azure::azure_hl::SurfacePattern;
+use azure::azure_hl::{BackendType, ColorPattern, DrawTarget};
+use azure::azure_hl::{CapStyle, JoinStyle};
+use azure::azure_hl::{LinearGradientPattern, RadialGradientPattern};
+use canvas_traits::canvas::*;
+use cssparser::RGBA;
+use euclid::{Point2D, Rect, Size2D, Transform2D, Vector2D};
+
+pub struct AzureBackend;
+
+impl Backend for AzureBackend {
+ fn get_composition_op(&self, opts: &DrawOptions) -> CompositionOp {
+ CompositionOp::Azure(opts.as_azure().composition)
+ }
+
+ fn need_to_draw_shadow(&self, color: &Color) -> bool {
+ color.as_azure().a != 0.0f32
+ }
+
+ fn size_from_pattern(&self, rect: &Rect<f32>, pattern: &Pattern) -> Option<Size2D<f32>> {
+ match pattern {
+ Pattern::Azure(azure_hl::Pattern::Surface(ref surface)) => {
+ let surface_size = surface.size();
+ let size = match (surface.repeat_x, surface.repeat_y) {
+ (true, true) => rect.size,
+ (true, false) => Size2D::new(rect.size.width, surface_size.height as f32),
+ (false, true) => Size2D::new(surface_size.width as f32, rect.size.height),
+ (false, false) => {
+ Size2D::new(surface_size.width as f32, surface_size.height as f32)
+ },
+ };
+ Some(size)
+ },
+ Pattern::Azure(_) => None,
+ }
+ }
+
+ fn set_shadow_color<'a>(&mut self, color: RGBA, state: &mut CanvasPaintState<'a>) {
+ state.shadow_color = Color::Azure(color.to_azure_style());
+ }
+
+ fn set_fill_style<'a>(
+ &mut self,
+ style: FillOrStrokeStyle,
+ state: &mut CanvasPaintState<'a>,
+ drawtarget: &GenericDrawTarget,
+ ) {
+ if let Some(pattern) = style.to_azure_pattern(drawtarget) {
+ state.fill_style = Pattern::Azure(pattern)
+ }
+ }
+
+ fn set_stroke_style<'a>(
+ &mut self,
+ style: FillOrStrokeStyle,
+ state: &mut CanvasPaintState<'a>,
+ drawtarget: &GenericDrawTarget,
+ ) {
+ if let Some(pattern) = style.to_azure_pattern(drawtarget) {
+ state.stroke_style = Pattern::Azure(pattern)
+ }
+ }
+
+ fn set_global_composition<'a>(
+ &mut self,
+ op: CompositionOrBlending,
+ state: &mut CanvasPaintState<'a>,
+ ) {
+ state
+ .draw_options
+ .as_azure_mut()
+ .set_composition_op(op.to_azure_style());
+ }
+
+ fn create_drawtarget(&self, size: Size2D<u64>) -> Box<GenericDrawTarget> {
+ // FIXME(nox): Why is the size made of i32 values?
+ Box::new(DrawTarget::new(
+ BackendType::Skia,
+ size.to_i32(),
+ azure_hl::SurfaceFormat::B8G8R8A8,
+ ))
+ }
+
+ fn recreate_paint_state<'a>(&self, state: &CanvasPaintState<'a>) -> CanvasPaintState<'a> {
+ CanvasPaintState::new(AntialiasMode::from_azure(
+ state.draw_options.as_azure().antialias,
+ ))
+ }
+}
+
+impl<'a> CanvasPaintState<'a> {
+ pub fn new(antialias: AntialiasMode) -> CanvasPaintState<'a> {
+ CanvasPaintState {
+ draw_options: DrawOptions::Azure(azure_hl::DrawOptions::new(
+ 1.0,
+ azure_hl::CompositionOp::Over,
+ antialias.into_azure(),
+ )),
+ fill_style: Pattern::Azure(azure_hl::Pattern::Color(ColorPattern::new(
+ azure_hl::Color::black(),
+ ))),
+ stroke_style: Pattern::Azure(azure_hl::Pattern::Color(ColorPattern::new(
+ azure_hl::Color::black(),
+ ))),
+ stroke_opts: StrokeOptions::Azure(azure_hl::StrokeOptions::new(
+ 1.0,
+ JoinStyle::MiterOrBevel,
+ CapStyle::Butt,
+ 10.0,
+ &[],
+ )),
+ transform: Transform2D::identity(),
+ shadow_offset_x: 0.0,
+ shadow_offset_y: 0.0,
+ shadow_blur: 0.0,
+ shadow_color: Color::Azure(azure_hl::Color::transparent()),
+ }
+ }
+}
+
+impl GenericPathBuilder for azure_hl::PathBuilder {
+ fn arc(
+ &self,
+ origin: Point2D<f32>,
+ radius: f32,
+ start_angle: f32,
+ end_angle: f32,
+ anticlockwise: bool,
+ ) {
+ self.arc(
+ origin as Point2D<AzFloat>,
+ radius as AzFloat,
+ start_angle as AzFloat,
+ end_angle as AzFloat,
+ anticlockwise,
+ );
+ }
+ fn bezier_curve_to(
+ &self,
+ control_point1: &Point2D<f32>,
+ control_point2: &Point2D<f32>,
+ control_point3: &Point2D<f32>,
+ ) {
+ self.bezier_curve_to(
+ control_point1 as &Point2D<AzFloat>,
+ control_point2 as &Point2D<AzFloat>,
+ control_point3 as &Point2D<AzFloat>,
+ );
+ }
+ fn close(&self) {
+ self.close();
+ }
+ fn ellipse(
+ &self,
+ origin: Point2D<f32>,
+ radius_x: f32,
+ radius_y: f32,
+ rotation_angle: f32,
+ start_angle: f32,
+ end_angle: f32,
+ anticlockwise: bool,
+ ) {
+ self.ellipse(
+ origin as Point2D<AzFloat>,
+ radius_x as AzFloat,
+ radius_y as AzFloat,
+ rotation_angle as AzFloat,
+ start_angle as AzFloat,
+ end_angle as AzFloat,
+ anticlockwise,
+ );
+ }
+ fn get_current_point(&self) -> Point2D<f32> {
+ let AzPoint { x, y } = self.get_current_point();
+ Point2D::new(x as f32, y as f32)
+ }
+ fn line_to(&self, point: Point2D<f32>) {
+ self.line_to(point as Point2D<AzFloat>);
+ }
+ fn move_to(&self, point: Point2D<f32>) {
+ self.move_to(point as Point2D<AzFloat>);
+ }
+ fn quadratic_curve_to(&self, control_point: &Point2D<f32>, end_point: &Point2D<f32>) {
+ self.quadratic_curve_to(
+ control_point as &Point2D<AzFloat>,
+ end_point as &Point2D<AzFloat>,
+ );
+ }
+ fn finish(&self) -> Path {
+ Path::Azure(self.finish())
+ }
+}
+
+impl GenericDrawTarget for azure_hl::DrawTarget {
+ fn clear_rect(&self, rect: &Rect<f32>) {
+ self.clear_rect(rect as &Rect<AzFloat>);
+ }
+
+ fn copy_surface(&self, surface: SourceSurface, source: Rect<i32>, destination: Point2D<i32>) {
+ self.copy_surface(surface.into_azure(), source, destination);
+ }
+
+ fn create_gradient_stops(
+ &self,
+ gradient_stops: Vec<GradientStop>,
+ extend_mode: ExtendMode,
+ ) -> GradientStops {
+ let gradient_stops: Vec<AzGradientStop> =
+ gradient_stops.into_iter().map(|x| x.into_azure()).collect();
+ GradientStops::Azure(self.create_gradient_stops(&gradient_stops, extend_mode.into_azure()))
+ }
+
+ fn create_path_builder(&self) -> Box<GenericPathBuilder> {
+ Box::new(self.create_path_builder())
+ }
+
+ fn create_similar_draw_target(
+ &self,
+ size: &Size2D<i32>,
+ format: SurfaceFormat,
+ ) -> Box<GenericDrawTarget> {
+ Box::new(self.create_similar_draw_target(size, format.into_azure()))
+ }
+ fn create_source_surface_from_data(
+ &self,
+ data: &[u8],
+ size: Size2D<i32>,
+ stride: i32,
+ ) -> Option<SourceSurface> {
+ self.create_source_surface_from_data(data, size, stride, azure_hl::SurfaceFormat::B8G8R8A8)
+ .map(|s| SourceSurface::Azure(s))
+ }
+ fn draw_surface(
+ &self,
+ surface: SourceSurface,
+ dest: Rect<f64>,
+ source: Rect<f64>,
+ filter: Filter,
+ draw_options: &DrawOptions,
+ ) {
+ let surf_options = azure_hl::DrawSurfaceOptions::new(filter.as_azure(), true);
+ let draw_options = azure_hl::DrawOptions::new(
+ draw_options.as_azure().alpha,
+ draw_options.as_azure().composition,
+ azure_hl::AntialiasMode::None,
+ );
+ self.draw_surface(
+ surface.into_azure(),
+ dest.to_azure_style(),
+ source.to_azure_style(),
+ surf_options,
+ draw_options,
+ );
+ }
+ fn draw_surface_with_shadow(
+ &self,
+ surface: SourceSurface,
+ dest: &Point2D<f32>,
+ color: &Color,
+ offset: &Vector2D<f32>,
+ sigma: f32,
+ operator: CompositionOp,
+ ) {
+ self.draw_surface_with_shadow(
+ surface.into_azure(),
+ dest as &Point2D<AzFloat>,
+ color.as_azure(),
+ offset as &Vector2D<AzFloat>,
+ sigma as AzFloat,
+ operator.into_azure(),
+ );
+ }
+ fn fill(&self, path: &Path, pattern: Pattern, draw_options: &DrawOptions) {
+ self.fill(
+ path.as_azure(),
+ pattern.as_azure().to_pattern_ref(),
+ draw_options.as_azure(),
+ );
+ }
+ fn fill_rect(&self, rect: &Rect<f32>, pattern: Pattern, draw_options: Option<&DrawOptions>) {
+ self.fill_rect(
+ rect as &Rect<AzFloat>,
+ pattern.as_azure().to_pattern_ref(),
+ draw_options.map(|x| x.as_azure()),
+ );
+ }
+ fn get_format(&self) -> SurfaceFormat {
+ SurfaceFormat::Azure(self.get_format())
+ }
+ fn get_size(&self) -> Size2D<i32> {
+ let size = self.get_size();
+ Size2D::new(size.width, size.height)
+ }
+ fn get_transform(&self) -> Transform2D<f32> {
+ self.get_transform() as Transform2D<f32>
+ }
+ fn pop_clip(&self) {
+ self.pop_clip();
+ }
+ fn push_clip(&self, path: &Path) {
+ self.push_clip(path.as_azure());
+ }
+ fn set_transform(&self, matrix: &Transform2D<f32>) {
+ self.set_transform(matrix as &Transform2D<AzFloat>);
+ }
+ fn snapshot(&self) -> SourceSurface {
+ SourceSurface::Azure(self.snapshot())
+ }
+ fn stroke(
+ &self,
+ path: &Path,
+ pattern: Pattern,
+ stroke_options: &StrokeOptions,
+ draw_options: &DrawOptions,
+ ) {
+ self.stroke(
+ path.as_azure(),
+ pattern.as_azure().to_pattern_ref(),
+ stroke_options.as_azure(),
+ draw_options.as_azure(),
+ );
+ }
+ fn stroke_line(
+ &self,
+ start: Point2D<f32>,
+ end: Point2D<f32>,
+ pattern: Pattern,
+ stroke_options: &StrokeOptions,
+ draw_options: &DrawOptions,
+ ) {
+ let stroke_options = stroke_options.as_azure();
+ let cap = match stroke_options.line_join {
+ JoinStyle::Round => CapStyle::Round,
+ _ => CapStyle::Butt,
+ };
+
+ let stroke_opts = azure_hl::StrokeOptions::new(
+ stroke_options.line_width,
+ stroke_options.line_join,
+ cap,
+ stroke_options.miter_limit,
+ stroke_options.mDashPattern,
+ );
+
+ self.stroke_line(
+ start,
+ end,
+ pattern.as_azure().to_pattern_ref(),
+ &stroke_opts,
+ draw_options.as_azure(),
+ );
+ }
+ fn stroke_rect(
+ &self,
+ rect: &Rect<f32>,
+ pattern: Pattern,
+ stroke_options: &StrokeOptions,
+ draw_options: &DrawOptions,
+ ) {
+ self.stroke_rect(
+ rect as &Rect<AzFloat>,
+ pattern.as_azure().to_pattern_ref(),
+ stroke_options.as_azure(),
+ draw_options.as_azure(),
+ );
+ }
+
+ #[allow(unsafe_code)]
+ fn snapshot_data(&self, f: &Fn(&[u8]) -> Vec<u8>) -> Vec<u8> {
+ unsafe { f(self.snapshot().get_data_surface().data()) }
+ }
+
+ #[allow(unsafe_code)]
+ fn snapshot_data_owned(&self) -> Vec<u8> {
+ unsafe { self.snapshot().get_data_surface().data().into() }
+ }
+}
+
+impl AntialiasMode {
+ fn into_azure(self) -> azure_hl::AntialiasMode {
+ match self {
+ AntialiasMode::Default => azure_hl::AntialiasMode::Default,
+ AntialiasMode::None => azure_hl::AntialiasMode::None,
+ }
+ }
+
+ fn from_azure(val: azure_hl::AntialiasMode) -> AntialiasMode {
+ match val {
+ azure_hl::AntialiasMode::Default => AntialiasMode::Default,
+ azure_hl::AntialiasMode::None => AntialiasMode::None,
+ v => unimplemented!("{:?} is unsupported", v),
+ }
+ }
+}
+
+impl ExtendMode {
+ fn into_azure(self) -> azure_hl::ExtendMode {
+ match self {
+ ExtendMode::Azure(m) => m,
+ }
+ }
+}
+
+impl GradientStop {
+ fn into_azure(self) -> AzGradientStop {
+ match self {
+ GradientStop::Azure(s) => s,
+ }
+ }
+}
+
+impl GradientStops {
+ fn into_azure(self) -> azure_hl::GradientStops {
+ match self {
+ GradientStops::Azure(s) => s,
+ }
+ }
+}
+
+impl Color {
+ fn as_azure(&self) -> &azure_hl::Color {
+ match self {
+ Color::Azure(s) => s,
+ }
+ }
+}
+
+impl CompositionOp {
+ fn into_azure(self) -> azure_hl::CompositionOp {
+ match self {
+ CompositionOp::Azure(s) => s,
+ }
+ }
+}
+
+impl SurfaceFormat {
+ fn into_azure(self) -> azure_hl::SurfaceFormat {
+ match self {
+ SurfaceFormat::Azure(s) => s,
+ }
+ }
+}
+
+impl SourceSurface {
+ fn into_azure(self) -> azure_hl::SourceSurface {
+ match self {
+ SourceSurface::Azure(s) => s,
+ }
+ }
+}
+
+impl Path {
+ fn as_azure(&self) -> &azure_hl::Path {
+ match self {
+ Path::Azure(p) => p,
+ }
+ }
+}
+
+impl Pattern {
+ fn as_azure(&self) -> &azure_hl::Pattern {
+ match self {
+ Pattern::Azure(p) => p,
+ }
+ }
+}
+
+impl DrawOptions {
+ fn as_azure(&self) -> &azure_hl::DrawOptions {
+ match self {
+ DrawOptions::Azure(options) => options,
+ }
+ }
+ fn as_azure_mut(&mut self) -> &mut azure_hl::DrawOptions {
+ match self {
+ DrawOptions::Azure(options) => options,
+ }
+ }
+ pub fn set_alpha(&mut self, val: f32) {
+ match self {
+ DrawOptions::Azure(options) => options.alpha = val as AzFloat,
+ }
+ }
+}
+
+impl<'a> StrokeOptions<'a> {
+ pub fn as_azure(&self) -> &azure_hl::StrokeOptions<'a> {
+ match self {
+ StrokeOptions::Azure(options) => options,
+ }
+ }
+ pub fn set_line_width(&mut self, val: f32) {
+ match self {
+ StrokeOptions::Azure(options) => options.line_width = val as AzFloat,
+ }
+ }
+ pub fn set_miter_limit(&mut self, val: f32) {
+ match self {
+ StrokeOptions::Azure(options) => options.miter_limit = val as AzFloat,
+ }
+ }
+ pub fn set_line_join(&mut self, val: LineJoinStyle) {
+ match self {
+ StrokeOptions::Azure(options) => options.line_join = val.to_azure_style(),
+ }
+ }
+ pub fn set_line_cap(&mut self, val: LineCapStyle) {
+ match self {
+ StrokeOptions::Azure(options) => options.line_cap = val.to_azure_style(),
+ }
+ }
+}
+
+pub trait ToAzureStyle {
+ type Target;
+ fn to_azure_style(self) -> Self::Target;
+}
+
+impl ToAzureStyle for Rect<f64> {
+ type Target = Rect<f32>;
+
+ fn to_azure_style(self) -> Rect<f32> {
+ Rect::new(
+ Point2D::new(self.origin.x as f32, self.origin.y as f32),
+ Size2D::new(self.size.width as f32, self.size.height as f32),
+ )
+ }
+}
+
+impl ToAzureStyle for LineCapStyle {
+ type Target = CapStyle;
+
+ fn to_azure_style(self) -> CapStyle {
+ match self {
+ LineCapStyle::Butt => CapStyle::Butt,
+ LineCapStyle::Round => CapStyle::Round,
+ LineCapStyle::Square => CapStyle::Square,
+ }
+ }
+}
+
+impl ToAzureStyle for LineJoinStyle {
+ type Target = JoinStyle;
+
+ fn to_azure_style(self) -> JoinStyle {
+ match self {
+ LineJoinStyle::Round => JoinStyle::Round,
+ LineJoinStyle::Bevel => JoinStyle::Bevel,
+ LineJoinStyle::Miter => JoinStyle::Miter,
+ }
+ }
+}
+
+impl ToAzureStyle for CompositionStyle {
+ type Target = azure_hl::CompositionOp;
+
+ fn to_azure_style(self) -> azure_hl::CompositionOp {
+ match self {
+ CompositionStyle::SrcIn => azure_hl::CompositionOp::In,
+ CompositionStyle::SrcOut => azure_hl::CompositionOp::Out,
+ CompositionStyle::SrcOver => azure_hl::CompositionOp::Over,
+ CompositionStyle::SrcAtop => azure_hl::CompositionOp::Atop,
+ CompositionStyle::DestIn => azure_hl::CompositionOp::DestIn,
+ CompositionStyle::DestOut => azure_hl::CompositionOp::DestOut,
+ CompositionStyle::DestOver => azure_hl::CompositionOp::DestOver,
+ CompositionStyle::DestAtop => azure_hl::CompositionOp::DestAtop,
+ CompositionStyle::Copy => azure_hl::CompositionOp::Source,
+ CompositionStyle::Lighter => azure_hl::CompositionOp::Add,
+ CompositionStyle::Xor => azure_hl::CompositionOp::Xor,
+ }
+ }
+}
+
+impl ToAzureStyle for BlendingStyle {
+ type Target = azure_hl::CompositionOp;
+
+ fn to_azure_style(self) -> azure_hl::CompositionOp {
+ match self {
+ BlendingStyle::Multiply => azure_hl::CompositionOp::Multiply,
+ BlendingStyle::Screen => azure_hl::CompositionOp::Screen,
+ BlendingStyle::Overlay => azure_hl::CompositionOp::Overlay,
+ BlendingStyle::Darken => azure_hl::CompositionOp::Darken,
+ BlendingStyle::Lighten => azure_hl::CompositionOp::Lighten,
+ BlendingStyle::ColorDodge => azure_hl::CompositionOp::ColorDodge,
+ BlendingStyle::ColorBurn => azure_hl::CompositionOp::ColorBurn,
+ BlendingStyle::HardLight => azure_hl::CompositionOp::HardLight,
+ BlendingStyle::SoftLight => azure_hl::CompositionOp::SoftLight,
+ BlendingStyle::Difference => azure_hl::CompositionOp::Difference,
+ BlendingStyle::Exclusion => azure_hl::CompositionOp::Exclusion,
+ BlendingStyle::Hue => azure_hl::CompositionOp::Hue,
+ BlendingStyle::Saturation => azure_hl::CompositionOp::Saturation,
+ BlendingStyle::Color => azure_hl::CompositionOp::Color,
+ BlendingStyle::Luminosity => azure_hl::CompositionOp::Luminosity,
+ }
+ }
+}
+
+impl ToAzureStyle for CompositionOrBlending {
+ type Target = azure_hl::CompositionOp;
+
+ fn to_azure_style(self) -> azure_hl::CompositionOp {
+ match self {
+ CompositionOrBlending::Composition(op) => op.to_azure_style(),
+ CompositionOrBlending::Blending(op) => op.to_azure_style(),
+ }
+ }
+}
+
+pub trait ToAzurePattern {
+ fn to_azure_pattern(&self, drawtarget: &GenericDrawTarget) -> Option<azure_hl::Pattern>;
+}
+
+impl ToAzurePattern for FillOrStrokeStyle {
+ fn to_azure_pattern(&self, drawtarget: &GenericDrawTarget) -> Option<azure_hl::Pattern> {
+ Some(match *self {
+ FillOrStrokeStyle::Color(ref color) => {
+ azure_hl::Pattern::Color(ColorPattern::new(color.to_azure_style()))
+ },
+ FillOrStrokeStyle::LinearGradient(ref linear_gradient_style) => {
+ let gradient_stops: Vec<GradientStop> = linear_gradient_style
+ .stops
+ .iter()
+ .map(|s| {
+ GradientStop::Azure(azure_hl::GradientStop {
+ offset: s.offset as f32,
+ color: s.color.to_azure_style(),
+ })
+ })
+ .collect();
+
+ azure_hl::Pattern::LinearGradient(LinearGradientPattern::new(
+ &Point2D::new(
+ linear_gradient_style.x0 as f32,
+ linear_gradient_style.y0 as f32,
+ ),
+ &Point2D::new(
+ linear_gradient_style.x1 as f32,
+ linear_gradient_style.y1 as f32,
+ ),
+ drawtarget
+ .create_gradient_stops(
+ gradient_stops,
+ ExtendMode::Azure(azure_hl::ExtendMode::Clamp),
+ )
+ .into_azure(),
+ &Transform2D::identity(),
+ ))
+ },
+ FillOrStrokeStyle::RadialGradient(ref radial_gradient_style) => {
+ let gradient_stops: Vec<GradientStop> = radial_gradient_style
+ .stops
+ .iter()
+ .map(|s| {
+ GradientStop::Azure(azure_hl::GradientStop {
+ offset: s.offset as f32,
+ color: s.color.to_azure_style(),
+ })
+ })
+ .collect();
+
+ azure_hl::Pattern::RadialGradient(RadialGradientPattern::new(
+ &Point2D::new(
+ radial_gradient_style.x0 as f32,
+ radial_gradient_style.y0 as f32,
+ ),
+ &Point2D::new(
+ radial_gradient_style.x1 as f32,
+ radial_gradient_style.y1 as f32,
+ ),
+ radial_gradient_style.r0 as f32,
+ radial_gradient_style.r1 as f32,
+ drawtarget
+ .create_gradient_stops(
+ gradient_stops,
+ ExtendMode::Azure(azure_hl::ExtendMode::Clamp),
+ )
+ .into_azure(),
+ &Transform2D::identity(),
+ ))
+ },
+ FillOrStrokeStyle::Surface(ref surface_style) => {
+ let source_surface = drawtarget
+ .create_source_surface_from_data(
+ &surface_style.surface_data,
+ // FIXME(nox): Why are those i32 values?
+ surface_style.surface_size.to_i32(),
+ surface_style.surface_size.width as i32 * 4,
+ )?
+ .into_azure();
+ azure_hl::Pattern::Surface(SurfacePattern::new(
+ source_surface.azure_source_surface,
+ surface_style.repeat_x,
+ surface_style.repeat_y,
+ &Transform2D::identity(),
+ ))
+ },
+ })
+ }
+}
+
+impl ToAzureStyle for RGBA {
+ type Target = azure_hl::Color;
+
+ fn to_azure_style(self) -> azure_hl::Color {
+ azure_hl::Color::rgba(
+ self.red_f32() as f32,
+ self.green_f32() as f32,
+ self.blue_f32() as f32,
+ self.alpha_f32() as f32,
+ )
+ }
+}
+
+impl Pattern {
+ pub fn is_zero_size_gradient(&self) -> bool {
+ match *self {
+ Pattern::Azure(azure_hl::Pattern::LinearGradient(ref gradient)) => {
+ gradient.is_zero_size()
+ },
+ _ => false,
+ }
+ }
+}
+
+impl Filter {
+ fn as_azure(&self) -> azure_hl::Filter {
+ match *self {
+ Filter::Linear => azure_hl::Filter::Linear,
+ Filter::Point => azure_hl::Filter::Point,
+ }
+ }
+}
+
+impl Path {
+ pub fn transformed_copy_to_builder(
+ &self,
+ transform: &Transform2D<f32>,
+ ) -> Box<GenericPathBuilder> {
+ Box::new(self.as_azure().transformed_copy_to_builder(transform))
+ }
+
+ pub fn contains_point(&self, x: f64, y: f64, path_transform: &Transform2D<f32>) -> bool {
+ self.as_azure().contains_point(x, y, path_transform)
+ }
+
+ pub fn copy_to_builder(&self) -> Box<GenericPathBuilder> {
+ Box::new(self.as_azure().copy_to_builder())
+ }
+}
diff --git a/components/canvas/canvas_data.rs b/components/canvas/canvas_data.rs
index beb29242b5e..6b65f75117a 100644
--- a/components/canvas/canvas_data.rs
+++ b/components/canvas/canvas_data.rs
@@ -2,19 +2,14 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
-use azure::azure::AzFloat;
-use azure::azure_hl::SurfacePattern;
-use azure::azure_hl::{AntialiasMode, AsAzurePoint, CapStyle, CompositionOp, JoinStyle};
-use azure::azure_hl::{
- BackendType, DrawOptions, DrawTarget, Pattern, StrokeOptions, SurfaceFormat,
-};
-use azure::azure_hl::{Color, ColorPattern, DrawSurfaceOptions, Filter, Path, PathBuilder};
-use azure::azure_hl::{ExtendMode, GradientStop, LinearGradientPattern, RadialGradientPattern};
+use crate::canvas_paint_thread::AntialiasMode;
use canvas_traits::canvas::*;
use cssparser::RGBA;
use euclid::{Point2D, Rect, Size2D, Transform2D, Vector2D};
use ipc_channel::ipc::{IpcSender, IpcSharedMemory};
use num_traits::ToPrimitive;
+#[allow(unused_imports)]
+use std::marker::PhantomData;
use std::mem;
use std::sync::Arc;
use webrender::api::DirtyRect;
@@ -31,13 +26,13 @@ enum PathState {
/// Path builder in user-space. If a transform has been applied
/// but no further path operations have occurred, it is stored
/// in the optional field.
- UserSpacePathBuilder(PathBuilder, Option<Transform2D<AzFloat>>),
+ UserSpacePathBuilder(Box<GenericPathBuilder>, Option<Transform2D<f32>>),
/// Path builder in device-space.
- DeviceSpacePathBuilder(PathBuilder),
+ DeviceSpacePathBuilder(Box<GenericPathBuilder>),
/// Path in user-space. If a transform has been applied but
/// but no further path operations have occurred, it is stored
/// in the optional field.
- UserSpacePath(Path, Option<Transform2D<AzFloat>>),
+ UserSpacePath(Path, Option<Transform2D<f32>>),
}
impl PathState {
@@ -58,20 +53,81 @@ impl PathState {
}
}
+pub trait Backend {
+ fn get_composition_op(&self, opts: &DrawOptions) -> CompositionOp;
+ fn need_to_draw_shadow(&self, color: &Color) -> bool;
+ fn set_shadow_color<'a>(&mut self, color: RGBA, state: &mut CanvasPaintState<'a>);
+ fn set_fill_style<'a>(
+ &mut self,
+ style: FillOrStrokeStyle,
+ state: &mut CanvasPaintState<'a>,
+ drawtarget: &GenericDrawTarget,
+ );
+ fn set_stroke_style<'a>(
+ &mut self,
+ style: FillOrStrokeStyle,
+ state: &mut CanvasPaintState<'a>,
+ drawtarget: &GenericDrawTarget,
+ );
+ fn set_global_composition<'a>(
+ &mut self,
+ op: CompositionOrBlending,
+ state: &mut CanvasPaintState<'a>,
+ );
+ fn create_drawtarget(&self, size: Size2D<u64>) -> Box<GenericDrawTarget>;
+ fn recreate_paint_state<'a>(&self, state: &CanvasPaintState<'a>) -> CanvasPaintState<'a>;
+ fn size_from_pattern(&self, rect: &Rect<f32>, pattern: &Pattern) -> Option<Size2D<f32>>;
+}
+
+/// A generic PathBuilder that abstracts the interface for
+/// azure's and raqote's PathBuilder.
+pub trait GenericPathBuilder {
+ fn arc(
+ &self,
+ origin: Point2D<f32>,
+ radius: f32,
+ start_angle: f32,
+ end_angle: f32,
+ anticlockwise: bool,
+ );
+ fn bezier_curve_to(
+ &self,
+ control_point1: &Point2D<f32>,
+ control_point2: &Point2D<f32>,
+ control_point3: &Point2D<f32>,
+ );
+ fn close(&self);
+ fn ellipse(
+ &self,
+ origin: Point2D<f32>,
+ radius_x: f32,
+ radius_y: f32,
+ rotation_angle: f32,
+ start_angle: f32,
+ end_angle: f32,
+ anticlockwise: bool,
+ );
+ fn get_current_point(&self) -> Point2D<f32>;
+ fn line_to(&self, point: Point2D<f32>);
+ fn move_to(&self, point: Point2D<f32>);
+ fn quadratic_curve_to(&self, control_point: &Point2D<f32>, end_point: &Point2D<f32>);
+ fn finish(&self) -> Path;
+}
+
/// A wrapper around a stored PathBuilder and an optional transformation that should be
/// applied to any points to ensure they are in the matching device space.
struct PathBuilderRef<'a> {
- builder: &'a PathBuilder,
- transform: Transform2D<AzFloat>,
+ builder: &'a Box<GenericPathBuilder>,
+ transform: Transform2D<f32>,
}
impl<'a> PathBuilderRef<'a> {
- fn line_to(&self, pt: &Point2D<AzFloat>) {
+ fn line_to(&self, pt: &Point2D<f32>) {
let pt = self.transform.transform_point(pt);
self.builder.line_to(pt);
}
- fn move_to(&self, pt: &Point2D<AzFloat>) {
+ fn move_to(&self, pt: &Point2D<f32>) {
let pt = self.transform.transform_point(pt);
self.builder.move_to(pt);
}
@@ -95,19 +151,14 @@ impl<'a> PathBuilderRef<'a> {
self.builder.close();
}
- fn quadratic_curve_to(&self, cp: &Point2D<AzFloat>, endpoint: &Point2D<AzFloat>) {
+ fn quadratic_curve_to(&self, cp: &Point2D<f32>, endpoint: &Point2D<f32>) {
self.builder.quadratic_curve_to(
&self.transform.transform_point(cp),
&self.transform.transform_point(endpoint),
)
}
- fn bezier_curve_to(
- &self,
- cp1: &Point2D<AzFloat>,
- cp2: &Point2D<AzFloat>,
- endpoint: &Point2D<AzFloat>,
- ) {
+ fn bezier_curve_to(&self, cp1: &Point2D<f32>, cp2: &Point2D<f32>, endpoint: &Point2D<f32>) {
self.builder.bezier_curve_to(
&self.transform.transform_point(cp1),
&self.transform.transform_point(cp2),
@@ -115,14 +166,7 @@ impl<'a> PathBuilderRef<'a> {
)
}
- fn arc(
- &self,
- center: &Point2D<AzFloat>,
- radius: AzFloat,
- start_angle: AzFloat,
- end_angle: AzFloat,
- ccw: bool,
- ) {
+ fn arc(&self, center: &Point2D<f32>, radius: f32, start_angle: f32, end_angle: f32, ccw: bool) {
let center = self.transform.transform_point(center);
self.builder
.arc(center, radius, start_angle, end_angle, ccw);
@@ -130,12 +174,12 @@ impl<'a> PathBuilderRef<'a> {
pub fn ellipse(
&self,
- center: &Point2D<AzFloat>,
- radius_x: AzFloat,
- radius_y: AzFloat,
- rotation_angle: AzFloat,
- start_angle: AzFloat,
- end_angle: AzFloat,
+ center: &Point2D<f32>,
+ radius_x: f32,
+ radius_y: f32,
+ rotation_angle: f32,
+ start_angle: f32,
+ end_angle: f32,
ccw: bool,
) {
let center = self.transform.transform_point(center);
@@ -150,7 +194,7 @@ impl<'a> PathBuilderRef<'a> {
);
}
- fn current_point(&self) -> Option<Point2D<AzFloat>> {
+ fn current_point(&self) -> Option<Point2D<f32>> {
let inverse = match self.transform.inverse() {
Some(i) => i,
None => return None,
@@ -160,8 +204,181 @@ impl<'a> PathBuilderRef<'a> {
}
}
+// TODO(pylbrecht)
+// This defines required methods for DrawTarget of azure and raqote
+// The prototypes are derived from azure's methods.
+pub trait GenericDrawTarget {
+ fn clear_rect(&self, rect: &Rect<f32>);
+ fn copy_surface(&self, surface: SourceSurface, source: Rect<i32>, destination: Point2D<i32>);
+ fn create_gradient_stops(
+ &self,
+ gradient_stops: Vec<GradientStop>,
+ extend_mode: ExtendMode,
+ ) -> GradientStops;
+ fn create_path_builder(&self) -> Box<GenericPathBuilder>;
+ fn create_similar_draw_target(
+ &self,
+ size: &Size2D<i32>,
+ format: SurfaceFormat,
+ ) -> Box<GenericDrawTarget>;
+ fn create_source_surface_from_data(
+ &self,
+ data: &[u8],
+ size: Size2D<i32>,
+ stride: i32,
+ ) -> Option<SourceSurface>;
+ fn draw_surface(
+ &self,
+ surface: SourceSurface,
+ dest: Rect<f64>,
+ source: Rect<f64>,
+ filter: Filter,
+ draw_options: &DrawOptions,
+ );
+ fn draw_surface_with_shadow(
+ &self,
+ surface: SourceSurface,
+ dest: &Point2D<f32>,
+ color: &Color,
+ offset: &Vector2D<f32>,
+ sigma: f32,
+ operator: CompositionOp,
+ );
+ fn fill(&self, path: &Path, pattern: Pattern, draw_options: &DrawOptions);
+ fn fill_rect(&self, rect: &Rect<f32>, pattern: Pattern, draw_options: Option<&DrawOptions>);
+ fn get_format(&self) -> SurfaceFormat;
+ fn get_size(&self) -> Size2D<i32>;
+ fn get_transform(&self) -> Transform2D<f32>;
+ fn pop_clip(&self);
+ fn push_clip(&self, path: &Path);
+ fn set_transform(&self, matrix: &Transform2D<f32>);
+ fn snapshot(&self) -> SourceSurface;
+ fn stroke(
+ &self,
+ path: &Path,
+ pattern: Pattern,
+ stroke_options: &StrokeOptions,
+ draw_options: &DrawOptions,
+ );
+ fn stroke_line(
+ &self,
+ start: Point2D<f32>,
+ end: Point2D<f32>,
+ pattern: Pattern,
+ stroke_options: &StrokeOptions,
+ draw_options: &DrawOptions,
+ );
+ fn stroke_rect(
+ &self,
+ rect: &Rect<f32>,
+ pattern: Pattern,
+ stroke_options: &StrokeOptions,
+ draw_options: &DrawOptions,
+ );
+ fn snapshot_data(&self, f: &Fn(&[u8]) -> Vec<u8>) -> Vec<u8>;
+ fn snapshot_data_owned(&self) -> Vec<u8>;
+}
+
+#[derive(Clone)]
+pub enum ExtendMode {
+ #[cfg(feature = "azure_backend")]
+ Azure(azure::azure_hl::ExtendMode),
+ #[cfg(feature = "raqote_backend")]
+ Raqote(()),
+}
+
+pub enum GradientStop {
+ #[cfg(feature = "azure_backend")]
+ Azure(azure::AzGradientStop),
+ #[cfg(feature = "raqote_backend")]
+ Raqote(()),
+}
+
+pub enum GradientStops {
+ #[cfg(feature = "azure_backend")]
+ Azure(azure::azure_hl::GradientStops),
+ #[cfg(feature = "raqote_backend")]
+ Raqote(()),
+}
+
+#[derive(Clone)]
+pub enum Color {
+ #[cfg(feature = "azure_backend")]
+ Azure(azure::azure_hl::Color),
+ #[cfg(feature = "raqote_backend")]
+ Raqote(()),
+}
+
+#[derive(Clone)]
+pub enum CompositionOp {
+ #[cfg(feature = "azure_backend")]
+ Azure(azure::azure_hl::CompositionOp),
+ #[cfg(feature = "raqote_backend")]
+ Raqote(()),
+}
+
+pub enum SurfaceFormat {
+ #[cfg(feature = "azure_backend")]
+ Azure(azure::azure_hl::SurfaceFormat),
+ #[cfg(feature = "raqote_backend")]
+ Raqote(()),
+}
+
+#[derive(Clone)]
+pub enum SourceSurface {
+ #[cfg(feature = "azure_backend")]
+ Azure(azure::azure_hl::SourceSurface),
+ #[cfg(feature = "raqote_backend")]
+ Raqote(()),
+}
+
+pub enum Path {
+ #[cfg(feature = "azure_backend")]
+ Azure(azure::azure_hl::Path),
+ #[cfg(feature = "raqote_backend")]
+ Raqote(()),
+}
+
+#[derive(Clone)]
+pub enum Pattern {
+ #[cfg(feature = "azure_backend")]
+ Azure(azure::azure_hl::Pattern),
+ #[cfg(feature = "raqote_backend")]
+ Raqote(()),
+}
+
+pub enum DrawSurfaceOptions {
+ #[cfg(feature = "azure_backend")]
+ Azure(azure::azure_hl::DrawSurfaceOptions),
+ #[cfg(feature = "raqote_backend")]
+ Raqote(()),
+}
+
+#[derive(Clone)]
+pub enum DrawOptions {
+ #[cfg(feature = "azure_backend")]
+ Azure(azure::azure_hl::DrawOptions),
+ #[cfg(feature = "raqote_backend")]
+ Raqote(()),
+}
+
+#[derive(Clone)]
+pub enum StrokeOptions<'a> {
+ #[cfg(feature = "azure_backend")]
+ Azure(azure::azure_hl::StrokeOptions<'a>),
+ #[cfg(feature = "raqote_backend")]
+ Raqote(PhantomData<&'a ()>),
+}
+
+#[derive(Clone, Copy)]
+pub enum Filter {
+ Linear,
+ Point,
+}
+
pub struct CanvasData<'a> {
- drawtarget: DrawTarget,
+ backend: Box<Backend>,
+ drawtarget: Box<GenericDrawTarget>,
path_state: Option<PathState>,
state: CanvasPaintState<'a>,
saved_states: Vec<CanvasPaintState<'a>>,
@@ -174,6 +391,16 @@ pub struct CanvasData<'a> {
pub canvas_id: CanvasId,
}
+#[cfg(feature = "azure_backend")]
+fn create_backend() -> Box<Backend> {
+ Box::new(crate::azure_backend::AzureBackend)
+}
+
+#[cfg(feature = "raqote_backend")]
+fn create_backend() -> Box<Backend> {
+ Box::new(crate::raqote_backend::RaqoteBackend)
+}
+
impl<'a> CanvasData<'a> {
pub fn new(
size: Size2D<u64>,
@@ -181,9 +408,11 @@ impl<'a> CanvasData<'a> {
antialias: AntialiasMode,
canvas_id: CanvasId,
) -> CanvasData<'a> {
- let draw_target = CanvasData::create(size);
+ let backend = create_backend();
+ let draw_target = backend.create_drawtarget(size);;
let webrender_api = webrender_api_sender.create_api();
CanvasData {
+ backend,
drawtarget: draw_target,
path_state: None,
state: CanvasPaintState::new(antialias),
@@ -213,15 +442,14 @@ impl<'a> CanvasData<'a> {
image_data.into()
};
- let writer = |draw_target: &DrawTarget| {
+ let writer = |draw_target: &GenericDrawTarget| {
write_image(
- &draw_target,
+ draw_target,
image_data,
source_rect.size,
dest_rect,
smoothing_enabled,
- self.state.draw_options.composition,
- self.state.draw_options.alpha,
+ &self.state.draw_options,
);
};
@@ -231,9 +459,10 @@ impl<'a> CanvasData<'a> {
Size2D::new(dest_rect.size.width as f32, dest_rect.size.height as f32),
);
+ // TODO(pylbrecht) pass another closure for raqote
self.draw_with_shadow(&rect, writer);
} else {
- writer(&self.drawtarget);
+ writer(&*self.drawtarget);
}
}
@@ -257,40 +486,29 @@ impl<'a> CanvasData<'a> {
}
pub fn fill_rect(&self, rect: &Rect<f32>) {
- if is_zero_size_gradient(&self.state.fill_style) {
+ if self.state.fill_style.is_zero_size_gradient() {
return; // Paint nothing if gradient size is zero.
}
let draw_rect = Rect::new(
rect.origin,
- match self.state.fill_style {
- Pattern::Surface(ref surface) => {
- let surface_size = surface.size();
- match (surface.repeat_x, surface.repeat_y) {
- (true, true) => rect.size,
- (true, false) => Size2D::new(rect.size.width, surface_size.height as f32),
- (false, true) => Size2D::new(surface_size.width as f32, rect.size.height),
- (false, false) => {
- Size2D::new(surface_size.width as f32, surface_size.height as f32)
- },
- }
- },
- _ => rect.size,
- },
+ self.backend
+ .size_from_pattern(&rect, &self.state.fill_style)
+ .unwrap_or(rect.size),
);
if self.need_to_draw_shadow() {
- self.draw_with_shadow(&draw_rect, |new_draw_target: &DrawTarget| {
+ self.draw_with_shadow(&draw_rect, |new_draw_target: &GenericDrawTarget| {
new_draw_target.fill_rect(
&draw_rect,
- self.state.fill_style.to_pattern_ref(),
+ self.state.fill_style.clone(),
Some(&self.state.draw_options),
);
});
} else {
self.drawtarget.fill_rect(
&draw_rect,
- self.state.fill_style.to_pattern_ref(),
+ self.state.fill_style.clone(),
Some(&self.state.draw_options),
);
}
@@ -301,43 +519,31 @@ impl<'a> CanvasData<'a> {
}
pub fn stroke_rect(&self, rect: &Rect<f32>) {
- if is_zero_size_gradient(&self.state.stroke_style) {
+ if self.state.stroke_style.is_zero_size_gradient() {
return; // Paint nothing if gradient size is zero.
}
if self.need_to_draw_shadow() {
- self.draw_with_shadow(&rect, |new_draw_target: &DrawTarget| {
+ self.draw_with_shadow(&rect, |new_draw_target: &GenericDrawTarget| {
new_draw_target.stroke_rect(
rect,
- self.state.stroke_style.to_pattern_ref(),
+ self.state.stroke_style.clone(),
&self.state.stroke_opts,
&self.state.draw_options,
);
});
} else if rect.size.width == 0. || rect.size.height == 0. {
- let cap = match self.state.stroke_opts.line_join {
- JoinStyle::Round => CapStyle::Round,
- _ => CapStyle::Butt,
- };
-
- let stroke_opts = StrokeOptions::new(
- self.state.stroke_opts.line_width,
- self.state.stroke_opts.line_join,
- cap,
- self.state.stroke_opts.miter_limit,
- self.state.stroke_opts.mDashPattern,
- );
self.drawtarget.stroke_line(
rect.origin,
rect.bottom_right(),
- self.state.stroke_style.to_pattern_ref(),
- &stroke_opts,
+ self.state.stroke_style.clone(),
+ &self.state.stroke_opts,
&self.state.draw_options,
);
} else {
self.drawtarget.stroke_rect(
rect,
- self.state.stroke_style.to_pattern_ref(),
+ self.state.stroke_style.clone(),
&self.state.stroke_opts,
&self.state.draw_options,
);
@@ -419,27 +625,27 @@ impl<'a> CanvasData<'a> {
}
pub fn fill(&mut self) {
- if is_zero_size_gradient(&self.state.fill_style) {
+ if self.state.fill_style.is_zero_size_gradient() {
return; // Paint nothing if gradient size is zero.
}
self.ensure_path();
self.drawtarget.fill(
&self.path(),
- self.state.fill_style.to_pattern_ref(),
+ self.state.fill_style.clone(),
&self.state.draw_options,
);
}
pub fn stroke(&mut self) {
- if is_zero_size_gradient(&self.state.stroke_style) {
+ if self.state.stroke_style.is_zero_size_gradient() {
return; // Paint nothing if gradient size is zero.
}
self.ensure_path();
self.drawtarget.stroke(
&self.path(),
- self.state.stroke_style.to_pattern_ref(),
+ self.state.stroke_style.clone(),
&self.state.stroke_opts,
&self.state.draw_options,
);
@@ -469,11 +675,11 @@ impl<'a> CanvasData<'a> {
chan.send(result).unwrap();
}
- pub fn move_to(&mut self, point: &Point2D<AzFloat>) {
+ pub fn move_to(&mut self, point: &Point2D<f32>) {
self.path_builder().move_to(point);
}
- pub fn line_to(&mut self, point: &Point2D<AzFloat>) {
+ pub fn line_to(&mut self, point: &Point2D<f32>) {
self.path_builder().line_to(point);
}
@@ -545,34 +751,34 @@ impl<'a> CanvasData<'a> {
self.path_builder().rect(rect);
}
- pub fn quadratic_curve_to(&mut self, cp: &Point2D<AzFloat>, endpoint: &Point2D<AzFloat>) {
+ pub fn quadratic_curve_to(&mut self, cp: &Point2D<f32>, endpoint: &Point2D<f32>) {
self.path_builder().quadratic_curve_to(cp, endpoint);
}
pub fn bezier_curve_to(
&mut self,
- cp1: &Point2D<AzFloat>,
- cp2: &Point2D<AzFloat>,
- endpoint: &Point2D<AzFloat>,
+ cp1: &Point2D<f32>,
+ cp2: &Point2D<f32>,
+ endpoint: &Point2D<f32>,
) {
self.path_builder().bezier_curve_to(cp1, cp2, endpoint);
}
pub fn arc(
&mut self,
- center: &Point2D<AzFloat>,
- radius: AzFloat,
- start_angle: AzFloat,
- end_angle: AzFloat,
+ center: &Point2D<f32>,
+ radius: f32,
+ start_angle: f32,
+ end_angle: f32,
ccw: bool,
) {
self.path_builder()
.arc(center, radius, start_angle, end_angle, ccw);
}
- pub fn arc_to(&mut self, cp1: &Point2D<AzFloat>, cp2: &Point2D<AzFloat>, radius: AzFloat) {
+ pub fn arc_to(&mut self, cp1: &Point2D<f32>, cp2: &Point2D<f32>, radius: f32) {
let cp0 = match self.path_builder().current_point() {
- Some(p) => p.as_azure_point(),
+ Some(p) => p,
None => return,
};
let cp1 = *cp1;
@@ -635,12 +841,12 @@ impl<'a> CanvasData<'a> {
pub fn ellipse(
&mut self,
- center: &Point2D<AzFloat>,
- radius_x: AzFloat,
- radius_y: AzFloat,
- rotation_angle: AzFloat,
- start_angle: AzFloat,
- end_angle: AzFloat,
+ center: &Point2D<f32>,
+ radius_x: f32,
+ radius_y: f32,
+ rotation_angle: f32,
+ start_angle: f32,
+ end_angle: f32,
ccw: bool,
) {
self.path_builder().ellipse(
@@ -655,31 +861,29 @@ impl<'a> CanvasData<'a> {
}
pub fn set_fill_style(&mut self, style: FillOrStrokeStyle) {
- if let Some(pattern) = style.to_azure_pattern(&self.drawtarget) {
- self.state.fill_style = pattern
- }
+ self.backend
+ .set_fill_style(style, &mut self.state, &*self.drawtarget);
}
pub fn set_stroke_style(&mut self, style: FillOrStrokeStyle) {
- if let Some(pattern) = style.to_azure_pattern(&self.drawtarget) {
- self.state.stroke_style = pattern
- }
+ self.backend
+ .set_stroke_style(style, &mut self.state, &*self.drawtarget);
}
pub fn set_line_width(&mut self, width: f32) {
- self.state.stroke_opts.line_width = width;
+ self.state.stroke_opts.set_line_width(width);
}
pub fn set_line_cap(&mut self, cap: LineCapStyle) {
- self.state.stroke_opts.line_cap = cap.to_azure_style();
+ self.state.stroke_opts.set_line_cap(cap);
}
pub fn set_line_join(&mut self, join: LineJoinStyle) {
- self.state.stroke_opts.line_join = join.to_azure_style();
+ self.state.stroke_opts.set_line_join(join);
}
pub fn set_miter_limit(&mut self, limit: f32) {
- self.state.stroke_opts.miter_limit = limit;
+ self.state.stroke_opts.set_miter_limit(limit);
}
pub fn set_transform(&mut self, transform: &Transform2D<f32>) {
@@ -699,23 +903,18 @@ impl<'a> CanvasData<'a> {
}
pub fn set_global_alpha(&mut self, alpha: f32) {
- self.state.draw_options.alpha = alpha;
+ self.state.draw_options.set_alpha(alpha);
}
pub fn set_global_composition(&mut self, op: CompositionOrBlending) {
- self.state
- .draw_options
- .set_composition_op(op.to_azure_style());
- }
-
- pub fn create(size: Size2D<u64>) -> DrawTarget {
- // FIXME(nox): Why is the size made of i32 values?
- DrawTarget::new(BackendType::Skia, size.to_i32(), SurfaceFormat::B8G8R8A8)
+ self.backend.set_global_composition(op, &mut self.state);
}
pub fn recreate(&mut self, size: Size2D<u32>) {
- self.drawtarget = CanvasData::create(Size2D::new(size.width as u64, size.height as u64));
- self.state = CanvasPaintState::new(self.state.draw_options.antialias);
+ self.drawtarget = self
+ .backend
+ .create_drawtarget(Size2D::new(size.width as u64, size.height as u64));
+ self.state = self.backend.recreate_paint_state(&self.state);
self.saved_states.clear();
// Webrender doesn't let images change size, so we clear the webrender image key.
// TODO: there is an annying race condition here: the display list builder
@@ -730,15 +929,14 @@ impl<'a> CanvasData<'a> {
}
}
- #[allow(unsafe_code)]
pub fn send_pixels(&mut self, chan: IpcSender<IpcSharedMemory>) {
- let data = IpcSharedMemory::from_bytes(unsafe {
- self.drawtarget.snapshot().get_data_surface().data()
+ self.drawtarget.snapshot_data(&|bytes| {
+ let data = IpcSharedMemory::from_bytes(bytes);
+ chan.send(data).unwrap();
+ vec![]
});
- chan.send(data).unwrap();
}
- #[allow(unsafe_code)]
pub fn send_data(&mut self, chan: IpcSender<CanvasImageData>) {
let size = self.drawtarget.get_size();
@@ -750,9 +948,8 @@ impl<'a> CanvasData<'a> {
is_opaque: false,
allow_mipmaps: false,
};
- let data = webrender_api::ImageData::Raw(Arc::new(unsafe {
- self.drawtarget.snapshot().get_data_surface().data().into()
- }));
+ let data = self.drawtarget.snapshot_data_owned();
+ let data = webrender_api::ImageData::Raw(Arc::new(data));
let mut txn = webrender_api::Transaction::new();
@@ -793,7 +990,6 @@ impl<'a> CanvasData<'a> {
&imagedata,
rect.size.to_i32(),
rect.size.width as i32 * 4,
- SurfaceFormat::B8G8R8A8,
)
.unwrap();
self.drawtarget.copy_surface(
@@ -815,19 +1011,19 @@ impl<'a> CanvasData<'a> {
self.state.shadow_blur = value;
}
- pub fn set_shadow_color(&mut self, value: Color) {
- self.state.shadow_color = value;
+ pub fn set_shadow_color(&mut self, value: RGBA) {
+ self.backend.set_shadow_color(value, &mut self.state);
}
// https://html.spec.whatwg.org/multipage/#when-shadows-are-drawn
fn need_to_draw_shadow(&self) -> bool {
- self.state.shadow_color.a != 0.0f32 &&
+ self.backend.need_to_draw_shadow(&self.state.shadow_color) &&
(self.state.shadow_offset_x != 0.0f64 ||
self.state.shadow_offset_y != 0.0f64 ||
self.state.shadow_blur != 0.0f64)
}
- fn create_draw_target_for_shadow(&self, source_rect: &Rect<f32>) -> DrawTarget {
+ fn create_draw_target_for_shadow(&self, source_rect: &Rect<f32>) -> Box<GenericDrawTarget> {
let draw_target = self.drawtarget.create_similar_draw_target(
&Size2D::new(
source_rect.size.width as i32,
@@ -844,24 +1040,24 @@ impl<'a> CanvasData<'a> {
fn draw_with_shadow<F>(&self, rect: &Rect<f32>, draw_shadow_source: F)
where
- F: FnOnce(&DrawTarget),
+ F: FnOnce(&GenericDrawTarget),
{
let shadow_src_rect = self.state.transform.transform_rect(rect);
let new_draw_target = self.create_draw_target_for_shadow(&shadow_src_rect);
- draw_shadow_source(&new_draw_target);
+ draw_shadow_source(&*new_draw_target);
self.drawtarget.draw_surface_with_shadow(
new_draw_target.snapshot(),
&Point2D::new(
- shadow_src_rect.origin.x as AzFloat,
- shadow_src_rect.origin.y as AzFloat,
+ shadow_src_rect.origin.x as f32,
+ shadow_src_rect.origin.y as f32,
),
&self.state.shadow_color,
&Vector2D::new(
- self.state.shadow_offset_x as AzFloat,
- self.state.shadow_offset_y as AzFloat,
+ self.state.shadow_offset_x as f32,
+ self.state.shadow_offset_y as f32,
),
- (self.state.shadow_blur / 2.0f64) as AzFloat,
- self.state.draw_options.composition,
+ (self.state.shadow_blur / 2.0f64) as f32,
+ self.backend.get_composition_op(&self.state.draw_options),
);
}
@@ -877,13 +1073,10 @@ impl<'a> CanvasData<'a> {
{
return vec![];
}
- let data_surface = self.drawtarget.snapshot().get_data_surface();
- pixels::rgba8_get_rect(
- unsafe { data_surface.data() },
- canvas_size.to_u32(),
- read_rect.to_u32(),
- )
- .into_owned()
+
+ self.drawtarget.snapshot_data(&|bytes| {
+ pixels::rgba8_get_rect(bytes, canvas_size.to_u32(), read_rect.to_u32()).into_owned()
+ })
}
}
@@ -903,48 +1096,17 @@ impl<'a> Drop for CanvasData<'a> {
}
#[derive(Clone)]
-struct CanvasPaintState<'a> {
- draw_options: DrawOptions,
- fill_style: Pattern,
- stroke_style: Pattern,
- stroke_opts: StrokeOptions<'a>,
+pub struct CanvasPaintState<'a> {
+ pub draw_options: DrawOptions,
+ pub fill_style: Pattern,
+ pub stroke_style: Pattern,
+ pub stroke_opts: StrokeOptions<'a>,
/// The current 2D transform matrix.
- transform: Transform2D<f32>,
- shadow_offset_x: f64,
- shadow_offset_y: f64,
- shadow_blur: f64,
- shadow_color: Color,
-}
-
-impl<'a> CanvasPaintState<'a> {
- fn new(antialias: AntialiasMode) -> CanvasPaintState<'a> {
- CanvasPaintState {
- draw_options: DrawOptions::new(1.0, CompositionOp::Over, antialias),
- fill_style: Pattern::Color(ColorPattern::new(Color::black())),
- stroke_style: Pattern::Color(ColorPattern::new(Color::black())),
- stroke_opts: StrokeOptions::new(
- 1.0,
- JoinStyle::MiterOrBevel,
- CapStyle::Butt,
- 10.0,
- &[],
- ),
- transform: Transform2D::identity(),
- shadow_offset_x: 0.0,
- shadow_offset_y: 0.0,
- shadow_blur: 0.0,
- shadow_color: Color::transparent(),
- }
- }
-}
-
-fn is_zero_size_gradient(pattern: &Pattern) -> bool {
- if let &Pattern::LinearGradient(ref gradient) = pattern {
- if gradient.is_zero_size() {
- return true;
- }
- }
- false
+ pub transform: Transform2D<f32>,
+ pub shadow_offset_x: f64,
+ pub shadow_offset_y: f64,
+ pub shadow_blur: f64,
+ pub shadow_color: Color,
}
/// It writes an image to the destination target
@@ -954,13 +1116,12 @@ fn is_zero_size_gradient(pattern: &Pattern) -> bool {
/// dest_rect: Area of the destination target where the pixels will be copied
/// smoothing_enabled: It determines if smoothing is applied to the image result
fn write_image(
- draw_target: &DrawTarget,
+ draw_target: &GenericDrawTarget,
image_data: Vec<u8>,
image_size: Size2D<f64>,
dest_rect: Rect<f64>,
smoothing_enabled: bool,
- composition_op: CompositionOp,
- global_alpha: f32,
+ draw_options: &DrawOptions,
) {
if image_data.is_empty() {
return;
@@ -979,22 +1140,10 @@ fn write_image(
let image_size = image_size.to_i32();
let source_surface = draw_target
- .create_source_surface_from_data(
- &image_data,
- image_size,
- image_size.width * 4,
- SurfaceFormat::B8G8R8A8,
- )
+ .create_source_surface_from_data(&image_data, image_size, image_size.width * 4)
.unwrap();
- let draw_surface_options = DrawSurfaceOptions::new(filter, true);
- let draw_options = DrawOptions::new(global_alpha, composition_op, AntialiasMode::None);
- draw_target.draw_surface(
- source_surface,
- dest_rect.to_azure_style(),
- image_rect.to_azure_style(),
- draw_surface_options,
- draw_options,
- );
+
+ draw_target.draw_surface(source_surface, dest_rect, image_rect, filter, draw_options);
}
pub trait PointToi32 {
@@ -1043,188 +1192,3 @@ impl RectToi32 for Rect<f64> {
)
}
}
-
-pub trait ToAzureStyle {
- type Target;
- fn to_azure_style(self) -> Self::Target;
-}
-
-impl ToAzureStyle for Rect<f64> {
- type Target = Rect<AzFloat>;
-
- fn to_azure_style(self) -> Rect<AzFloat> {
- Rect::new(
- Point2D::new(self.origin.x as AzFloat, self.origin.y as AzFloat),
- Size2D::new(self.size.width as AzFloat, self.size.height as AzFloat),
- )
- }
-}
-
-impl ToAzureStyle for LineCapStyle {
- type Target = CapStyle;
-
- fn to_azure_style(self) -> CapStyle {
- match self {
- LineCapStyle::Butt => CapStyle::Butt,
- LineCapStyle::Round => CapStyle::Round,
- LineCapStyle::Square => CapStyle::Square,
- }
- }
-}
-
-impl ToAzureStyle for LineJoinStyle {
- type Target = JoinStyle;
-
- fn to_azure_style(self) -> JoinStyle {
- match self {
- LineJoinStyle::Round => JoinStyle::Round,
- LineJoinStyle::Bevel => JoinStyle::Bevel,
- LineJoinStyle::Miter => JoinStyle::Miter,
- }
- }
-}
-
-impl ToAzureStyle for CompositionStyle {
- type Target = CompositionOp;
-
- fn to_azure_style(self) -> CompositionOp {
- match self {
- CompositionStyle::SrcIn => CompositionOp::In,
- CompositionStyle::SrcOut => CompositionOp::Out,
- CompositionStyle::SrcOver => CompositionOp::Over,
- CompositionStyle::SrcAtop => CompositionOp::Atop,
- CompositionStyle::DestIn => CompositionOp::DestIn,
- CompositionStyle::DestOut => CompositionOp::DestOut,
- CompositionStyle::DestOver => CompositionOp::DestOver,
- CompositionStyle::DestAtop => CompositionOp::DestAtop,
- CompositionStyle::Copy => CompositionOp::Source,
- CompositionStyle::Lighter => CompositionOp::Add,
- CompositionStyle::Xor => CompositionOp::Xor,
- }
- }
-}
-
-impl ToAzureStyle for BlendingStyle {
- type Target = CompositionOp;
-
- fn to_azure_style(self) -> CompositionOp {
- match self {
- BlendingStyle::Multiply => CompositionOp::Multiply,
- BlendingStyle::Screen => CompositionOp::Screen,
- BlendingStyle::Overlay => CompositionOp::Overlay,
- BlendingStyle::Darken => CompositionOp::Darken,
- BlendingStyle::Lighten => CompositionOp::Lighten,
- BlendingStyle::ColorDodge => CompositionOp::ColorDodge,
- BlendingStyle::ColorBurn => CompositionOp::ColorBurn,
- BlendingStyle::HardLight => CompositionOp::HardLight,
- BlendingStyle::SoftLight => CompositionOp::SoftLight,
- BlendingStyle::Difference => CompositionOp::Difference,
- BlendingStyle::Exclusion => CompositionOp::Exclusion,
- BlendingStyle::Hue => CompositionOp::Hue,
- BlendingStyle::Saturation => CompositionOp::Saturation,
- BlendingStyle::Color => CompositionOp::Color,
- BlendingStyle::Luminosity => CompositionOp::Luminosity,
- }
- }
-}
-
-impl ToAzureStyle for CompositionOrBlending {
- type Target = CompositionOp;
-
- fn to_azure_style(self) -> CompositionOp {
- match self {
- CompositionOrBlending::Composition(op) => op.to_azure_style(),
- CompositionOrBlending::Blending(op) => op.to_azure_style(),
- }
- }
-}
-
-pub trait ToAzurePattern {
- fn to_azure_pattern(&self, drawtarget: &DrawTarget) -> Option<Pattern>;
-}
-
-impl ToAzurePattern for FillOrStrokeStyle {
- fn to_azure_pattern(&self, drawtarget: &DrawTarget) -> Option<Pattern> {
- Some(match *self {
- FillOrStrokeStyle::Color(ref color) => {
- Pattern::Color(ColorPattern::new(color.to_azure_style()))
- },
- FillOrStrokeStyle::LinearGradient(ref linear_gradient_style) => {
- let gradient_stops: Vec<GradientStop> = linear_gradient_style
- .stops
- .iter()
- .map(|s| GradientStop {
- offset: s.offset as AzFloat,
- color: s.color.to_azure_style(),
- })
- .collect();
-
- Pattern::LinearGradient(LinearGradientPattern::new(
- &Point2D::new(
- linear_gradient_style.x0 as AzFloat,
- linear_gradient_style.y0 as AzFloat,
- ),
- &Point2D::new(
- linear_gradient_style.x1 as AzFloat,
- linear_gradient_style.y1 as AzFloat,
- ),
- drawtarget.create_gradient_stops(&gradient_stops, ExtendMode::Clamp),
- &Transform2D::identity(),
- ))
- },
- FillOrStrokeStyle::RadialGradient(ref radial_gradient_style) => {
- let gradient_stops: Vec<GradientStop> = radial_gradient_style
- .stops
- .iter()
- .map(|s| GradientStop {
- offset: s.offset as AzFloat,
- color: s.color.to_azure_style(),
- })
- .collect();
-
- Pattern::RadialGradient(RadialGradientPattern::new(
- &Point2D::new(
- radial_gradient_style.x0 as AzFloat,
- radial_gradient_style.y0 as AzFloat,
- ),
- &Point2D::new(
- radial_gradient_style.x1 as AzFloat,
- radial_gradient_style.y1 as AzFloat,
- ),
- radial_gradient_style.r0 as AzFloat,
- radial_gradient_style.r1 as AzFloat,
- drawtarget.create_gradient_stops(&gradient_stops, ExtendMode::Clamp),
- &Transform2D::identity(),
- ))
- },
- FillOrStrokeStyle::Surface(ref surface_style) => {
- let source_surface = drawtarget.create_source_surface_from_data(
- &surface_style.surface_data,
- // FIXME(nox): Why are those i32 values?
- surface_style.surface_size.to_i32(),
- surface_style.surface_size.width as i32 * 4,
- SurfaceFormat::B8G8R8A8,
- )?;
- Pattern::Surface(SurfacePattern::new(
- source_surface.azure_source_surface,
- surface_style.repeat_x,
- surface_style.repeat_y,
- &Transform2D::identity(),
- ))
- },
- })
- }
-}
-
-impl ToAzureStyle for RGBA {
- type Target = Color;
-
- fn to_azure_style(self) -> Color {
- Color::rgba(
- self.red_f32() as AzFloat,
- self.green_f32() as AzFloat,
- self.blue_f32() as AzFloat,
- self.alpha_f32() as AzFloat,
- )
- }
-}
diff --git a/components/canvas/canvas_paint_thread.rs b/components/canvas/canvas_paint_thread.rs
index b9e0a4fbd45..f026311f2ee 100644
--- a/components/canvas/canvas_paint_thread.rs
+++ b/components/canvas/canvas_paint_thread.rs
@@ -3,7 +3,6 @@
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
use crate::canvas_data::*;
-use azure::azure_hl::AntialiasMode;
use canvas_traits::canvas::*;
use euclid::Size2D;
use ipc_channel::ipc::{self, IpcSender};
@@ -11,6 +10,11 @@ use std::borrow::ToOwned;
use std::collections::HashMap;
use std::thread;
+pub enum AntialiasMode {
+ Default,
+ None,
+}
+
pub struct CanvasPaintThread<'a> {
canvases: HashMap<CanvasId, CanvasData<'a>>,
next_canvas_id: CanvasId,
@@ -195,9 +199,7 @@ impl<'a> CanvasPaintThread<'a> {
self.canvas(canvas_id).set_shadow_offset_y(value)
},
Canvas2dMsg::SetShadowBlur(value) => self.canvas(canvas_id).set_shadow_blur(value),
- Canvas2dMsg::SetShadowColor(ref color) => self
- .canvas(canvas_id)
- .set_shadow_color(color.to_azure_style()),
+ Canvas2dMsg::SetShadowColor(color) => self.canvas(canvas_id).set_shadow_color(color),
}
}
diff --git a/components/canvas/lib.rs b/components/canvas/lib.rs
index cb6fe50f8d8..28dd1e04f5d 100644
--- a/components/canvas/lib.rs
+++ b/components/canvas/lib.rs
@@ -7,6 +7,12 @@
#[macro_use]
extern crate log;
+#[cfg(feature = "azure_backend")]
+mod azure_backend;
+
+#[cfg(feature = "raqote_backend")]
+mod raqote_backend;
+
pub mod canvas_data;
pub mod canvas_paint_thread;
pub mod gl_context;
diff --git a/components/canvas/raqote_backend.rs b/components/canvas/raqote_backend.rs
new file mode 100644
index 00000000000..6e49026606e
--- /dev/null
+++ b/components/canvas/raqote_backend.rs
@@ -0,0 +1,262 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
+
+use crate::canvas_data::{
+ Backend, CanvasPaintState, Color, CompositionOp, DrawOptions, ExtendMode, Filter,
+ GenericDrawTarget, GenericPathBuilder, GradientStop, GradientStops, Path, Pattern,
+ SourceSurface, StrokeOptions, SurfaceFormat,
+};
+use crate::canvas_paint_thread::AntialiasMode;
+use canvas_traits::canvas::*;
+use cssparser::RGBA;
+use euclid::{Point2D, Rect, Size2D, Transform2D, Vector2D};
+use std::marker::PhantomData;
+
+pub struct RaqoteBackend;
+
+impl Backend for RaqoteBackend {
+ fn get_composition_op(&self, _opts: &DrawOptions) -> CompositionOp {
+ unimplemented!()
+ }
+
+ fn need_to_draw_shadow(&self, _color: &Color) -> bool {
+ unimplemented!()
+ }
+
+ fn size_from_pattern(&self, _rect: &Rect<f32>, _pattern: &Pattern) -> Option<Size2D<f32>> {
+ unimplemented!()
+ }
+
+ fn set_shadow_color<'a>(&mut self, _color: RGBA, _state: &mut CanvasPaintState<'a>) {
+ unimplemented!()
+ }
+
+ fn set_fill_style<'a>(
+ &mut self,
+ _style: FillOrStrokeStyle,
+ _state: &mut CanvasPaintState<'a>,
+ _drawtarget: &GenericDrawTarget,
+ ) {
+ unimplemented!()
+ }
+
+ fn set_stroke_style<'a>(
+ &mut self,
+ _style: FillOrStrokeStyle,
+ _state: &mut CanvasPaintState<'a>,
+ _drawtarget: &GenericDrawTarget,
+ ) {
+ unimplemented!()
+ }
+
+ fn set_global_composition<'a>(
+ &mut self,
+ _op: CompositionOrBlending,
+ _state: &mut CanvasPaintState<'a>,
+ ) {
+ unimplemented!()
+ }
+
+ fn create_drawtarget(&self, size: Size2D<u64>) -> Box<GenericDrawTarget> {
+ Box::new(raqote::DrawTarget::new(
+ size.width as i32,
+ size.height as i32,
+ ))
+ }
+
+ fn recreate_paint_state<'a>(&self, _state: &CanvasPaintState<'a>) -> CanvasPaintState<'a> {
+ CanvasPaintState::new(AntialiasMode::Default)
+ }
+}
+
+impl<'a> CanvasPaintState<'a> {
+ pub fn new(_antialias: AntialiasMode) -> CanvasPaintState<'a> {
+ CanvasPaintState {
+ draw_options: DrawOptions::Raqote(()),
+ fill_style: Pattern::Raqote(()),
+ stroke_style: Pattern::Raqote(()),
+ stroke_opts: StrokeOptions::Raqote(PhantomData),
+ transform: Transform2D::identity(),
+ shadow_offset_x: 0.0,
+ shadow_offset_y: 0.0,
+ shadow_blur: 0.0,
+ shadow_color: Color::Raqote(()),
+ }
+ }
+}
+
+impl Pattern {
+ pub fn is_zero_size_gradient(&self) -> bool {
+ match *self {
+ Pattern::Raqote(()) => unimplemented!(),
+ }
+ }
+}
+
+impl<'a> StrokeOptions<'a> {
+ pub fn set_line_width(&mut self, _val: f32) {
+ unimplemented!()
+ }
+ pub fn set_miter_limit(&mut self, _val: f32) {
+ unimplemented!()
+ }
+ pub fn set_line_join(&mut self, _val: LineJoinStyle) {
+ unimplemented!()
+ }
+ pub fn set_line_cap(&mut self, _val: LineCapStyle) {
+ unimplemented!()
+ }
+}
+
+impl DrawOptions {
+ pub fn set_alpha(&mut self, _val: f32) {
+ match self {
+ DrawOptions::Raqote(()) => unimplemented!(),
+ }
+ }
+}
+
+impl Path {
+ pub fn transformed_copy_to_builder(
+ &self,
+ _transform: &Transform2D<f32>,
+ ) -> Box<GenericPathBuilder> {
+ unimplemented!()
+ }
+
+ pub fn contains_point(&self, _x: f64, _y: f64, _path_transform: &Transform2D<f32>) -> bool {
+ unimplemented!()
+ }
+
+ pub fn copy_to_builder(&self) -> Box<GenericPathBuilder> {
+ unimplemented!()
+ }
+}
+
+impl GenericDrawTarget for raqote::DrawTarget {
+ fn clear_rect(&self, _rect: &Rect<f32>) {
+ unimplemented!()
+ }
+
+ fn copy_surface(
+ &self,
+ _surface: SourceSurface,
+ _source: Rect<i32>,
+ _destination: Point2D<i32>,
+ ) {
+ unimplemented!()
+ }
+
+ fn create_gradient_stops(
+ &self,
+ _gradient_stops: Vec<GradientStop>,
+ _extend_mode: ExtendMode,
+ ) -> GradientStops {
+ unimplemented!()
+ }
+
+ fn create_path_builder(&self) -> Box<GenericPathBuilder> {
+ unimplemented!()
+ }
+
+ fn create_similar_draw_target(
+ &self,
+ _size: &Size2D<i32>,
+ _format: SurfaceFormat,
+ ) -> Box<GenericDrawTarget> {
+ unimplemented!()
+ }
+ fn create_source_surface_from_data(
+ &self,
+ _data: &[u8],
+ _size: Size2D<i32>,
+ _stride: i32,
+ ) -> Option<SourceSurface> {
+ unimplemented!()
+ }
+ fn draw_surface(
+ &self,
+ _surface: SourceSurface,
+ _dest: Rect<f64>,
+ _source: Rect<f64>,
+ _filter: Filter,
+ _draw_options: &DrawOptions,
+ ) {
+ unimplemented!()
+ }
+ fn draw_surface_with_shadow(
+ &self,
+ _surface: SourceSurface,
+ _dest: &Point2D<f32>,
+ _color: &Color,
+ _offset: &Vector2D<f32>,
+ _sigma: f32,
+ _operator: CompositionOp,
+ ) {
+ unimplemented!()
+ }
+ fn fill(&self, _path: &Path, _pattern: Pattern, _draw_options: &DrawOptions) {
+ unimplemented!()
+ }
+ fn fill_rect(&self, _rect: &Rect<f32>, _pattern: Pattern, _draw_options: Option<&DrawOptions>) {
+ unimplemented!()
+ }
+ fn get_format(&self) -> SurfaceFormat {
+ unimplemented!()
+ }
+ fn get_size(&self) -> Size2D<i32> {
+ unimplemented!()
+ }
+ fn get_transform(&self) -> Transform2D<f32> {
+ unimplemented!()
+ }
+ fn pop_clip(&self) {
+ unimplemented!()
+ }
+ fn push_clip(&self, _path: &Path) {
+ unimplemented!()
+ }
+ fn set_transform(&self, _matrix: &Transform2D<f32>) {
+ unimplemented!()
+ }
+ fn snapshot(&self) -> SourceSurface {
+ unimplemented!()
+ }
+ fn stroke(
+ &self,
+ _path: &Path,
+ _pattern: Pattern,
+ _stroke_options: &StrokeOptions,
+ _draw_options: &DrawOptions,
+ ) {
+ unimplemented!()
+ }
+ fn stroke_line(
+ &self,
+ _start: Point2D<f32>,
+ _end: Point2D<f32>,
+ _pattern: Pattern,
+ _stroke_options: &StrokeOptions,
+ _draw_options: &DrawOptions,
+ ) {
+ unimplemented!()
+ }
+ fn stroke_rect(
+ &self,
+ _rect: &Rect<f32>,
+ _pattern: Pattern,
+ _stroke_options: &StrokeOptions,
+ _draw_options: &DrawOptions,
+ ) {
+ unimplemented!()
+ }
+
+ fn snapshot_data(&self, _f: &Fn(&[u8]) -> Vec<u8>) -> Vec<u8> {
+ unimplemented!()
+ }
+
+ fn snapshot_data_owned(&self) -> Vec<u8> {
+ unimplemented!()
+ }
+}
diff --git a/components/constellation/Cargo.toml b/components/constellation/Cargo.toml
index 795a1c5921e..fc2021d3af3 100644
--- a/components/constellation/Cargo.toml
+++ b/components/constellation/Cargo.toml
@@ -10,11 +10,15 @@ publish = false
name = "constellation"
path = "lib.rs"
+[features]
+azure_backend = ["canvas/azure_backend"]
+raqote_backend = ["canvas/raqote_backend"]
+
[dependencies]
background_hang_monitor = { path = "../background_hang_monitor"}
backtrace = "0.3"
bluetooth_traits = { path = "../bluetooth_traits" }
-canvas = {path = "../canvas"}
+canvas = {path = "../canvas", default-features = false}
clipboard = "0.5"
canvas_traits = {path = "../canvas_traits"}
compositing = {path = "../compositing"}
diff --git a/components/servo/Cargo.toml b/components/servo/Cargo.toml
index a81954f885f..86e5f0852a6 100644
--- a/components/servo/Cargo.toml
+++ b/components/servo/Cargo.toml
@@ -12,14 +12,15 @@ path = "lib.rs"
crate-type = ["rlib"]
[features]
-max_log_level = ["log/release_max_level_info"]
-webdriver = ["webdriver_server"]
-energy-profiling = ["profile_traits/energy-profiling"]
+azure_backend = ["canvas/azure_backend"]
debugmozjs = ["script/debugmozjs"]
+energy-profiling = ["profile_traits/energy-profiling"]
profilemozjs = ["script/profilemozjs"]
googlevr = ["webvr/googlevr"]
js_backtrace = ["script/js_backtrace"]
+max_log_level = ["log/release_max_level_info"]
native-bluetooth = ["bluetooth/native-bluetooth"]
+raqote_backend = ["canvas/raqote_backend"]
webrender_debugger = ["webrender/debugger"]
no_static_freetype = ["webrender/no_static_freetype"]
oculusvr = ["webvr/oculusvr"]
@@ -28,6 +29,7 @@ unstable = [
"profile/unstable",
"script/unstable",
]
+webdriver = ["webdriver_server"]
webgl_backtrace = [
"script/webgl_backtrace",
"canvas/webgl_backtrace",
@@ -38,7 +40,7 @@ webgl_backtrace = [
background_hang_monitor = {path = "../background_hang_monitor"}
bluetooth_traits = {path = "../bluetooth_traits"}
bluetooth = {path = "../bluetooth"}
-canvas = {path = "../canvas"}
+canvas = {path = "../canvas", default-features = false}
canvas_traits = {path = "../canvas_traits"}
compositing = {path = "../compositing", features = ["gl"]}
constellation = {path = "../constellation"}
diff --git a/etc/taskcluster/decision_task.py b/etc/taskcluster/decision_task.py
index bbe797bc4f0..6de1fce4db9 100644
--- a/etc/taskcluster/decision_task.py
+++ b/etc/taskcluster/decision_task.py
@@ -175,6 +175,7 @@ def linux_tidy_unit_docs():
./mach build --dev
./mach test-unit
./mach package --dev
+ ./mach build --dev --features raqote_backend
./mach build --dev --libsimpleservo
./mach build --dev --no-default-features --features default-except-unstable
./mach test-tidy --no-progress --self-test
diff --git a/ports/glutin/Cargo.toml b/ports/glutin/Cargo.toml
index 41fbf47d734..534abcbf351 100644
--- a/ports/glutin/Cargo.toml
+++ b/ports/glutin/Cargo.toml
@@ -27,18 +27,20 @@ OriginalFilename = "servo.exe"
ProductName = "Servo"
[features]
+azure_backend = ["libservo/azure_backend"]
default = ["unstable", "default-except-unstable"]
default-except-unstable = ["webdriver", "max_log_level"]
-native-bluetooth = ["libservo/native-bluetooth"]
-max_log_level = ["log/release_max_level_info"]
-webdriver = ["libservo/webdriver"]
energy-profiling = ["libservo/energy-profiling"]
debugmozjs = ["libservo/debugmozjs"]
+js_backtrace = ["libservo/js_backtrace"]
+max_log_level = ["log/release_max_level_info"]
+native-bluetooth = ["libservo/native-bluetooth"]
profilemozjs = ["libservo/profilemozjs"]
+raqote_backend = ["libservo/raqote_backend"]
unstable = ["libservo/unstable"]
+webdriver = ["libservo/webdriver"]
webgl_backtrace = ["libservo/webgl_backtrace"]
webrender_debugger = ["libservo/webrender_debugger"]
-js_backtrace = ["libservo/js_backtrace"]
[target.'cfg(not(target_os = "android"))'.dependencies]
backtrace = "0.3"
diff --git a/ports/libmlservo/Cargo.toml b/ports/libmlservo/Cargo.toml
index 2534dbe4a9d..b2e3d900285 100644
--- a/ports/libmlservo/Cargo.toml
+++ b/ports/libmlservo/Cargo.toml
@@ -12,6 +12,10 @@ crate-type = ["staticlib"]
test = false
bench = false
+[features]
+azure_backend = ["simpleservo/azure_backend"]
+raqote_backend = ["simpleservo/raqote_backend"]
+
[dependencies]
libservo = { path = "../../components/servo", features = ["no_static_freetype"] }
simpleservo = { path = "../libsimpleservo/api", features = ["no_static_freetype"] }
diff --git a/ports/libsimpleservo/api/Cargo.toml b/ports/libsimpleservo/api/Cargo.toml
index 0556947d7da..7c48fa4de21 100644
--- a/ports/libsimpleservo/api/Cargo.toml
+++ b/ports/libsimpleservo/api/Cargo.toml
@@ -26,16 +26,18 @@ libloading = "0.5"
gl_generator = "0.11"
[features]
+azure_backend = ["libservo/azure_backend"]
default = ["unstable", "default-except-unstable"]
default-except-unstable = ["webdriver", "max_log_level"]
-max_log_level = ["log/release_max_level_info"]
-webdriver = ["libservo/webdriver"]
-energy-profiling = ["libservo/energy-profiling"]
debugmozjs = ["libservo/debugmozjs"]
-unstable = ["libservo/unstable"]
+energy-profiling = ["libservo/energy-profiling"]
googlevr = ["libservo/googlevr"]
-oculusvr = ["libservo/oculusvr"]
-native-bluetooth = ["libservo/native-bluetooth"]
-webgl_backtrace = ["libservo/webgl_backtrace"]
js_backtrace = ["libservo/js_backtrace"]
+max_log_level = ["log/release_max_level_info"]
+native-bluetooth = ["libservo/native-bluetooth"]
no_static_freetype = ["libservo/no_static_freetype"]
+oculusvr = ["libservo/oculusvr"]
+raqote_backend = ["libservo/raqote_backend"]
+webdriver = ["libservo/webdriver"]
+unstable = ["libservo/unstable"]
+webgl_backtrace = ["libservo/webgl_backtrace"]
diff --git a/ports/libsimpleservo/capi/Cargo.toml b/ports/libsimpleservo/capi/Cargo.toml
index c114f87083d..7764f3fe71b 100644
--- a/ports/libsimpleservo/capi/Cargo.toml
+++ b/ports/libsimpleservo/capi/Cargo.toml
@@ -21,15 +21,17 @@ env_logger = "0.6"
cbindgen = "0.8"
[features]
+azure_backend = ["simpleservo/azure_backend"]
+debugmozjs = ["simpleservo/debugmozjs"]
default = ["unstable", "default-except-unstable"]
default-except-unstable = ["webdriver", "max_log_level"]
-max_log_level = ["simpleservo/max_log_level"]
-webdriver = ["simpleservo/webdriver"]
energy-profiling = ["simpleservo/energy-profiling"]
-debugmozjs = ["simpleservo/debugmozjs"]
-unstable = ["simpleservo/unstable"]
googlevr = ["simpleservo/googlevr"]
-oculusvr = ["simpleservo/oculusvr"]
+js_backtrace = ["simpleservo/js_backtrace"]
+max_log_level = ["simpleservo/max_log_level"]
native-bluetooth = ["simpleservo/native-bluetooth"]
+oculusvr = ["simpleservo/oculusvr"]
+raqote_backend = ["simpleservo/raqote_backend"]
+unstable = ["simpleservo/unstable"]
+webdriver = ["simpleservo/webdriver"]
webgl_backtrace = ["simpleservo/webgl_backtrace"]
-js_backtrace = ["simpleservo/js_backtrace"]
diff --git a/ports/libsimpleservo/jniapi/Cargo.toml b/ports/libsimpleservo/jniapi/Cargo.toml
index d2fafd86dc2..95a841770a0 100644
--- a/ports/libsimpleservo/jniapi/Cargo.toml
+++ b/ports/libsimpleservo/jniapi/Cargo.toml
@@ -26,15 +26,17 @@ simpleservo = { path = "../api" }
cc = "1.0"
[features]
+azure_backend = ["simpleservo/azure_backend"]
+debugmozjs = ["simpleservo/debugmozjs"]
default = ["unstable", "default-except-unstable"]
default-except-unstable = ["webdriver", "max_log_level"]
-max_log_level = ["simpleservo/max_log_level"]
-webdriver = ["simpleservo/webdriver"]
energy-profiling = ["simpleservo/energy-profiling"]
-debugmozjs = ["simpleservo/debugmozjs"]
-unstable = ["simpleservo/unstable"]
googlevr = ["simpleservo/googlevr"]
-oculusvr = ["simpleservo/oculusvr"]
+js_backtrace = ["simpleservo/js_backtrace"]
+max_log_level = ["simpleservo/max_log_level"]
native-bluetooth = ["simpleservo/native-bluetooth"]
+oculusvr = ["simpleservo/oculusvr"]
+raqote_backend = ["simpleservo/raqote_backend"]
+unstable = ["simpleservo/unstable"]
+webdriver = ["simpleservo/webdriver"]
webgl_backtrace = ["simpleservo/webgl_backtrace"]
-js_backtrace = ["simpleservo/js_backtrace"]
diff --git a/python/servo/build_commands.py b/python/servo/build_commands.py
index 05e8db0bfdc..51709be6834 100644
--- a/python/servo/build_commands.py
+++ b/python/servo/build_commands.py
@@ -296,6 +296,9 @@ class MachCommands(CommandBase):
if self.config["build"]["dom-backtrace"]:
features += ["dom-backtrace"]
+ if "raqote_backend" not in features:
+ features += ["azure_backend"]
+
if features:
opts += ["--features", "%s" % ' '.join(features)]
diff --git a/python/servo/post_build_commands.py b/python/servo/post_build_commands.py
index 4d27475f74b..42e2ad84cb4 100644
--- a/python/servo/post_build_commands.py
+++ b/python/servo/post_build_commands.py
@@ -264,6 +264,8 @@ class PostBuildCommands(CommandBase):
else:
copy2(full_name, destination)
+ params += ["--features", "azure_backend"]
+
returncode = self.call_rustup_run(
["cargo", "doc", "--manifest-path", self.ports_glutin_manifest()] + params,
env=self.build_env())
diff --git a/servo-tidy.toml b/servo-tidy.toml
index 5ad6a7fc3ad..3af80740c70 100644
--- a/servo-tidy.toml
+++ b/servo-tidy.toml
@@ -39,9 +39,11 @@ packages = [
"crossbeam-epoch",
"crossbeam-utils",
"digest",
+ "dwrote",
"generic-array",
"gl_generator", # https://github.com/servo/servo/pull/23288#issuecomment-494687746
"lock_api",
+ "memmap",
"nix", # https://github.com/servo/servo/issues/23189#issuecomment-487512605
"parking_lot",
"parking_lot_core",