8000 get slicing · jepler/circuitpython@0563487 · GitHub
[go: up one dir, main page]

Skip to content

Commit 0563487

Browse files
committed
get slicing
1 parent c6ca2bd commit 0563487

File tree

3 files changed

+49
-28
lines changed

3 files changed

+49
-28
lines changed

shared-bindings/_pixelmap/PixelMap.c

Lines changed: 37 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ MP_PROPERTY_GETTER(pixelmap_pixelmap_byteorder_obj,
135135
(mp_obj_t)&pixelmap_pixelmap_get_byteorder);
136136

137137
//|
138-
//| def fill(self, color: PixelType, /) -> None:
138+
//| def fill(self, color: PixelType) -> None:
139139
//| """Fill all the pixels in the map with the given color"""
140140
STATIC mp_obj_t pixelmap_pixelmap_fill(const mp_obj_t self_in, const mp_obj_t color) {
141141
pixelmap_pixelmap_obj_t *self = MP_OBJ_TO_PTR(self_in);
@@ -146,7 +146,7 @@ STATIC mp_obj_t pixelmap_pixelmap_fill(const mp_obj_t self_in, const mp_obj_t co
146146
MP_DEFINE_CONST_FUN_OBJ_2(pixelmap_pixelmap_fill_obj, pixelmap_pixelmap_fill);
147147

148148
//|
149-
//| def indices(self, index: int, /) -> Tuple[int]:
149+
//| def indices(self, index: int) -> Tuple[int]:
150150
//| """Return the PixelBuf indices for a PixelMap index"""
151151
STATIC mp_obj_t pixelmap_pixelmap_indices(const mp_obj_t self_in, const mp_obj_t index) {
152152
pixelmap_pixelmap_obj_t *self = MP_OBJ_TO_PTR(self_in);
@@ -157,10 +157,14 @@ STATIC mp_obj_t pixelmap_pixelmap_indices(const mp_obj_t self_in, const mp_obj_t
157157
MP_DEFINE_CONST_FUN_OBJ_2(pixelmap_pixelmap_indices_obj, pixelmap_pixelmap_indices);
158158

159159

160+
//| @overload
161+
//| def __getitem__(self, index: slice) -> PixelReturnSequence:
162+
//| """Retrieve the value of the underlying pixels."""
163+
//| ...
164+
//| @overload
160165
//| def __getitem__(self, index: int) -> PixelReturnType:
161-
//| """Retrieve the value of one of the underlying pixels at 'index'.
162-
//|
163-
//| Note that slices are not supported by PixelMap.__getitem__"""
166+
8000 //| """Retrieve the value of one of the underlying pixels at 'index'."""
167+
//| ...
164168
//| @overload
165169
//| def __setitem__(self, index: slice, value: PixelSequence) -> None: ...
166170
//| @overload
@@ -176,21 +180,41 @@ STATIC mp_obj_t pixelmap_pixelmap_subscr(mp_obj_t self_in, mp_obj_t index_in, mp
176180
if (value == MP_OBJ_NULL) {
177181
// delete
178182
return MP_OBJ_NULL; // op not supported
179-
} else if (value == MP_OBJ_SENTINEL) {
180-
int index = mp_obj_get_int(index_in);
181-
return shared_module_pixelmap_pixelmap_getitem(self, index);
182183
}
183184

184-
// get
185185
if (0) {
186186
#if MICROPY_PY_BUILTINS_SLICE
187187
} else if (mp_obj_is_type(index_in, &mp_type_slice)) {
188-
shared_module_pixelmap_pixelmap_setslice(self, index_in, value);
188+
mp_bound_slice_t slice;
189+
mp_seq_get_fast_slice_indexes(self->len, index_in, &slice);
190+
size_t slice_len;
191+
if (slice.step > 0) {
192+
slice_len = slice.stop - slice.start;
193+
} else {
194+
slice_len = 1 + slice.start - slice.stop;
195+
}
196+
if (slice.step > 1 || slice.step < -1) {
197+
size_t step = slice.step > 0 ? slice.step : slice.step * -1;
198+
slice_len = (slice_len / step) + (slice_len % step ? 1 : 0);
199+
}
200+
201+
if (value == MP_OBJ_SENTINEL) { // Get
202+
return shared_module_pixelmap_pixelmap_getslice(self, slice, slice_len);
203+
} else { // Set
204+
shared_module_pixelmap_pixelmap_setslice(self, value, slice, slice_len);
205+
return mp_const_none;
206+
}
189207
#endif
190-
} else {
191-
shared_module_pixelmap_pixelmap_setitem(self, mp_obj_get_int(index_in), value);
208+
} else { // single index
209+
int index = mp_obj_get_int(index_in);
210+
211+
if (value == MP_OBJ_SENTINEL) { // Get
212+
return shared_module_pixelmap_pixelmap_getitem(self, index);
213+
} else {
214+
shared_module_pixelmap_pixelmap_setitem(self, mp_obj_get_int(index_in), value);
215+
return mp_const_none;
216+
}
192217
}
193-
return mp_const_none;
194218
}
195219

196220
//| def __len__(self) -> int:

shared-bindings/_pixelmap/PixelMap.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ bool shared_module_pixelmap_pixelmap_auto_write_get(pixelmap_pixelmap_obj_t *sel
3737
void shared_module_pixelmap_pixelmap_auto_write_set(pixelmap_pixelmap_obj_t *self, bool auto_write);
3838
void shared_module_pixelmap_pixelmap_fill(pixelmap_pixelmap_obj_t *self, const mp_obj_t color);
3939
mp_obj_t shared_module_pixelmap_pixelmap_indices(pixelmap_pixelmap_obj_t *self, int index);
40-
void shared_module_pixelmap_pixelmap_setslice(pixelmap_pixelmap_obj_t *self, const mp_obj_t slice_in, const mp_obj_t value);
40+
void shared_module_pixelmap_pixelmap_setslice(pixelmap_pixelmap_obj_t *self, const mp_obj_t value, mp_bound_slice_t slice, size_t slice_len);
41+
mp_obj_t shared_module_pixelmap_pixelmap_getslice(pixelmap_pixelmap_obj_t *self, mp_bound_slice_t slice, size_t slice_len);
4142
mp_obj_t shared_module_pixelmap_pixelmap_getitem(pixelmap_pixelmap_obj_t *self, mp_int_t index);
4243
void shared_module_pixelmap_pixelmap_setitem(pixelmap_pixelmap_obj_t *self, mp_int_t index, const mp_obj_t value);

shared-module/_pixelmap/PixelMap.c

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434

3535

3636
static void pixelmap_set_pixel_rgbw(pixelmap_pixelmap_obj_t *self, size_t i, color_u rgbw) {
37-
mp_arg_validate_index_range(i, 0, self->len, MP_QSTR_index);
37+
mp_arg_validate_index_range(i, 0, self->len - 1, MP_QSTR_index);
3838

3939
mp_obj_t item = self->items[i];
4040
if (mp_obj_is_small_int(item)) {
@@ -109,20 +109,16 @@ mp_obj_t shared_module_pixelmap_pixelmap_indices(pixelmap_pixelmap_obj_t *self,
109109
}
110110

111111
#if MICROPY_PY_BUILTINS_SLICE
112-
void shared_module_pixelmap_pixelmap_setslice(pixelmap_pixelmap_obj_t *self, const mp_obj_t slice_in, const mp_obj_t values) {
113-
mp_bound_slice_t slice;
114-
mp_seq_get_fast_slice_indexes(self->len, slice_in, &slice);
115-
size_t slice_len;
116-
if (slice.step > 0) {
117-
slice_len = slice.stop - slice.start;
118-
} else {
119-
slice_len = 1 + slice.start - slice.stop;
120-
}
121-
if (slice.step > 1 || slice.step < -1) {
122-
size_t step = slice.step > 0 ? slice.step : slice.step * -1;
123-
slice_len = (slice_len / step) + (slice_len % step ? 1 : 0);
112+
113+
mp_obj_t shared_module_pixelmap_pixelmap_getslice(pixelmap_pixelmap_obj_t *self, mp_bound_slice_t slice, size_t slice_len) {
114+
mp_obj_tuple_t *t = MP_OBJ_TO_PTR(mp_obj_new_tuple(slice_len, NULL));
115+
for (uint i = 0; i < slice_len; i++) {
116+
t->items[i] = shared_module_pixelmap_pixelmap_getitem(self, i * slice.step + slice.start);
124117
}
118+
return MP_OBJ_FROM_PTR(t);
119+
}
125120

121+
void shared_module_pixelmap_pixelmap_setslice(pixelmap_pixelmap_obj_t *self, const mp_obj_t values, mp_bound_slice_t slice, size_t slice_len) {
126122
size_t num_items = mp_obj_get_int(mp_obj_len(values));
127123
if (num_items != slice_len) {
128124
mp_raise_ValueError_varg(translate("Unmatched number of items on RHS (expected %d, got %d)."), slice_len, num_items);
@@ -165,7 +161,7 @@ void shared_module_pixelmap_pixelmap_setitem(pixelmap_pixelmap_obj_t *self, mp_i
165161
}
166162

167163
mp_obj_t shared_module_pixelmap_pixelmap_getitem(pixelmap_pixelmap_obj_t *self, mp_int_t i) {
168-
mp_arg_validate_index_range(i, 0, self->len, MP_QSTR_index);
164+
mp_arg_validate_index_range(i, 0, self->len - 1, MP_QSTR_index);
169165
mp_obj_t item = self->items[i];
170166
if (mp_obj_is_small_int(item)) {
171167
return common_hal_adafruit_pixelbuf_pixelbuf_get_pixel(self->pixelbuf, MP_OBJ_SMALL_INT_VALUE(item));

0 commit comments

Comments
 (0)
0