duc_graph *duc_graph_new_opengl(duc *duc, double font_scale) { duc_graph *g = duc_graph_new(duc); g->backend = &duc_graph_backend_opengl; struct opengl_backend_data *bd; bd = duc_malloc(sizeof *bd); g->backend_data = bd; bd->sp = shaders(); bd->loc_pos = glGetAttribLocation(bd->sp, "pos_in"); bd->loc_texture = glGetAttribLocation(bd->sp, "tex_in"); bd->loc_color = glGetAttribLocation(bd->sp, "color_in"); bd->loc_sampler = glGetUniformLocation(bd->sp, "Texture"); bd->loc_matrix = glGetUniformLocation(bd->sp, "matrix"); bd->font_scale = font_scale / STB_SOMEFONT_LINE_SPACING; unsigned char fontpixels[STB_SOMEFONT_BITMAP_HEIGHT][STB_SOMEFONT_BITMAP_WIDTH]; STB_SOMEFONT_CREATE(bd->fontdata, fontpixels, STB_SOMEFONT_BITMAP_HEIGHT); glGenTextures(1, &bd->font_texid); glBindTexture(GL_TEXTURE_2D, bd->font_texid); glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, STB_SOMEFONT_BITMAP_WIDTH, STB_SOMEFONT_BITMAP_HEIGHT, 0, GL_ALPHA, GL_UNSIGNED_BYTE, fontpixels ); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glGenerateMipmap(GL_TEXTURE_2D); return g; }
duc_graph *duc_graph_new_cairo(duc *duc, cairo_t *cr) { duc_graph *g = duc_graph_new(duc); g->backend = &duc_graph_backend_cairo; struct cairo_backend_data *bd; bd = duc_malloc(sizeof *bd); g->backend_data = bd; bd->cr = cr; return g; }
duc_graph *duc_graph_new_cairo_file(duc *duc, duc_graph_file_format fmt, FILE *fout) { duc_graph *g = duc_graph_new(duc); g->backend = &duc_graph_backend_file; struct cairo_backend_data *bd; bd = duc_malloc(sizeof *bd); g->backend_data = bd; bd->fmt = fmt; bd->fout = fout; return g; }
duc_graph *duc_graph_new_html(duc *duc, FILE *fout, int write_body) { duc_graph *g = duc_graph_new(duc); g->backend = &duc_graph_backend_html; struct html_backend_data *bd; bd = duc_malloc(sizeof *bd); g->backend_data = bd; bd->fout = fout; bd->write_body = write_body; return g; }