カイロ1.14.6を表示用に使用しているとき、同じパスを別の色で上書きすると、必ずしもすべてのピクセルが上書きされず、望ましくないアーチファクトが残っていました。カイロでアンチエイリアス処理されたピクセルを上書きできない
私の主張の証拠として、私は短い自己完結型の例からこの出力を提供します。
左から右へ画像の6つの部分の説明は、青にストローク
- オリジナル形状。
- オリジナルシェイプがRGBAホワイトで上書きされます。
- 元の形がRGB白で上書きされます。
- 元の形状は、CAIRO_OPERATOR_SOURCEモードでRGBA白に上書きされます。
- 元の形状は、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モードにします。結果は私の実際のサーフェスを構成するフレームバッファで同じです。したがって、これはバックエンドの問題ではありません。
カイロは、通常、私がこれに非常に驚いていることでとても良いです。アンチエイリアシングされた形状をカイロに上書きする方法はありませんか?