From 4aef626e34583e175067f9f3d26815eaf04c910d Mon Sep 17 00:00:00 2001 From: Armin Sander Date: Tue, 16 Apr 2019 13:24:07 +0200 Subject: [PATCH 1/9] support features 'svg' and wrap SkSVGCanvas --- azure-pipelines-template.yml | 3 ++ skia-bindings/CMakeLists.txt | 2 + skia-bindings/Cargo.toml | 1 + skia-bindings/build.rs | 33 +++++++++++----- skia-bindings/src/bindings.cpp | 18 ++++++++- skia-safe/Cargo.toml | 1 + skia-safe/src/core/canvas.rs | 2 +- skia-safe/src/lib.rs | 2 + skia-safe/src/prelude.rs | 2 +- skia-safe/src/svg.rs | 3 ++ skia-safe/src/svg/canvas.rs | 69 ++++++++++++++++++++++++++++++++++ 11 files changed, 124 insertions(+), 12 deletions(-) create mode 100644 skia-safe/src/svg.rs create mode 100644 skia-safe/src/svg/canvas.rs diff --git a/azure-pipelines-template.yml b/azure-pipelines-template.yml index 5874097c4..7c76659d2 100644 --- a/azure-pipelines-template.yml +++ b/azure-pipelines-template.yml @@ -11,6 +11,9 @@ jobs: stable-vulkan: toolchain: stable features: 'vulkan' + stable-svg: + toolchain: stable + features: 'svg' variables: platform: ${{ parameters.platform }} image: ${{ parameters.image }} diff --git a/skia-bindings/CMakeLists.txt b/skia-bindings/CMakeLists.txt index 0c65c6784..ec9f72022 100644 --- a/skia-bindings/CMakeLists.txt +++ b/skia-bindings/CMakeLists.txt @@ -7,5 +7,7 @@ include_directories("skia/include/core") include_directories("skia/include/docs") include_directories("skia/include/effects") include_directories("skia/include/gpu") +include_directories("skia/include/svg") +include_directories("skia/src/xml") add_library(skiabindings src/bindings.cpp) diff --git a/skia-bindings/Cargo.toml b/skia-bindings/Cargo.toml index b2985f260..3ed4c7390 100644 --- a/skia-bindings/Cargo.toml +++ b/skia-bindings/Cargo.toml @@ -10,6 +10,7 @@ include = [ "Cargo.toml", "build.rs", "src/**/*.cpp", "src/lib.rs", "skia/includ [features] default = [] vulkan = [] +svg = [] [dependencies] diff --git a/skia-bindings/build.rs b/skia-bindings/build.rs index 4e61355ec..e045b1e13 100644 --- a/skia-bindings/build.rs +++ b/skia-bindings/build.rs @@ -5,7 +5,7 @@ extern crate cc; use std::env; use std::fs; -use std::path::PathBuf; +use std::path::{PathBuf, Path}; use std::process::{Command, Stdio}; use bindgen::EnumVariation; use cc::Build; @@ -24,6 +24,9 @@ mod build { /// Build with Vulkan support? pub const VULKAN: bool = cfg!(feature = "vulkan"); + + /// Build with SVG support? + pub const SVG: bool = cfg!(feature = "svg"); } fn main() { @@ -72,7 +75,8 @@ fn main() { let mut args: Vec<(&str, String)> = vec![ ("is_official_build", if build::SKIA_RELEASE { yes() } else { no() }), - ("skia_use_expat", no()), + ("skia_use_expat", if build::SVG { yes() } else { no() }), + ("skia_use_system_expat", no()), ("skia_use_icu", no()), ("skia_use_system_libjpeg_turbo", no()), ("skia_use_system_libpng", no()), @@ -175,15 +179,14 @@ fn main() { .success(), "`ninja` returned an error, please check the output for details."); let current_dir = env::current_dir().unwrap(); - let current_dir_name = current_dir.to_str().unwrap(); println!("cargo:rustc-link-search={}", &skia_out_dir); - cargo::add_link_libs(&["static=skia", "static=skiabinding"]); + cargo::add_link_lib("static=skia"); - bindgen_gen(¤t_dir_name, &skia_out_dir) + bindgen_gen(¤t_dir, &skia_out_dir) } -fn bindgen_gen(current_dir_name: &str, skia_out_dir: &str) { +fn bindgen_gen(current_dir: &Path, skia_out_dir: &str) { let mut builder = bindgen::Builder::default() .generate_inline_functions(true) @@ -225,9 +228,11 @@ fn bindgen_gen(current_dir_name: &str, skia_out_dir: &str) { .whitelist_type("SkGradientShader") .whitelist_type("SkPerlinNoiseShader") .whitelist_type("SkTableColorFilter") + .whitelist_type("SkDocument") .whitelist_type("SkDynamicMemoryWStream") + .whitelist_type("SkXMLStreamWriter") .whitelist_type("GrGLBackendState") @@ -251,9 +256,9 @@ fn bindgen_gen(current_dir_name: &str, skia_out_dir: &str) { for include_dir in fs::read_dir("skia/include").expect("Unable to read skia/include") { let dir = include_dir.unwrap(); cargo::add_dependent_path(dir.path().to_str().unwrap()); - let include_path = format!("{}/{}", ¤t_dir_name, &dir.path().to_str().unwrap()); - builder = builder.clang_arg(format!("-I{}", &include_path)); - cc_build.include(&include_path); + let include_path = current_dir.join(dir.path()); + builder = builder.clang_arg(format!("-I{}", include_path.display())); + cc_build.include(include_path); } if build::VULKAN { @@ -263,6 +268,16 @@ fn bindgen_gen(current_dir_name: &str, skia_out_dir: &str) { builder = builder.clang_arg("-DSKIA_IMPLEMENTATION=1"); } + if build::SVG { + cc_build.define("SK_XML", "1"); + builder = builder.clang_arg("-DSK_XML"); + + // SkXMLWriter.h + let include_path = current_dir.join(Path::new("skia/src/xml")); + builder = builder.clang_arg(format!("-I{}", include_path.display())); + cc_build.include(include_path); + } + if build::SKIA_RELEASE { cc_build.define("NDEBUG", "1"); builder = builder.clang_arg("-DNDEBUG=1") diff --git a/skia-bindings/src/bindings.cpp b/skia-bindings/src/bindings.cpp index fdeeee653..b40c0e867 100644 --- a/skia-bindings/src/bindings.cpp +++ b/skia-bindings/src/bindings.cpp @@ -38,14 +38,18 @@ #include "GrContext.h" // gpu/gl #include "gl/GrGLInterface.h" +#include "SkRect.h" #if defined(SK_VULKAN) - #include "vk/GrVkVulkan.h" #include "vk/GrVkTypes.h" #include "vk/GrVkBackendContext.h" #include "GrBackendSurface.h" +#endif +#if defined(SK_XML) +#include "SkSVGCanvas.h" +#include "SkXMLWriter.h" #endif template @@ -1358,3 +1362,15 @@ extern "C" bool C_GrVkImageInfo_Equals(const GrVkImageInfo* lhs, const GrVkImage } #endif + +#if defined(SK_XML) + +// Note, we can't use the SkWStream* implementation, because its implementation creates +// an SkXMLWriter and destroys it before returning (this bug is fixed in Skia master, and +// so may be available in a future update). + +extern "C" SkCanvas* C_SkSVGCanvas_Make(const SkRect* bounds, SkXMLWriter* writer) { + return SkSVGCanvas::Make(*bounds, writer).release(); +} + +#endif diff --git a/skia-safe/Cargo.toml b/skia-safe/Cargo.toml index 376d3c51c..cf7eb783a 100644 --- a/skia-safe/Cargo.toml +++ b/skia-safe/Cargo.toml @@ -7,6 +7,7 @@ edition = "2018" [features] default = [] vulkan = ["skia-bindings/vulkan"] +svg = ["skia-bindings/svg"] [dependencies] bitflags = "1.0.4" diff --git a/skia-safe/src/core/canvas.rs b/skia-safe/src/core/canvas.rs index 05139f0a4..8e030891c 100644 --- a/skia-safe/src/core/canvas.rs +++ b/skia-safe/src/core/canvas.rs @@ -145,7 +145,7 @@ impl NativeAccess for Canvas { } } -/// This is the type representing a canvas that is owned and destructed +/// This is the type representing a canvas that is owned and dropped /// when it goes out of scope _and_ is bound to a the lifetime of another /// instance. Function resolvement is done via the Deref trait. pub struct OwnedCanvas<'lt>(*mut Canvas, PhantomData<&'lt ()>); diff --git a/skia-safe/src/lib.rs b/skia-safe/src/lib.rs index 9f865c693..62dcf73ba 100644 --- a/skia-safe/src/lib.rs +++ b/skia-safe/src/lib.rs @@ -4,6 +4,8 @@ mod docs; mod effects; mod interop; pub mod gpu; +#[cfg(feature = "svg")] +pub mod svg; #[macro_use] extern crate bitflags; diff --git a/skia-safe/src/prelude.rs b/skia-safe/src/prelude.rs index a15002894..1727c7c6f 100644 --- a/skia-safe/src/prelude.rs +++ b/skia-safe/src/prelude.rs @@ -231,7 +231,7 @@ impl IntoHandle for N } /// Wraps a native type that can be represented as a value -/// and needs a destructor. +/// and needs a Drop trait. #[repr(transparent)] pub struct Handle(N); diff --git a/skia-safe/src/svg.rs b/skia-safe/src/svg.rs new file mode 100644 index 000000000..d6061578a --- /dev/null +++ b/skia-safe/src/svg.rs @@ -0,0 +1,3 @@ +mod canvas; +pub use self::canvas::*; + diff --git a/skia-safe/src/svg/canvas.rs b/skia-safe/src/svg/canvas.rs new file mode 100644 index 000000000..fe041787a --- /dev/null +++ b/skia-safe/src/svg/canvas.rs @@ -0,0 +1,69 @@ +use crate::interop::DynamicMemoryWStream; +use crate::prelude::{NativeAccess, NativeTransmutable}; +use crate::{Data, Rect}; +use skia_bindings::{C_SkCanvas_delete, C_SkSVGCanvas_Make, SkCanvas, SkXMLStreamWriter}; +use std::ops::{Deref, DerefMut}; +use std::pin::Pin; + +pub struct Canvas { + canvas: *mut SkCanvas, + #[allow(dead_code)] + xml_stream_writer: Pin>, + stream: Pin>, +} + +impl Drop for Canvas { + fn drop(&mut self) { + unsafe { + C_SkCanvas_delete(self.canvas); + } + } +} + +impl Deref for Canvas { + type Target = crate::Canvas; + + fn deref(&self) -> &Self::Target { + crate::Canvas::borrow_from_native(unsafe { &mut *self.canvas }) + } +} + +impl DerefMut for Canvas { + fn deref_mut(&mut self) -> &mut Self::Target { + crate::Canvas::borrow_from_native(unsafe { &mut *self.canvas }) + } +} + +impl Canvas { + /// Creates a new SVG canvas. + pub fn new>(bounds: B) -> Canvas { + let bounds = bounds.as_ref(); + let mut stream = Box::pin(DynamicMemoryWStream::new()); + let mut xml_stream_writer = + Box::pin(unsafe { SkXMLStreamWriter::new(&mut stream.native_mut()._base) }); + let canvas = unsafe { C_SkSVGCanvas_Make(bounds.native(), &mut xml_stream_writer._base) }; + Canvas { + canvas, + xml_stream_writer, + stream, + } + } + + /// Ends the Canvas drawing and returns the resulting SVG. + pub fn end(mut self) -> Data { + self.deref_mut().flush(); + self.stream.detach_as_data() + } +} + +#[test] +fn test_svg() { + use crate::Paint; + let mut canvas = Canvas::new(&Rect::from_size((20, 20))); + let paint = Paint::default(); + canvas.draw_circle((10, 10), 10.0, &paint); + let data = canvas.end(); + let contents = String::from_utf8_lossy(data.bytes()); + assert!(contents + .contains(r#""#)); +} From 93108ed5934cca81d54e006348979eaf6914ef96 Mon Sep 17 00:00:00 2001 From: Armin Sander Date: Tue, 16 Apr 2019 13:52:48 +0200 Subject: [PATCH 2/9] add SVG support to the skia-org example --- skia-safe/examples/skia-org/main.rs | 45 ++++++++++++++++++++++------- skia-safe/src/svg/canvas.rs | 1 + 2 files changed, 35 insertions(+), 11 deletions(-) diff --git a/skia-safe/examples/skia-org/main.rs b/skia-safe/examples/skia-org/main.rs index 6c6515cb3..d23c37869 100644 --- a/skia-safe/examples/skia-org/main.rs +++ b/skia-safe/examples/skia-org/main.rs @@ -52,10 +52,13 @@ pub(crate) mod artifact { } pub enum CPU {} + pub enum PDF {} + #[cfg(feature = "svg")] + pub enum SVG {} + pub enum OpenGL {} #[cfg(feature = "vulkan")] pub enum Vulkan {} - pub enum PDF {} impl DrawingDriver for CPU { @@ -79,6 +82,19 @@ pub(crate) mod artifact { } } + #[cfg(feature = "svg")] + impl DrawingDriver for SVG { + const NAME: &'static str = "svg"; + + fn draw_image(size: (i32, i32), path: &PathBuf, name: &str, func: F) -> () where F: Fn(&mut Canvas) -> () { + use skia_safe::Rect; + let mut canvas = skia_safe::svg::Canvas::new(Rect::from_size(size)); + func(&mut canvas); + let data = canvas.end(); + write_file(data.bytes(), path, name, "svg"); + } + } + impl DrawingDriver for OpenGL { const NAME: &'static str = "opengl"; @@ -195,7 +211,7 @@ fn main() { .arg(Arg::with_name(DRIVER) .long(DRIVER) .takes_value(true) - .possible_values(get_possible_drivers()) + .possible_values(get_possible_drivers().as_slice()) .multiple(true) .help("In addition to the CPU, render with the given driver.") ) @@ -225,6 +241,13 @@ fn main() { draw_all::(&out_path); } + #[cfg(feature = "svg")] + { + if drivers.contains(&artifact::SVG::NAME) { + draw_all::(&out_path); + } + } + if drivers.contains(&artifact::OpenGL::NAME) { let context = GLContext::::create( @@ -262,13 +285,13 @@ fn main() { } } -#[cfg(not(feature = "vulkan"))] -fn get_possible_drivers() -> &'static [&'static str] { - ["cpu", "pdf", "opengl"].as_ref() -} - -#[cfg(feature = "vulkan")] -fn get_possible_drivers() -> &'static [&'static str] { - ["cpu", "pdf", "opengl", "vulkan"].as_ref() +fn get_possible_drivers() -> Vec<&'static str> { + let mut drivers = vec!["cpu", "pdf", "opengl"]; + if cfg!(feature = "vulkan") { + drivers.push("vulkan") + } + if cfg!(feature = "svg") { + drivers.push("svg"); + } + drivers } - diff --git a/skia-safe/src/svg/canvas.rs b/skia-safe/src/svg/canvas.rs index fe041787a..f785f915b 100644 --- a/skia-safe/src/svg/canvas.rs +++ b/skia-safe/src/svg/canvas.rs @@ -50,6 +50,7 @@ impl Canvas { } /// Ends the Canvas drawing and returns the resulting SVG. + /// TODO: rename to into_svg() or into_svg_data()? pub fn end(mut self) -> Data { self.deref_mut().flush(); self.stream.detach_as_data() From a1c33b8c625cdc7d93e92d48528221e71c3122e0 Mon Sep 17 00:00:00 2001 From: Armin Sander Date: Tue, 16 Apr 2019 15:43:12 +0200 Subject: [PATCH 3/9] properly flush out all data from the SVG XMLStreamWriter so that closing tags are written --- skia-bindings/src/bindings.cpp | 4 +++ skia-safe/src/interop/stream.rs | 2 +- skia-safe/src/svg/canvas.rs | 52 +++++++++++++++++++++++++++------ 3 files changed, 48 insertions(+), 10 deletions(-) diff --git a/skia-bindings/src/bindings.cpp b/skia-bindings/src/bindings.cpp index b40c0e867..495bc19d3 100644 --- a/skia-bindings/src/bindings.cpp +++ b/skia-bindings/src/bindings.cpp @@ -1373,4 +1373,8 @@ extern "C" SkCanvas* C_SkSVGCanvas_Make(const SkRect* bounds, SkXMLWriter* write return SkSVGCanvas::Make(*bounds, writer).release(); } +extern "C" void C_SkXMLStreamWriter_destruct(SkXMLStreamWriter* self) { + self->~SkXMLStreamWriter(); +} + #endif diff --git a/skia-safe/src/interop/stream.rs b/skia-safe/src/interop/stream.rs index a8de07df8..f3bf173b6 100644 --- a/skia-safe/src/interop/stream.rs +++ b/skia-safe/src/interop/stream.rs @@ -13,7 +13,7 @@ pub type DynamicMemoryWStream = Handle; impl NativeDrop for SkDynamicMemoryWStream { fn drop(&mut self) { unsafe { - C_SkDynamicMemoryWStream_destruct(self) + C_SkDynamicMemoryWStream_destruct(self); } } } diff --git a/skia-safe/src/svg/canvas.rs b/skia-safe/src/svg/canvas.rs index f785f915b..e7ceb5148 100644 --- a/skia-safe/src/svg/canvas.rs +++ b/skia-safe/src/svg/canvas.rs @@ -1,14 +1,17 @@ use crate::interop::DynamicMemoryWStream; -use crate::prelude::{NativeAccess, NativeTransmutable}; +use crate::prelude::*; use crate::{Data, Rect}; -use skia_bindings::{C_SkCanvas_delete, C_SkSVGCanvas_Make, SkCanvas, SkXMLStreamWriter}; +use skia_bindings::{ + C_SkCanvas_delete, C_SkSVGCanvas_Make, C_SkXMLStreamWriter_destruct, SkCanvas, + SkXMLStreamWriter, +}; use std::ops::{Deref, DerefMut}; use std::pin::Pin; +use std::ptr; pub struct Canvas { canvas: *mut SkCanvas, - #[allow(dead_code)] - xml_stream_writer: Pin>, + xml_stream_writer: Option>>, stream: Pin>, } @@ -39,12 +42,15 @@ impl Canvas { pub fn new>(bounds: B) -> Canvas { let bounds = bounds.as_ref(); let mut stream = Box::pin(DynamicMemoryWStream::new()); - let mut xml_stream_writer = - Box::pin(unsafe { SkXMLStreamWriter::new(&mut stream.native_mut()._base) }); - let canvas = unsafe { C_SkSVGCanvas_Make(bounds.native(), &mut xml_stream_writer._base) }; + let mut xml_stream_writer = Box::pin(XMLStreamWriter::from_native(unsafe { + SkXMLStreamWriter::new(&mut stream.native_mut()._base) + })); + let canvas = unsafe { + C_SkSVGCanvas_Make(bounds.native(), &mut xml_stream_writer.native_mut()._base) + }; Canvas { canvas, - xml_stream_writer, + xml_stream_writer: Some(xml_stream_writer), stream, } } @@ -52,19 +58,47 @@ impl Canvas { /// Ends the Canvas drawing and returns the resulting SVG. /// TODO: rename to into_svg() or into_svg_data()? pub fn end(mut self) -> Data { - self.deref_mut().flush(); + // note: flushing canvas + XMLStreamWriter does not seem to work, + // we have to delete the canvas and destruct the stream writer + // to get all data out _and_ keep the referential integrity. + unsafe { + C_SkCanvas_delete(self.canvas); + } + self.canvas = ptr::null_mut(); + self.xml_stream_writer = None; self.stream.detach_as_data() } } +type XMLStreamWriter = Handle; + +impl NativeDrop for SkXMLStreamWriter { + fn drop(&mut self) { + unsafe { + C_SkXMLStreamWriter_destruct(self); + } + } +} + #[test] fn test_svg() { use crate::Paint; + let mut canvas = Canvas::new(&Rect::from_size((20, 20))); let paint = Paint::default(); canvas.draw_circle((10, 10), 10.0, &paint); let data = canvas.end(); let contents = String::from_utf8_lossy(data.bytes()); + dbg!(&contents); assert!(contents .contains(r#""#)); + assert!(contents.contains(r#""#)); +} + +#[test] +fn test_svg_without_ending() { + use crate::Paint; + let mut canvas = Canvas::new(&Rect::from_size((20, 20))); + let paint = Paint::default(); + canvas.draw_circle((10, 10), 10.0, &paint); } From 014bc5734934f04743951050eb93ae42463c973d Mon Sep 17 00:00:00 2001 From: Armin Sander Date: Tue, 16 Apr 2019 15:53:51 +0200 Subject: [PATCH 4/9] render artificts cpu pdf on stable only and svg on stable with features svg enabled --- azure-pipelines-template.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/azure-pipelines-template.yml b/azure-pipelines-template.yml index 7c76659d2..e2fa3638f 100644 --- a/azure-pipelines-template.yml +++ b/azure-pipelines-template.yml @@ -5,6 +5,7 @@ jobs: stable: toolchain: stable features: '' + exampleArgs: '--driver cpu --driver pdf' beta: toolchain: beta features: '' @@ -14,10 +15,10 @@ jobs: stable-svg: toolchain: stable features: 'svg' + exampleArgs: '--driver svg' variables: platform: ${{ parameters.platform }} image: ${{ parameters.image }} - exampleArgs: '--driver cpu --driver pdf' pool: vmImage: $(image) @@ -68,12 +69,12 @@ jobs: - ${{ if ne(parameters.platform, 'Windows') }}: - script: cargo run --release --example skia-org ${BUILD_ARTIFACTSTAGINGDIRECTORY}/skia-org $(exampleArgs) displayName: Generate skia-org Example Images - condition: eq(variables['features'], '') + condition: ne(variables['exampleArgs'], Null) - ${{ if eq(parameters.platform, 'Windows') }}: - script: cargo run --release --example skia-org %BUILD_ARTIFACTSTAGINGDIRECTORY%/skia-org $(exampleArgs) displayName: Generate skia-org Example Images - condition: eq(variables['features'], '') + condition: ne(variables['exampleArgs'], Null) - task: PublishBuildArtifacts@1 inputs: From c169ca4d32f0d91829157e8b160a1e03c1f7494f Mon Sep 17 00:00:00 2001 From: Armin Sander Date: Tue, 16 Apr 2019 16:01:01 +0200 Subject: [PATCH 5/9] why is there no Null or null? --- azure-pipelines-template.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/azure-pipelines-template.yml b/azure-pipelines-template.yml index e2fa3638f..a1880a570 100644 --- a/azure-pipelines-template.yml +++ b/azure-pipelines-template.yml @@ -69,12 +69,12 @@ jobs: - ${{ if ne(parameters.platform, 'Windows') }}: - script: cargo run --release --example skia-org ${BUILD_ARTIFACTSTAGINGDIRECTORY}/skia-org $(exampleArgs) displayName: Generate skia-org Example Images - condition: ne(variables['exampleArgs'], Null) + condition: ne(variables['exampleArgs'], '') - ${{ if eq(parameters.platform, 'Windows') }}: - script: cargo run --release --example skia-org %BUILD_ARTIFACTSTAGINGDIRECTORY%/skia-org $(exampleArgs) displayName: Generate skia-org Example Images - condition: ne(variables['exampleArgs'], Null) + condition: ne(variables['exampleArgs'], '') - task: PublishBuildArtifacts@1 inputs: From ac88ccea76b9b614e7854dba19655be29f53203f Mon Sep 17 00:00:00 2001 From: Armin Sander Date: Tue, 16 Apr 2019 16:40:47 +0200 Subject: [PATCH 6/9] ci: be sure skia-org is parameterized with the current feature set and publish artifacts only if there are any --- azure-pipelines-template.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/azure-pipelines-template.yml b/azure-pipelines-template.yml index a1880a570..35756cbc5 100644 --- a/azure-pipelines-template.yml +++ b/azure-pipelines-template.yml @@ -67,12 +67,12 @@ jobs: displayName: Test skia-safe - ${{ if ne(parameters.platform, 'Windows') }}: - - script: cargo run --release --example skia-org ${BUILD_ARTIFACTSTAGINGDIRECTORY}/skia-org $(exampleArgs) + - script: cargo run --release --features "$(features)" --example skia-org ${BUILD_ARTIFACTSTAGINGDIRECTORY}/skia-org $(exampleArgs) displayName: Generate skia-org Example Images condition: ne(variables['exampleArgs'], '') - ${{ if eq(parameters.platform, 'Windows') }}: - - script: cargo run --release --example skia-org %BUILD_ARTIFACTSTAGINGDIRECTORY%/skia-org $(exampleArgs) + - script: cargo run --release --features "$(features)" --example skia-org %BUILD_ARTIFACTSTAGINGDIRECTORY%/skia-org $(exampleArgs) displayName: Generate skia-org Example Images condition: ne(variables['exampleArgs'], '') @@ -80,4 +80,4 @@ jobs: inputs: pathtoPublish: '$(Build.ArtifactStagingDirectory)/skia-org' artifactName: 'skia-org-examples-$(platform)-$(toolchain)' - condition: eq(variables['features'], '') + condition: ne(variables['exampleArgs'], '') From a4bf03619327c70a00f0abc99547b079fa009eb5 Mon Sep 17 00:00:00 2001 From: Armin Sander Date: Tue, 16 Apr 2019 17:47:41 +0200 Subject: [PATCH 7/9] run skia-org example from within the skia-safe directory so that we can set the proper features --- azure-pipelines-template.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/azure-pipelines-template.yml b/azure-pipelines-template.yml index 35756cbc5..554494cb7 100644 --- a/azure-pipelines-template.yml +++ b/azure-pipelines-template.yml @@ -67,12 +67,12 @@ jobs: displayName: Test skia-safe - ${{ if ne(parameters.platform, 'Windows') }}: - - script: cargo run --release --features "$(features)" --example skia-org ${BUILD_ARTIFACTSTAGINGDIRECTORY}/skia-org $(exampleArgs) + - script: cd skia-safe && cargo run --release --features "$(features)" --example skia-org ${BUILD_ARTIFACTSTAGINGDIRECTORY}/skia-org $(exampleArgs) displayName: Generate skia-org Example Images condition: ne(variables['exampleArgs'], '') - ${{ if eq(parameters.platform, 'Windows') }}: - - script: cargo run --release --features "$(features)" --example skia-org %BUILD_ARTIFACTSTAGINGDIRECTORY%/skia-org $(exampleArgs) + - script: cd skia-safe && cargo run --release --features "$(features)" --example skia-org %BUILD_ARTIFACTSTAGINGDIRECTORY%/skia-org $(exampleArgs) displayName: Generate skia-org Example Images condition: ne(variables['exampleArgs'], '') From b10412423373b58396d8bdbf079ad7d0b52fad8a Mon Sep 17 00:00:00 2001 From: Armin Sander Date: Tue, 16 Apr 2019 17:54:52 +0200 Subject: [PATCH 8/9] check svg --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 42afff658..197c69f03 100644 --- a/README.md +++ b/README.md @@ -97,7 +97,7 @@ We do support most of the SkCanvas, SkPaint, and SkPath and related APIs and are - [x] Basic Drawing: Surface, Canvas, Paint, Path. - [x] Basic Effects and Shaders. - [x] PDF -- [ ] SVG +- [x] SVG - [ ] Animation - [x] Vulkan - [x] OpenGL From 18e0d12d9d9ac0001dff1cfdf21a252f556169b0 Mon Sep 17 00:00:00 2001 From: Armin Sander Date: Tue, 16 Apr 2019 17:55:22 +0200 Subject: [PATCH 9/9] ci: unify skia-org example generation scripts --- azure-pipelines-template.yml | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/azure-pipelines-template.yml b/azure-pipelines-template.yml index 554494cb7..f22d0fe23 100644 --- a/azure-pipelines-template.yml +++ b/azure-pipelines-template.yml @@ -66,15 +66,9 @@ jobs: - script: cd skia-safe && cargo test --release --features "$(features)" -vv displayName: Test skia-safe - - ${{ if ne(parameters.platform, 'Windows') }}: - - script: cd skia-safe && cargo run --release --features "$(features)" --example skia-org ${BUILD_ARTIFACTSTAGINGDIRECTORY}/skia-org $(exampleArgs) - displayName: Generate skia-org Example Images - condition: ne(variables['exampleArgs'], '') - - - ${{ if eq(parameters.platform, 'Windows') }}: - - script: cd skia-safe && cargo run --release --features "$(features)" --example skia-org %BUILD_ARTIFACTSTAGINGDIRECTORY%/skia-org $(exampleArgs) - displayName: Generate skia-org Example Images - condition: ne(variables['exampleArgs'], '') + - script: cd skia-safe && cargo run --release --features "$(features)" --example skia-org "$(Build.ArtifactStagingDirectory)/skia-org" $(exampleArgs) + displayName: Generate skia-org Example Images + condition: ne(variables['exampleArgs'], '') - task: PublishBuildArtifacts@1 inputs: