[轉]SkGradientShader::CreateLinear

SkGradientShader::CreateLinear 的參數。

函數聲明:

在class SK_API SkGradientShader 中。(include\effects\SkGradientShader.h)

/** Returns a shader that generates a linear gradient between the two
    specified points.
    <p />
    CreateLinear returns a shader with a reference count of 1.
    The caller should decrement the shader's reference count when done with the shader.
    It is an error for count to be < 2.
    @param  pts The start and end points for the gradient.
    @param  colors  The array[count] of colors, to be distributed between the two points
    @param  pos     May be NULL. array[count] of SkScalars, or NULL, of the relative position of
                    each corresponding color in the colors array. If this is NULL,
                    the the colors are distributed evenly between the start and end point.
                    If this is not null, the values must begin with 0, end with 1.0, and
                    intermediate values must be strictly increasing.
    @param  count   Must be >=2. The number of colors (and pos if not NULL) entries.
    @param  mode    The tiling mode
    @param  mapper  May be NULL. Callback to modify the spread of the colors.
*/
static SkShader* CreateLinear(  const SkPoint pts[2],
                                const SkColor colors[], const SkScalar pos[], int count,
                                SkShader::TileMode mode,
                                SkUnitMapper* mapper = NULL);

  SkPoint pts[2]; 起始點和結束點,影響了Gradient的起始位置和過渡完 count個顏色需要的像素。

  SkColor colors[] 過渡的顏色表

  SkScalar pos[] 過渡色百分比,必須以0開始,以1.0結束,中間值嚴格增長

  int count   過渡的顏色數

  SkShader::TileMode mode 繪製範圍大於 pts的兩個點指定的距離時的重複模式

  SkUnitMapper *mapper ;

  舉例一:

  pts 分別爲 [0,0]、[50,50], 畫 區域SkRect(0,0,100,100),重複模式kMirror_TileMode,顏色表用紅綠藍白黑

  則Gradient過渡完顏色表的顏色時,需要從點(0,0)到點(50,50),Gradient方向是斜向右下45°

  範圍(0,0,100,100)超出範圍,重複模式是kMirror_TileMode,鏡像重複  

  本來是紅綠藍白黑 超出部分挨着就是  黑白藍綠紅 再次 紅綠藍白黑 ……

     

   如果畫圖的範圍小於 (0,0,50,50),就按比例裁剪

  畫到(0,0,50,50)是: 畫到(0,0,20,50)則是:

  舉例二:

  如果pts 起始點不是(0,0),比如(x,y),如果在(x,y)左側有繪製Gradient,則按照 mode模式重複。

  pts(50,50),(100,50),方向是從左到右,重複模式kMirror_TileMode,顏色表用紅綠藍白黑

  畫(0,0,100,100)是從左到右過渡,從起始點的x座標開始往右50像素是紅綠藍白黑的過渡,

             從起始點的x座標(50)開始往左,是右邊的kMirror_TileMode模式的重複:從座標50往左是 紅綠藍白黑。

  舉例三:

  參數count ,如果小於colors的元素個數,則只取colors的前count個顏色,如果大於,則填充了透明色

  (但是如果count比colors的元素個數多了超過1,比如大3,就填充3個空顏色,但是空顏色之間的過渡有顏色)

  pts (50,50),(100,50);畫範圍SkRect r = {0,0,SkIntToScalar(200),SkIntToScalar(100)};

  如:SkColor colors[] ={SK_ColorRED,SK_ColorGREEN,SK_ColorBLUE,SK_ColorWHITE,SK_ColorBLACK};

  //紅、綠、藍、白、黑,這些宏的alpha值都是FF,即不透明

  count = SK_ARRAY_COUNT(colors);//5

 ,count =  2:,count =8:

 

  

舉例四:

  三種mode的效果圖

  

例四代碼:

//畫到屏幕上
void Flip()
{
    HDC dc = GetDC(g_hWnd);
    SetDIBitsToDevice(dc, 0, 0, 800, 480, 0, 0, 0, 800, pskBitmap->getPixels(), lpbmi, DIB_RGB_COLORS);
    ReleaseDC(g_hWnd,dc);
}
 
 
void PaintShader()
{
    SkPaint paint;
    paint.setAntiAlias(true);
    //paint.setStyle(SkPaint::kStroke_Style);
    //paint.setStrokeWidth(SkScalarHalf(SkIntToScalar(3)));
    //paint.setStyle(SkPaint::kFill_Style);
    SkPoint p = SkPoint::Make(50,50);
    SkPoint q = SkPoint::Make(100,50);
    SkPoint pts[] ={p,q};
    SkScalar t,temp,x,y;
    SkColor colors[] ={
        SK_ColorRED,SK_ColorGREEN,SK_ColorBLUE,SK_ColorWHITE,SK_ColorBLACK
    };
    //紅、綠、藍、白、黑,這些宏的alpha值都是FF,即不透明
    SkShader *shader ;
    shader =SkGradientShader::CreateLinear(
        pts,colors,NULL,SK_ARRAY_COUNT(colors),SkShader::kMirror_TileMode);
    //pts決定Gradient的起始點和走向,以及過渡完gClors的顏色需要的像素距離
    paint.setShader(shader);
    shader->unref();
    SkRect r = {0,0,SkIntToScalar(200),SkIntToScalar(100)};
    // 如果r範圍小於pts,則只顯示完整過渡colors需要像素的一部分,如果大於就會按mode重複
    //kMirror_TileMode就是紅綠藍白黑+白藍綠紅+綠藍白黑+白...重複
    pskCanvas->drawRect(r,paint);
     
    shader =SkGradientShader::CreateLinear(
        pts,colors,NULL,SK_ARRAY_COUNT(colors),SkShader::kRepeat_TileMode);
    paint.setShader(shader);
    shader->ref();
    r.setLTRB(0,SkIntToScalar(110),SkIntToScalar(200),SkIntToScalar(210));
    pskCanvas->drawRect(r,paint);
 
    shader =SkGradientShader::CreateLinear(
        pts,colors,NULL,SK_ARRAY_COUNT(colors),SkShader::kClamp_TileMode);
    paint.setShader(shader);
    shader->ref();
    r.setLTRB(0,SkIntToScalar(220),SkIntToScalar(200),SkIntToScalar(320));
    pskCanvas->drawRect(r,paint);
 
 
}
 
void MyLButtonDown(POINT pt)
{
    PaintShader();
 
    Flip();
 
}

  舉例五:

  關於constSkScalar pos[]參數,以0開始,以1.0結束,中間值嚴格增長。

  我個人理解:constSkColor colors[]中兩個顏色的過渡所佔百分比爲pos[]中對應兩個值的差值

  SkColor colors[] ={SK_ColorRED,SK_ColorGREEN,SK_ColorBLUE,SK_ColorWHITE,SK_ColorBLACK};
  SkScalar scalars[] ={0.0, 0.2, 0.2, 0.3,1.0};

  //紅綠過渡佔20%,綠藍沒有過渡,藍白過渡佔10%,白黑過渡70%(對應值的差)

  

SkPoint p = SkPoint::Make(0,50);
SkPoint q = SkPoint::Make(800,50);
SkPoint pts[] ={p,q};
SkColor colors[] ={
    SK_ColorRED,SK_ColorGREEN,SK_ColorBLUE,SK_ColorWHITE,SK_ColorBLACK
};
SkScalar scalars[] ={0.0, 0.2, 0.2, 0.3,1.0};
//紅綠過渡佔20%,綠藍沒有過渡,藍白過渡佔10%,白黑過渡70%(對應值的差)
SkShader *shader ;
shader =SkGradientShader::CreateLinear(
    pts,colors,scalars,SK_ARRAY_COUNT(colors),SkShader::kMirror_TileMode);
//pts決定Gradient的起始點和走向,以及過渡完gClors的顏色需要的像素距離
paint.setShader(shader);
shader->unref();
SkRect r = {0,0,SkIntToScalar(800),SkIntToScalar(100)};

  pts差值800,就是過渡完5個顏色要800像素, 畫寬帶爲800像素的矩形

  紅綠顏色過渡佔0.2(0.2-0),有160像素

  綠藍過渡佔0(0.2-0.2)   沒有綠藍過渡區

  藍白過渡佔0.1(0.3-0.2)  有80像素

  白黑過渡佔0.7(1.0-0.3)  560像素

效果圖:

 

 

轉自:ezhong的博客園:http://www.cnblogs.com/ezhong/


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章