tiny.gui.paint.cpu.geometry
Defined in paint.cpu.
API (15)
Actions
Public operations.
Region.clampedRegion.fullRegion.pixelCountceilClampclampedRadiusclippedBoundsfiniteRectsfloorClampinsetinsideinsideRoundedregionRectroundedRectOutsideDistance
Types and contracts
Public types and contracts.
Source
Source: lib/gui/src/paint/cpu/geometry.zig
zig
const std = @import("std");const gui = @import("../../root.zig");const paint_root = @import("../root.zig");const Command = paint_root.command.Command;const Rect = gui.layout.Rect;pub const Bounds = struct { x0: u32, y0: u32, x1: u32, y1: u32,};pub const Region = struct { x: u32 = 0, y: u32 = 0, width: u32 = 0, height: u32 = 0, pub fn full(width: u32, height: u32) Region { return .{ .width = width, .height = height }; } pub fn pixelCount(self: Region) usize { return @as(usize, self.width) * @as(usize, self.height); } pub fn clamped(self: Region, width: u32, height: u32) Region { if (self.x >= width or self.y >= height) return .{ .x = self.x, .y = self.y }; return .{ .x = self.x, .y = self.y, .width = @min(self.width, width - self.x), .height = @min(self.height, height - self.y), }; }};pub fn clippedBounds(width: u32, height: u32, paint: Command, region: Region) ?Bounds { const bounds = paint_root.command.bounds(paint); const region_rect = regionRect(region); const x0 = floorClamp(@max(@max(bounds.x, paint.clip.x), region_rect.x), width); const y0 = floorClamp(@max(@max(bounds.y, paint.clip.y), region_rect.y), height); const x1 = ceilClamp(@min(@min(bounds.x + bounds.width, paint.clip.x + paint.clip.width), region_rect.x + region_rect.width), width); const y1 = ceilClamp(@min(@min(bounds.y + bounds.height, paint.clip.y + paint.clip.height), region_rect.y + region_rect.height), height); if (x0 >= x1 or y0 >= y1) return null; return .{ .x0 = x0, .y0 = y0, .x1 = x1, .y1 = y1 };}pub fn regionRect(region: Region) Rect { return .{ .x = @floatFromInt(region.x), .y = @floatFromInt(region.y), .width = @floatFromInt(region.width), .height = @floatFromInt(region.height), };}pub fn floorClamp(value: f32, limit: u32) u32 { if (std.math.isNan(value) or value <= 0) return 0; if (!std.math.isFinite(value)) return limit; const floored = @floor(value); if (floored >= @as(f32, @floatFromInt(limit))) return limit; return @intFromFloat(floored);}pub fn ceilClamp(value: f32, limit: u32) u32 { if (std.math.isNan(value) or value <= 0) return 0; if (!std.math.isFinite(value)) return limit; const ceiled = @ceil(value); if (ceiled >= @as(f32, @floatFromInt(limit))) return limit; return @intFromFloat(ceiled);}pub fn inside(rect: Rect, x: f32, y: f32) bool { return x >= rect.x and y >= rect.y and x < rect.x + rect.width and y < rect.y + rect.height;}pub fn insideRounded(rect: Rect, radius: f32, x: f32, y: f32) bool { if (!inside(rect, x, y)) return false; const clamped = clampedRadius(rect, radius); if (clamped <= 0) return true; const inner_x0 = rect.x + clamped; const inner_y0 = rect.y + clamped; const inner_x1 = rect.x + rect.width - clamped; const inner_y1 = rect.y + rect.height - clamped; const cx = @max(inner_x0, @min(x, inner_x1)); const cy = @max(inner_y0, @min(y, inner_y1)); const dx = x - cx; const dy = y - cy; return dx * dx + dy * dy <= clamped * clamped;}pub fn roundedRectOutsideDistance(rect: Rect, radius: f32, x: f32, y: f32) f32 { const clamped = clampedRadius(rect, radius); const inner_x0 = rect.x + clamped; const inner_y0 = rect.y + clamped; const inner_x1 = rect.x + rect.width - clamped; const inner_y1 = rect.y + rect.height - clamped; const cx = @max(inner_x0, @min(x, inner_x1)); const cy = @max(inner_y0, @min(y, inner_y1)); const dx = x - cx; const dy = y - cy; return @max(@sqrt(dx * dx + dy * dy) - clamped, 0);}pub fn clampedRadius(rect: Rect, radius: f32) f32 { return @min(@max(radius, 0), @min(rect.width, rect.height) * 0.5);}pub fn inset(rect: Rect, value: f32) Rect { return .{ .x = rect.x + value, .y = rect.y + value, .width = @max(rect.width - value * 2, 0), .height = @max(rect.height - value * 2, 0), };}pub fn finiteRects(rect: Rect, clip: Rect) bool { return !std.math.isNan(rect.x) and !std.math.isNan(rect.y) and !std.math.isNan(rect.width) and !std.math.isNan(rect.height) and !std.math.isNan(clip.x) and !std.math.isNan(clip.y) and !std.math.isNan(clip.width) and !std.math.isNan(clip.height);}test "floorClamp and ceilClamp bound non-finite and negative values" { try std.testing.expectEqual(@as(u32, 0), floorClamp(-3.5, 10)); try std.testing.expectEqual(@as(u32, 0), floorClamp(std.math.nan(f32), 10)); try std.testing.expectEqual(@as(u32, 10), floorClamp(400, 10)); try std.testing.expectEqual(@as(u32, 4), ceilClamp(3.5, 10)); try std.testing.expectEqual(@as(u32, 0), ceilClamp(std.math.inf(f32) * -1, 10)); try std.testing.expectEqual(@as(u32, 10), ceilClamp(std.math.inf(f32), 10)); try std.testing.expectEqual(@as(u32, 10), floorClamp(std.math.inf(f32), 10)); try std.testing.expectEqual(@as(u32, 0), floorClamp(std.math.inf(f32) * -1, 10));}test "clippedBounds culls positive-infinite geometry instead of leaking outside the region" { const inf = std.math.inf(f32); const region = Region{ .x = 3, .y = 2, .width = 4, .height = 4 }; const command = Command{ .kind = .fill, .rect = .{ .x = inf, .y = 1, .width = 5, .height = 5 }, .clip = .{ .x = 0, .y = 0, .width = 10, .height = 8 }, .color = .{ .r = 1, .g = 2, .b = 3, .a = 255 }, }; try std.testing.expectEqual(@as(?Bounds, null), clippedBounds(10, 8, command, region)); const clipped_away = Command{ .kind = .fill, .rect = .{ .x = 1, .y = 1, .width = 5, .height = 5 }, .clip = .{ .x = inf, .y = 0, .width = 10, .height = 8 }, .color = .{ .r = 1, .g = 2, .b = 3, .a = 255 }, }; try std.testing.expectEqual(@as(?Bounds, null), clippedBounds(10, 8, clipped_away, region));}test "insideRounded keeps straight bands and rejects corners" { const rect = Rect{ .x = 0, .y = 0, .width = 10, .height = 10 }; try std.testing.expect(insideRounded(rect, 3, 5, 0.1)); try std.testing.expect(!insideRounded(rect, 3, 0.2, 0.2)); try std.testing.expect(insideRounded(rect, 3, 3, 3));}Source: lib/gui/src/paint/cpu/root.zig:3
zig
pub const geometry = render.geometry;Complete caller list for paint.Region.full
33 direct callers.
tiny.gui.paint.accy.renderCommandsCpu[function] atlib/gui/src/paint/accy.zig:625tiny.gui.paint.accy.renderCommandsCpuWithImages[function] atlib/gui/src/paint/accy.zig:636tiny.gui.paint.accy.runPackedCommandsCpu[function] atlib/gui/src/paint/accy.zig:674tiny.gui.paint.accy.runPackedTileRangesCpu[function] atlib/gui/src/paint/accy.zig:749lib.gui.src.paint.accy.runPaintFrameLifecycle[function] — private source atlib/gui/src/paint/accy.zig:2919in nearest public ownertiny.gui.paint.accylib.gui.src.paint.accy.test_Accy_failed_frame_acquisition_leaves_the_graph_reusable[function] — test source atlib/gui/src/paint/accy.zig:2896in nearest public ownertiny.gui.paint.accylib.gui.src.paint.accy.test_Accy_steady_frames_make_no_allocator_calls_at_a_fixed_surface_epoch[function] — test source atlib/gui/src/paint/accy.zig:2830in nearest public ownertiny.gui.paint.accylib.gui.src.paint.accy.test_Accy_surface_epochs_stay_allocation-free_after_one_full-block_frame[function] — test source atlib/gui/src/paint/accy.zig:2859in nearest public ownertiny.gui.paint.accylib.gui.src.paint.accy.test_Accy_tile_count_scan_covers_multi-block_CSR_offsets[function] — test source atlib/gui/src/paint/accy.zig:2532in nearest public ownertiny.gui.paint.accylib.gui.src.paint.accy.test_Accy_zero-size_regions_render_without_allocator_use[function] — test source atlib/gui/src/paint/accy.zig:2943in nearest public ownertiny.gui.paint.accylib.gui.src.paint.accy.test_BinScratch_reuses_tile_bin_storage_across_builds[function] — test source atlib/gui/src/paint/accy.zig:2289in nearest public ownertiny.gui.paint.accylib.gui.src.paint.accy.test_binCommandsAlloc_orders_tile_command_lists_by_paint_order[function] — test source atlib/gui/src/paint/accy.zig:2232in nearest public ownertiny.gui.paint.accylib.gui.src.paint.accy.test_binPairCount_surveys_exact_command_tile_pairs_without_scratch[function] — test source atlib/gui/src/paint/accy.zig:2339in nearest public ownertiny.gui.paint.accylib.gui.src.paint.accy.test_commandVisits_counts_per-pixel_tile_command_work[function] — test source atlib/gui/src/paint/accy.zig:2264in nearest public ownertiny.gui.paint.accytiny.gui.paint.renderCommandsPackedWithImages[function] atlib/gui/src/paint/cpu/render.zig:66tiny.gui.paint.renderCommandsWithImages[function] atlib/gui/src/paint/cpu/render.zig:51lib.gui.src.paint.retained.test_retained_clip_shrink_damages_pixels_uncovered_by_the_old_clip[function] — test source atlib/gui/src/paint/retained.zig:641in nearest public ownertiny.gui.paint.retainedlib.gui.src.paint.retained.test_retained_command_bookkeeping_needs_no_allocation_after_warmup[function] — test source atlib/gui/src/paint/retained.zig:821in nearest public ownertiny.gui.paint.retainedlib.gui.src.paint.retained.test_retained_damage_includes_removed_effects_and_current_geometry[function] — test source atlib/gui/src/paint/retained.zig:608in nearest public ownertiny.gui.paint.retainedlib.gui.src.paint.retained.test_retained_duplicate_fragment_identities_reject[function] — test source atlib/gui/src/paint/retained.zig:573in nearest public ownertiny.gui.paint.retainedlib.gui.src.paint.retained.test_retained_identity_churn_keeps_narrower_positional_command_damage[function] — test source atlib/gui/src/paint/retained.zig:530in nearest public ownertiny.gui.paint.retainedlib.gui.src.paint.retained.test_retained_insertion_damages_only_the_inserted_fragment[function] — test source atlib/gui/src/paint/retained.zig:483in nearest public ownertiny.gui.paint.retainedlib.gui.src.paint.retained.test_retained_linear_gradient_changes_damage_its_widget_bounds[function] — test source atlib/gui/src/paint/retained.zig:674in nearest public ownertiny.gui.paint.retainedlib.gui.src.paint.retained.test_retained_matched_fragment_damages_only_changed_commands[function] — test source atlib/gui/src/paint/retained.zig:508in nearest public ownertiny.gui.paint.retainedlib.gui.src.paint.retained.test_retained_preflight_failure_preserves_a_reusable_baseline[function] — test source atlib/gui/src/paint/retained.zig:784in nearest public ownertiny.gui.paint.retainedlib.gui.src.paint.retained.test_retained_reorder_preserves_semantic_damage[function] — test source atlib/gui/src/paint/retained.zig:552in nearest public ownertiny.gui.paint.retainedlib.gui.src.paint.retained.test_retained_semantic_damage_repaints_changed_image_content[function] — test source atlib/gui/src/paint/retained.zig:729in nearest public ownertiny.gui.paint.retainedlib.gui.src.paint.strip.test_reifyAlloc_emits_globally_aligned_strip_records[function] — test source atlib/gui/src/paint/strip.zig:155in nearest public ownertiny.gui.paint.striplib.gui.src.paint.text.test_retained_text_run_color_changes_damage_only_the_styled_glyph[function] — test source atlib/gui/src/paint/text.zig:6078in nearest public ownertiny.gui.paint.textlib.gui.src.paint.text.test_wrapped_markers_preserve_glyph_geometry_and_partition_selection_by_visual_line[function] — test source atlib/gui/src/paint/text.zig:4756in nearest public ownertiny.gui.paint.textlib.gui.src.properties.raster.AccyProperty.property[function] — private source atlib/gui/src/properties/raster.zig:372in nearest public ownerlib.gui.src.properties.rasterlib.gui.src.properties.raster.Property.property[function] — private source atlib/gui/src/properties/raster.zig:180in nearest public ownerlib.gui.src.properties.rasterlib.gui.src.properties.raster.expectMatchesReference[function] — private source atlib/gui/src/properties/raster.zig:313in nearest public ownerlib.gui.src.properties.raster
Audit
| Definitions | 16 |
|---|---|
| Public names | 26 |
| Members | 8 |
| Version | 26.7.0 |
| Revision | daab053ee433 |