-#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_form(abc_render_t* render)
-{
- return 0;
-}
-
-static int _render_draw_form(abc_render_t* render, abc_obj_t* obj, int width, int height)
-{
- if (!obj->text)
- return 0;
-
- 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);
-
- abc_attr_t* attr;
- cairo_text_extents_t extents;
- cairo_surface_t* surface;
- cairo_t* cr;
-
- 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);
-
- attr = abc_obj_find_attr(obj, ABC_HTML_ATTR_FONT);
- if (attr)
- cairo_select_font_face(cr, attr->value->data, CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL);
-
- attr = abc_obj_find_attr(obj, ABC_HTML_ATTR_FONT_SIZE);
- if (attr)
- cairo_set_font_size(cr, atoi(attr->value->data));
-
- cairo_set_source_rgba(cr, 0.0, 0.0, 0.0, 1.0);
- 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_surface_write_to_png(surface, "tmp.png");
-
- 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_form =
-{
- .type = ABC_HTML_FORM,
-
- .draw = _render_draw_form,
- .fini = _render_fini_form,
-};