image
Show raster image. dvui will handle texture creation/destruction for you, unless the source is .texture. See ImageSource.InvalidationStrategy. Please pass the .label option to add accessibility text to the image.
See imageSize.
Only valid between Window.beginand Window.end.
Parameters
- src:std.builtin.SourceLocation
- std.builtin.SourceLocation
- init_opts:ImageInitOptions
- ImageInitOptions
- opts:Options
- Options
Source
Implementation
pub fn image(src: std.builtin.SourceLocation, init_opts: ImageInitOptions, opts: Options) WidgetData {
const options = (Options{ .name = "image", .role = .image }).override(opts);
var size = Size{};
if (options.min_size_content) |msc| {
// user gave us a min size, use it
size = msc;
} else {
// user didn't give us one, use natural size
size = dvui.imageSize(init_opts.source) catch .{ .w = 10, .h = 10 };
}
var wd = WidgetData.init(src, .{}, options.override(.{ .min_size_content = size }));
wd.register();
const cr = wd.contentRect();
const ms = wd.options.min_size_contentGet();
var too_big = false;
if (ms.w > cr.w or ms.h > cr.h) {
too_big = true;
}
var e = wd.options.expandGet();
if (too_big) {
e = init_opts.shrink orelse e;
}
const g = wd.options.gravityGet();
var rect = dvui.placeIn(cr, ms, e, g);
if (too_big and e != .ratio) {
if (ms.w > cr.w and !e.isHorizontal()) {
rect.w = ms.w;
rect.x -= g.x * (ms.w - cr.w);
}
if (ms.h > cr.h and !e.isVertical()) {
rect.h = ms.h;
rect.y -= g.y * (ms.h - cr.h);
}
}
// rect is the content rect, so expand to the whole rect
wd.rect = rect.outset(wd.options.paddingGet()).outset(wd.options.borderGet()).outset(wd.options.marginGet());
var renderBackground: ?Color = if (wd.options.backgroundGet()) wd.options.color(.fill) else null;
if (wd.options.rotationGet() == 0.0) {
wd.borderAndBackground(.{});
renderBackground = null;
} else {
if (wd.options.borderGet().nonZero()) {
dvui.log.debug("image {x} can't render border while rotated\n", .{wd.id});
}
}
const render_tex_opts = RenderTextureOptions{
.rotation = wd.options.rotationGet(),
.corners = wd.options.cornersGet(),
.uv = init_opts.uv,
.background_color = renderBackground,
};
const content_rs = wd.contentRectScale();
renderImage(init_opts.source, content_rs, render_tex_opts) catch |err| logError(@src(), err, "Could not render image {?s} at {}", .{ opts.name, content_rs });
wd.minSizeSetAndRefresh();
wd.minSizeReportToParent();
return wd;
}