工作中遇到乙個呼叫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...