카이로 1.14.6을 표시 목적으로 사용하는 동안 다른 색상으로 동일한 경로를 덮어 쓰지 않아도 반드시 모든 픽셀을 덮어 쓰지 않아 바람직하지 않은 인공물이 남아있는 것으로 나타났습니다.카이로에서 앤티 앨리어스가 적용된 픽셀을 덮어 쓰지 못함
본인의 주장에 대한 증거로 본인은 짧은 자체 포함 예제에서이 결과물을 제공합니다.
왼쪽에서 오른쪽으로 이미지의 여섯 개 부분에 대한 설명 : 파란색으로 쓰다
- 원래 모양.
- 원본 모양을 RGBA 흰색으로 덮어 씁니다.
- 원본 모양을 RGB 흰색으로 덮어 씁니다.
- 원본 모양을 CAIRO_OPERATOR_SOURCE 모드로 RGBA 흰색으로 덮어 씁니다.
- 원래 모양이 CAIRO_OPERATOR_SOURCE 모드 및 CAIRO_ANTIALIAS_NONE 인 RGBA 흰색으로 덮어 씁니다.
- 원래 모양이 CAARO_OPERATOR_SOURCE 모드 및 CAIRO_ANTIALIAS_BEST를 사용하여 RGBA 흰색으로 덮어 씁니다.
이미지는 다음 코드에서 생성되었습니다 그것은 바로 그 모양을 덮어 쓰기하는 것은 내가 그것을 강제 특히, 자사의 모든 픽셀을 덮어하지 않을 것이라고 나에게 직관적으로 이해가되지 않습니다
#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 모드로 전환합니다. 결과는 내 실제 표면을 구성하는 프레임 버퍼에서 동일하므로 백엔드에서는 문제가되지 않습니다.
카이로 (Cairo)는 일반적으로 매우 훌륭하기 때문에 나는 이것에 매우 놀랐습니다. 카이로에서 앤티 앨리어싱 된 모양을 정확하게 덮어 쓸 방법이 없습니까?