From faba682f2225672e92c1d791f60697d7bb1e04a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1ty=C3=A1s=20Mustoha?= Date: Thu, 14 May 2015 19:12:43 +0200 Subject: [PATCH] Fix handling of antialias in DrawOptions and add a default contructor for it. --- src/azure-c.h | 12 +++------ src/azure.rs | 70 +++++++++++++++++++++++++------------------------ src/azure_hl.rs | 55 +++++++++++++++++++++++++++++--------- 3 files changed, 83 insertions(+), 54 deletions(-) diff --git a/src/azure-c.h b/src/azure-c.h index 1d14298..6d16b59 100644 --- a/src/azure-c.h +++ b/src/azure-c.h @@ -149,7 +149,7 @@ enum AzFontStyle AZ_FONT_STYLE_BOLD_ITALIC }; -enum AzCompositionOp { +enum AzCompositionOp: uint8_t { AZ_OP_OVER, AZ_OP_ADD, AZ_OP_ATOP, @@ -190,7 +190,7 @@ enum AzFillRule { AZ_FILL_EVEN_ODD }; -enum AzAntialiasMode { +enum AzAntialiasMode: uint8_t { AZ_AA_NONE, AZ_AA_GRAY, AZ_AA_SUBPIXEL, @@ -293,14 +293,10 @@ typedef struct _AzMatrix5x4 { /* 2D.h */ -// FIXME: rust-bindgen can't handle bitfields typedef struct _AzDrawOptions { AzFloat mAlpha; - uint16_t fields; - /* - enum AzCompositionOp mCompositionOp : 8; - enum AzAntialiasMode mAntialiasMode : 2; - */ + AzCompositionOp mCompositionOp; + AzAntialiasMode mAntialiasMode; } AzDrawOptions; typedef struct _AzStrokeOptions { diff --git a/src/azure.rs b/src/azure.rs index c1ee002..00a9c7e 100644 --- a/src/azure.rs +++ b/src/azure.rs @@ -115,34 +115,34 @@ pub static AZ_FONT_STYLE_ITALIC: u32 = 1_u32; pub static AZ_FONT_STYLE_BOLD: u32 = 2_u32; pub static AZ_FONT_STYLE_BOLD_ITALIC: u32 = 3_u32; -pub type enum_AzCompositionOp = c_uint; -pub static AZ_OP_OVER: u32 = 0_u32; -pub static AZ_OP_ADD: u32 = 1_u32; -pub static AZ_OP_ATOP: u32 = 2_u32; -pub static AZ_OP_OUT: u32 = 3_u32; -pub static AZ_OP_IN: u32 = 4_u32; -pub static AZ_OP_SOURCE: u32 = 5_u32; -pub static AZ_OP_DEST_IN: u32 = 6_u32; -pub static AZ_OP_DEST_OUT: u32 = 7_u32; -pub static AZ_OP_DEST_OVER: u32 = 8_u32; -pub static AZ_OP_DEST_ATOP: u32 = 9_u32; -pub static AZ_OP_XOR: u32 = 10_u32; -pub static AZ_OP_MULTIPLY: u32 = 11_u32; -pub static AZ_OP_SCREEN: u32 = 12_u32; -pub static AZ_OP_OVERLAY: u32 = 13_u32; -pub static AZ_OP_DARKEN: u32 = 14_u32; -pub static AZ_OP_LIGHTEN: u32 = 15_u32; -pub static AZ_OP_COLOR_DODGE: u32 = 16_u32; -pub static AZ_OP_COLOR_BURN: u32 = 17_u32; -pub static AZ_OP_HARD_LIGHT: u32 = 18_u32; -pub static AZ_OP_SOFT_LIGHT: u32 = 19_u32; -pub static AZ_OP_DIFFERENCE: u32 = 20_u32; -pub static AZ_OP_EXCLUSION: u32 = 21_u32; -pub static AZ_OP_HUE: u32 = 22_u32; -pub static AZ_OP_SATURATION: u32 = 23_u32; -pub static AZ_OP_COLOR: u32 = 24_u32; -pub static AZ_OP_LUMINOSITY: u32 = 25_u32; -pub static AZ_OP_COUNT: u32 = 26_u32; +pub type enum_AzCompositionOp = c_uchar; +pub static AZ_OP_OVER: u8 = 0_u8; +pub static AZ_OP_ADD: u8 = 1_u8; +pub static AZ_OP_ATOP: u8 = 2_u8; +pub static AZ_OP_OUT: u8 = 3_u8; +pub static AZ_OP_IN: u8 = 4_u8; +pub static AZ_OP_SOURCE: u8 = 5_u8; +pub static AZ_OP_DEST_IN: u8 = 6_u8; +pub static AZ_OP_DEST_OUT: u8 = 7_u8; +pub static AZ_OP_DEST_OVER: u8 = 8_u8; +pub static AZ_OP_DEST_ATOP: u8 = 9_u8; +pub static AZ_OP_XOR: u8 = 10_u8; +pub static AZ_OP_MULTIPLY: u8 = 11_u8; +pub static AZ_OP_SCREEN: u8 = 12_u8; +pub static AZ_OP_OVERLAY: u8 = 13_u8; +pub static AZ_OP_DARKEN: u8 = 14_u8; +pub static AZ_OP_LIGHTEN: u8 = 15_u8; +pub static AZ_OP_COLOR_DODGE: u8 = 16_u8; +pub static AZ_OP_COLOR_BURN: u8 = 17_u8; +pub static AZ_OP_HARD_LIGHT: u8 = 18_u8; +pub static AZ_OP_SOFT_LIGHT: u8 = 19_u8; +pub static AZ_OP_DIFFERENCE: u8 = 20_u8; +pub static AZ_OP_EXCLUSION: u8 = 21_u8; +pub static AZ_OP_HUE: u8 = 22_u8; +pub static AZ_OP_SATURATION: u8 = 23_u8; +pub static AZ_OP_COLOR: u8 = 24_u8; +pub static AZ_OP_LUMINOSITY: u8 = 25_u8; +pub static AZ_OP_COUNT: u8 = 26_u8; pub type AzCompositionOp = enum_AzCompositionOp; pub type enum_AzExtendMode = c_uint; @@ -154,11 +154,12 @@ pub type enum_AzFillRule = c_uint; pub static AZ_FILL_WINDING: u32 = 0_u32; pub static AZ_FILL_EVEN_ODD: u32 = 1_u32; -pub type enum_AzAntialiasMode = c_uint; -pub static AZ_AA_NONE: u32 = 0_u32; -pub static AZ_AA_GRAY: u32 = 1_u32; -pub static AZ_AA_SUBPIXEL: u32 = 2_u32; -pub static AZ_AA_DEFAULT: u32 = 3_u32; +pub type enum_AzAntialiasMode = c_uchar; +pub static AZ_AA_NONE: u8 = 0_u8; +pub static AZ_AA_GRAY: u8 = 1_u8; +pub static AZ_AA_SUBPIXEL: u8 = 2_u8; +pub static AZ_AA_DEFAULT: u8 = 3_u8; +pub type AzAntialiasMode = enum_AzCompositionOp; pub type enum_AzFilter = c_uint; pub static AZ_FILTER_GOOD: u32 = 0_u32; @@ -351,7 +352,8 @@ pub type AzMatrix5x4 = struct__AzMatrix5x4; #[repr(C)] pub struct struct__AzDrawOptions { pub mAlpha: AzFloat, - pub fields: uint16_t, + pub mCompositionOp: AzCompositionOp, + pub mAntialiasMode: AzAntialiasMode, } pub type AzDrawOptions = struct__AzDrawOptions; diff --git a/src/azure_hl.rs b/src/azure_hl.rs index 62bc995..dbfe8c8 100644 --- a/src/azure_hl.rs +++ b/src/azure_hl.rs @@ -23,7 +23,7 @@ use azure::{AzPoint, AzRect, AzFloat, AzIntSize, AzColor, AzColorPatternRef, AzG use azure::{AzStrokeOptions, AzDrawOptions, AzSurfaceFormat, AzFilter, AzDrawSurfaceOptions}; use azure::{AzBackendType, AzDrawTargetRef, AzSourceSurfaceRef, AzDataSourceSurfaceRef}; use azure::{AzScaledFontRef, AzGlyphRenderingOptionsRef, AzExtendMode, AzGradientStop}; -use azure::{AzCompositionOp, AzJoinStyle, AzCapStyle}; +use azure::{AzCompositionOp, AzAntialiasMode, AzJoinStyle, AzCapStyle}; use azure::{struct__AzColor, struct__AzGlyphBuffer}; use azure::{struct__AzDrawOptions, struct__AzDrawSurfaceOptions, struct__AzIntSize}; use azure::{struct__AzPoint, struct__AzRect, struct__AzStrokeOptions, struct__AzMatrix5x4}; @@ -143,6 +143,8 @@ impl ColorPattern { } } +#[repr(u8)] +#[derive(Clone, Copy, PartialEq)] pub enum CompositionOp { Over, Add, @@ -173,6 +175,27 @@ pub enum CompositionOp { Count, } +impl CompositionOp { + fn as_azure_composition_op(self) -> AzCompositionOp { + self as AzCompositionOp + } +} + +#[repr(u8)] +#[derive(Clone, Copy, PartialEq)] +pub enum AntialiasMode { + None = 0, + Gray = 1, + Subpixel = 2, + Default = 3, +} + +impl AntialiasMode { + fn as_azure_antialias_mode(self) -> AzAntialiasMode { + self as AzAntialiasMode + } +} + #[repr(u8)] #[derive(Clone, Copy, PartialEq)] pub enum JoinStyle { @@ -240,33 +263,41 @@ impl<'a> StrokeOptions<'a> { #[derive(Clone)] pub struct DrawOptions { pub alpha: AzFloat, - pub fields: uint16_t, + pub composition: CompositionOp, + pub antialias: AntialiasMode, } impl DrawOptions { - pub fn new(alpha: AzFloat, fields: uint16_t) -> DrawOptions { + pub fn default() -> DrawOptions { + DrawOptions { + alpha: 1.0, + composition: CompositionOp::Over, + antialias: AntialiasMode::Default, + } + } + + pub fn new(alpha: AzFloat, composition: CompositionOp, antialias: AntialiasMode) -> DrawOptions { DrawOptions { - alpha : alpha, - fields : fields, + alpha: alpha, + composition: composition, + antialias: antialias, } } fn as_azure_draw_options(&self) -> AzDrawOptions { struct__AzDrawOptions { mAlpha: self.alpha, - fields: self.fields + mCompositionOp: self.composition.as_azure_composition_op(), + mAntialiasMode: self.antialias.as_azure_antialias_mode(), } } pub fn set_composition_op(&mut self, style: CompositionOp) { - self.fields = self.fields & 0b1111_1111_0000_0000_u16; - self.fields = self.fields | (style as u16); + self.composition = style; } - pub fn set_antialias_mode(&mut self, style: u8) { - self.fields = self.fields & 0b1111_1000_1111_1111_u16; - let style = ((style & 7) as u16) << 8; - self.fields = self.fields | style; + pub fn set_antialias_mode(&mut self, style: AntialiasMode) { + self.antialias = style; } }