SkMaskFilter (SkBlurMaskFilter的使用)
還是先看下類的繼承關(guān)系:
SkNoncopyable
?????? ∟ SkRefCnt
???????????? ∟SkFlattenable
????????????????? ∟SkMaskFilter
??????????????????????? ∟SkBlurMaskFilterImpl
??????????????????????? ∟SkEmbossMaskFilter
??????????????????????? ∟SkTableMaskFilter
?? ? ? ? ? ? ? ? ? ? ? ?∟SkKernel33ProcMaskFilter
SkBlurMaskFilter
SkBlurMask ?
SkEmbossMask
以上為與MaskFilter相關(guān)的類,其他SkBlurMaskFilter/SkBlurMask/SkEmbossMask三個(gè)類在effect目錄下的文件中定義。
SkBlurMask 只封裝了靜態(tài)成員函數(shù)Blur
SkEmbossMask 只封裝了靜態(tài)成員函數(shù)Emboss
從參數(shù)看 Blur 和Emboss 是改變SkMask對(duì)象的作用。
SkEmbossMaskFilter 的成員函數(shù) filterMask 用到了SkBlurMask::Blur和SkEmbossMask::Emboss
SkBlurMaskFilterImpl?的成員函數(shù) filterMask 用到了SkBlurMask::Blur。
--------------------------------------------------------------- -------------------------------使用--
要使用MaskFilter要通過類 SkBlurMaskFilter
SkBlurMaskFilter是個(gè)獨(dú)立的類,沒有繼承關(guān)系。
class SK_API SkBlurMaskFilter { public:enum BlurStyle { //模糊風(fēng)格kNormal_BlurStyle, //!< fuzzy inside and outside 模糊內(nèi)外kSolid_BlurStyle, //!< solid inside, fuzzy outside 內(nèi)實(shí)體,外模糊kOuter_BlurStyle, //!< nothing inside, fuzzy outside 內(nèi)部空,外模糊kInner_BlurStyle, //!< fuzzy inside, nothing outside 內(nèi)模糊,外空kBlurStyleCount //style個(gè)數(shù)};enum BlurFlags {kNone_BlurFlag = 0x00,/**模糊半徑不被transforms影響 */ kIgnoreTransform_BlurFlag = 0x01,/** 使用smother 高質(zhì)量模糊算法 */kHighQuality_BlurFlag = 0x02,/** 所有模糊標(biāo)志的 */kAll_BlurFlag = 0x03};static SkMaskFilter* Create(SkScalar radius, BlurStyle style, uint32_t flags = kNone_BlurFlag);static SkMaskFilter* CreateEmboss( const SkScalar direction[3],SkScalar ambient, SkScalar specular,SkScalar blurRadius); private:SkBlurMaskFilter(); // can't be instantiated };SkBlurMaskFilter 定義了 BlurStyle 類型和?BlurFlags 類型
SkBlurMaskFilter的構(gòu)造函數(shù)是私有成員,不能創(chuàng)建SkBlurMaskFilter類型對(duì)象。
然后封裝了兩個(gè)靜態(tài)成員函數(shù)Create(...) 和 CreateEmboss(...)。
Create()函數(shù)用它的參數(shù) new 了一個(gè) SkBlurMaskFilterImp l對(duì)象。
CreateEmboss()用它的參數(shù) new 了一個(gè) SkEmbossMaskFilter 對(duì)象。
1.Create(...) 參數(shù)
SkScalar radius:要大于0,模糊效果的半徑? 從圖形邊沿開始算(往里、往外)radius經(jīng)過或者不經(jīng)過轉(zhuǎn)換的值如果超過128(float),會(huì)被賦值為128(float)。
BlurStyle style:BlurStyle?
Uint32_t flags:?BlurFlags? ,flags包含kHighQuality_BlurFlag標(biāo)志時(shí),為高質(zhì)量,否則是低質(zhì)量。
相互關(guān)系:當(dāng)flags是kIgnoreTransform_BlurFlag的時(shí)候,radius不被矩陣轉(zhuǎn)換影響,否則會(huì)按矩陣轉(zhuǎn)換。
實(shí)際效果1:
flags選擇默認(rèn)的kNone_BlurFlag,根據(jù)style的不同從左到右分別是:
kNormal_BlurStyle:圖形邊界內(nèi)外都有模糊效果
kSolid_BlurStyle:內(nèi)部是實(shí)體(paint指定的顏色),外邊模糊
kOuter_BlurStyle:內(nèi)部不繪制,外邊模糊效果
kInner_BlurStyel:內(nèi)部模糊效果,外部不繪制
實(shí)際效果2:
flag選擇kIgnoreTransform_BlurFlag的時(shí)候,不同style的效果是(順序同上):
模糊半徑忽略了矩陣變換。只有2像素
實(shí)際效果3
flag選擇kHighQuality_BlurFlag的時(shí)候,情況如下:
與kNone_BlurFlag在拐角處略有區(qū)別。(看眼花了…)
實(shí)際效果4:
flag選擇kAll_BlurFlag的時(shí)候:
相當(dāng)于:kHighQuality_BlurFlag(高質(zhì)量)+kIgnoreTransform_BlurFlag(模糊半徑忽略矩陣)
2.CreateEmboss(...) 參數(shù)
const SkScalar direction[3] 指定光源方向
這里的光應(yīng)該都是平行光(與所畫圖形在屏幕上位置無關(guān)), Z軸正向是屏幕往外,理解direction為光源位置。direction到(0,0,0)的向量方向就是平行光的光線方向。
如果設(shè)置z軸<=0,就相當(dāng)于沒有光源在屏幕后面,也就是在圖形后面,無法產(chǎn)生光照效果。
SkScalar ambient 環(huán)境光強(qiáng)度? 范圍0---1的scalar值,小于0效果同0,大于1效果同1。
SkScalar specular 鏡面反射光? 范圍0---15.99的scalar值,小于0效果同0,大于15.99效果同15.99。
SkScalar blurRadius 模糊半徑,同Create(...)的參數(shù)意義。
效果圖:(最后一個(gè)箭頭)
上圖代碼:
void BlurMask_path() {SkPaint embossPaint;embossPaint.setAntiAlias(true);embossPaint.setColor(SK_ColorRED);SkScalar dir[3] ={-5,5,5};SkMaskFilter *embossMask = SkBlurMaskFilter::CreateEmboss(dir,0.5,1,2);embossPaint.setMaskFilter(embossMask);embossMask->unref();SkMaskFilter * blurMask[SkBlurMaskFilter::kBlurStyleCount];for (size_t i = 0;i<SK_ARRAY_COUNT(blurMask);i++){//下面依次實(shí)驗(yàn)flags參數(shù)//maskFilter[i] = SkBlurMaskFilter::Create(2,SkBlurMaskFilter::BlurStyle(i));//默認(rèn)flags//maskFilter[i] = SkBlurMaskFilter::Create(2,SkBlurMaskFilter::BlurStyle(i),//SkBlurMaskFilter::kIgnoreTransform_BlurFlag);//忽略矩陣變換,注意只有模板半徑忽略矩陣變換blurMask[i] = SkBlurMaskFilter::Create(2,SkBlurMaskFilter::BlurStyle(i),SkBlurMaskFilter::kHighQuality_BlurFlag);//maskFilter[i] = SkBlurMaskFilter::Create(2,SkBlurMaskFilter::BlurStyle(i),// SkBlurMaskFilter::kAll_BlurFlag);}SkPaint blurPaint[SK_ARRAY_COUNT(blurMask)];for (size_t i = 0;i<SK_ARRAY_COUNT(blurMask);i++){blurPaint[i].setAntiAlias(true);blurPaint[i].setColor(SK_ColorRED);blurPaint[i].setMaskFilter(blurMask[i]);blurMask[i]->unref();}//DrawImage("\\USER\\Skia\\music-n.png",pskCanvas,g_rtImg,&embossPaint); //對(duì)畫圖片沒效果float pts[]={0, 0,10, 0,10, 5,20, -5,10, -15,10, -10,0, -10}; //將這些坐標(biāo)連起來是一個(gè)箭頭形狀SkPath fPath;fPath.moveTo(pts[0], pts[1]);for (size_t i = 2; i < SK_ARRAY_COUNT(pts); i += 2) {fPath.lineTo(pts[i], pts[i+1]);}pskCanvas->scale(5,5); //水平垂直都放大5倍pskCanvas->translate(10,30); //移動(dòng)坐標(biāo)原點(diǎn)for (size_t i = 0;i<SK_ARRAY_COUNT(blurMask);i++){pskCanvas->drawPath(fPath, blurPaint[i]);pskCanvas->translate(32, 0); //水平移動(dòng)32像素(實(shí)際效果要經(jīng)過scale)}pskCanvas->drawPath(fPath, embossPaint); }(箭頭數(shù)組來源:http://code.google.com/p/skia/source/browse/trunk/samplecode/SampleEffects.cpp)
分析關(guān)于光源的方向:
選定光源指定后,效果與所畫圖形在屏幕的位置無關(guān),是平行光。
光源在不同x,y坐標(biāo)情況下,其他參數(shù)同上面代碼:z坐標(biāo)5,環(huán)境光0.5,反射光1,模糊半徑2,效果圖如下:
x軸向左?Y軸向上 ,z軸向屏幕外。
以備補(bǔ)充:
ezhong的博客園:http://www.cnblogs.com/ezhong/? ? ?2011-11-30/17:53:47
轉(zhuǎn)載于:https://www.cnblogs.com/ezhong/archive/2011/11/30/2269501.html
總結(jié)
以上是生活随笔為你收集整理的SkMaskFilter (SkBlurMaskFilter的使用)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 十一月最后一天
- 下一篇: KlayGE 4.0中Deferred