use std::fmt::{Error, Debug};
use std::ffi::CStr;
use std::i32;
use std::u32;
#[repr(C)]
#[derive(Clone, Copy, PartialEq, Eq)]
pub enum Status {
Success = 0,
NoMemory,
InvalidRestore,
InvalidPopGroup,
NoCurrentPoint,
InvalidMatrix,
InvalidStatus,
NullPointer,
InvalidString,
InvalidPathData,
ReadError,
WriteError,
SurfaceFinished,
SurfaceTypeMismatch,
PatternTypeMismatch,
InvalidContent,
InvalidFormat,
InvalidVisual,
FileNotFound,
InvalidDash,
InvalidDscComment,
InvalidIndex,
ClipNotRepresentable,
TempFileError,
InvalidStride,
FontTypeMismatch,
UserFontImmutable,
UserFontError,
NegativeCount,
InvalidClusters,
InvalidSlant,
InvalidWeight,
InvalidSize,
UserFontNotImplemented,
DeviceTypeMismatch,
DeviceError,
InvalidMeshConstruction,
DeviceFinished,
JBig2GlobalMissing,
PngError,
FreetypeError,
Win32GdiError,
LastStatus
}
impl Debug for Status {
fn fmt(&self, formatter: &mut ::std::fmt::Formatter) -> Result<(), Error> {
unsafe {
let char_ptr = super::cairo_status_to_string(*self);
let tmp = String::from_utf8_lossy(CStr::from_ptr(char_ptr).to_bytes()).into_owned();
tmp.fmt(formatter)
}
}
}
impl Status {
pub fn ensure_valid(&self) {
if *self != Status::Success {
panic!("Cairo error {:?}", *self)
}
}
}
#[repr(C)]
#[derive(Clone, PartialEq, PartialOrd, Debug, Copy)]
pub enum Antialias {
Default,
None,
Gray,
Subpixel,
Fast,
Good,
Best
}
#[repr(C)]
#[derive(Clone, PartialEq, PartialOrd, Debug, Copy)]
pub enum FillRule {
Winding,
EvenOdd
}
#[repr(C)]
#[derive(Clone, PartialEq, PartialOrd, Debug, Copy)]
pub enum LineCap {
Butt,
Round,
Square
}
#[repr(C)]
#[derive(Clone, PartialEq, PartialOrd, Debug, Copy)]
pub enum LineJoin {
Miter,
Round,
Bevel
}
#[repr(C)]
#[derive(Clone, PartialEq, PartialOrd, Debug, Copy)]
pub enum Operator {
Clear,
Source,
Over,
In,
Out,
Atop,
Dest,
DestOver,
DestIn,
DestOut,
DestAtop,
Xor,
Add,
Saturate,
Multiply,
Screen,
Overlay,
Darken,
Lighten,
ColorDodge,
ColorBurn,
HardLight,
SoftLight,
Difference,
Exclusion,
HslHue,
HslSaturation,
HslColor,
HslLuminosity
}
#[repr(C)]
#[derive(Clone, PartialEq, PartialOrd, Debug, Copy)]
pub enum PathDataType {
MoveTo,
LineTo,
CurveTo,
ClosePath
}
#[repr(C)]
#[derive(Clone, PartialEq, PartialOrd, Debug, Copy)]
pub enum Content {
Color = 0x1000,
Alpha = 0x2000,
ColorAlpha = 0x3000
}
#[repr(C)]
#[derive(Clone, PartialEq, PartialOrd, Debug, Copy)]
pub enum Extend {
None,
Repeat,
Reflect,
Pad
}
#[repr(C)]
#[derive(Clone, PartialEq, PartialOrd, Debug, Copy)]
pub enum Filter {
Fast,
Good,
Best,
Nearest,
Bilinear,
Gaussian
}
#[repr(C)]
#[derive(Clone, PartialEq, PartialOrd, Debug, Copy)]
pub enum PatternType {
Solid,
Surface,
LinearGradient,
RadialGradient,
#[cfg(any(feature = "v1_12", feature = "dox"))]
Mesh,
#[cfg(any(feature = "v1_12", feature = "dox"))]
RasterSource
}
#[repr(C)]
#[derive(Clone, PartialEq, PartialOrd, Debug, Copy)]
pub enum FontSlant {
Normal,
Italic,
Oblique
}
#[repr(C)]
#[derive(Clone, PartialEq, PartialOrd, Debug, Copy)]
pub enum FontWeight {
Normal,
Bold
}
#[repr(C)]
#[derive(Clone, PartialEq, PartialOrd, Debug, Copy)]
pub enum TextClusterFlags {
None = 0x00000000,
Backward = 0x00000001
}
#[repr(C)]
#[derive(Clone, PartialEq, PartialOrd, Debug, Copy)]
pub enum FontType {
FontTypeToy,
FontTypeFt,
FontTypeWin32,
FontTypeQuartz,
FontTypeUser
}
#[repr(C)]
#[derive(Clone, PartialEq, PartialOrd, Debug, Copy)]
pub enum SubpixelOrder {
Default,
Rgb,
Bgr,
Vrgb,
Vbgr
}
#[repr(C)]
#[derive(Clone, PartialEq, PartialOrd, Debug, Copy)]
pub enum HintStyle {
Default,
None,
Slight,
Medium,
Full
}
#[repr(C)]
#[derive(Clone, PartialEq, PartialOrd, Debug, Copy)]
pub enum HintMetrics {
Default,
Off,
On
}
#[repr(C)]
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum SurfaceType {
Image,
Pdf,
Ps,
Xlib,
Xcb,
Glitz,
Quartz,
Win32,
BeOs,
DirectFb,
Svg,
Os2,
Win32Printing,
QuartzImage,
Script,
Qt,
Recording,
Vg,
Gl,
Drm,
Tee,
Xml,
Skia,
Subsurface,
Cogl,
}
#[repr(C)]
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum Format {
Invalid = -1,
ARgb32 = 0,
Rgb24 = 1,
A8 = 2,
A1 = 3,
Rgb16_565 = 4,
Rgb30 = 5,
}
impl Format {
pub fn stride_for_width(&self, width: u32) -> Result<i32, ()> {
assert!(width <= i32::MAX as u32);
let width = width as i32;
let stride = unsafe { super::cairo_format_stride_for_width(*self, width) };
if stride == -1 {
Err(())
} else {
Ok(stride)
}
}
}
#[repr(C)]
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum RegionOverlap {
In,
Out,
Part,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
#[should_panic]
fn stride_panics_on_bad_value() {
let _ = Format::Rgb24.stride_for_width(u32::MAX);
}
#[test]
fn stride_errors_on_large_width() {
assert!(Format::Rgb24.stride_for_width(i32::MAX as u32).is_err());
}
#[test]
fn stride_works() {
assert!(Format::Rgb24.stride_for_width(1).unwrap() == 4);
}
}