소스 검색

* Added the cucul_blit() function. It lets us blit various canvas one

onto the other with an optional mask.
tags/v0.99.beta14
Sam Hocevar sam 18 년 전
부모
커밋
73aad0447c
4개의 변경된 파일95개의 추가작업 그리고 20개의 파일을 삭제
  1. +42
    -3
      cucul/canvas.c
  2. +7
    -5
      cucul/cucul.h
  3. +1
    -1
      test/Makefile.am
  4. +45
    -11
      test/gamma.c

+ 42
- 3
cucul/canvas.c 파일 보기

@@ -65,7 +65,7 @@ void cucul_set_color(cucul_t *qq, enum cucul_color fgcolor,
*
* \return The current foreground colour.
*/
enum cucul_color cucul_get_fg_color(cucul_t *qq)
enum cucul_color cucul_get_fg_color(cucul_t const *qq)
{
return qq->fgcolor;
}
@@ -77,7 +77,7 @@ enum cucul_color cucul_get_fg_color(cucul_t *qq)
*
* \return The current background colour.
*/
enum cucul_color cucul_get_bg_color(cucul_t *qq)
enum cucul_color cucul_get_bg_color(cucul_t const *qq)
{
return qq->bgcolor;
}
@@ -226,7 +226,7 @@ void cucul_printf(cucul_t *qq, int x, int y, char const *format, ...)
*
* This function fills a byte array with the character values.
*/
void cucul_get_screen(cucul_t *qq, char *buffer)
void cucul_get_screen(cucul_t const *qq, char *buffer)
{
unsigned int x, y;

@@ -259,3 +259,42 @@ void cucul_clear(cucul_t *qq)
cucul_set_color(qq, oldfg, oldbg);
}

/** \brief Blit a canvas onto another one.
*
* This function blits a canvas onto another one at the given coordinates.
* An optional mask canvas can be used.
*
* \param dst The destination canvas.
* \param x X coordinate.
* \param y Y coordinate.
* \param src The source canvas.
* \param mask The mask canvas.
*/
void cucul_blit(cucul_t *dst, int x, int y,
cucul_t const *src, cucul_t const *mask)
{
int i, j, starti, startj, endi, endj;

if(src->width != mask->width || src->height != mask->height)
return;

starti = x < 0 ? -x : 0;
startj = y < 0 ? -y : 0;
endi = (x + src->width >= dst->width) ? dst->width - x : src->width;
endj = (y + src->height >= dst->height) ? dst->height - y : src->height;

for(j = startj; j < endj; j++)
{
for(i = starti; i < endi; i++)
{
if(mask && mask->chars[j * src->width + i] == (uint32_t)' ')
continue;

dst->chars[(j + y) * dst->width + (i + x)]
= src->chars[j * src->width + i];
dst->attr[(j + y) * dst->width + (i + x)]
= src->attr[j * src->width + i];
}
}
}


+ 7
- 5
cucul/cucul.h 파일 보기

@@ -128,20 +128,22 @@ char const *cucul_get_feature_name(enum cucul_feature);
void cucul_end(cucul_t *);
/* @} */

/** \defgroup char Character printing
/** \defgroup canvas Canvas drawing
*
* These functions provide low-level character printing routines.
* These functions provide low-level character printing routines and
* higher level graphics functions.
*
* @{ */
void cucul_set_color(cucul_t *, enum cucul_color, enum cucul_color);
enum cucul_color cucul_get_fg_color(cucul_t *);
enum cucul_color cucul_get_bg_color(cucul_t *);
enum cucul_color cucul_get_fg_color(cucul_t const *);
enum cucul_color cucul_get_bg_color(cucul_t const *);
char const *cucul_get_color_name(enum cucul_color);
void cucul_putchar(cucul_t *, int, int, char);
void cucul_putstr(cucul_t *, int, int, char const *);
void cucul_printf(cucul_t *, int, int, char const *, ...);
void cucul_get_screen(cucul_t *, char *);
void cucul_get_screen(cucul_t const *, char *);
void cucul_clear(cucul_t *);
void cucul_blit(cucul_t *, int, int, cucul_t const *, cucul_t const *);
/* @} */

/** \defgroup prim Primitives drawing


+ 1
- 1
test/Makefile.am 파일 보기

@@ -23,7 +23,7 @@ export_LDADD = ../cucul/libcucul.la @CUCUL_LIBS@
export_CPPFLAGS = -I$(top_srcdir)/cucul

gamma_SOURCES = gamma.c
gamma_LDADD = ../caca/libcaca.la ../cucul/libcucul.la @CACA_LIBS@
gamma_LDADD = ../caca/libcaca.la ../cucul/libcucul.la @CACA_LIBS@ @MATH_LIBS@
gamma_CPPFLAGS = -I$(top_srcdir)/cucul -I$(top_srcdir)/caca

hsv_SOURCES = hsv.c


+ 45
- 11
test/gamma.c 파일 보기

@@ -21,6 +21,11 @@ typedef unsigned short uint16_t;
typedef unsigned int uint32_t;
#endif

#if !defined(__KERNEL__)
# include <stdio.h>
# include <math.h>
#endif

#include "cucul.h"
#include "caca.h"

@@ -28,15 +33,18 @@ uint32_t buffer[256 * 4];

int main(void)
{
cucul_t *qq;
cucul_t *qq, *gg, *mask;
caca_t *kk;

struct cucul_bitmap *left, *right;
float gam = 1.0;
int x;

qq = cucul_init(0, 0);
kk = caca_attach(qq);

gg = cucul_init(cucul_get_width(qq), cucul_get_height(qq));
mask = cucul_init(cucul_get_width(qq), cucul_get_height(qq));

for(x = 0; x < 256; x++)
{
buffer[x] = (x << 16) | (x << 8) | (x<< 0);
@@ -51,24 +59,50 @@ int main(void)
0x00ff0000, 0x0000ff00, 0x000000ff, 0x0);
caca_set_delay(kk, 20000);

for(x = 0; ; x = (x + 1) % 256)
for(x = 0; ; x++)
{
float g = (x > 128) ? (256.0 + 8.0 - x) / 64.0 : (8.0 + x) / 64.0;

if(caca_get_event(kk, CACA_EVENT_KEY_PRESS))
int ev = caca_get_event(kk, CACA_EVENT_KEY_PRESS);

if(ev == (CACA_EVENT_KEY_PRESS | CACA_KEY_LEFT))
gam /= 1.03;
else if(ev == (CACA_EVENT_KEY_PRESS | CACA_KEY_RIGHT))
gam *= 1.03;
else if(ev == (CACA_EVENT_KEY_PRESS | CACA_KEY_DOWN))
gam = 1.0;
else if(ev == (CACA_EVENT_KEY_PRESS | CACA_KEY_ESCAPE))
break;

cucul_draw_bitmap(qq, 0, cucul_get_height(qq) / 2,
/* Resize the spare canvas, just in case the main one changed */
cucul_set_size(gg, cucul_get_width(qq), cucul_get_height(qq));
cucul_set_size(mask, cucul_get_width(qq), cucul_get_height(qq));

/* Draw the regular bitmap on the main canvas */
cucul_draw_bitmap(qq, 0, 0,
cucul_get_width(qq) - 1, cucul_get_height(qq) - 1,
left, buffer);

cucul_set_bitmap_gamma(right, g);
cucul_draw_bitmap(qq, 0, 0,
cucul_get_width(qq) - 1, cucul_get_height(qq) / 2 - 1,
/* Draw the gamma-modified bitmap on the spare canvas */
cucul_set_bitmap_gamma(right, gam);
cucul_draw_bitmap(gg, 0, 0,
cucul_get_width(gg) - 1, cucul_get_height(gg) - 1,
right, buffer);

/* Draw something on the mask */
cucul_clear(mask);
cucul_set_color(mask, CUCUL_COLOR_WHITE, CUCUL_COLOR_WHITE);
cucul_fill_ellipse(mask, (1.0 + sin(0.05 * (float)x))
* 0.5 * cucul_get_width(mask),
(1.0 + cos(0.05 * (float)x))
* 0.5 * cucul_get_height(mask),
cucul_get_width(mask) / 2,
cucul_get_height(mask) / 2, '#');

/* Blit the spare canvas onto the first one */
cucul_blit(qq, 0, 0, gg, mask);

cucul_set_color(qq, CUCUL_COLOR_WHITE, CUCUL_COLOR_BLUE);
cucul_printf(qq, 2, 1, "gamma=%g", g);
cucul_printf(qq, 2, 1,
"gamma=%g - use arrows to change, Esc to quit", gam);

caca_display(kk);
}


불러오는 중...
취소
저장