diff --git a/src/azure-c.cpp b/src/azure-c.cpp index 99f3534..285fed8 100644 --- a/src/azure-c.cpp +++ b/src/azure-c.cpp @@ -258,7 +258,7 @@ AzDrawTargetClearRect(AzDrawTargetRef aDrawTarget, AzRect *aRect) { } extern "C" void -AzDrawTargetFill(AzDrawTargetRef aDrawTarget, AzPathRef aPath, +AzDrawTargetFill(AzDrawTargetRef aDrawTarget, AzPathRef aPath, AzPatternRef aPattern, AzDrawOptions *aDrawOptions) { gfx::DrawTarget *gfxDrawTarget = static_cast(aDrawTarget); gfx::Path *gfxPath = static_cast(aPath); @@ -684,6 +684,15 @@ AzCreateLinearGradientPattern(const AzPoint *aBegin, return gfxLinearGradientPattern; } +extern "C" AzLinearGradientPatternRef +AzCloneLinearGradientPattern(AzLinearGradientPatternRef aPattern) { + gfx::LinearGradientPattern *gfxLinearGradientPattern = static_cast(aPattern); + return new gfx::LinearGradientPattern(gfxLinearGradientPattern->mBegin, + gfxLinearGradientPattern->mEnd, + gfxLinearGradientPattern->mStops, + gfxLinearGradientPattern->mMatrix); +} + extern "C" AzRadialGradientPatternRef AzCreateRadialGradientPattern(const AzPoint *aCenter1, const AzPoint *aCenter2, @@ -700,6 +709,35 @@ AzCreateRadialGradientPattern(const AzPoint *aCenter1, return gfxRadialGradientPattern; } +extern "C" AzRadialGradientPatternRef +AzCloneRadialGradientPattern(AzRadialGradientPatternRef aPattern) { + gfx::RadialGradientPattern *gfxRadialGradientPattern = static_cast(aPattern); + return new gfx::RadialGradientPattern(gfxRadialGradientPattern->mCenter1, + gfxRadialGradientPattern->mCenter2, + gfxRadialGradientPattern->mRadius1, + gfxRadialGradientPattern->mRadius2, + gfxRadialGradientPattern->mStops, + gfxRadialGradientPattern->mMatrix); +} + +extern "C" AzSurfacePatternRef +AzCreateSurfacePattern(AzSourceSurfaceRef aSurface) { + gfx::SourceSurface *gfxSourceSurface = reinterpret_cast(aSurface); + gfx::SurfacePattern* gfxSurfacePattern = new + gfx::SurfacePattern(gfxSourceSurface, gfx::ExtendMode::CLAMP); + return gfxSurfacePattern; +} + +extern "C" AzSurfacePatternRef +AzCloneSurfacePattern(AzSurfacePatternRef aPattern) { + gfx::SurfacePattern *gfxSurfacePattern = static_cast(aPattern); + return new gfx::SurfacePattern(gfxSurfacePattern->mSurface, + gfxSurfacePattern->mExtendMode, + gfxSurfacePattern->mFilter, + gfxSurfacePattern->mMatrix, + gfxSurfacePattern->mSamplingRect); +} + 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 1d14298..36f38dc 100644 --- a/src/azure-c.h +++ b/src/azure-c.h @@ -33,6 +33,7 @@ typedef void* AzPathBuilderRef; typedef void* AzPathRef; typedef void* AzLinearGradientPatternRef; typedef void* AzRadialGradientPatternRef; +typedef void* AzSurfacePatternRef; typedef void* AzFilterNodeRef; /* Types.h */ @@ -454,6 +455,8 @@ AzLinearGradientPatternRef AzCreateLinearGradientPattern(const AzPoint *aBegin, AzGradientStopsRef aStops, const AzMatrix *aMatrix); +AzLinearGradientPatternRef AzCloneLinearGradientPattern(AzLinearGradientPatternRef aPattern); + AzRadialGradientPatternRef AzCreateRadialGradientPattern(const AzPoint *aCenter1, const AzPoint *aCenter2, AzFloat aRadius1, @@ -461,6 +464,12 @@ AzRadialGradientPatternRef AzCreateRadialGradientPattern(const AzPoint *aCenter1 AzGradientStopsRef aStops, const AzMatrix *aMatrix); +AzRadialGradientPatternRef AzCloneRadialGradientPattern(AzRadialGradientPatternRef aPattern); + +AzSurfacePatternRef AzCreateSurfacePattern(AzSourceSurfaceRef aSurface); + +AzSurfacePatternRef AzCloneSurfacePattern(AzSurfacePatternRef aPattern); + void AzReleasePattern(AzPatternRef aPattern); void AzReleaseGradientStops(AzGradientStopsRef aStops); diff --git a/src/azure.rs b/src/azure.rs index c1ee002..04f7d04 100644 --- a/src/azure.rs +++ b/src/azure.rs @@ -416,6 +416,8 @@ pub type AzLinearGradientPatternRef = *mut c_void; pub type AzRadialGradientPatternRef = *mut c_void; +pub type AzSurfacePatternRef = *mut c_void; + pub type AzScaledFontRef = *mut c_void; pub type AzGlyphRenderingOptionsRef = *mut c_void; @@ -535,6 +537,9 @@ pub fn AzCreateLinearGradientPattern(aBegin: *const AzPoint, aMatrix: *const AzMatrix) -> AzLinearGradientPatternRef; +pub fn AzCloneLinearGradientPattern(aPattern: AzLinearGradientPatternRef) + -> AzLinearGradientPatternRef; + pub fn AzCreateRadialGradientPattern(aCenter1: *const AzPoint, aCenter2: *const AzPoint, aRadius1: AzFloat, @@ -543,6 +548,15 @@ pub fn AzCreateRadialGradientPattern(aCenter1: *const AzPoint, aMatrix: *const AzMatrix) -> AzRadialGradientPatternRef; +pub fn AzCloneRadialGradientPattern(aPattern: AzRadialGradientPatternRef) + -> AzRadialGradientPatternRef; + +pub fn AzCreateSurfacePattern(aSurface: AzSourceSurfaceRef) + -> AzSurfacePatternRef; + +pub fn AzCloneSurfacePattern(aPattern: AzSurfacePatternRef) + -> AzSurfacePatternRef; + pub fn AzReleaseSourceSurface(aSurface: AzSourceSurfaceRef); pub fn AzSourceSurfaceGetSize(aSurface: AzSourceSurfaceRef) -> AzIntSize; diff --git a/src/azure_hl.rs b/src/azure_hl.rs index 62bc995..231e431 100644 --- a/src/azure_hl.rs +++ b/src/azure_hl.rs @@ -42,8 +42,9 @@ use azure::{AzSourceSurfaceGetSize, AzCreateDrawTargetSkiaWithGrContextAndFBO}; use azure::{AzCreatePathBuilder, AzPathBuilderRef, AzPathBuilderMoveTo, AzPathBuilderLineTo}; use azure::{AzDrawTargetStroke, AzPathBuilderArc, AzPathBuilderFinish, AzReleasePathBuilder}; use azure::{AzDrawTargetFill, AzPathRef, AzReleasePath, AzDrawTargetPushClip, AzDrawTargetPopClip}; -use azure::{AzLinearGradientPatternRef, AzRadialGradientPatternRef, AzMatrix, AzPatternRef}; -use azure::{AzCreateLinearGradientPattern, AzCreateRadialGradientPattern, AzDrawTargetPushClipRect}; +use azure::{AzLinearGradientPatternRef, AzRadialGradientPatternRef, AzSurfacePatternRef, AzMatrix, AzPatternRef}; +use azure::{AzCreateLinearGradientPattern, AzCreateRadialGradientPattern, AzCreateSurfacePattern, AzDrawTargetPushClipRect}; +use azure::{AzCloneLinearGradientPattern, AzCloneRadialGradientPattern, AzCloneSurfacePattern}; use azure::{AzDrawTargetDrawSurfaceWithShadow, AzDrawTargetCreateShadowDrawTarget}; use azure::{AzDrawTargetCreateSimilarDrawTarget, AzDrawTargetGetTransform}; use azure::{AzFilterNodeSetSourceSurfaceInput, AzReleaseFilterNode, AzDrawTargetCreateFilter}; @@ -1066,7 +1067,6 @@ impl Drop for PathBuilder { } } -#[derive(Clone)] pub struct LinearGradientPattern { pub azure_linear_gradient_pattern: AzLinearGradientPatternRef, } @@ -1079,6 +1079,17 @@ impl Drop for LinearGradientPattern { } } +impl Clone for LinearGradientPattern { + fn clone(&self) -> LinearGradientPattern { + unsafe { + LinearGradientPattern { + azure_linear_gradient_pattern: + AzCloneLinearGradientPattern(self.azure_linear_gradient_pattern), + } + } + } +} + impl LinearGradientPattern { pub fn new(begin: &Point2D, end: &Point2D, @@ -1097,7 +1108,6 @@ impl LinearGradientPattern { } } -#[derive(Clone)] pub struct RadialGradientPattern { pub azure_radial_gradient_pattern: AzRadialGradientPatternRef, } @@ -1110,6 +1120,17 @@ impl Drop for RadialGradientPattern { } } +impl Clone for RadialGradientPattern { + fn clone(&self) -> RadialGradientPattern { + unsafe { + RadialGradientPattern { + azure_radial_gradient_pattern: + AzCloneRadialGradientPattern(self.azure_radial_gradient_pattern), + } + } + } +} + impl RadialGradientPattern { pub fn new(center1: &Point2D, center2: &Point2D, @@ -1132,10 +1153,46 @@ impl RadialGradientPattern { } } +pub struct SurfacePattern { + pub azure_surface_pattern: AzSurfacePatternRef, +} + +impl Drop for SurfacePattern { + fn drop(&mut self) { + unsafe { + AzReleasePattern(self.azure_surface_pattern); + } + } +} + +impl Clone for SurfacePattern { + fn clone(&self) -> SurfacePattern { + unsafe { + SurfacePattern { + azure_surface_pattern: + AzCloneSurfacePattern(self.azure_surface_pattern), + } + } + } +} + +impl SurfacePattern { + pub fn new(surface: AzSourceSurfaceRef) + -> SurfacePattern { + unsafe { + SurfacePattern { + azure_surface_pattern: + AzCreateSurfacePattern(surface), + } + } + } +} + pub enum PatternRef<'a> { Color(&'a ColorPattern), LinearGradient(&'a LinearGradientPattern), RadialGradient(&'a RadialGradientPattern), + Surface(&'a SurfacePattern), } impl<'a> PatternRef<'a> { @@ -1149,7 +1206,10 @@ impl<'a> PatternRef<'a> { }, PatternRef::RadialGradient(radial_gradient_pattern) => { radial_gradient_pattern.azure_radial_gradient_pattern - } + }, + PatternRef::Surface(surface_pattern) => { + surface_pattern.azure_surface_pattern + }, } } } @@ -1159,6 +1219,7 @@ pub enum Pattern { Color(ColorPattern), LinearGradient(LinearGradientPattern), RadialGradient(RadialGradientPattern), + Surface(SurfacePattern), } impl Pattern { @@ -1170,7 +1231,10 @@ impl Pattern { }, Pattern::RadialGradient(ref radial_gradient_pattern) => { PatternRef::RadialGradient(radial_gradient_pattern) - } + }, + Pattern::Surface(ref surface_pattern) => { + PatternRef::Surface(surface_pattern) + }, } } }