cairo裁剪使用分析

2021-10-23 07:35:11 字數 2690 閱讀 8754

工作中遇到乙個呼叫cairo_clip之後,無法執行任何繪製的問題,在官方文件裡面僅僅是對這一堆函式的簡單介紹。因此自己啃**研究無法繪製的具體原因。

首先貼出官方給出的乙個簡單例子: 

cairo_arc (cr, 128.0, 128.0, 76.8, 0, 2 * m_pi);

cairo_clip (cr);

cairo_new_path (cr); /* current path is not

consumed by cairo_clip() */

cairo_rectangle (cr, 0, 0, 256, 256);

cairo_fill (cr);

其實只是在cairo_t裡面建立了乙個path物件。

在cairo_t裡面根據前面的path建立了乙個clip物件,此函式的核心**如下:

cairo_clip_t *

_cairo_clip_intersect_path (cairo_clip_t *clip,

const cairo_path_fixed_t *path,

cairo_fill_rule_t fill_rule,

double tolerance,

cairo_antialias_t antialias)

return _cairo_clip_intersect_box (clip, &box);

}if (_cairo_path_fixed_fill_is_rectilinear (path))

return _cairo_clip_intersect_rectilinear_path (clip, path,

fill_rule, antialias);

if (extents.width == 0 || extents.height == 0)

return _cairo_clip_set_all_clipped (clip);

clip = _cairo_clip_intersect_rectangle (clip, &extents);

if (_cairo_clip_is_all_clipped (clip))

return clip;

clip_path = _cairo_clip_path_create (clip);

if (unlikely (clip_path == null))

return _cairo_clip_set_all_clipped (clip);

status = _cairo_path_fixed_init_copy (&clip_path->path, path);

if (unlikely (status))

return _cairo_clip_set_all_clipped (clip);

clip_path->fill_rule = fill_rule;

clip_path->tolerance = tolerance;

clip_path->antialias = antialias;

if (clip->region)

clip->is_region = false;

return clip;

}

_cairo_path_fixed_fill_is_empty函式主要是判斷path是否為空,如果為空,則執行_cairo_clip_set_all_clipped 。

再來看看_cairo_clip_set_all_clipped 怎麼寫的:

static inline cairo_clip_t *

_cairo_clip_set_all_clipped (cairo_clip_t *clip)

所以,如果path為空,cairo會直接直接返回全域性cairo_clip_t物件。因此,呼叫cairo_clip之前,必須給cairo乙個非空的path物件。

當path存在後,接下來就是建立乙個clip了。

當傳入的path是通過cairo_rectangle建立的,這個範圍就是乙個簡單的box,會執行_cairo_clip_intersect_box函式,並返回。

當傳入的path是通過cairo_arc建立的,則會走後面的流程,_cairo_clip_intersect_rectangle裡面所做的事情,其實本質上和_cairo_clip_intersect_box是一樣的。然後接下來,呼叫_cairo_clip_path_create,為clip建立乙個裁剪路徑。最後呼叫_cairo_path_fixed_init_copy,使用cairo_arc建立的路徑初始化裁剪路徑。

函式也是在cairo_t裡面新增乙個path物件。

函式是cairo的實際繪製的函式。

cairo_status_t

_cairo_gstate_fill (cairo_gstate_t *gstate, cairo_path_fixed_t *path)

在繪製時,同樣會判斷上下文中的clip物件是否是全域性預設的clip物件,如果是,則直接返回,之後的繪製流程不會再執行。後面的繪製過程,因筆者水平有限,就不再分析。

總結:

呼叫cairo_clip之前,必須給乙個非空的path,否則cairo_clip會直接使用全域性clip物件,導致後面的繪製都不會執行。

Arcengine裁剪分析

方法一 網上找的方法,在vs2013 arcengine10.1 執行時報錯,通過客服得知此方法經常錯誤,大家可以自己測試下。private void startclip ifeaturelayer inputfeaturelayer,ifeatureclass cliplayerclass,ife...

掩膜裁剪tif步驟 使用Matlab裁剪柵格資料

需求 使用matlab讀取tif格式的柵格資料,並根據該柵格資料裁剪多副其餘柵格資料 製作掩膜資料 mask data double importdata d gpp ecology eco1km 2015 eco1km.tif 獲取研究區柵格資料 mask data mask data 15 ma...

使用ogr裁剪向量資料

使用ogr裁剪向量資料 由來 近期有個需求,內容是這樣的 我們有兩個向量資料,現在要求以乙個向量檔案為底板,按字段對另乙個向量檔案進行分割,生成若干小的shpfile檔案 分析 經過分析之後,將步驟拆解如下 首先確保兩個shpfile投影座標系統一 如果出現不統一的情況,那麼用arcgis的工具pr...