-#include"abc.h"
-
-static const char* vert_shader =
- "#version 330 core\n"
- "layout(location = 0) in vec4 position; \n"
- "layout(location = 1) in vec2 a_texCoord; \n"
- "out vec2 v_texCoord; \n"
- "uniform mat4 mvp; \n"
- "void main() { \n"
- "gl_Position = mvp * position; \n"
- "v_texCoord = a_texCoord; \n"
- "} \n";
-
-static const char* frag_shader =
- "#version 330 core\n"
- "in vec2 v_texCoord; \n"
- "out vec4 outputColor; \n"
- "uniform sampler2D tex_rgba; \n"
- "void main() { \n"
- " vec2 xy = v_texCoord; \n"
- " vec4 v = texture2D(tex_rgba, xy).rgba; \n"
- " outputColor = vec4(v.b, v.g, v.r, 1.0); \n"
- "} \n";
-
-
-static GLuint program = 0;
-
-static GLuint vao = 0;
-static GLuint buffers[2] = {0};
-static GLuint texture_rgba = 0;
-
-static GLuint uniform_mvp;
-static GLuint uniform_rgba;
-
-
-static int _render_fini_a(abc_render_t* render)
-{
- return 0;
-}
-
-static int _render_draw_a(abc_render_t* render, abc_obj_t* obj, int width, int height)
-{
- if (0 == program)
- __init_program(&program, vert_shader, frag_shader);
-
- if (0 == vao)
- __init_buffers(&vao, buffers);
-
- if (0 == texture_rgba)
- __init_texture(&texture_rgba, GL_RGBA, obj->w, obj->h, NULL);
-
- cairo_text_extents_t extents;
- cairo_surface_t* surface;
- cairo_t* cr;
-
- scf_list_t* l;
- abc_obj_t* attr;
-
- uint8_t* bgra = calloc(1, obj->w * obj->h * 4);
- if (!bgra)
- return -ENOMEM;
-
- surface = cairo_image_surface_create_for_data(bgra, CAIRO_FORMAT_ARGB32, obj->w, obj->h, obj->w * 4);
- cr = cairo_create(surface);
-
- cairo_set_line_width(cr, 1);
- cairo_set_source_rgb(cr, 1, 1, 1);
- cairo_rectangle(cr, 0, 0, obj->w, obj->h);
- cairo_fill(cr);
- cairo_stroke(cr);
-
- double r = 0.0;
- double g = 0.0;
- double b = 0.0;
- cairo_set_source_rgba(cr, r, g, b, 1.0);
-
- for (l = scf_list_head(&obj->attrs); l != scf_list_sentinel(&obj->attrs); l = scf_list_next(l)) {
- attr = scf_list_data(l, abc_obj_t, list);
-
- switch (attr->type) {
-
- case ABC_HTML_ATTR_FONT:
- cairo_select_font_face(cr, attr->value->data, CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL);
- break;
-
- case ABC_HTML_ATTR_FONT_SIZE:
- cairo_set_font_size(cr, atoi(attr->value->data));
- break;
-
- case ABC_HTML_ATTR_FONT_COLOR:
- abc_css_color(&r, &g, &b, attr->value->data);
-
- cairo_set_source_rgba(cr, r, g, b, 1.0);
- break;
- default:
- break;
- };
- }
-
- cairo_set_line_width(cr, 1);
-
- cairo_text_extents(cr, obj->text->data, &extents);
-
- cairo_move_to (cr, extents.x_bearing, -extents.y_bearing);
- cairo_show_text(cr, obj->text->data);
-
- cairo_move_to (cr, extents.x_bearing, -extents.y_bearing);
- cairo_line_to (cr, extents.width, -extents.y_bearing);
- cairo_stroke(cr);
-
- cairo_destroy(cr);
- cairo_surface_destroy(surface);
- surface = NULL;
- cr = NULL;
-
- float mvp[16];
- __compute_mvp(mvp, 0, 0, 0);
-
- scf_logi("%s, x: %d, y: %d, w: %d, h: %d\n", obj->text->data, obj->x, obj->y, obj->w, obj->h);
-
- GLfloat vert_update[] =
- {
- 2.0 * obj->x / (float)width - 1.0,
- -2.0 * (obj->y + obj->h) / (float)height + 1.0,
-
- 2.0 * (obj->x + obj->w) / (float)width - 1.0,
- -2.0 * (obj->y + obj->h) / (float)height + 1.0,
-
- 2.0 * obj->x / (float)width - 1.0,
- -2.0 * obj->y / (float)height + 1.0,
-
- 2.0 * (obj->x + obj->w) / (float)width - 1.0,
- -2.0 * obj->y / (float)height + 1.0,
- };
-
- glUseProgram(program);
- uniform_rgba = glGetUniformLocation(program, "tex_rgba");
- uniform_mvp = glGetUniformLocation(program, "mvp");
-
- glUniformMatrix4fv(uniform_mvp, 1, GL_FALSE, mvp);
-
- // board
- glActiveTexture(GL_TEXTURE0);
- glBindTexture (GL_TEXTURE_2D, texture_rgba);
- glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, obj->w, obj->h, 0, GL_RGBA, GL_UNSIGNED_BYTE, bgra);
- glUniform1i(uniform_rgba, 0);
-
- // draw
- glBindBuffer (GL_ARRAY_BUFFER, buffers[0]);
- glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(vert_update), vert_update);
-
- glBindVertexArray(vao);
-
- glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
-
- glBindVertexArray(0);
- glUseProgram(0);
-
- free(bgra);
- return 0;
-}
-
-abc_render_t abc_render_a =
-{
- .type = ABC_HTML_A,
-
- .draw = _render_draw_a,
- .fini = _render_fini_a,
-};