2016-09-15 7 views
0

카이로 1.14.6을 표시 목적으로 사용하는 동안 다른 색상으로 동일한 경로를 덮어 쓰지 않아도 반드시 모든 픽셀을 덮어 쓰지 않아 바람직하지 않은 인공물이 남아있는 것으로 나타났습니다.카이로에서 앤티 앨리어스가 적용된 픽셀을 덮어 쓰지 못함

본인의 주장에 대한 증거로 본인은 짧은 자체 포함 예제에서이 결과물을 제공합니다.

enter image description here

왼쪽에서 오른쪽으로 이미지의 여섯 개 부분에 대한 설명 : 파란색으로 쓰다

  1. 원래 모양.
  2. 원본 모양을 RGBA 흰색으로 덮어 씁니다.
  3. 원본 모양을 RGB 흰색으로 덮어 씁니다.
  4. 원본 모양을 CAIRO_OPERATOR_SOURCE 모드로 RGBA 흰색으로 덮어 씁니다.
  5. 원래 모양이 CAIRO_OPERATOR_SOURCE 모드 및 CAIRO_ANTIALIAS_NONE 인 RGBA 흰색으로 덮어 씁니다.
  6. 원래 모양이 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)는 일반적으로 매우 훌륭하기 때문에 나는 이것에 매우 놀랐습니다. 카이로에서 앤티 앨리어싱 된 모양을 정확하게 덮어 쓸 방법이 없습니까?

답변

0

내가하려는 것은 분명히 불가능합니다. 내 question 카이로 메일 링리스트에 게시 두 가지 옵션을 제공했다 :

  1. 그들을 그리기 전에 원래 픽셀의 사본을 보관 :. "안티 앨리어싱이 혼합 포함 당신이 앤티 앨리어싱을하지 않으려면, 그것을 끄십시오. " (Link)
  2. 훨씬 더 높은 해상도로 그립니다 : "유일한 해결책은 정확히 0으로 반올림되거나 각 픽셀에 대해 반올림 된 훨씬 높은 해상도를 그리는 것입니다." 구체적으로는 (Link)

모든 즉 첫 번째 도면에서 화소에 저장된다

화소의 비율 형상에 의해 커버 된 것입니다. 정확히 픽셀의 어떤 부분이 다룰 지 기억하지 못합니다.

안티 앨리어싱에는 블렌딩이 필요하기 때문에 카이로는 블렌드를 유도 한 서브 픽셀의 어떤 부분을 기억하지 않으므로 블렌딩을 취소하는 방법을 알 수 없습니다.

관련 문제