@@ -102,6 +102,42 @@ pub const morton = struct {
102102
103103 return values ;
104104 }
105+
106+ pub const Strategy = enum { tile , untile };
107+
108+ pub fn convert (comptime T : type , comptime strategy : Strategy , comptime tile_size : usize , width : usize , dst_pixels : []T , src_pixels : []const T ) void {
109+ std .debug .assert (dst_pixels .len == src_pixels .len );
110+ const max_tile_subindex = (tile_size * tile_size );
111+ const SubindexInt = std .math .IntFittingRange (0 , max_tile_subindex - 1 );
112+
113+ const height = @divExact (src_pixels .len , width );
114+ const width_tiles = @divExact (width , tile_size );
115+ const height_tiles = @divExact (height , tile_size );
116+
117+ var i : u16 = 0 ;
118+ for (0.. height_tiles ) | y_tile | {
119+ const y_start = y_tile * tile_size ;
120+
121+ for (0.. width_tiles ) | x_tile | {
122+ const x_start = x_tile * tile_size ;
123+
124+ for (0.. max_tile_subindex ) | tile | {
125+ const x , const y = toDimensions (SubindexInt , 2 , @intCast (tile ));
126+
127+ const linear_index = i ;
128+ const morton_index = (y_start + y ) * width + x_start + x ;
129+
130+ const src_pixel , const dst_pixel = switch (strategy ) {
131+ .tile = > .{ & src_pixels [morton_index ], & dst_pixels [linear_index ] },
132+ .untile = > .{ & src_pixels [linear_index ], & dst_pixels [morton_index ] },
133+ };
134+
135+ dst_pixel .* = src_pixel .* ;
136+ i += 1 ;
137+ }
138+ }
139+ }
140+ }
105141};
106142
107143pub const Screen = enum (u1 ) {
@@ -547,6 +583,16 @@ pub const TextureUnitFormat = enum(u4) {
547583 a4 ,
548584 etc1 ,
549585 etc1a4 ,
586+
587+ pub fn scale (format : TextureUnitFormat , size : usize ) usize {
588+ return switch (format ) {
589+ .abgr8888 = > size << 2 ,
590+ .bgr888 = > size * 3 ,
591+ .rgba5551 , .rgb565 , .rgba4444 , .ia88 , .hilo88 = > size << 1 ,
592+ .i8 , .a8 , .ia44 , .etc1a4 = > size ,
593+ .i4 , .a4 , .etc1 = > size >> 1 ,
594+ };
595+ }
550596};
551597
552598pub const TextureUnitTexture2Coordinates = enum (u1 ) {
0 commit comments