From 00958cce61d57d2e816eb42bf50d112a3f641258 Mon Sep 17 00:00:00 2001 From: Hyowon Kim Date: Thu, 14 May 2015 16:16:14 +0900 Subject: [PATCH 1/2] Add support for surface pattern. --- src/azure-c.cpp | 10 +++++++++- src/azure-c.h | 3 +++ src/azure.rs | 6 ++++++ src/azure_hl.rs | 41 +++++++++++++++++++++++++++++++++++++---- 4 files changed, 55 insertions(+), 5 deletions(-) diff --git a/src/azure-c.cpp b/src/azure-c.cpp index 99f3534..1bbcd2a 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); @@ -700,6 +700,14 @@ AzCreateRadialGradientPattern(const AzPoint *aCenter1, return gfxRadialGradientPattern; } +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" void AzReleasePattern(AzPatternRef aPattern) { gfx::Pattern *gfxPattern = reinterpret_cast(aPattern); diff --git a/src/azure-c.h b/src/azure-c.h index 1d14298..6f490a7 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 */ @@ -461,6 +462,8 @@ AzRadialGradientPatternRef AzCreateRadialGradientPattern(const AzPoint *aCenter1 AzGradientStopsRef aStops, const AzMatrix *aMatrix); +AzSurfacePatternRef AzCreateSurfacePattern(AzSourceSurfaceRef aSurface); + void AzReleasePattern(AzPatternRef aPattern); void AzReleaseGradientStops(AzGradientStopsRef aStops); diff --git a/src/azure.rs b/src/azure.rs index c1ee002..edd165f 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; @@ -543,6 +545,10 @@ pub fn AzCreateRadialGradientPattern(aCenter1: *const AzPoint, aMatrix: *const AzMatrix) -> AzRadialGradientPatternRef; + +pub fn AzCreateSurfacePattern(aSurface: AzSourceSurfaceRef) + -> 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..d4dda03 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::{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::{AzDrawTargetDrawSurfaceWithShadow, AzDrawTargetCreateShadowDrawTarget}; use azure::{AzDrawTargetCreateSimilarDrawTarget, AzDrawTargetGetTransform}; use azure::{AzFilterNodeSetSourceSurfaceInput, AzReleaseFilterNode, AzDrawTargetCreateFilter}; @@ -1132,10 +1132,36 @@ impl RadialGradientPattern { } } +#[derive(Clone)] +pub struct SurfacePattern { + pub azure_surface_pattern: AzSurfacePatternRef, +} + +impl Drop for SurfacePattern { + fn drop(&mut self) { + unsafe { + AzReleasePattern(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 +1175,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 +1188,7 @@ pub enum Pattern { Color(ColorPattern), LinearGradient(LinearGradientPattern), RadialGradient(RadialGradientPattern), + Surface(SurfacePattern), } impl Pattern { @@ -1170,7 +1200,10 @@ impl Pattern { }, Pattern::RadialGradient(ref radial_gradient_pattern) => { PatternRef::RadialGradient(radial_gradient_pattern) - } + }, + Pattern::Surface(ref surface_pattern) => { + PatternRef::Surface(surface_pattern) + }, } } } From a7bab6c035e1fa14692d6f28dc120073b35bc974 Mon Sep 17 00:00:00 2001 From: Hyowon Kim Date: Fri, 15 May 2015 13:29:22 +0900 Subject: [PATCH 2/2] Make clone for Pattern safe. --- src/azure-c.cpp | 30 ++++++++++++++++++++++++++++++ src/azure-c.h | 6 ++++++ src/azure.rs | 8 ++++++++ src/azure_hl.rs | 37 ++++++++++++++++++++++++++++++++++--- 4 files changed, 78 insertions(+), 3 deletions(-) diff --git a/src/azure-c.cpp b/src/azure-c.cpp index 1bbcd2a..285fed8 100644 --- a/src/azure-c.cpp +++ b/src/azure-c.cpp @@ -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,17 @@ 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); @@ -708,6 +728,16 @@ AzCreateSurfacePattern(AzSourceSurfaceRef aSurface) { 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 6f490a7..36f38dc 100644 --- a/src/azure-c.h +++ b/src/azure-c.h @@ -455,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, @@ -462,8 +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 edd165f..04f7d04 100644 --- a/src/azure.rs +++ b/src/azure.rs @@ -537,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, @@ -545,10 +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 d4dda03..231e431 100644 --- a/src/azure_hl.rs +++ b/src/azure_hl.rs @@ -44,6 +44,7 @@ use azure::{AzDrawTargetStroke, AzPathBuilderArc, AzPathBuilderFinish, AzRelease use azure::{AzDrawTargetFill, AzPathRef, AzReleasePath, AzDrawTargetPushClip, AzDrawTargetPopClip}; 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,7 +1153,6 @@ impl RadialGradientPattern { } } -#[derive(Clone)] pub struct SurfacePattern { pub azure_surface_pattern: AzSurfacePatternRef, } @@ -1145,6 +1165,17 @@ impl Drop for SurfacePattern { } } +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 {