При использовании Cairo 1.14.6 для отображения я обнаружил, что переписывание того же пути другим цветом не обязательно перезаписывает все пиксели и оставляет нежелательные артефакты.Невозможность перезаписать сглаженные пиксели в Каире
В качестве доказательства моей претензии я предлагаю этот вывод из краткого автономного примера, источник которого следует далее ниже.
Объяснение шести частей изображения, слева направо:
- Оригинальная форма погладил синим цветом.
- Оригинальная форма, переписанная в RGBA белом.
- Оригинальная форма, переписанная в RGB-белом.
- Оригинальная форма, переписанная в RGBA-белизне с режимом CAIRO_OPERATOR_SOURCE.
- Оригинальная форма, перезаписанная в RGBA-белом режиме CAIRO_OPERATOR_SOURCE и CAIRO_ANTIALIAS_NONE.
- Оригинальная форма, переписанная в RGBA-белизне, с режимом CAIRO_OPERATOR_SOURCE и CAIRO_ANTIALIAS_BEST.
Изображение генерировали из следующего кода:
#include "cairo/cairo.h"
#define M_PI 3.14159265358979323846
void draw_shape(cairo_t* cr, int x, int y) {
cairo_arc(cr, 50 + x, 50 + y, 48, -M_PI, -M_PI/2);
cairo_stroke(cr);
cairo_move_to(cr, x + 2, y + 2);
cairo_line_to(cr, x + 48, y + 48);
cairo_stroke(cr);
}
int main(int argc, char** argv) {
int x = 0;
int y = 0;
cairo_surface_t* surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, 300, 50);
cairo_t* cr = cairo_create(surface);
/* Draw a white background and a few shapes to overwrite */
cairo_set_source_rgba(cr, 1.0, 1.0, 1.0, 1.0);
cairo_paint(cr);
cairo_set_source_rgba(cr, 0.0, 0.0, 1.0, 1.0);
draw_shape(cr, x, y); x += 50;
draw_shape(cr, x, y); x += 50;
draw_shape(cr, x, y); x += 50;
draw_shape(cr, x, y); x += 50;
draw_shape(cr, x, y); x += 50;
draw_shape(cr, x, y); x += 50;
x = 50;
/* Leftmost shape is left unchanged for reference */
/* Stroke in RGBA opaque white */
cairo_set_source_rgba(cr, 1.0, 1.0, 1.0, 1.0);
draw_shape(cr, x, y); x += 50;
/* Stroke in RGB white */
cairo_set_source_rgb(cr, 1.0, 1.0, 1.0);
draw_shape(cr, x + 0, y); x += 50;
/* Stroke in opaque white without blending */
cairo_set_source_rgba(cr, 1.0, 1.0, 1.0, 1.0);
cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE);
draw_shape(cr, x, y); x += 50;
/* Stroke in opaque white without blending, with no antialiasing */
cairo_set_source_rgba(cr, 1.0, 1.0, 1.0, 1.0);
cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE);
cairo_set_antialias(cr, CAIRO_ANTIALIAS_NONE);
draw_shape(cr, x, y); x += 50;
/* Stroke in opaque white without blending, with best antialiasing */
cairo_set_source_rgba(cr, 1.0, 1.0, 1.0, 1.0);
cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE);
cairo_set_antialias(cr, CAIRO_ANTIALIAS_BEST);
draw_shape(cr, x, y); x += 50;
/* Write the results to a file */
cairo_surface_write_to_png(surface, "output.png");
return 0;
}
Это не делает интуитивное чувство для меня, что перезапись ту же самую форму, не будет перезаписывать все его пикселей, особенно если я заставляю его в не смешивающийся режим CAIRO_OPERATOR_SOURCE. Результаты одинаковы на фреймбуфере, который составляет мою фактическую поверхность, поэтому это не проблема с бэкэнд.
Каир обычно так хорош в своих действиях, что я очень этому удивляюсь. Нет ли способа переписать сглаженную форму точно в Каире?