int main(int argc, char *argv[]) { caca_canvas_t *cv, *pig; void *buffer; size_t len; int i, j; pig = caca_create_canvas(0, 0); caca_import_canvas_from_memory(pig, STRING, strlen(STRING), "text"); cv = caca_create_canvas(caca_get_canvas_width(pig) * 2, caca_get_canvas_height(pig) * 2); if(cv == NULL || pig == NULL) { printf("Can't created canvas\n"); return -1; } caca_blit(cv, 0, 0, pig, NULL); caca_flip(pig); caca_blit(cv, caca_get_canvas_width(pig), 0, pig, NULL); caca_flip(pig); caca_flop(pig); caca_blit(cv, 0, caca_get_canvas_height(pig), pig, NULL); caca_flop(pig); caca_rotate_180(pig); caca_blit(cv, caca_get_canvas_width(pig), caca_get_canvas_height(pig), pig, NULL); for(j = 0; j < caca_get_canvas_height(cv); j++) { for(i = 0; i < caca_get_canvas_width(cv); i += 2) { unsigned long int a; caca_set_color_ansi(cv, CACA_LIGHTBLUE + (i + j) % 6, CACA_DEFAULT); a = caca_get_attr(cv, -1, -1); caca_put_attr(cv, i, j, a); caca_put_attr(cv, i + 1, j, a); } } buffer = caca_export_canvas_to_memory(cv, "utf8", &len); fwrite(buffer, len, 1, stdout); free(buffer); caca_rotate_left(cv); buffer = caca_export_canvas_to_memory(cv, "utf8", &len); fwrite(buffer, len, 1, stdout); free(buffer); caca_free_canvas(pig); caca_free_canvas(cv); return 0; }
/** \brief flush the figlet context */ int caca_flush_figlet(caca_canvas_t *cv) { caca_charfont_t *ff = cv->ff; int x, y; if (!ff) return -1; //ff->torender = cv; //caca_set_canvas_size(ff->torender, ff->w, ff->h); caca_set_canvas_size(cv, ff->w, ff->h); /* FIXME: do this somewhere else, or record hardblank positions */ for(y = 0; y < ff->h; y++) for(x = 0; x < ff->w; x++) if(caca_get_char(cv, x, y) == 0xa0) { uint32_t attr = caca_get_attr(cv, x, y); caca_put_char(cv, x, y, ' '); caca_put_attr(cv, x, y, attr); } ff->x = ff->y = 0; ff->w = ff->h = 0; //cv = caca_create_canvas(1, 1); /* XXX */ /* from render.c */ ff->lines += caca_get_canvas_height(cv); return 0; }
/** \brief paste a character using the current figfont */ int caca_put_figchar(caca_canvas_t *cv, uint32_t ch) { caca_charfont_t *ff = cv->ff; int c, w, h, x, y, overlap, extra, xleft, xright; if (!ff) return -1; switch(ch) { case (uint32_t)'\r': return 0; case (uint32_t)'\n': ff->x = 0; ff->y += ff->height; return 0; /* FIXME: handle '\t' */ } /* Look whether our glyph is available */ for(c = 0; c < ff->glyphs; c++) if(ff->lookup[c * 2] == ch) break; if(c == ff->glyphs) return 0; w = ff->lookup[c * 2 + 1]; h = ff->height; caca_set_canvas_handle(ff->fontcv, 0, c * ff->height); caca_blit(ff->charcv, 0, 0, ff->fontcv, NULL); /* Check whether we reached the end of the screen */ if(ff->x && ff->x + w > ff->term_width) { ff->x = 0; ff->y += h; } /* Compute how much the next character will overlap */ switch(ff->hmode) { case H_SMUSH: case H_KERN: case H_OVERLAP: extra = (ff->hmode == H_OVERLAP); overlap = w; for(y = 0; y < h; y++) { /* Compute how much spaces we can eat from the new glyph */ for(xright = 0; xright < overlap; xright++) if(caca_get_char(ff->charcv, xright, y) != ' ') break; /* Compute how much spaces we can eat from the previous glyph */ for(xleft = 0; xright + xleft < overlap && xleft < ff->x; xleft++) if(caca_get_char(cv, ff->x - 1 - xleft, ff->y + y) != ' ') break; /* Handle overlapping */ if(ff->hmode == H_OVERLAP && xleft < ff->x) xleft++; /* Handle smushing */ if(ff->hmode == H_SMUSH) { if(xleft < ff->x && hsmush(caca_get_char(cv, ff->x - 1 - xleft, ff->y + y), caca_get_char(ff->charcv, xright, y), ff->hsmushrule)) xleft++; } if(xleft + xright < overlap) overlap = xleft + xright; } break; case H_NONE: overlap = 0; break; default: return -1; } /* Check whether the current canvas is large enough */ if(ff->x + w - overlap > ff->w) ff->w = ff->x + w - overlap < ff->term_width ? ff->x + w - overlap : ff->term_width; if(ff->y + h > ff->h) ff->h = ff->y + h; #if 0 /* deactivated for libcaca insertion */ if(attr) caca_set_attr(cv, attr); #endif caca_set_canvas_size(cv, ff->w, ff->h); /* Render our char (FIXME: create a rect-aware caca_blit_canvas?) */ for(y = 0; y < h; y++) for(x = 0; x < w; x++) { uint32_t ch1, ch2; uint32_t tmpat = caca_get_attr(ff->fontcv, x, y + c * ff->height); ch2 = caca_get_char(ff->charcv, x, y); if(ch2 == ' ') continue; ch1 = caca_get_char(cv, ff->x + x - overlap, ff->y + y); if(ch1 == ' ' || ff->hmode != H_SMUSH) caca_put_char(cv, ff->x + x - overlap, ff->y + y, ch2); else caca_put_char(cv, ff->x + x - overlap, ff->y + y, hsmush(ch1, ch2, ff->hsmushrule)); caca_put_attr(cv, ff->x + x, ff->y + y, tmpat); } /* Advance cursor */ ff->x += w - overlap; return 0; }
JNIEXPORT void JNICALL Java_org_zoy_caca_Canvas_putCanvasAttribute(JNIEnv *env, jclass cls, jlong ptr, jint x, jint y, jint attr) { caca_put_attr((caca_canvas_t *)ptr, x, y, attr); }