diff --git a/src/azure-c.cpp b/src/azure-c.cpp index ab5d5d9..0774e63 100644 --- a/src/azure-c.cpp +++ b/src/azure-c.cpp @@ -263,6 +263,18 @@ AzDrawTargetGetSize(AzDrawTargetRef aDrawTarget) { return IntSizeToC(gfxDrawTarget->GetSize()); } +extern "C" AzSurfaceFormat +AzDrawTargetGetFormat(AzDrawTargetRef aDrawTarget) { + gfx::DrawTarget *gfxDrawTarget = static_cast(aDrawTarget); + return static_cast(gfxDrawTarget->GetFormat()); +} + +extern "C" void +AzDrawTargetGetTransform(AzDrawTargetRef aDrawTarget, AzMatrix* aOutMatrix) { + gfx::DrawTarget *gfxDrawTarget = static_cast(aDrawTarget); + *reinterpret_cast(aOutMatrix) = gfxDrawTarget->GetTransform(); +} + extern "C" void AzDrawTargetFlush(AzDrawTargetRef aDrawTarget) { gfx::DrawTarget *gfxDrawTarget = static_cast(aDrawTarget); @@ -418,11 +430,42 @@ AzDrawTargetCreateSourceSurfaceFromData(AzDrawTargetRef aDrawTarget, gfx::DrawTarget *gfxDrawTarget = static_cast(aDrawTarget); gfx::IntSize *gfxSize = reinterpret_cast(aSize); gfx::SurfaceFormat gfxSurfaceFormat = static_cast(aFormat); - RefPtr gfxSourceSurface = gfxDrawTarget->CreateSourceSurfaceFromData(const_cast(aData), *gfxSize, aStride, gfxSurfaceFormat); + RefPtr gfxSourceSurface = + gfxDrawTarget->CreateSourceSurfaceFromData(const_cast(aData), + *gfxSize, + aStride, + gfxSurfaceFormat); gfxSourceSurface->AddRef(); return gfxSourceSurface; } +extern "C" AzDrawTargetRef +AzDrawTargetCreateSimilarDrawTarget(AzDrawTargetRef aDrawTarget, + const AzIntSize *aSize, + AzSurfaceFormat aFormat) { + gfx::DrawTarget *gfxDrawTarget = static_cast(aDrawTarget); + const gfx::IntSize *gfxSize = reinterpret_cast(aSize); + gfx::SurfaceFormat gfxSurfaceFormat = static_cast(aFormat); + RefPtr newDrawTarget = + gfxDrawTarget->CreateSimilarDrawTarget(*gfxSize, gfxSurfaceFormat); + newDrawTarget->AddRef(); + return newDrawTarget; +} + +extern "C" AzDrawTargetRef +AzDrawTargetCreateShadowDrawTarget(AzDrawTargetRef aDrawTarget, + const AzIntSize *aSize, + AzSurfaceFormat aFormat, + AzFloat aSigma) { + gfx::DrawTarget *gfxDrawTarget = static_cast(aDrawTarget); + const gfx::IntSize *gfxSize = reinterpret_cast(aSize); + gfx::SurfaceFormat gfxSurfaceFormat = static_cast(aFormat); + RefPtr newDrawTarget = + gfxDrawTarget->CreateShadowDrawTarget(*gfxSize, gfxSurfaceFormat, aSigma); + newDrawTarget->AddRef(); + return newDrawTarget; +} + extern "C" AzGradientStopsRef AzDrawTargetCreateGradientStops(AzDrawTargetRef aDrawTarget, AzGradientStop *aStops, diff --git a/src/azure-c.h b/src/azure-c.h index 65c2d67..c76cc23 100644 --- a/src/azure-c.h +++ b/src/azure-c.h @@ -330,6 +330,8 @@ void AzRetainDrawTarget(AzDrawTargetRef aTarget); void AzReleaseDrawTarget(AzDrawTargetRef aTarget); AzIntSize AzDrawTargetGetSize(AzDrawTargetRef aDrawTarget); +AzSurfaceFormat AzDrawTargetGetFormat(AzDrawTargetRef aDrawTarget); +void AzDrawTargetGetTransform(AzDrawTargetRef aDrawTarget, AzMatrix* aOutMatrix); void AzDrawTargetFlush(AzDrawTargetRef aDrawTarget); void AzDrawTargetClearRect(AzDrawTargetRef aDrawTarget, AzRect *aRect); void AzDrawTargetFillRect(AzDrawTargetRef aDrawTarget, @@ -372,6 +374,10 @@ AzSourceSurfaceRef AzDrawTargetCreateSourceSurfaceFromData(AzDrawTargetRef aDraw AzIntSize *aSize, int32_t aStride, AzSurfaceFormat aFormat); +AzDrawTargetRef AzDrawTargetCreateShadowDrawTarget(AzDrawTargetRef aDrawTarget, + const AzIntSize *aSize, + AzSurfaceFormat aFormat, + AzFloat aSigma); AzGradientStopsRef AzDrawTargetCreateGradientStops(AzDrawTargetRef aDrawTarget, AzGradientStop *aStops, uint32_t aNumStops, diff --git a/src/azure.rs b/src/azure.rs index db360bd..d88e3a6 100644 --- a/src/azure.rs +++ b/src/azure.rs @@ -367,6 +367,10 @@ pub fn AzReleaseDrawTarget(aTarget: AzDrawTargetRef); pub fn AzDrawTargetGetSize(aDrawTarget: AzDrawTargetRef) -> AzIntSize; +pub fn AzDrawTargetGetFormat(aDrawTarget: AzDrawTargetRef) -> AzSurfaceFormat; + +pub fn AzDrawTargetGetTransform(aDrawTarget: AzDrawTargetRef, aOutMatrix: *mut AzMatrix); + pub fn AzDrawTargetFlush(aDrawTarget: AzDrawTargetRef); pub fn AzDrawTargetClearRect(aDrawTarget: AzDrawTargetRef, aRect: *mut AzRect); @@ -404,6 +408,17 @@ pub fn AzDrawTargetGetSnapshot(aDrawTarget: AzDrawTargetRef) -> AzSourceSurfaceR pub fn AzDrawTargetCreateSourceSurfaceFromData(aDrawTarget: AzDrawTargetRef, aData: *const u8, aSize: *mut AzIntSize, aStride: i32, aFormat: AzSurfaceFormat) -> AzSourceSurfaceRef; +pub fn AzDrawTargetCreateSimilarDrawTarget(aDrawTarget: AzDrawTargetRef, + aSize: *const AzIntSize, + aFormat: AzSurfaceFormat) + -> AzSourceSurfaceRef; + +pub fn AzDrawTargetCreateShadowDrawTarget(aDrawTarget: AzDrawTargetRef, + aSize: *const AzIntSize, + aFormat: AzSurfaceFormat, + aSigma: AzFloat) + -> AzSourceSurfaceRef; + pub fn AzDrawTargetCreateGradientStops(aDrawTarget: AzDrawTargetRef, aStops: *const AzGradientStop, aNumStops: u32, diff --git a/src/azure_hl.rs b/src/azure_hl.rs index 3ae2069..79fcf00 100644 --- a/src/azure_hl.rs +++ b/src/azure_hl.rs @@ -22,7 +22,7 @@ use azure::{AzReleaseSkiaSharedGLContext, AzRetainSkiaSharedGLContext}; use azure::{AzDrawTargetDrawSurface, AzDrawTargetFillRect, AzDrawTargetFlush}; use azure::{AzDrawTargetGetSize, AzDrawTargetGetSnapshot, AzDrawTargetSetTransform}; use azure::{AzDrawTargetStrokeLine, AzDrawTargetStrokeRect, AzDrawTargetFillGlyphs}; -use azure::{AzDrawTargetCreateGradientStops}; +use azure::{AzDrawTargetCreateGradientStops, AzDrawTargetGetFormat}; use azure::{AzReleaseDrawTarget, AzReleasePattern, AzReleaseGradientStops}; use azure::{AzReleaseSourceSurface, AzRetainDrawTarget}; use azure::{AzSourceSurfaceGetDataSurface, AzSourceSurfaceGetFormat}; @@ -34,7 +34,8 @@ use azure::{AzPathBuilderArc, AzPathBuilderFinish, AzReleasePathBuilder}; use azure::{AzDrawTargetFill, AzPathRef, AzReleasePath, AzDrawTargetPushClip, AzDrawTargetPopClip}; use azure::{AzGLNativeContextRef, AzLinearGradientPatternRef, AzMatrix, AzPatternRef}; use azure::{AzCreateLinearGradientPattern, AzDrawTargetPushClipRect}; -use azure::{AzDrawTargetDrawSurfaceWithShadow}; +use azure::{AzDrawTargetDrawSurfaceWithShadow, AzDrawTargetCreateShadowDrawTarget}; +use azure::{AzDrawTargetCreateSimilarDrawTarget, AzDrawTargetGetTransform}; use sync::Arc; use geom::matrix2d::Matrix2D; @@ -342,6 +343,13 @@ impl Drop for DrawTarget { } } +impl PartialEq for DrawTarget { + #[inline] + fn eq(&self, other: &DrawTarget) -> bool { + self.azure_draw_target == other.azure_draw_target + } +} + /// Contains the GL resources that Skia was holding onto that may be safely extracted. At the /// moment this consists simply of the native surface. pub struct StolenGLResources { @@ -459,6 +467,20 @@ impl DrawTarget { } } + pub fn get_format(&self) -> SurfaceFormat { + unsafe { + SurfaceFormat::new(AzDrawTargetGetFormat(self.azure_draw_target)) + } + } + + pub fn get_transform(&self) -> Matrix2D { + unsafe { + let mut result: AzMatrix = mem::uninitialized(); + AzDrawTargetGetTransform(self.azure_draw_target, &mut result); + mem::transmute::>(result) + } + } + pub fn flush(&self) { unsafe { AzDrawTargetFlush(self.azure_draw_target); @@ -592,6 +614,40 @@ impl DrawTarget { } } + pub fn create_similar_draw_target(&self, size: &Size2D, format: SurfaceFormat) + -> DrawTarget { + unsafe { + let new_draw_target = AzDrawTargetCreateSimilarDrawTarget( + self.azure_draw_target, + &size.as_azure_int_size(), + format.as_azure_surface_format()); + DrawTarget { + azure_draw_target: new_draw_target, + data: None, + skia_context: None, + } + } + } + + pub fn create_shadow_draw_target(&self, + size: &Size2D, + format: SurfaceFormat, + sigma: AzFloat) + -> DrawTarget { + unsafe { + let new_draw_target = AzDrawTargetCreateShadowDrawTarget( + self.azure_draw_target, + &size.as_azure_int_size(), + format.as_azure_surface_format(), + sigma); + DrawTarget { + azure_draw_target: new_draw_target, + data: None, + skia_context: None, + } + } + } + pub fn create_gradient_stops(&self, gradient_stops: &[GradientStop], extend_mode: ExtendMode)