Skip to content

Commit 023d64f

Browse files
author
arcturu
committed
Support image drawing
1 parent 0f067be commit 023d64f

File tree

6 files changed

+101
-38
lines changed

6 files changed

+101
-38
lines changed

ui-sys/libui

Submodule libui updated from 5fa7ba4 to 2319174

ui-sys/src/lib.rs

Lines changed: 54 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -665,45 +665,45 @@ pub enum uiExtKey {
665665
/// Equivalent to "Help" on Apple keyboards.
666666
Insert = 2,
667667
Delete = 3,
668-
Home = 4,
669-
End = 5,
670-
PageUp = 6,
671-
PageDown = 7,
672-
Up = 8,
673-
Down = 9,
674-
Left = 10,
675-
Right = 11,
668+
Home = 4,
669+
End = 5,
670+
PageUp = 6,
671+
PageDown = 7,
672+
Up = 8,
673+
Down = 9,
674+
Left = 10,
675+
Right = 11,
676676
// F1..F12 are guaranteed to be consecutive.
677-
F1 = 12,
678-
F2 = 13,
679-
F3 = 14,
680-
F4 = 15,
681-
F5 = 16,
682-
F6 = 17,
683-
F7 = 18,
684-
F8 = 19,
685-
F9 = 20,
686-
F10 = 21,
687-
F11 = 22,
688-
F12 = 23,
677+
F1 = 12,
678+
F2 = 13,
679+
F3 = 14,
680+
F4 = 15,
681+
F5 = 16,
682+
F6 = 17,
683+
F7 = 18,
684+
F8 = 19,
685+
F9 = 20,
686+
F10 = 21,
687+
F11 = 22,
688+
F12 = 23,
689689
// Numpad keys; independent of Num Lock state.
690690
// N0..N9 are guaranteed to be consecutive.
691-
N0 = 24,
692-
N1 = 25,
693-
N2 = 26,
694-
N3 = 27,
695-
N4 = 28,
696-
N5 = 29,
697-
N6 = 30,
698-
N7 = 31,
699-
N8 = 32,
700-
N9 = 33,
701-
NDot = 34,
702-
NEnter = 35,
703-
NAdd = 36,
704-
NSubtract = 37,
705-
NMultiply = 38,
706-
NDivide = 39,
691+
N0 = 24,
692+
N1 = 25,
693+
N2 = 26,
694+
N3 = 27,
695+
N4 = 28,
696+
N5 = 29,
697+
N6 = 30,
698+
N7 = 31,
699+
N8 = 32,
700+
N9 = 33,
701+
NDot = 34,
702+
NEnter = 35,
703+
NAdd = 36,
704+
NSubtract = 37,
705+
NMultiply = 38,
706+
NDivide = 39,
707707
}
708708

709709
#[repr(C)]
@@ -749,3 +749,21 @@ extern {
749749
pub fn uiNewColorButton() -> *mut uiColorButton;
750750
}
751751

752+
pub enum uiImage {}
753+
754+
#[link(name = "ui")]
755+
extern {
756+
pub fn uiNewImage(width: c_double, height: c_double) -> *mut uiImage;
757+
pub fn uiFreeImage(i: *mut uiImage);
758+
pub fn uiImageAppend(i: *mut uiImage,
759+
pixels: *mut c_void,
760+
pixelWidth: c_int,
761+
pixelHeight: c_int,
762+
pixelStride: c_int);
763+
pub fn uiDrawImage(c: *mut uiDrawContext,
764+
x: c_double,
765+
y: c_double,
766+
width: c_double,
767+
height: c_double,
768+
image: *mut uiImage);
769+
}

ui/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ authors = ["Patrick Walton <[email protected]>"]
66
[dependencies]
77
bitflags = "0.7"
88
libc = "*"
9+
#image = "*"
910

1011
[dependencies.ui-sys]
1112
path = "../ui-sys"

ui/src/draw.rs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,16 @@
11
//! Functions and types related to 2D vector graphics.
22
33
use ffi_utils::{self, Text};
4-
use libc::{c_double, c_int};
4+
use libc::{c_double, c_int, c_void};
55
use std::marker::PhantomData;
66
use std::mem;
77
use std::ops::Mul;
88
use std::ptr;
99
use ui_sys::{self, uiDrawBrush, uiDrawBrushType, uiDrawContext, uiDrawFontFamilies, uiDrawMatrix};
1010
use ui_sys::{uiDrawPath, uiDrawStrokeParams};
1111

12+
use image;
13+
1214
pub use ui_sys::uiDrawBrushGradientStop as BrushGradientStop;
1315
pub use ui_sys::uiDrawLineCap as LineCap;
1416
pub use ui_sys::uiDrawLineJoin as LineJoin;
@@ -85,6 +87,15 @@ impl Context {
8587
ui_sys::uiDrawText(self.ui_draw_context, x, y, layout.as_ui_draw_text_layout())
8688
}
8789
}
90+
91+
#[inline]
92+
pub fn draw_image(&self, x: f64, y: f64, width: f64, height: f64, image: &mut image::Image) {
93+
ffi_utils::ensure_initialized();
94+
unsafe {
95+
ui_sys::uiImageAppend(image.ui_image, image.data.as_mut_ptr() as *mut c_void, image.width as i32, image.height as i32, image.width as i32 * 4);
96+
ui_sys::uiDrawImage(self.ui_draw_context, x, y, width, height, image.ui_image);
97+
}
98+
}
8899
}
89100

90101
#[derive(Clone, Debug)]

ui/src/image.rs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
use ffi_utils;
2+
use ui_sys;
3+
4+
pub struct Image {
5+
pub ui_image: *mut ui_sys::uiImage,
6+
pub data: Vec<u8>,
7+
pub width: f64,
8+
pub height: f64,
9+
}
10+
11+
impl Image {
12+
pub fn new(x: f64, y: f64) -> Image {
13+
ffi_utils::ensure_initialized();
14+
unsafe {
15+
Image {
16+
ui_image: ui_sys::uiNewImage(x, y),
17+
data: Vec::with_capacity((x * y * 4.0) as usize),
18+
width: x,
19+
height: y,
20+
}
21+
}
22+
}
23+
}
24+
impl Drop for Image {
25+
fn drop(&mut self) {
26+
ffi_utils::ensure_initialized();
27+
unsafe {
28+
ui_sys::uiFreeImage(self.ui_image);
29+
}
30+
}
31+
}

ui/src/lib.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ pub use menus::{Menu, MenuItem};
1717
pub use ui::{InitError, InitOptions, init, main, msg_box, msg_box_error, on_should_quit};
1818
pub use ui::{open_file, queue_main, quit, save_file, uninit};
1919
pub use windows::Window;
20+
pub use image::Image;
2021

2122
#[macro_use]
2223
mod controls;
@@ -25,4 +26,5 @@ pub mod ffi_utils;
2526
mod menus;
2627
mod ui;
2728
mod windows;
29+
mod image;
2830

0 commit comments

Comments
 (0)