mirror of
https://github.com/dankamongmen/notcurses
synced 2025-03-09 17:19:03 -04:00
Prep for Fedora packaging (#452)
* jungle demo should be available outside of DFSG builds * libav: blitters don't need FFMpeg * CMake: threads independent of ffmpeg * CMake: add USE_TESTS option to disable tests #450 * tetris: work without ffmpeg * fedora: flesh out specfile #328 * menu poc: don't use ffmpeg at all * compile PoCs with binary/include * multiselect PoC: work without ffmpeg
This commit is contained in:
parent
c2d7983afc
commit
d66549d362
@ -32,7 +32,9 @@ pkg_check_modules(AVUTIL REQUIRED libavutil>=56.0)
|
|||||||
pkg_check_modules(SWSCALE REQUIRED libswscale>=5.0)
|
pkg_check_modules(SWSCALE REQUIRED libswscale>=5.0)
|
||||||
endif()
|
endif()
|
||||||
find_library(LIBRT rt)
|
find_library(LIBRT rt)
|
||||||
|
if(${USE_TESTS})
|
||||||
find_package(doctest 2.3.5 REQUIRED)
|
find_package(doctest 2.3.5 REQUIRED)
|
||||||
|
endif()
|
||||||
|
|
||||||
# libnotcurses
|
# libnotcurses
|
||||||
file(GLOB NCSRCS CONFIGURE_DEPENDS src/lib/*.c)
|
file(GLOB NCSRCS CONFIGURE_DEPENDS src/lib/*.c)
|
||||||
@ -69,11 +71,13 @@ target_include_directories(notcurses-static
|
|||||||
)
|
)
|
||||||
target_link_libraries(notcurses
|
target_link_libraries(notcurses
|
||||||
PRIVATE
|
PRIVATE
|
||||||
|
Threads::Threads
|
||||||
"${TERMINFO_LIBRARIES}"
|
"${TERMINFO_LIBRARIES}"
|
||||||
"${LIBRT}"
|
"${LIBRT}"
|
||||||
)
|
)
|
||||||
target_link_libraries(notcurses-static
|
target_link_libraries(notcurses-static
|
||||||
PRIVATE
|
PRIVATE
|
||||||
|
Threads::Threads
|
||||||
"${TERMINFO_STATIC_LIBRARIES}"
|
"${TERMINFO_STATIC_LIBRARIES}"
|
||||||
"${LIBRT}"
|
"${LIBRT}"
|
||||||
)
|
)
|
||||||
@ -107,7 +111,6 @@ target_link_libraries(notcurses
|
|||||||
"${AVFORMAT_LIBRARIES}"
|
"${AVFORMAT_LIBRARIES}"
|
||||||
"${AVUTIL_LIBRARIES}"
|
"${AVUTIL_LIBRARIES}"
|
||||||
"${SWSCALE_LIBRARIES}"
|
"${SWSCALE_LIBRARIES}"
|
||||||
Threads::Threads
|
|
||||||
)
|
)
|
||||||
target_link_libraries(notcurses-static
|
target_link_libraries(notcurses-static
|
||||||
PRIVATE
|
PRIVATE
|
||||||
@ -115,7 +118,6 @@ target_link_libraries(notcurses-static
|
|||||||
"${AVFORMAT_STATIC_LIBRARIES}"
|
"${AVFORMAT_STATIC_LIBRARIES}"
|
||||||
"${AVUTIL_STATIC_LIBRARIES}"
|
"${AVUTIL_STATIC_LIBRARIES}"
|
||||||
"${SWSCALE_STATIC_LIBRARIES}"
|
"${SWSCALE_STATIC_LIBRARIES}"
|
||||||
Threads::Threads
|
|
||||||
)
|
)
|
||||||
target_link_directories(notcurses
|
target_link_directories(notcurses
|
||||||
PUBLIC
|
PUBLIC
|
||||||
@ -331,6 +333,7 @@ foreach(f ${POCSRCS})
|
|||||||
add_executable(${fe} ${f})
|
add_executable(${fe} ${f})
|
||||||
target_include_directories(${fe}
|
target_include_directories(${fe}
|
||||||
PRIVATE include "${TERMINFO_INCLUDE_DIRS}"
|
PRIVATE include "${TERMINFO_INCLUDE_DIRS}"
|
||||||
|
"${PROJECT_BINARY_DIR}/include"
|
||||||
)
|
)
|
||||||
target_link_libraries(${fe}
|
target_link_libraries(${fe}
|
||||||
PRIVATE notcurses++ "${TERMINFO_LIBRARIES}"
|
PRIVATE notcurses++ "${TERMINFO_LIBRARIES}"
|
||||||
@ -529,6 +532,7 @@ target_compile_definitions(notcurses-view
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Testing
|
# Testing
|
||||||
|
if(${USE_TESTS})
|
||||||
if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME)
|
if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME)
|
||||||
include(CTest)
|
include(CTest)
|
||||||
endif()
|
endif()
|
||||||
@ -558,6 +562,7 @@ add_test(
|
|||||||
NAME notcurses-tester
|
NAME notcurses-tester
|
||||||
COMMAND notcurses-tester -p ${CMAKE_CURRENT_SOURCE_DIR}/data
|
COMMAND notcurses-tester -p ${CMAKE_CURRENT_SOURCE_DIR}/data
|
||||||
)
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
# pkg-config support
|
# pkg-config support
|
||||||
configure_file(tools/notcurses.pc.in
|
configure_file(tools/notcurses.pc.in
|
||||||
@ -680,11 +685,13 @@ install(FILES
|
|||||||
DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig
|
DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if(${USE_FFMPEG})
|
||||||
file(GLOB TESTDATA CONFIGURE_DEPENDS data/*)
|
file(GLOB TESTDATA CONFIGURE_DEPENDS data/*)
|
||||||
install(FILES
|
install(FILES
|
||||||
${TESTDATA}
|
${TESTDATA}
|
||||||
DESTINATION ${CMAKE_INSTALL_DATADIR}/notcurses
|
DESTINATION ${CMAKE_INSTALL_DATADIR}/notcurses
|
||||||
)
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
install(DIRECTORY
|
install(DIRECTORY
|
||||||
"${CMAKE_CURRENT_SOURCE_DIR}/include/"
|
"${CMAKE_CURRENT_SOURCE_DIR}/include/"
|
||||||
@ -706,7 +713,9 @@ install(TARGETS notcurses-demo DESTINATION bin)
|
|||||||
install(TARGETS notcurses-input DESTINATION bin)
|
install(TARGETS notcurses-input DESTINATION bin)
|
||||||
install(TARGETS notcurses-keyplot DESTINATION bin)
|
install(TARGETS notcurses-keyplot DESTINATION bin)
|
||||||
install(TARGETS notcurses-ncreel DESTINATION bin)
|
install(TARGETS notcurses-ncreel DESTINATION bin)
|
||||||
|
if(${USE_TESTS})
|
||||||
install(TARGETS notcurses-tester DESTINATION bin)
|
install(TARGETS notcurses-tester DESTINATION bin)
|
||||||
|
endif()
|
||||||
install(TARGETS notcurses-tetris DESTINATION bin)
|
install(TARGETS notcurses-tetris DESTINATION bin)
|
||||||
if(${USE_FFMPEG})
|
if(${USE_FFMPEG})
|
||||||
install(TARGETS notcurses-view DESTINATION bin)
|
install(TARGETS notcurses-view DESTINATION bin)
|
||||||
|
@ -72,7 +72,14 @@ struct timespec demodelay = {
|
|||||||
#ifndef DFSG_BUILD
|
#ifndef DFSG_BUILD
|
||||||
#ifdef USE_FFMPEG
|
#ifdef USE_FFMPEG
|
||||||
#define NONFREE(name, fxn) { name, fxn, }
|
#define NONFREE(name, fxn) { name, fxn, }
|
||||||
|
#else
|
||||||
#endif
|
#endif
|
||||||
|
#else
|
||||||
|
#define DFSG(name, fxn) { NULL, NULL, }
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef DFSG
|
||||||
|
#define DFSG(name, fxn) { name, fxn, }
|
||||||
#endif
|
#endif
|
||||||
#ifndef NONFREE
|
#ifndef NONFREE
|
||||||
#define NONFREE(name, fxn) { NULL, NULL, }
|
#define NONFREE(name, fxn) { NULL, NULL, }
|
||||||
@ -99,7 +106,7 @@ static struct {
|
|||||||
{ "grid", grid_demo, },
|
{ "grid", grid_demo, },
|
||||||
{ "highcon", highcontrast_demo, },
|
{ "highcon", highcontrast_demo, },
|
||||||
{ "intro", intro, },
|
{ "intro", intro, },
|
||||||
NONFREE("jungle", jungle_demo),
|
DFSG("jungle", jungle_demo),
|
||||||
{ NULL, NULL, },
|
{ NULL, NULL, },
|
||||||
NONFREE("luigi", luigi_demo),
|
NONFREE("luigi", luigi_demo),
|
||||||
{ NULL, NULL, },
|
{ NULL, NULL, },
|
||||||
|
181
src/lib/libav.c
181
src/lib/libav.c
@ -6,6 +6,95 @@ ncplane* ncvisual_plane(ncvisual* ncv){
|
|||||||
return ncv->ncp;
|
return ncv->ncp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// alpha comes to us 0--255, but we have only 3 alpha values to map them to.
|
||||||
|
// settled on experimentally.
|
||||||
|
static inline bool
|
||||||
|
ffmpeg_trans_p(bool bgr, unsigned char alpha){
|
||||||
|
if(!bgr && alpha < 192){
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// RGBA/BGRx blitter. For incoming BGRx (no transparency), bgr == true.
|
||||||
|
static inline int
|
||||||
|
tria_blit(ncplane* nc, int placey, int placex, int linesize, const void* data,
|
||||||
|
int begy, int begx, int leny, int lenx, bool bgr){
|
||||||
|
const int bpp = 32;
|
||||||
|
const int rpos = bgr ? 2 : 0;
|
||||||
|
const int bpos = bgr ? 0 : 2;
|
||||||
|
int dimy, dimx, x, y;
|
||||||
|
int visy = begy;
|
||||||
|
int total = 0; // number of cells written
|
||||||
|
ncplane_dim_yx(nc, &dimy, &dimx);
|
||||||
|
// FIXME not going to necessarily be safe on all architectures hrmmm
|
||||||
|
const unsigned char* dat = data;
|
||||||
|
for(y = placey ; visy < (begy + leny) && y < dimy ; ++y, visy += 2){
|
||||||
|
if(ncplane_cursor_move_yx(nc, y, placex)){
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
int visx = begx;
|
||||||
|
for(x = placex ; visx < (begx + lenx) && x < dimx ; ++x, ++visx){
|
||||||
|
const unsigned char* rgbbase_up = dat + (linesize * visy) + (visx * bpp / CHAR_BIT);
|
||||||
|
const unsigned char* rgbbase_down = dat + (linesize * (visy + 1)) + (visx * bpp / CHAR_BIT);
|
||||||
|
//fprintf(stderr, "[%04d/%04d] bpp: %d lsize: %d %02x %02x %02x %02x\n", y, x, bpp, linesize, rgbbase_up[0], rgbbase_up[1], rgbbase_up[2], rgbbase_up[3]);
|
||||||
|
cell* c = ncplane_cell_ref_yx(nc, y, x);
|
||||||
|
// use the default for the background, as that's the only way it's
|
||||||
|
// effective in that case anyway
|
||||||
|
c->channels = 0;
|
||||||
|
c->attrword = 0;
|
||||||
|
if(ffmpeg_trans_p(bgr, rgbbase_up[3]) || ffmpeg_trans_p(bgr, rgbbase_down[3])){
|
||||||
|
cell_set_bg_alpha(c, CELL_ALPHA_TRANSPARENT);
|
||||||
|
if(ffmpeg_trans_p(bgr, rgbbase_up[3]) && ffmpeg_trans_p(bgr, rgbbase_down[3])){
|
||||||
|
cell_set_fg_alpha(c, CELL_ALPHA_TRANSPARENT);
|
||||||
|
}else if(ffmpeg_trans_p(bgr, rgbbase_up[3])){ // down has the color
|
||||||
|
if(cell_load(nc, c, "\u2584") <= 0){ // lower half block
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
cell_set_fg_rgb(c, rgbbase_down[rpos], rgbbase_down[1], rgbbase_down[bpos]);
|
||||||
|
}else{ // up has the color
|
||||||
|
if(cell_load(nc, c, "\u2580") <= 0){ // upper half block
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
cell_set_fg_rgb(c, rgbbase_up[rpos], rgbbase_up[1], rgbbase_up[bpos]);
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
if(memcmp(rgbbase_up, rgbbase_down, 3) == 0){
|
||||||
|
cell_set_fg_rgb(c, rgbbase_down[rpos], rgbbase_down[1], rgbbase_down[bpos]);
|
||||||
|
cell_set_bg_rgb(c, rgbbase_down[rpos], rgbbase_down[1], rgbbase_down[bpos]);
|
||||||
|
if(cell_load(nc, c, " ") <= 0){ // only need the background
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
cell_set_fg_rgb(c, rgbbase_up[rpos], rgbbase_up[1], rgbbase_up[bpos]);
|
||||||
|
cell_set_bg_rgb(c, rgbbase_down[rpos], rgbbase_down[1], rgbbase_down[bpos]);
|
||||||
|
if(cell_load(nc, c, "\u2580") <= 0){ // upper half block
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
++total;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return total;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Blit a flat array 'data' of BGRx 32-bit values to the ncplane 'nc', offset
|
||||||
|
// from the upper left by 'placey' and 'placex'. Each row ought occupy
|
||||||
|
// 'linesize' bytes (this might be greater than lenx * 4 due to padding). A
|
||||||
|
// subregion of the input can be specified with 'begy'x'begx' and 'leny'x'lenx'.
|
||||||
|
int ncblit_bgrx(ncplane* nc, int placey, int placex, int linesize,
|
||||||
|
const void* data, int begy, int begx, int leny, int lenx){
|
||||||
|
return tria_blit(nc, placey, placex, linesize, data,
|
||||||
|
begy, begx, leny, lenx, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
int ncblit_rgba(ncplane* nc, int placey, int placex, int linesize,
|
||||||
|
const void* data, int begy, int begx, int leny, int lenx){
|
||||||
|
return tria_blit(nc, placey, placex, linesize, data,
|
||||||
|
begy, begx, leny, lenx, false);
|
||||||
|
}
|
||||||
|
|
||||||
void ncvisual_destroy(ncvisual* ncv){
|
void ncvisual_destroy(ncvisual* ncv){
|
||||||
if(ncv){
|
if(ncv){
|
||||||
#ifdef USE_FFMPEG
|
#ifdef USE_FFMPEG
|
||||||
@ -354,95 +443,6 @@ ncvisual* ncvisual_open_plane(notcurses* nc, const char* filename,
|
|||||||
return ncv;
|
return ncv;
|
||||||
}
|
}
|
||||||
|
|
||||||
// alpha comes to us 0--255, but we have only 3 alpha values to map them to.
|
|
||||||
// settled on experimentally.
|
|
||||||
static inline bool
|
|
||||||
ffmpeg_trans_p(bool bgr, unsigned char alpha){
|
|
||||||
if(!bgr && alpha < 192){
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// RGBA/BGRx blitter. For incoming BGRx (no transparency), bgr == true.
|
|
||||||
static inline int
|
|
||||||
tria_blit(ncplane* nc, int placey, int placex, int linesize, const void* data,
|
|
||||||
int begy, int begx, int leny, int lenx, bool bgr){
|
|
||||||
const int bpp = 32;
|
|
||||||
const int rpos = bgr ? 2 : 0;
|
|
||||||
const int bpos = bgr ? 0 : 2;
|
|
||||||
int dimy, dimx, x, y;
|
|
||||||
int visy = begy;
|
|
||||||
int total = 0; // number of cells written
|
|
||||||
ncplane_dim_yx(nc, &dimy, &dimx);
|
|
||||||
// FIXME not going to necessarily be safe on all architectures hrmmm
|
|
||||||
const unsigned char* dat = data;
|
|
||||||
for(y = placey ; visy < (begy + leny) && y < dimy ; ++y, visy += 2){
|
|
||||||
if(ncplane_cursor_move_yx(nc, y, placex)){
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
int visx = begx;
|
|
||||||
for(x = placex ; visx < (begx + lenx) && x < dimx ; ++x, ++visx){
|
|
||||||
const unsigned char* rgbbase_up = dat + (linesize * visy) + (visx * bpp / CHAR_BIT);
|
|
||||||
const unsigned char* rgbbase_down = dat + (linesize * (visy + 1)) + (visx * bpp / CHAR_BIT);
|
|
||||||
//fprintf(stderr, "[%04d/%04d] bpp: %d lsize: %d %02x %02x %02x %02x\n", y, x, bpp, linesize, rgbbase_up[0], rgbbase_up[1], rgbbase_up[2], rgbbase_up[3]);
|
|
||||||
cell* c = ncplane_cell_ref_yx(nc, y, x);
|
|
||||||
// use the default for the background, as that's the only way it's
|
|
||||||
// effective in that case anyway
|
|
||||||
c->channels = 0;
|
|
||||||
c->attrword = 0;
|
|
||||||
if(ffmpeg_trans_p(bgr, rgbbase_up[3]) || ffmpeg_trans_p(bgr, rgbbase_down[3])){
|
|
||||||
cell_set_bg_alpha(c, CELL_ALPHA_TRANSPARENT);
|
|
||||||
if(ffmpeg_trans_p(bgr, rgbbase_up[3]) && ffmpeg_trans_p(bgr, rgbbase_down[3])){
|
|
||||||
cell_set_fg_alpha(c, CELL_ALPHA_TRANSPARENT);
|
|
||||||
}else if(ffmpeg_trans_p(bgr, rgbbase_up[3])){ // down has the color
|
|
||||||
if(cell_load(nc, c, "\u2584") <= 0){ // lower half block
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
cell_set_fg_rgb(c, rgbbase_down[rpos], rgbbase_down[1], rgbbase_down[bpos]);
|
|
||||||
}else{ // up has the color
|
|
||||||
if(cell_load(nc, c, "\u2580") <= 0){ // upper half block
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
cell_set_fg_rgb(c, rgbbase_up[rpos], rgbbase_up[1], rgbbase_up[bpos]);
|
|
||||||
}
|
|
||||||
}else{
|
|
||||||
if(memcmp(rgbbase_up, rgbbase_down, 3) == 0){
|
|
||||||
cell_set_fg_rgb(c, rgbbase_down[rpos], rgbbase_down[1], rgbbase_down[bpos]);
|
|
||||||
cell_set_bg_rgb(c, rgbbase_down[rpos], rgbbase_down[1], rgbbase_down[bpos]);
|
|
||||||
if(cell_load(nc, c, " ") <= 0){ // only need the background
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}else{
|
|
||||||
cell_set_fg_rgb(c, rgbbase_up[rpos], rgbbase_up[1], rgbbase_up[bpos]);
|
|
||||||
cell_set_bg_rgb(c, rgbbase_down[rpos], rgbbase_down[1], rgbbase_down[bpos]);
|
|
||||||
if(cell_load(nc, c, "\u2580") <= 0){ // upper half block
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
++total;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return total;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Blit a flat array 'data' of BGRx 32-bit values to the ncplane 'nc', offset
|
|
||||||
// from the upper left by 'placey' and 'placex'. Each row ought occupy
|
|
||||||
// 'linesize' bytes (this might be greater than lenx * 4 due to padding). A
|
|
||||||
// subregion of the input can be specified with 'begy'x'begx' and 'leny'x'lenx'.
|
|
||||||
int ncblit_bgrx(ncplane* nc, int placey, int placex, int linesize,
|
|
||||||
const void* data, int begy, int begx, int leny, int lenx){
|
|
||||||
return tria_blit(nc, placey, placex, linesize, data,
|
|
||||||
begy, begx, leny, lenx, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
int ncblit_rgba(ncplane* nc, int placey, int placex, int linesize,
|
|
||||||
const void* data, int begy, int begx, int leny, int lenx){
|
|
||||||
return tria_blit(nc, placey, placex, linesize, data,
|
|
||||||
begy, begx, leny, lenx, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
int ncvisual_render(const ncvisual* ncv, int begy, int begx, int leny, int lenx){
|
int ncvisual_render(const ncvisual* ncv, int begy, int begx, int leny, int lenx){
|
||||||
//fprintf(stderr, "render %dx%d+%dx%d\n", begy, begx, leny, lenx);
|
//fprintf(stderr, "render %dx%d+%dx%d\n", begy, begx, leny, lenx);
|
||||||
if(begy < 0 || begx < 0 || lenx < -1 || leny < -1){
|
if(begy < 0 || begx < 0 || lenx < -1 || leny < -1){
|
||||||
@ -610,6 +610,7 @@ char* ncvisual_subtitle(const ncvisual* ncv){
|
|||||||
|
|
||||||
int ncvisual_init(int loglevel){
|
int ncvisual_init(int loglevel){
|
||||||
(void)loglevel;
|
(void)loglevel;
|
||||||
return 0;
|
return 0; // allow success here
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -118,17 +118,6 @@ int main(void){
|
|||||||
|
|
||||||
int averr;
|
int averr;
|
||||||
|
|
||||||
struct ncvisual* ncv = ncplane_visual_open(n, "../data/ebolavirus_wide-0723bc3f01c644976b4df7e146a1d795aaf9d55e.jpg", &averr);
|
|
||||||
if(!ncv){
|
|
||||||
goto err;
|
|
||||||
}
|
|
||||||
if(!ncvisual_decode(ncv, &averr)){
|
|
||||||
goto err;
|
|
||||||
}
|
|
||||||
if(ncvisual_render(ncv, 0, 0, -1, -1) <= 0){
|
|
||||||
goto err;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint64_t channels = 0;
|
uint64_t channels = 0;
|
||||||
channels_set_fg(&channels, 0x88aa00);
|
channels_set_fg(&channels, 0x88aa00);
|
||||||
channels_set_bg(&channels, 0x000088);
|
channels_set_bg(&channels, 0x000088);
|
||||||
@ -144,18 +133,6 @@ int main(void){
|
|||||||
run_menu(nc, top);
|
run_menu(nc, top);
|
||||||
|
|
||||||
ncplane_erase(n);
|
ncplane_erase(n);
|
||||||
ncvisual_destroy(ncv);
|
|
||||||
|
|
||||||
ncv = ncplane_visual_open(n, "../data/aidsrobots.jpeg", &averr);
|
|
||||||
if(!ncv){
|
|
||||||
goto err;
|
|
||||||
}
|
|
||||||
if(!ncvisual_decode(ncv, &averr)){
|
|
||||||
goto err;
|
|
||||||
}
|
|
||||||
if(ncvisual_render(ncv, 0, 0, -1, -1) <= 0){
|
|
||||||
goto err;
|
|
||||||
}
|
|
||||||
|
|
||||||
mopts.bottom = true;
|
mopts.bottom = true;
|
||||||
struct ncmenu* bottom = ncmenu_create(nc, &mopts);
|
struct ncmenu* bottom = ncmenu_create(nc, &mopts);
|
||||||
@ -167,7 +144,6 @@ int main(void){
|
|||||||
}
|
}
|
||||||
run_menu(nc, bottom);
|
run_menu(nc, bottom);
|
||||||
|
|
||||||
ncvisual_destroy(ncv);
|
|
||||||
if(notcurses_stop(nc)){
|
if(notcurses_stop(nc)){
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
#include <locale.h>
|
#include <locale.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <notcurses/notcurses.h>
|
#include <notcurses/notcurses.h>
|
||||||
|
#include "version.h"
|
||||||
|
|
||||||
// http://theboomerbible.com/tbb112.html
|
// http://theboomerbible.com/tbb112.html
|
||||||
static struct mselector_item items[] = {
|
static struct mselector_item items[] = {
|
||||||
@ -81,6 +82,7 @@ int main(void){
|
|||||||
channels_set_bg_alpha(&sopts.bgchannels, CELL_ALPHA_BLEND);
|
channels_set_bg_alpha(&sopts.bgchannels, CELL_ALPHA_BLEND);
|
||||||
struct ncplane* n = notcurses_stdplane(nc);
|
struct ncplane* n = notcurses_stdplane(nc);
|
||||||
|
|
||||||
|
#ifdef USE_FFMPEG
|
||||||
int averr;
|
int averr;
|
||||||
struct ncvisual* ncv = ncplane_visual_open(n, "../data/covid19.jpg", &averr);
|
struct ncvisual* ncv = ncplane_visual_open(n, "../data/covid19.jpg", &averr);
|
||||||
if(!ncv){
|
if(!ncv){
|
||||||
@ -92,6 +94,7 @@ int main(void){
|
|||||||
if(ncvisual_render(ncv, 0, 0, -1, -1) <= 0){
|
if(ncvisual_render(ncv, 0, 0, -1, -1) <= 0){
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
ncplane_set_fg(n, 0x40f040);
|
ncplane_set_fg(n, 0x40f040);
|
||||||
ncplane_putstr_aligned(n, 0, NCALIGN_RIGHT, "multiselect widget demo");
|
ncplane_putstr_aligned(n, 0, NCALIGN_RIGHT, "multiselect widget demo");
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
#include <locale.h>
|
#include <locale.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <notcurses/notcurses.h>
|
#include <notcurses/notcurses.h>
|
||||||
|
#include "version.h"
|
||||||
|
|
||||||
static struct selector_item items[] = {
|
static struct selector_item items[] = {
|
||||||
{ "first", "this is the first option", },
|
{ "first", "this is the first option", },
|
||||||
@ -80,6 +81,7 @@ int main(void){
|
|||||||
channels_set_bg_alpha(&sopts.bgchannels, CELL_ALPHA_BLEND);
|
channels_set_bg_alpha(&sopts.bgchannels, CELL_ALPHA_BLEND);
|
||||||
struct ncplane* n = notcurses_stdplane(nc);
|
struct ncplane* n = notcurses_stdplane(nc);
|
||||||
|
|
||||||
|
#ifdef USE_FFMPEG
|
||||||
int averr;
|
int averr;
|
||||||
struct ncvisual* ncv = ncplane_visual_open(n, "../data/changes.jpg", &averr);
|
struct ncvisual* ncv = ncplane_visual_open(n, "../data/changes.jpg", &averr);
|
||||||
if(!ncv){
|
if(!ncv){
|
||||||
@ -91,7 +93,7 @@ int main(void){
|
|||||||
if(ncvisual_render(ncv, 0, 0, -1, -1) <= 0){
|
if(ncvisual_render(ncv, 0, 0, -1, -1) <= 0){
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
ncplane_set_fg(n, 0x40f040);
|
ncplane_set_fg(n, 0x40f040);
|
||||||
ncplane_putstr_aligned(n, 0, NCALIGN_RIGHT, "selector widget demo");
|
ncplane_putstr_aligned(n, 0, NCALIGN_RIGHT, "selector widget demo");
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
void DrawBackground(const std::string& s) { // drawn to the standard plane
|
void DrawBackground(const std::string& s) { // drawn to the standard plane
|
||||||
|
#ifdef USE_FFMPEG
|
||||||
int averr;
|
int averr;
|
||||||
try{
|
try{
|
||||||
backg_ = std::make_unique<ncpp::Visual>(s.c_str(), &averr, 0, 0, ncpp::NCScale::Stretch);
|
backg_ = std::make_unique<ncpp::Visual>(s.c_str(), &averr, 0, 0, ncpp::NCScale::Stretch);
|
||||||
@ -12,6 +13,9 @@ void DrawBackground(const std::string& s) { // drawn to the standard plane
|
|||||||
throw TetrisNotcursesErr("render(): " + s);
|
throw TetrisNotcursesErr("render(): " + s);
|
||||||
}
|
}
|
||||||
backg_->get_plane()->greyscale();
|
backg_->get_plane()->greyscale();
|
||||||
|
#else
|
||||||
|
(void)s;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void DrawBoard() { // draw all fixed components of the game
|
void DrawBoard() { // draw all fixed components of the game
|
||||||
|
50
tools/notcurses.spec
Normal file
50
tools/notcurses.spec
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
Name: notcurses
|
||||||
|
Version: 1.2.5
|
||||||
|
Release: 1
|
||||||
|
Summary: Character graphics and TUI library
|
||||||
|
License: ASL 2.0
|
||||||
|
Source0: https://github.com/dankamongmen/%{name}/archive/v%{version}.tar.gz
|
||||||
|
Source1: https://github.com/dankamongmen/%{name}/releases/v%{version}/v%{version}.tar.gz.asc
|
||||||
|
Source2: https://dank.qemfd.net/dankamongmen.gpg
|
||||||
|
BuildRequires: gnupg2 cmake make gcc-c++ ncurses-devel pandoc python3-devel
|
||||||
|
|
||||||
|
%description
|
||||||
|
notcurses facilitates the creation of modern TUI programs,
|
||||||
|
making full use of Unicode and 24-bit direct color. It presents
|
||||||
|
an API similar to that of Curses, and rides atop libtinfo.
|
||||||
|
|
||||||
|
%prep
|
||||||
|
%{gpgverify} --keyring='%{SOURCE2}' --signature='%{SOURCE1}' --data='%{SOURCE0}'
|
||||||
|
%setup
|
||||||
|
|
||||||
|
%build
|
||||||
|
%cmake -DUSE_FFMPEG=off -DUSE_TEST=off .
|
||||||
|
%make_build
|
||||||
|
|
||||||
|
%install
|
||||||
|
%make_install
|
||||||
|
|
||||||
|
%files
|
||||||
|
/usr/bin/notcurses-demo
|
||||||
|
/usr/bin/notcurses-input
|
||||||
|
/usr/bin/notcurses-keyplot
|
||||||
|
/usr/bin/notcurses-ncreel
|
||||||
|
/usr/bin/notcurses-pydemo
|
||||||
|
/usr/bin/notcurses-tester
|
||||||
|
/usr/bin/notcurses-tetris
|
||||||
|
/usr/bin/notcurses-view
|
||||||
|
/usr/include/notcurses/nckeys.h
|
||||||
|
/usr/include/notcurses/notcurses.h
|
||||||
|
/usr/lib/x86_64-linux-gnu/libnotcurses.so.{version}
|
||||||
|
/usr/lib/x86_64-linux-gnu/libnotcurses.so.1
|
||||||
|
/usr/lib/x86_64-linux-gnu/libnotcurses.so
|
||||||
|
/usr/lib/x86_64-linux-gnu/cmake/notcurses/notcursesConfig.cmake
|
||||||
|
/usr/lib/x86_64-linux-gnu/cmake/notcurses/notcursesConfigVersion.cmake
|
||||||
|
/usr/lib/x86_64-linux-gnu/libnotcurses.a
|
||||||
|
/usr/lib/x86_64-linux-gnu/pkgconfig
|
||||||
|
/usr/lib/x86_64-linux-gnu/pkgconfig/notcurses.pc
|
||||||
|
%license LICENSE
|
||||||
|
|
||||||
|
%changelog
|
||||||
|
* Tue, Apr 07 2020 Nick Black <dankamongmen@gmail.com> - 1.2.5-1
|
||||||
|
- Initial Fedora packaging
|
Loading…
x
Reference in New Issue
Block a user