#include <cairo.h>
#include <math.h>
#include <stdio.h>

int main()
{
    double width = 270, height = 240;
    double x;
    cairo_surface_t *surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, width, height);
    cairo_pattern_t *gradient;
    cairo_t *crc = cairo_create(surface);
    cairo_font_options_t* font;

    // Set up font  (face is second field in 'xlsfonts'; first field is foundry)
    font = cairo_font_options_create();
    cairo_font_options_set_antialias(font, CAIRO_ANTIALIAS_SUBPIXEL);
    cairo_set_font_options(crc, font);
    cairo_select_font_face(crc, "nimbus sans l", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD);
    cairo_set_font_size(crc, 16);
    cairo_font_options_destroy(font);

    // Background
    cairo_rectangle(crc, 0, 0, width, height);
    cairo_set_source_rgb(crc, 1, 1, 1);
    cairo_fill(crc);

    //////////////////////////////////////

    // Texel 1
    cairo_rectangle(crc, 10, 50, 50, 20);
    cairo_set_source_rgb(crc, 0, 0.5, 1);
    cairo_fill_preserve(crc);
    cairo_set_source_rgb(crc, 0, 0, 0);
    cairo_stroke(crc);

    cairo_rectangle(crc, 34, 59, 3, 3);
    cairo_fill(crc);

    cairo_move_to(crc, 33, 45);
    cairo_show_text(crc, "1");

    // Texel 4
    cairo_rectangle(crc, 60, 50, 50, 20);
    cairo_set_source_rgb(crc, 1, 0, 0);
    cairo_fill_preserve(crc);
    cairo_set_source_rgb(crc, 0, 0, 0);
    cairo_stroke(crc);

    cairo_rectangle(crc, 84, 59, 3, 3);
    cairo_fill(crc);

    cairo_move_to(crc, 83, 45);
    cairo_show_text(crc, "4");

    // Texel 4
    cairo_rectangle(crc, 160, 50, 50, 20);
    cairo_set_source_rgb(crc, 0, 1, 1);
    cairo_fill_preserve(crc);
    cairo_set_source_rgb(crc, 0, 0, 0);
    cairo_stroke(crc);

    cairo_rectangle(crc, 184, 59, 3, 3);
    cairo_fill(crc);

    cairo_move_to(crc, 183, 45);
    cairo_show_text(crc, "4");

    // Texel 1
    cairo_rectangle(crc, 210, 50, 50, 20);
    cairo_set_source_rgb(crc, 1, 0, 1);
    cairo_fill_preserve(crc);
    cairo_set_source_rgb(crc, 0, 0, 0);
    cairo_stroke(crc);

    cairo_rectangle(crc, 234, 59, 3, 3);
    cairo_fill(crc);

    cairo_move_to(crc, 233, 45);
    cairo_show_text(crc, "1");

    // Texel 6
    cairo_set_line_width(crc, 4);
    cairo_rectangle(crc, 110, 50, 50, 20);
    cairo_set_source_rgb(crc, 1, 1, 0);
    cairo_fill_preserve(crc);
    cairo_set_source_rgb(crc, 0, 0, 0);
    cairo_stroke(crc);
    cairo_set_line_width(crc, 2);

    cairo_rectangle(crc, 134, 59, 3, 3);
    cairo_fill(crc);

    cairo_move_to(crc, 133, 45);
    cairo_show_text(crc, "6");

    //////////////////////////////////////
    cairo_translate(crc, 0, 75);
    //////////////////////////////////////

    gradient = cairo_pattern_create_linear(10, 0, 260, 0);
    cairo_pattern_add_color_stop_rgb(gradient, 0, 0, 0.5, 1);
    cairo_pattern_add_color_stop_rgb(gradient, 0.1, 0, 0.5, 1);
    cairo_pattern_add_color_stop_rgb(gradient, 0.3, 1, 0, 0);
    cairo_pattern_add_color_stop_rgb(gradient, 0.5, 1, 1, 0);
    cairo_pattern_add_color_stop_rgb(gradient, 0.7, 0, 1, 1);
    cairo_pattern_add_color_stop_rgb(gradient, 0.9, 1, 0, 1);
    cairo_pattern_add_color_stop_rgb(gradient, 1, 1, 0, 1);
    cairo_set_source(crc, gradient);
    cairo_rectangle(crc, 10, 50, 250, 20);
    cairo_fill(crc);
    cairo_pattern_destroy(gradient);

    // Texel 1
    cairo_rectangle(crc, 10, 50, 50, 20);
    cairo_set_source_rgb(crc, 0, 0, 0);
    cairo_stroke(crc);

    cairo_rectangle(crc, 34, 59, 3, 3);
    cairo_fill(crc);

    cairo_move_to(crc, 33, 45);
    cairo_show_text(crc, "1");

    // Texel 4
    cairo_rectangle(crc, 60, 50, 50, 20);
    cairo_set_source_rgb(crc, 0, 0, 0);
    cairo_stroke(crc);

    cairo_rectangle(crc, 84, 59, 3, 3);
    cairo_fill(crc);

    cairo_move_to(crc, 83, 45);
    cairo_show_text(crc, "4");

    // Texel 4
    cairo_rectangle(crc, 160, 50, 50, 20);
    cairo_set_source_rgb(crc, 0, 0, 0);
    cairo_stroke(crc);

    cairo_rectangle(crc, 184, 59, 3, 3);
    cairo_fill(crc);

    cairo_move_to(crc, 183, 45);
    cairo_show_text(crc, "4");

    // Texel 1
    cairo_rectangle(crc, 210, 50, 50, 20);
    cairo_set_source_rgb(crc, 0, 0, 0);
    cairo_stroke(crc);

    cairo_rectangle(crc, 234, 59, 3, 3);
    cairo_fill(crc);

    cairo_move_to(crc, 233, 45);
    cairo_show_text(crc, "1");

    // Texel 6
    cairo_set_line_width(crc, 4);
    cairo_rectangle(crc, 110, 50, 50, 20);
    cairo_set_source_rgb(crc, 0, 0, 0);
    cairo_stroke(crc);
    cairo_set_line_width(crc, 2);

    cairo_rectangle(crc, 134, 59, 3, 3);
    cairo_fill(crc);

    cairo_move_to(crc, 133, 45);
    cairo_show_text(crc, "6");

    //////////////////////////////////////
    cairo_translate(crc, 0, 75);
    //////////////////////////////////////

    gradient = cairo_pattern_create_linear(10, 0, 260, 0);
    cairo_pattern_add_color_stop_rgb(gradient, 0, 0, 0.5, 1);
    cairo_pattern_add_color_stop_rgb(gradient, 0.1, 0, 0.5, 1);
    cairo_pattern_add_color_stop_rgb(gradient, 0.3, 1, 0, 0);
    cairo_pattern_add_color_stop_rgb(gradient, 0.5, 1, 1, 0);
    cairo_pattern_add_color_stop_rgb(gradient, 0.7, 0, 1, 1);
    cairo_pattern_add_color_stop_rgb(gradient, 0.9, 1, 0, 1);
    cairo_pattern_add_color_stop_rgb(gradient, 1, 1, 0, 1);
    cairo_set_source(crc, gradient);
    cairo_rectangle(crc, 10, 50, 250, 20);
    cairo_fill(crc);
    cairo_pattern_destroy(gradient);

    // Texel 1
    cairo_rectangle(crc, 10, 50, 50, 20);
    cairo_set_source_rgb(crc, 0, 0, 0);
    cairo_stroke(crc);


    // Texel 4
    cairo_rectangle(crc, 60, 50, 50, 20);
    cairo_set_source_rgb(crc, 0, 0, 0);
    cairo_stroke(crc);

    // 1-4 Span
    cairo_set_antialias(crc, CAIRO_ANTIALIAS_NONE);
    cairo_set_line_width(crc, 1);
    cairo_rectangle(crc, 34, 59, 3, 3);
    cairo_stroke(crc);
    cairo_rectangle(crc, 84, 59, 3, 3);
    cairo_stroke(crc);
    cairo_move_to(crc, 37, 60);
    cairo_line_to(crc, 84, 60);
    cairo_stroke(crc);
    cairo_set_line_width(crc, 2);
    cairo_set_antialias(crc, CAIRO_ANTIALIAS_DEFAULT);

    // Texel 5
    x = 35 + (85 - 35) * 4 / 5.0;
    cairo_rectangle(crc, x - 1, 59, 3, 3);
    cairo_fill(crc);

    cairo_move_to(crc, x - 4, 45);
    cairo_show_text(crc, "5");

    // Texel 4
    cairo_rectangle(crc, 160, 50, 50, 20);
    cairo_set_source_rgb(crc, 0, 0, 0);
    cairo_stroke(crc);

    // Texel 1
    cairo_rectangle(crc, 210, 50, 50, 20);
    cairo_set_source_rgb(crc, 0, 0, 0);
    cairo_stroke(crc);

    // 4-1 Span
    cairo_set_antialias(crc, CAIRO_ANTIALIAS_NONE);
    cairo_set_line_width(crc, 1);
    cairo_rectangle(crc, 184, 59, 3, 3);
    cairo_stroke(crc);
    cairo_rectangle(crc, 234, 59, 3, 3);
    cairo_stroke(crc);
    cairo_move_to(crc, 187, 60);
    cairo_line_to(crc, 234, 60);
    cairo_stroke(crc);
    cairo_set_line_width(crc, 2);
    cairo_set_antialias(crc, CAIRO_ANTIALIAS_DEFAULT);

    // Texel 5
    x = 185 + (235 - 185) * 1 / 5.0;
    cairo_rectangle(crc, x - 1, 59, 3, 3);
    cairo_fill(crc);

    cairo_move_to(crc, x - 4, 45);
    cairo_show_text(crc, "5");

    // Texel 6
    cairo_set_line_width(crc, 4);
    cairo_rectangle(crc, 110, 50, 50, 20);
    cairo_set_source_rgb(crc, 0, 0, 0);
    cairo_stroke(crc);
    cairo_set_line_width(crc, 2);

    cairo_rectangle(crc, 134, 59, 3, 3);
    cairo_fill(crc);

    cairo_move_to(crc, 133, 45);
    cairo_show_text(crc, "6");

    //////////////////////////////////////

    // Done.
    cairo_surface_write_to_png(surface, "filter.png");
    return 0;
}

