2016-09-15 8 views
0

カイロ1.14.6を表示用に使用しているとき、同じパスを別の色で上書きすると、必ずしもすべてのピクセルが上書きされず、望ましくないアーチファクトが残っていました。カイロでアンチエイリアス処理されたピクセルを上書きできない

私の主張の証拠として、私は短い自己完結型の例からこの出力を提供します。

enter image description here

左から右へ画像の6つの部分の説明は、青にストローク

  1. オリジナル形状。
  2. オリジナルシェイプがRGBAホワイトで上書きされます。
  3. 元の形がRGB白で上書きされます。
  4. 元の形状は、CAIRO_OPERATOR_SOURCEモードでRGBA白に上書きされます。
  5. 元の形状は、RGBA白で上書きされ、CAIRO_OPERATOR_SOURCEモードとCAIRO_ANTIALIAS_NONEで上書きされます。
  6. 元の形状は、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モードにします。結果は私の実際のサーフェスを構成するフレームバッファで同じです。したがって、これはバックエンドの問題ではありません。

カイロは、通常、私がこれに非常に驚いていることでとても良いです。アンチエイリアシングされた形状をカイロに上書きする方法はありませんか?

答えて

0

私がしようとしていたことは明らかに不可能です。私は私のquestionカイロのメーリングリストに投稿し、2つのオプションが提供された:

  1. 彼らの上に描画する前に、元のピクセルのコピーを保管してください:「アンチエイリアシングがブレンドが含まあなたがアンチエイリアシングをしたくない場合は、消して。" (Link
  2. はるかに高い解像度で描画します。「実際の唯一の解決策は、カバレッジが正確に0に丸められた、またはピクセルごとに1つに丸められた非常に高い解像度を描画することです。 (Link

具体:

最初の図面から画素に格納されている全ての画素の パーセンテージは形状によって覆われていたものです。 は、ピクセルのどの部分がカバーされているかを覚えていません。

アンチエイリアスには必然的にブレンドが必要なため、カイロはブレンドにつながったサブピクセルのどの部分を覚えていないため、ブレンドを元に戻す方法を知る方法がありません。

関連する問題