mirror of
https://github.com/dankamongmen/notcurses
synced 2025-03-09 17:19:03 -04:00
add ncplane_erase_region()
This commit is contained in:
parent
e4a1b44ffa
commit
f080e1502b
2
NEWS.md
2
NEWS.md
@ -7,6 +7,8 @@ rearrangements of Notcurses.
|
|||||||
static linking on systems with libtinfo embedded into libncurses.
|
static linking on systems with libtinfo embedded into libncurses.
|
||||||
* Added `ncblit_rgb_loose()` and `ncblit_rgb_packed()` helpers for blitting
|
* Added `ncblit_rgb_loose()` and `ncblit_rgb_packed()` helpers for blitting
|
||||||
32bpp RGBx and 24bpp RGB.
|
32bpp RGBx and 24bpp RGB.
|
||||||
|
* Added `ncplane_erase_region()` to initialize all `nccell`s within a
|
||||||
|
region of a plane.
|
||||||
|
|
||||||
* 2.2.10 (2021-05-05)
|
* 2.2.10 (2021-05-05)
|
||||||
* Added `NCVISUAL_OPTION_CHILDPLANE` to interpret the `n` field of
|
* Added `NCVISUAL_OPTION_CHILDPLANE` to interpret the `n` field of
|
||||||
|
8
USAGE.md
8
USAGE.md
@ -820,6 +820,14 @@ int ncplane_mergedown_simple(const ncplane* restrict src, ncplane* restrict dst)
|
|||||||
// with this ncplane are invalidated, and must not be used after the call,
|
// with this ncplane are invalidated, and must not be used after the call,
|
||||||
// excluding the base cell. The cursor is homed.
|
// excluding the base cell. The cursor is homed.
|
||||||
void ncplane_erase(struct ncplane* n);
|
void ncplane_erase(struct ncplane* n);
|
||||||
|
|
||||||
|
// Erase every cell in the region starting at {ystart, xstart} and having size
|
||||||
|
// {ylen, xlen}. It is an error if any of ystart, xstart, ylen, or xlen is
|
||||||
|
// negative. A value of 0 may be provided for ylen and/or xlen, meaning to
|
||||||
|
// erase everything along that dimension. It is an error if ystart + ylen
|
||||||
|
// or xstart + xlen is not in the plane.
|
||||||
|
int ncplane_erase_region(struct ncplane* n, int ystart, int xstart,
|
||||||
|
int ylen, int xlen);
|
||||||
```
|
```
|
||||||
|
|
||||||
All planes, including the standard plane, are created with scrolling disabled.
|
All planes, including the standard plane, are created with scrolling disabled.
|
||||||
|
@ -192,6 +192,8 @@ typedef struct ncplane_options {
|
|||||||
|
|
||||||
**void ncplane_erase(struct ncplane* ***n***);**
|
**void ncplane_erase(struct ncplane* ***n***);**
|
||||||
|
|
||||||
|
**int ncplane_erase_region(struct ncplane* ***n***, int ***ystart***, int ***xstart***, int ***ylen***, int ***xlen***);**
|
||||||
|
|
||||||
**bool ncplane_set_scrolling(struct ncplane* ***n***, bool ***scrollp***);**
|
**bool ncplane_set_scrolling(struct ncplane* ***n***, bool ***scrollp***);**
|
||||||
|
|
||||||
**int ncplane_rotate_cw(struct ncplane* ***n***);**
|
**int ncplane_rotate_cw(struct ncplane* ***n***);**
|
||||||
@ -286,6 +288,9 @@ might see changes. It is an error to merge a plane onto itself.
|
|||||||
|
|
||||||
**ncplane_erase** zeroes out every cell of the plane, dumps the egcpool, and
|
**ncplane_erase** zeroes out every cell of the plane, dumps the egcpool, and
|
||||||
homes the cursor. The base cell is preserved, as are the active attributes.
|
homes the cursor. The base cell is preserved, as are the active attributes.
|
||||||
|
**ncplane_erase_region** does the same for a subregion of the plane. For the
|
||||||
|
latter, supply 0 for ***ylen*** and/or ***xlen*** to erase through that
|
||||||
|
dimension, starting at the specified point.
|
||||||
|
|
||||||
When a plane is resized (whether by **ncplane_resize**, **SIGWINCH**, or any
|
When a plane is resized (whether by **ncplane_resize**, **SIGWINCH**, or any
|
||||||
other mechanism), a depth-first recursion is performed on its children.
|
other mechanism), a depth-first recursion is performed on its children.
|
||||||
@ -397,6 +402,9 @@ destroyed. The caller should release this **nccell** with **nccell_release**.
|
|||||||
**ncplane_as_rgba** returns a heap-allocated array of **uint32_t** values,
|
**ncplane_as_rgba** returns a heap-allocated array of **uint32_t** values,
|
||||||
each representing a single RGBA pixel, or **NULL** on failure.
|
each representing a single RGBA pixel, or **NULL** on failure.
|
||||||
|
|
||||||
|
**ncplane_erase_region** returns -1 if any of its parameters are negative, or
|
||||||
|
if they specify any area beyond the plane.
|
||||||
|
|
||||||
Functions returning **int** return 0 on success, and non-zero on error.
|
Functions returning **int** return 0 on success, and non-zero on error.
|
||||||
|
|
||||||
All other functions cannot fail (and return **void**).
|
All other functions cannot fail (and return **void**).
|
||||||
|
@ -1982,6 +1982,15 @@ API int ncplane_mergedown(struct ncplane* RESTRICT src,
|
|||||||
// The cursor is homed. The plane's active attributes are unaffected.
|
// The cursor is homed. The plane's active attributes are unaffected.
|
||||||
API void ncplane_erase(struct ncplane* n);
|
API void ncplane_erase(struct ncplane* n);
|
||||||
|
|
||||||
|
// Erase every cell in the region starting at {ystart, xstart} and having size
|
||||||
|
// {ylen, xlen}. It is an error if any of ystart, xstart, ylen, or xlen is
|
||||||
|
// negative. A value of 0 may be provided for ylen and/or xlen, meaning to
|
||||||
|
// erase everything along that dimension. It is an error if ystart + ylen
|
||||||
|
// or xstart + xlen is not in the plane.
|
||||||
|
API int ncplane_erase_region(struct ncplane* n, int ystart, int xstart,
|
||||||
|
int ylen, int xlen)
|
||||||
|
__attribute__ ((nonnull (1)));
|
||||||
|
|
||||||
// Extract 24 bits of foreground RGB from 'cl', shifted to LSBs.
|
// Extract 24 bits of foreground RGB from 'cl', shifted to LSBs.
|
||||||
static inline uint32_t
|
static inline uint32_t
|
||||||
nccell_fg_rgb(const nccell* cl){
|
nccell_fg_rgb(const nccell* cl){
|
||||||
|
@ -2030,6 +2030,39 @@ void ncplane_erase(ncplane* n){
|
|||||||
n->y = n->x = 0;
|
n->y = n->x = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int ncplane_erase_region(ncplane* n, int ystart, int xstart, int ylen, int xlen){
|
||||||
|
const notcurses* nc = ncplane_notcurses_const(n);
|
||||||
|
if(ylen < 0 || xlen < 0){
|
||||||
|
logerror(nc, "Won't erase section of negative length (%d, %d)\n", ylen, xlen);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if(ystart < 0 || xstart < 0){
|
||||||
|
logerror(nc, "Illegal start of erase (%d, %d)\n", ystart, xstart);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if(ystart >= ncplane_dim_y(n) || ystart + ylen > ncplane_dim_y(n)){
|
||||||
|
logerror(nc, "Illegal y spec for erase (%d, %d)\n", ystart, ylen);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if(ylen == 0){
|
||||||
|
ylen = ncplane_dim_y(n) - ystart;
|
||||||
|
}
|
||||||
|
if(xstart >= ncplane_dim_x(n) || xstart + xlen > ncplane_dim_x(n)){
|
||||||
|
logerror(nc, "Illegal x spec for erase (%d, %d)\n", xstart, xlen);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if(xlen == 0){
|
||||||
|
xlen = ncplane_dim_x(n) - ystart;
|
||||||
|
}
|
||||||
|
for(int y = ystart ; y < ystart + ylen ; ++y){
|
||||||
|
for(int x = xstart ; x < xstart + xlen ; ++x){
|
||||||
|
nccell_release(n, &n->fb[nfbcellidx(n, y, x)]);
|
||||||
|
nccell_init(&n->fb[nfbcellidx(n, y, x)]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
ncplane* notcurses_top(notcurses* n){
|
ncplane* notcurses_top(notcurses* n){
|
||||||
return ncplane_pile(n->stdplane)->top;
|
return ncplane_pile(n->stdplane)->top;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user