Files
rustdesk/libs/rust-sciter/src/capi/scgraphics.rs
2021-05-23 10:55:19 +08:00

354 lines
13 KiB
Rust

//! Sciter's platform independent graphics interface.
#![allow(non_camel_case_types, non_snake_case)]
#![allow(dead_code)]
use capi::scdom::HELEMENT;
use capi::sctypes::{BOOL, LPCBYTE, LPCWSTR, LPVOID, UINT};
use capi::scvalue::VALUE;
MAKE_HANDLE!(#[doc = "Graphics native handle."] HGFX, _HGFX);
MAKE_HANDLE!(#[doc = "Image native handle."] HIMG, _HIMG);
MAKE_HANDLE!(#[doc = "Path native handle."] HPATH, _HPATH);
MAKE_HANDLE!(#[doc = "Text native handle."] HTEXT, _HTEXT);
pub type SC_REAL = f32;
pub type SC_POS = SC_REAL;
pub type SC_DIM = SC_REAL;
pub type SC_ANGLE = SC_REAL;
pub type SC_COLOR = u32;
#[repr(C)]
#[derive(Debug, PartialEq)]
/// Type of the result value for Sciter Graphics functions.
pub enum GRAPHIN_RESULT {
/// E.g. not enough memory.
PANIC = -1,
/// Success.
OK = 0,
/// Bad parameter.
BAD_PARAM = 1,
/// Operation failed, e.g. `restore()` without `save()`.
FAILURE = 2,
/// Platform does not support the requested feature.
NOTSUPPORTED = 3,
}
impl std::error::Error for GRAPHIN_RESULT {}
impl std::fmt::Display for GRAPHIN_RESULT {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
write!(f, "{:?}", self)
}
}
/// Path drawing mode.
#[repr(C)]
#[derive(Debug, PartialEq)]
pub enum DRAW_PATH {
/// Draw without outline line.
FILL_ONLY = 1,
/// Draw outline without fill.
STROKE_ONLY = 2,
/// Draw outlined and filled path.
FILL_AND_STROKE = 3,
}
/// Line drawing join mode.
#[repr(C)]
#[derive(Debug, PartialEq)]
pub enum LINE_JOIN {
/// Specifies a mitered join. This produces a sharp corner or a clipped corner,
/// depending on whether the length of the miter exceeds the miter limit (`10.0`).
MITER = 0,
/// Specifies a circular join. This produces a smooth, circular arc between the lines.
ROUND = 1,
/// Specifies a beveled join. This produces a diagonal corner.
BEVEL = 2,
/// Specifies a mitered join. This produces a sharp corner or a beveled corner,
/// depending on whether the length of the miter exceeds the miter limit (`10.0`).
MITER_OR_BEVEL = 3,
}
/// Line drawing cap mode.
#[repr(C)]
#[derive(Debug, PartialEq)]
pub enum LINE_CAP {
/// The ends of lines are squared off at the endpoints.
BUTT = 0,
/// The ends of lines are squared off by adding a box with an equal width
/// and half the height of the line's thickness.
SQUARE = 1,
/// The ends of lines are rounded.
ROUND = 2,
}
#[repr(C)]
#[derive(Debug, PartialEq)]
pub enum IMAGE_ENCODING {
RAW, // [a,b,g,r,a,b,g,r,...] vector
PNG,
JPG,
WEBP,
}
#[repr(C)]
#[derive(Debug)]
pub struct SC_COLOR_STOP {
pub color: SC_COLOR,
pub offset: f32,
}
#[repr(C)]
#[allow(missing_docs)]
pub struct SciterGraphicsAPI {
// image primitives
pub imageCreate: extern "system" fn(poutImg: &mut HIMG, width: UINT, height: UINT, withAlpha: BOOL) -> GRAPHIN_RESULT,
// construct image from B[n+0],G[n+1],R[n+2],A[n+3] data.
// Size of pixmap data is pixmapWidth*pixmapHeight*4
pub imageCreateFromPixmap:
extern "system" fn(poutImg: &mut HIMG, pixmapWidth: UINT, pixmapHeight: UINT, withAlpha: BOOL, pixmap: LPCBYTE) -> GRAPHIN_RESULT,
pub imageAddRef: extern "system" fn(himg: HIMG) -> GRAPHIN_RESULT,
pub imageRelease: extern "system" fn(himg: HIMG) -> GRAPHIN_RESULT,
pub imageGetInfo: extern "system" fn(himg: HIMG, width: &mut UINT, height: &mut UINT, usesAlpha: &mut BOOL) -> GRAPHIN_RESULT,
pub imageClear: extern "system" fn(himg: HIMG, byColor: SC_COLOR) -> GRAPHIN_RESULT,
pub imageLoad: extern "system" fn(bytes: LPCBYTE, num_bytes: UINT, pout_img: &mut HIMG) -> GRAPHIN_RESULT, // load png/jpeg/etc. image from stream of bytes
pub imageSave: extern "system" fn(himg: HIMG, pfn: ImageWriteFunction, prm: LPVOID, encoding: IMAGE_ENCODING, quality: UINT) -> GRAPHIN_RESULT,
// SECTION: graphics primitives and drawing operations
// create SC_COLOR value
pub RGBA: extern "system" fn(red: UINT, green: UINT, blue: UINT, alpha: UINT) -> SC_COLOR,
pub gCreate: extern "system" fn(img: HIMG, pout_gfx: &mut HGFX) -> GRAPHIN_RESULT,
pub gAddRef: extern "system" fn(gfx: HGFX) -> GRAPHIN_RESULT,
pub gRelease: extern "system" fn(gfx: HGFX) -> GRAPHIN_RESULT,
// Draws line from x1,y1 to x2,y2 using current lineColor and lineGradient.
pub gLine: extern "system" fn(hgfx: HGFX, x1: SC_POS, y1: SC_POS, x2: SC_POS, y2: SC_POS) -> GRAPHIN_RESULT,
// Draws rectangle using current lineColor/lineGradient and fillColor/fillGradient with (optional) rounded corners.
pub gRectangle: extern "system" fn(hgfx: HGFX, x1: SC_POS, y1: SC_POS, x2: SC_POS, y2: SC_POS) -> GRAPHIN_RESULT,
// Draws rounded rectangle using current lineColor/lineGradient and fillColor/fillGradient with (optional) rounded corners.
pub gRoundedRectangle: extern "system" fn(
hgfx: HGFX,
x1: SC_POS,
y1: SC_POS,
x2: SC_POS,
y2: SC_POS,
radii8: *const SC_DIM,
) -> GRAPHIN_RESULT,
// Draws circle or ellipse using current lineColor/lineGradient and fillColor/fillGradient.
pub gEllipse: extern "system" fn(hgfx: HGFX, x: SC_POS, y: SC_POS, rx: SC_DIM, ry: SC_DIM) -> GRAPHIN_RESULT,
// Draws closed arc using current lineColor/lineGradient and fillColor/fillGradient.
pub gArc:
extern "system" fn(hgfx: HGFX, x: SC_POS, y: SC_POS, rx: SC_POS, ry: SC_POS, start: SC_ANGLE, sweep: SC_ANGLE) -> GRAPHIN_RESULT,
// Draws star.
pub gStar: extern "system" fn(hgfx: HGFX, x: SC_POS, y: SC_POS, r1: SC_DIM, r2: SC_DIM, start: SC_ANGLE, rays: UINT) -> GRAPHIN_RESULT,
// Closed polygon.
pub gPolygon: extern "system" fn(hgfx: HGFX, xy: *const SC_POS, num_points: UINT) -> GRAPHIN_RESULT,
// Polyline.
pub gPolyline: extern "system" fn(hgfx: HGFX, xy: *const SC_POS, num_points: UINT) -> GRAPHIN_RESULT,
// SECTION: Path operations
pub pathCreate: extern "system" fn(path: &mut HPATH) -> GRAPHIN_RESULT,
pub pathAddRef: extern "system" fn(path: HPATH) -> GRAPHIN_RESULT,
pub pathRelease: extern "system" fn(path: HPATH) -> GRAPHIN_RESULT,
pub pathMoveTo: extern "system" fn(path: HPATH, x: SC_POS, y: SC_POS, relative: BOOL) -> GRAPHIN_RESULT,
pub pathLineTo: extern "system" fn(path: HPATH, x: SC_POS, y: SC_POS, relative: BOOL) -> GRAPHIN_RESULT,
pub pathArcTo: extern "system" fn(
path: HPATH,
x: SC_POS,
y: SC_POS,
angle: SC_ANGLE,
rx: SC_DIM,
ry: SC_DIM,
is_large_arc: BOOL,
clockwise: BOOL,
relative: BOOL,
) -> GRAPHIN_RESULT,
pub pathQuadraticCurveTo: extern "system" fn(path: HPATH, xc: SC_POS, yc: SC_POS, x: SC_POS, y: SC_POS, relative: BOOL) -> GRAPHIN_RESULT,
pub pathBezierCurveTo:
extern "system" fn(path: HPATH, xc1: SC_POS, yc1: SC_POS, xc2: SC_POS, yc2: SC_POS, x: SC_POS, y: SC_POS, relative: BOOL)
-> GRAPHIN_RESULT,
pub pathClosePath: extern "system" fn(path: HPATH) -> GRAPHIN_RESULT,
pub gDrawPath: extern "system" fn(hgfx: HGFX, path: HPATH, dpm: DRAW_PATH) -> GRAPHIN_RESULT,
// end of path opearations
// SECTION: affine tranformations:
pub gRotate: extern "system" fn(hgfx: HGFX, radians: SC_ANGLE, cx: Option<&SC_POS>, cy: Option<&SC_POS>) -> GRAPHIN_RESULT,
pub gTranslate: extern "system" fn(hgfx: HGFX, cx: SC_POS, cy: SC_POS) -> GRAPHIN_RESULT,
pub gScale: extern "system" fn(hgfx: HGFX, x: SC_DIM, y: SC_DIM) -> GRAPHIN_RESULT,
pub gSkew: extern "system" fn(hgfx: HGFX, dx: SC_DIM, dy: SC_DIM) -> GRAPHIN_RESULT,
// all above in one shot
pub gTransform:
extern "system" fn(hgfx: HGFX, m11: SC_POS, m12: SC_POS, m21: SC_POS, m22: SC_POS, dx: SC_POS, dy: SC_POS) -> GRAPHIN_RESULT,
// end of affine tranformations.
// SECTION: state save/restore
pub gStateSave: extern "system" fn(hgfx: HGFX) -> GRAPHIN_RESULT,
pub gStateRestore: extern "system" fn(hgfx: HGFX) -> GRAPHIN_RESULT,
// end of state save/restore
// SECTION: drawing attributes
// set line width for subsequent drawings.
pub gLineWidth: extern "system" fn(hgfx: HGFX, width: SC_DIM) -> GRAPHIN_RESULT,
pub gLineJoin: extern "system" fn(hgfx: HGFX, join_type: LINE_JOIN) -> GRAPHIN_RESULT,
pub gLineCap: extern "system" fn(hgfx: HGFX, cap_type: LINE_CAP) -> GRAPHIN_RESULT,
// SC_COLOR for solid lines/strokes
pub gLineColor: extern "system" fn(hgfx: HGFX, color: SC_COLOR) -> GRAPHIN_RESULT,
// SC_COLOR for solid fills
pub gFillColor: extern "system" fn(hgfx: HGFX, color: SC_COLOR) -> GRAPHIN_RESULT,
// setup parameters of linear gradient of lines.
pub gLineGradientLinear:
extern "system" fn(hgfx: HGFX, x1: SC_POS, y1: SC_POS, x2: SC_POS, y2: SC_POS, stops: *const SC_COLOR_STOP, nstops: UINT)
-> GRAPHIN_RESULT,
// setup parameters of linear gradient of fills.
pub gFillGradientLinear:
extern "system" fn(hgfx: HGFX, x1: SC_POS, y1: SC_POS, x2: SC_POS, y2: SC_POS, stops: *const SC_COLOR_STOP, nstops: UINT)
-> GRAPHIN_RESULT,
// setup parameters of line gradient radial fills.
pub gLineGradientRadial:
extern "system" fn(hgfx: HGFX, x: SC_POS, y: SC_POS, rx: SC_DIM, ry: SC_DIM, stops: *const SC_COLOR_STOP, nstops: UINT)
-> GRAPHIN_RESULT,
// setup parameters of gradient radial fills.
pub gFillGradientRadial:
extern "system" fn(hgfx: HGFX, x: SC_POS, y: SC_POS, rx: SC_DIM, ry: SC_DIM, stops: *const SC_COLOR_STOP, nstops: UINT)
-> GRAPHIN_RESULT,
pub gFillMode: extern "system" fn(hgfx: HGFX, even_odd: BOOL) -> GRAPHIN_RESULT,
// SECTION: text
// create text layout for host element
pub textCreateForElement: extern "system" fn(ptext: &mut HTEXT, text: LPCWSTR, textLength: UINT, he: HELEMENT, classNameOrNull: LPCWSTR) -> GRAPHIN_RESULT,
// create text layout using explicit style declaration
pub textCreateForElementAndStyle:
extern "system" fn(ptext: &mut HTEXT, text: LPCWSTR, textLength: UINT, he: HELEMENT, style: LPCWSTR, styleLength: UINT) -> GRAPHIN_RESULT,
// since 4.1.10
pub textAddRef: extern "system" fn(text: HTEXT) -> GRAPHIN_RESULT,
// since 4.1.10
pub textRelease: extern "system" fn(text: HTEXT) -> GRAPHIN_RESULT,
pub textGetMetrics: extern "system" fn(
text: HTEXT,
minWidth: &mut SC_DIM,
maxWidth: &mut SC_DIM,
height: &mut SC_DIM,
ascent: &mut SC_DIM,
descent: &mut SC_DIM,
nLines: &mut UINT,
) -> GRAPHIN_RESULT,
pub textSetBox: extern "system" fn(text: HTEXT, width: SC_DIM, height: SC_DIM) -> GRAPHIN_RESULT,
// draw text with position (1..9 on MUMPAD) at px,py
// Ex: gDrawText(100,100,5) will draw text box with its center at 100,100 px
pub gDrawText: extern "system" fn(hgfx: HGFX, text: HTEXT, px: SC_POS, py: SC_POS, position: UINT) -> GRAPHIN_RESULT,
// SECTION: image rendering
// draws img onto the graphics surface with current transformation applied (scale, rotation).
#[allow(clippy::type_complexity)]
pub gDrawImage: extern "system" fn(
hgfx: HGFX,
himg: HIMG,
x: SC_POS,
y: SC_POS,
w: Option<&SC_DIM>,
h: Option<&SC_DIM>,
ix: Option<&UINT>,
iy: Option<&UINT>,
iw: Option<&UINT>,
ih: Option<&UINT>,
opacity: Option<&f32>,
) -> GRAPHIN_RESULT,
// SECTION: coordinate space
pub gWorldToScreen: extern "system" fn(hgfx: HGFX, inout_x: &mut SC_POS, inout_y: &mut SC_POS) -> GRAPHIN_RESULT,
pub gScreenToWorld: extern "system" fn(hgfx: HGFX, inout_x: &mut SC_POS, inout_y: &mut SC_POS) -> GRAPHIN_RESULT,
// SECTION: clipping
pub gPushClipBox: extern "system" fn(hgfx: HGFX, x1: SC_POS, y1: SC_POS, x2: SC_POS, y2: SC_POS, opacity: f32) -> GRAPHIN_RESULT,
pub gPushClipPath: extern "system" fn(hgfx: HGFX, hpath: HPATH, opacity: f32) -> GRAPHIN_RESULT,
// pop clip layer previously set by gPushClipBox or gPushClipPath
pub gPopClip: extern "system" fn(hgfx: HGFX) -> GRAPHIN_RESULT,
// image painter
pub imagePaint: extern "system" fn(himg: HIMG, pPainter: ImagePaintFunction, prm: LPVOID) -> GRAPHIN_RESULT, // paint on image using graphics
// VALUE interface
pub vWrapGfx: extern "system" fn(hgfx: HGFX, toValue: *mut VALUE) -> GRAPHIN_RESULT,
pub vWrapImage: extern "system" fn(himg: HIMG, toValue: *mut VALUE) -> GRAPHIN_RESULT,
pub vWrapPath: extern "system" fn(hpath: HPATH, toValue: *mut VALUE) -> GRAPHIN_RESULT,
pub vWrapText: extern "system" fn(htext: HTEXT, toValue: *mut VALUE) -> GRAPHIN_RESULT,
pub vUnWrapGfx: extern "system" fn(fromValue: *const VALUE, phgfx: &mut HGFX) -> GRAPHIN_RESULT,
pub vUnWrapImage: extern "system" fn(fromValue: *const VALUE, phimg: &mut HIMG) -> GRAPHIN_RESULT,
pub vUnWrapPath: extern "system" fn(fromValue: *const VALUE, phpath: &mut HPATH) -> GRAPHIN_RESULT,
pub vUnWrapText: extern "system" fn(fromValue: *const VALUE, phtext: &mut HTEXT) -> GRAPHIN_RESULT,
// since 4.4.3.20
pub gFlush: extern "system" fn(hgfx: HGFX) -> GRAPHIN_RESULT,
}
pub type ImageWriteFunction = extern "system" fn(prm: LPVOID, data: LPCBYTE, data_length: UINT);
pub type ImagePaintFunction = extern "system" fn(prm: LPVOID, hgfx: HGFX, width: UINT, height: UINT);