diff --git a/src/azure-c.cpp b/src/azure-c.cpp index 6da7f0b..1f47545 100644 --- a/src/azure-c.cpp +++ b/src/azure-c.cpp @@ -653,6 +653,22 @@ AzCreateLinearGradientPattern(const AzPoint *aBegin, return gfxLinearGradientPattern; } +extern "C" AzRadialGradientPatternRef +AzCreateRadialGradientPattern(const AzPoint *aCenter1, + const AzPoint *aCenter2, + AzFloat aRadius1, + AzFloat aRadius2, + AzGradientStopsRef aStops, + const AzMatrix *aMatrix) { + const gfx::Point *gfxCenter1 = reinterpret_cast(aCenter1); + const gfx::Point *gfxCenter2 = reinterpret_cast(aCenter2); + gfx::GradientStops *gfxStops = reinterpret_cast(aStops); + const gfx::Matrix *gfxMatrix = reinterpret_cast(aMatrix); + gfx::RadialGradientPattern* gfxRadialGradientPattern = new + gfx::RadialGradientPattern(*gfxCenter1, *gfxCenter2, aRadius1, aRadius2, gfxStops, *gfxMatrix); + return gfxRadialGradientPattern; +} + extern "C" void AzReleasePattern(AzPatternRef aPattern) { gfx::Pattern *gfxPattern = reinterpret_cast(aPattern); diff --git a/src/azure-c.h b/src/azure-c.h index 92229af..d3d5d7b 100644 --- a/src/azure-c.h +++ b/src/azure-c.h @@ -32,6 +32,7 @@ typedef void* AzGLContextMetadataRef; typedef void* AzPathBuilderRef; typedef void* AzPathRef; typedef void* AzLinearGradientPatternRef; +typedef void* AzRadialGradientPatternRef; typedef void* AzFilterNodeRef; /* Types.h */ @@ -447,6 +448,14 @@ AzLinearGradientPatternRef AzCreateLinearGradientPattern(const AzPoint *aBegin, const AzPoint *aEnd, AzGradientStopsRef aStops, const AzMatrix *aMatrix); + +AzRadialGradientPatternRef AzCreateRadialGradientPattern(const AzPoint *aCenter1, + const AzPoint *aCenter2, + AzFloat aRadius1, + AzFloat aRadius2, + AzGradientStopsRef aStops, + const AzMatrix *aMatrix); + void AzReleasePattern(AzPatternRef aPattern); void AzReleaseGradientStops(AzGradientStopsRef aStops); diff --git a/src/azure.rs b/src/azure.rs index 2eafa72..3db9152 100644 --- a/src/azure.rs +++ b/src/azure.rs @@ -413,6 +413,8 @@ pub type AzColorPatternRef = *mut c_void; pub type AzLinearGradientPatternRef = *mut c_void; +pub type AzRadialGradientPatternRef = *mut c_void; + pub type AzScaledFontRef = *mut c_void; pub type AzGlyphRenderingOptionsRef = *mut c_void; @@ -530,6 +532,14 @@ pub fn AzCreateLinearGradientPattern(aBegin: *const AzPoint, aMatrix: *const AzMatrix) -> AzLinearGradientPatternRef; +pub fn AzCreateRadialGradientPattern(aCenter1: *const AzPoint, + aCenter2: *const AzPoint, + aRadius1: AzFloat, + aRadius2: AzFloat, + aStops: AzGradientStopsRef, + aMatrix: *const AzMatrix) + -> AzRadialGradientPatternRef; + pub fn AzReleaseSourceSurface(aSurface: AzSourceSurfaceRef); pub fn AzSourceSurfaceGetSize(aSurface: AzSourceSurfaceRef) -> AzIntSize; diff --git a/src/azure_hl.rs b/src/azure_hl.rs index a14c227..b587089 100644 --- a/src/azure_hl.rs +++ b/src/azure_hl.rs @@ -42,8 +42,8 @@ use azure::{AzSourceSurfaceGetSize, AzCreateDrawTargetSkiaWithGrContextAndFBO}; use azure::{AzCreatePathBuilder, AzPathBuilderRef, AzPathBuilderMoveTo, AzPathBuilderLineTo}; use azure::{AzPathBuilderArc, AzPathBuilderFinish, AzReleasePathBuilder}; use azure::{AzDrawTargetFill, AzPathRef, AzReleasePath, AzDrawTargetPushClip, AzDrawTargetPopClip}; -use azure::{AzLinearGradientPatternRef, AzMatrix, AzPatternRef}; -use azure::{AzCreateLinearGradientPattern, AzDrawTargetPushClipRect}; +use azure::{AzLinearGradientPatternRef, AzRadialGradientPatternRef, AzMatrix, AzPatternRef}; +use azure::{AzCreateLinearGradientPattern, AzCreateRadialGradientPattern, AzDrawTargetPushClipRect}; use azure::{AzDrawTargetDrawSurfaceWithShadow, AzDrawTargetCreateShadowDrawTarget}; use azure::{AzDrawTargetCreateSimilarDrawTarget, AzDrawTargetGetTransform}; use azure::{AzFilterNodeSetSourceSurfaceInput, AzReleaseFilterNode, AzDrawTargetCreateFilter}; @@ -1050,9 +1050,44 @@ impl LinearGradientPattern { } } +pub struct RadialGradientPattern { + pub azure_radial_gradient_pattern: AzRadialGradientPatternRef, +} + +impl Drop for RadialGradientPattern { + fn drop(&mut self) { + unsafe { + AzReleasePattern(self.azure_radial_gradient_pattern); + } + } +} + +impl RadialGradientPattern { + pub fn new(center1: &Point2D, + center2: &Point2D, + radius1: AzFloat, + radius2: AzFloat, + stops: GradientStops, + matrix: &Matrix2D) + -> RadialGradientPattern { + unsafe { + RadialGradientPattern { + azure_radial_gradient_pattern: + AzCreateRadialGradientPattern(mem::transmute::<_,*const AzPoint>(center1), + mem::transmute::<_,*const AzPoint>(center2), + radius1, + radius2, + stops.azure_gradient_stops, + mem::transmute::<_,*const AzMatrix>(matrix)), + } + } + } +} + pub enum PatternRef<'a> { Color(&'a ColorPattern), LinearGradient(&'a LinearGradientPattern), + RadialGradient(&'a RadialGradientPattern), } impl<'a> PatternRef<'a> { @@ -1063,6 +1098,9 @@ impl<'a> PatternRef<'a> { }, PatternRef::LinearGradient(linear_gradient_pattern) => { linear_gradient_pattern.azure_linear_gradient_pattern + }, + PatternRef::RadialGradient(radial_gradient_pattern) => { + radial_gradient_pattern.azure_radial_gradient_pattern } } } @@ -1071,6 +1109,7 @@ impl<'a> PatternRef<'a> { pub enum Pattern { Color(ColorPattern), LinearGradient(LinearGradientPattern), + RadialGradient(RadialGradientPattern), } impl Pattern { @@ -1079,6 +1118,9 @@ impl Pattern { Pattern::Color(ref color_pattern) => PatternRef::Color(color_pattern), Pattern::LinearGradient(ref linear_gradient_pattern) => { PatternRef::LinearGradient(linear_gradient_pattern) + }, + Pattern::RadialGradient(ref radial_gradient_pattern) => { + PatternRef::RadialGradient(radial_gradient_pattern) } } }