@@ -54,15 +54,16 @@ pub(crate) struct TextureSlice {
54
54
55
55
impl TextureSlicer {
56
56
/// Computes the 4 corner slices
57
- pub ( crate ) fn corner_slices ( & self , image_size : Vec2 , render_size : Vec2 ) -> [ TextureSlice ; 4 ] {
57
+ fn corner_slices ( & self , base_rect : Rect , render_size : Vec2 ) -> [ TextureSlice ; 4 ] {
58
+ let image_size = base_rect. size ( ) ;
58
59
let coef = render_size / image_size;
59
60
let min_coef = coef. x . min ( coef. y ) . min ( self . max_corner_scale . max ( 0.001 ) ) ;
60
61
[
61
62
// Top Left Corner
62
63
TextureSlice {
63
64
texture_rect : Rect {
64
- min : Vec2 :: ZERO ,
65
- max : Vec2 :: new ( self . border . left , self . border . top ) ,
65
+ min : base_rect . min ,
66
+ max : base_rect . min + Vec2 :: new ( self . border . left , self . border . top ) ,
66
67
} ,
67
68
draw_size : Vec2 :: new ( self . border . left , self . border . top ) * min_coef,
68
69
offset : Vec2 :: new (
@@ -73,8 +74,8 @@ impl TextureSlicer {
73
74
// Top Right Corner
74
75
TextureSlice {
75
76
texture_rect : Rect {
76
- min : Vec2 :: new ( image_size. x - self . border . right , 0.0 ) ,
77
- max : Vec2 :: new ( image_size. x , self . border . top ) ,
77
+ min : base_rect . min + Vec2 :: new ( image_size. x - self . border . right , 0.0 ) ,
78
+ max : base_rect . min + Vec2 :: new ( image_size. x , self . border . top ) ,
78
79
} ,
79
80
draw_size : Vec2 :: new ( self . border . right , self . border . top ) * min_coef,
80
81
offset : Vec2 :: new (
@@ -85,8 +86,8 @@ impl TextureSlicer {
85
86
// Bottom Left
86
87
TextureSlice {
87
88
texture_rect : Rect {
88
- min : Vec2 :: new ( 0.0 , image_size. y - self . border . bottom ) ,
89
- max : Vec2 :: new ( self . border . left , image_size. y ) ,
89
+ min : base_rect . min + Vec2 :: new ( 0.0 , image_size. y - self . border . bottom ) ,
90
+ max : base_rect . min + Vec2 :: new ( self . border . left , image_size. y ) ,
90
91
} ,
91
92
draw_size : Vec2 :: new ( self . border . left , self . border . bottom ) * min_coef,
92
93
offset : Vec2 :: new (
@@ -97,11 +98,12 @@ impl TextureSlicer {
97
98
// Bottom Right Corner
98
99
TextureSlice {
99
100
texture_rect : Rect {
100
- min : Vec2 :: new (
101
- image_size. x - self . border . right ,
102
- image_size. y - self . border . bottom ,
103
- ) ,
104
- max : Vec2 :: new ( image_size. x , image_size. y ) ,
101
+ min : base_rect. min
102
+ + Vec2 :: new (
103
+ image_size. x - self . border . right ,
104
+ image_size. y - self . border . bottom ,
105
+ ) ,
106
+ max : base_rect. min + Vec2 :: new ( image_size. x , image_size. y ) ,
105
107
} ,
106
108
draw_size : Vec2 :: new ( self . border . right , self . border . bottom ) * min_coef,
107
109
offset : Vec2 :: new (
@@ -113,17 +115,18 @@ impl TextureSlicer {
113
115
}
114
116
115
117
/// Computes the 2 horizontal side slices (left and right borders)
116
- pub ( crate ) fn horizontal_side_slices (
118
+ fn horizontal_side_slices (
117
119
& self ,
118
120
[ tl_corner, tr_corner, bl_corner, br_corner] : & [ TextureSlice ; 4 ] ,
119
- image_size : Vec2 ,
121
+ base_rect : Rect ,
120
122
render_size : Vec2 ,
121
123
) -> [ TextureSlice ; 2 ] {
124
+ let image_size = base_rect. size ( ) ;
122
125
// left
123
126
let left_side = TextureSlice {
124
127
texture_rect : Rect {
125
- min : Vec2 :: new ( 0.0 , self . border . top ) ,
126
- max : Vec2 :: new ( self . border . left , image_size. y - self . border . bottom ) ,
128
+ min : base_rect . min + Vec2 :: new ( 0.0 , self . border . top ) ,
129
+ max : base_rect . min + Vec2 :: new ( self . border . left , image_size. y - self . border . bottom ) ,
127
130
} ,
128
131
draw_size : Vec2 :: new (
129
132
bl_corner. draw_size . x ,
@@ -135,8 +138,9 @@ impl TextureSlicer {
135
138
// right
136
139
let right_side = TextureSlice {
137
140
texture_rect : Rect {
138
- min : Vec2 :: new ( image_size. x - self . border . right , self . border . bottom ) ,
139
- max : Vec2 :: new ( image_size. x , image_size. y - self . border . top ) ,
141
+ min : base_rect. min
142
+ + Vec2 :: new ( image_size. x - self . border . right , self . border . bottom ) ,
143
+ max : base_rect. min + Vec2 :: new ( image_size. x , image_size. y - self . border . top ) ,
140
144
} ,
141
145
draw_size : Vec2 :: new (
142
146
br_corner. draw_size . x ,
@@ -148,17 +152,18 @@ impl TextureSlicer {
148
152
}
149
153
150
154
/// Computes the 2 vertical side slices (top and bottom borders)
151
- pub ( crate ) fn vertical_side_slices (
155
+ fn vertical_side_slices (
152
156
& self ,
153
157
[ tl_corner, tr_corner, bl_corner, br_corner] : & [ TextureSlice ; 4 ] ,
154
- image_size : Vec2 ,
158
+ base_rect : Rect ,
155
159
render_size : Vec2 ,
156
160
) -> [ TextureSlice ; 2 ] {
161
+ let image_size = base_rect. size ( ) ;
157
162
// Bottom
158
163
let bot_side = TextureSlice {
159
164
texture_rect : Rect {
160
- min : Vec2 :: new ( self . border . left , image_size. y - self . border . bottom ) ,
161
- max : Vec2 :: new ( image_size. x - self . border . right , image_size. y ) ,
165
+ min : base_rect . min + Vec2 :: new ( self . border . left , image_size. y - self . border . bottom ) ,
166
+ max : base_rect . min + Vec2 :: new ( image_size. x - self . border . right , image_size. y ) ,
162
167
} ,
163
168
draw_size : Vec2 :: new (
164
169
render_size. x - ( bl_corner. draw_size . x + br_corner. draw_size . x ) ,
@@ -170,8 +175,8 @@ impl TextureSlicer {
170
175
// Top
171
176
let top_side = TextureSlice {
172
177
texture_rect : Rect {
173
- min : Vec2 :: new ( self . border . left , 0.0 ) ,
174
- max : Vec2 :: new ( image_size. x - self . border . right , self . border . top ) ,
178
+ min : base_rect . min + Vec2 :: new ( self . border . left , 0.0 ) ,
179
+ max : base_rect . min + Vec2 :: new ( image_size. x - self . border . right , self . border . top ) ,
175
180
} ,
176
181
draw_size : Vec2 :: new (
177
182
render_size. x - ( tl_corner. draw_size . x + tr_corner. draw_size . x ) ,
@@ -182,21 +187,24 @@ impl TextureSlicer {
182
187
[ bot_side, top_side]
183
188
}
184
189
185
- pub ( crate ) fn compute_slices ( & self , image_size : Vec2 , render_size : Vec2 ) -> Vec < TextureSlice > {
190
+ pub ( crate ) fn compute_slices (
191
+ & self ,
192
+ rect : Rect ,
193
+ render_size : Option < Vec2 > ,
194
+ ) -> Vec < TextureSlice > {
195
+ let render_size = render_size. unwrap_or_else ( || rect. size ( ) ) ;
186
196
let mut slices = Vec :: with_capacity ( 9 ) ;
187
197
// Corners
188
- let corners = self . corner_slices ( image_size , render_size) ;
198
+ let corners = self . corner_slices ( rect , render_size) ;
189
199
// Sides
190
- let vertical_sides = self . vertical_side_slices ( & corners, image_size , render_size) ;
191
- let horizontal_sides = self . horizontal_side_slices ( & corners, image_size , render_size) ;
200
+ let vertical_sides = self . vertical_side_slices ( & corners, rect , render_size) ;
201
+ let horizontal_sides = self . horizontal_side_slices ( & corners, rect , render_size) ;
192
202
// Center
193
203
let center = TextureSlice {
194
204
texture_rect : Rect {
195
- min : Vec2 :: new ( self . border . left , self . border . bottom ) ,
196
- max : Vec2 :: new (
197
- image_size. x - self . border . right ,
198
- image_size. y - self . border . top ,
199
- ) ,
205
+ min : rect. min + Vec2 :: new ( self . border . left , self . border . bottom ) ,
206
+ max : rect. min
207
+ + Vec2 :: new ( rect. max . x - self . border . right , rect. max . y - self . border . top ) ,
200
208
} ,
201
209
draw_size : Vec2 :: new (
202
210
render_size. x - ( corners[ 2 ] . draw_size . x + corners[ 3 ] . draw_size . x ) ,
0 commit comments