亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? gui_fillpolygon.c

?? uCGUI
?? C
字號:
/*************************************************************************************************************
                                                   uC/GUI
                                               嵌入式通用圖形軟件
File        : GUI_FillPolygon.C
Purpose     : Fill polygon routine
************************************************************************************************************/
#include <stddef.h>           /* needed for definition of NULL */
#include "GUI_Protected.H"
#include "GUIDebug.h"

/*************************************************************************************************************
              Configurable defines
*************************************************************************************************************/

// #define GUI_USE_POLYV2 1

/*************************************************************************************************************
*              Fill Polygon                            
*************************************************************************************************************/
/*************************************************************************************************************
*      Helper functions         
*************************************************************************************************************/

/*************************************************************************************************************
  This function returns the x-coordinate of the intersection
  of the given line at the given y-coordinate.
  If there is no intersection, GUI_XMAX is returned.
  This routine does not work for horizontal lines, as there
  would be more than a single point as intersection. This situation
  needs to be checked prior to calling the routine.
*************************************************************************************************************/
int GL_CheckYInterSect(int y, const GUI_POINT*paPoint0, const GUI_POINT*paPoint1) 
{
  int x0,y0,x1,y1;
  if (paPoint0->y <= (paPoint1)->y) 
  	{
    y0 = paPoint0->y;
    if (y0>y)      /* Check if there is an intersection ... (early out) */
      return GUI_XMAX+1;
    y1 = paPoint1->y;
    if (y1<y)      /* Check if there is an intersection ... (early out) */
      return GUI_XMAX+1;
    x0 = paPoint0->x;
    x1 = paPoint1->x;
  } 
  else 
  {
    y0 = paPoint1->y;
    if (y0>y)      /* Check if there is an intersection ... (early out) */
      return GUI_XMAX+1;
    y1 = paPoint0->y;
    if (y1<y)      /* Check if there is an intersection ... (early out) */
      return GUI_XMAX+1;
    x0 = paPoint1->x;
    x1 = paPoint0->x;
  }
/* Calc intermediate variables */
/* Calculate intersection */
  {
    I32 Mul = (I32)(x1-x0)* (I32)(y-y0);
    if (Mul >0)
      Mul += (y1-y0)>>1;	  /* for proper rounding */
    else
      Mul -= ((y1-y0)>>1)-1;	  /* for proper rounding */
    x0 +=Mul/(y1-y0);
  }
  return x0;
} 


int GL_GetSign(int v) 
{
  if (v>0)
    return 1;
  if (v<0)
    return -1;
  return 0;
}

/*************************************************************************************************************
      GL_FillPolygon   - Old Version
  The routine(s) below fill a given polygon.
*************************************************************************************************************/
#if !defined(GUI_USE_POLYV2) /* Old proven, but slow version */
void GL_FillPolygon  (const GUI_POINT*paPoint, int NumPoints, int xOff, int yOff) 
{
  int i;
  int y;
  int yMin = GUI_YMAX;
  int yMax = GUI_YMIN;
/* First step : find uppermost and lowermost coordinates */
  for (i=0; i<NumPoints; i++) 
  {
    y = (paPoint+i)->y;
    if (y<yMin)
      yMin = y;
    if (y>yMax)
      yMax = y;
  }
/* Use Clipping rect to reduce calculation (if possible) */
  if (GUI_Context.pClipRect_HL) 
  {
    if (yMax > (GUI_Context.pClipRect_HL->y1 -yOff))
      yMax = (GUI_Context.pClipRect_HL->y1 -yOff);
    if (yMin < (GUI_Context.pClipRect_HL->y0 -yOff))
      yMin = (GUI_Context.pClipRect_HL->y0 -yOff);
  }
/* Second step: Calculate and draw horizontal lines */
  for (y=yMin; y<=yMax; y++) 
  {
    int x0 = GUI_XMIN;         /* Left edge of line */
    int LineCntTotal =0;
    /* Draw all line segments */
    while (x0<GUI_XMAX) 
    {
      char PointOnly=0;
      char OnEdge =0;
      char LineCntAdd =0;
      int xX = GUI_XMAX;  /* x-coordinate of next intersection */
      /* find next intersection and count lines*/
      for (i=0; i<NumPoints; i++) 
      {
        int x;
        int iPrev = i ? (i-1) : NumPoints-1;
        int i1 = (i <(NumPoints-1)) ? i +1 : 0;
        int i2 = (i1<(NumPoints-1)) ? i1+1 : 0;
        /* Check if end-point is on the line */
        if ((paPoint+i1)->y ==y) 
        {
          /* Start-point also on the line ?*/
          if ((paPoint+i)->y ==y) 
          {
            /* Get xmin, xmax */
            int xmin = (paPoint+i)->x;
            int xmax = (paPoint+i1)->x;
            if (xmin > xmax) {
              int t = xmin; xmin = xmax; xmax =t;
            }
            /* left point */
            if ((xmin>x0) && (xmin<=xX)) 
            {
              xX = xmin;
              LineCntAdd =0;
            }
            if ((xmax>x0) && (xmax<=xX)) 
            {
              xX = xmax;
              OnEdge =1;
              /* Check if the line crosses ... */
              LineCntAdd = (GL_GetSign((paPoint+i2)->y-y)
                         == GL_GetSign((paPoint+iPrev)->y-y))
                         ? 0 : 1;
            }
          } 
          else 
          { /* end-point.y == y, start-point.y !=y */
            x = (paPoint+i1)->x;
            if ((x>x0) && (x<=xX)) 
            {
              if (xX > x) 
              {
                xX = x;
                if (GL_GetSign((paPoint+i2)->y -y) == GL_GetSign((paPoint+i)->y -y))
                {
                  PointOnly  = 1;
                  LineCntAdd = 0;
                } 
                else 
                {
                  LineCntAdd=1;
                }
              }
            }
          }
        } 
        else 
        { /* end point not on the line, find intersection */
          if (y != (paPoint+i)->y) 
          { /* if startpoint not on y */
            x = GL_CheckYInterSect(y, paPoint+i, paPoint+i1);
            if ((x>x0) && (x<=xX)) 
            {
              if (x==xX) 
                LineCntAdd++;
              else
                LineCntAdd=1;
              xX = x;
            }
          } 
        }
      }
      if ((LineCntTotal&1) || OnEdge) 
      {
        LCD_HL_DrawHLine(x0+xOff,y+yOff,xX+xOff);
      } 
      else 
      {
      /* We are looking at a endpoint ... */
    		if (PointOnly) 
    		{
          LCD_HL_DrawHLine(xX+xOff,y+yOff,xX+xOff); /* LCD_HL_DrawPixel(xX+xOff,y+yOff); */
        }
      }
      x0 = xX;
      LineCntTotal += LineCntAdd;
    }
  }  
}

#else
/*************************************************************************************************************
      GL_FillPolygon   - New Version
  The routine(s) below fill a given polygon.
*************************************************************************************************************/
#define GUI_FP_MAXCOUNT 10
#define FP_TYPE_X    0
#define FP_TYPE_V    1

static int GL_FP_Cnt;
static struct 
{
  I16 x;
  U8  Type;
} GL_FP_a[GUI_FP_MAXCOUNT];

static void GL_FP_Add(int x, U8 Type) 
{
  if (GL_FP_Cnt < GUI_FP_MAXCOUNT) 
  {
    int i;
    /* Move all entries to the right (bigger x-value) */
    for (i=GL_FP_Cnt; i ; i--) 
    {
      if (GL_FP_a[i-1].x < x)
        break;
      GL_FP_a[i] = GL_FP_a[i-1];
    }
    /* Insert new entry */
    GL_FP_a[i].x = x;
    GL_FP_a[i].Type = Type;
    GL_FP_Cnt++;
  }
}

void GL_FP_Init(void) 
{
  GL_FP_Cnt = 0;
}

void GL_FP_Flush(int x0, int y) 
{
  int i;
  int x;
  char On=0;
  for (i=0; i<GL_FP_Cnt; i++) 
  {
    int xNew = GL_FP_a[i].x;
    switch (GL_FP_a[i].Type) 
    {
    case FP_TYPE_X:
      if (On) 
      {
        LCD_HL_DrawHLine(x0+x, y, x0+xNew);
      }
      On ^= 1;
      break;
    case FP_TYPE_V:
      if (On) 
      {
        LCD_HL_DrawHLine(x0+x, y, x0+xNew);
      } 
      else 
      {
        LCD_HL_DrawHLine(x0+x, y, x0); /* Do not use LCD_HL_DrawPixel(x0+xNew, y); --- AA module does not support SetPixel */
      }
      break;
    }
    x = xNew+1;
  }
}

void GL_FillPolygon(const GUI_POINT*paPoint, int NumPoints, int xOff, int yOff) 
{
  int i;
  int y;
  int yMin = GUI_YMAX;
  int yMax = GUI_YMIN;
/* First step : find uppermost and lowermost coordinates */
  for (i=0; i<NumPoints; i++) 
  {
    y = (paPoint+i)->y;
    if (y<yMin)
      yMin = y;
    if (y>yMax)
      yMax = y;
  }
/* Use Clipping rect to reduce calculation (if possible) */
  if (GUI_Context.pClipRect_HL) 
  {
    if (yMax > (GUI_Context.pClipRect_HL->y1 -yOff))
      yMax = (GUI_Context.pClipRect_HL->y1 -yOff);
    if (yMin < (GUI_Context.pClipRect_HL->y0 -yOff))
      yMin = (GUI_Context.pClipRect_HL->y0 -yOff);
  }
/* Second step: Calculate and draw horizontal lines */
  for (y=yMin; y<=yMax; y++) 
  {
    GL_FP_Init();
    /* find next intersection and count lines*/
    for (i=0; i<NumPoints; i++) 
    {
      int i1 = (i <(NumPoints-1)) ? i +1 : 0;
      int y0 = (paPoint+i)->y;
      int y1 = (paPoint+i1)->y;
      /* Check if starting point is on line */
      if (y0 == y) 
      {
        if (y1 == y) 
        {  /* Add the entire line */
          GL_FP_Add((paPoint+i )->x, FP_TYPE_X);
          GL_FP_Add((paPoint+i1)->x, FP_TYPE_X);
        } 
        else 
        {        /* Add only one point */
          GL_FP_Add((paPoint+i )->x, FP_TYPE_V);
        }
      }
      else if (y1 != y) 
      {  /* Ignore if end-point is on the line */
        if (((y1 >= y) && (y0 <= y)) || ((y0 >= y) && (y1 <= y))) 
        {
          int x = GL_CheckYInterSect(y, paPoint+i, paPoint+i1);
          GL_FP_Add(x, FP_TYPE_X);
        }
      }
    }
    GL_FP_Flush(xOff, y+yOff);
  }  
}

#endif

void GUI_FillPolygon(const GUI_POINT* pPoints, int NumPoints, int x0, int y0) 
{
  GUI_LOCK();
  #if (GUI_WINSUPPORT)
    WM_ADDORG(x0,y0);
    WM_ITERATE_START(NULL); 
   {
  #endif
  GL_FillPolygon (pPoints, NumPoints, x0, y0);
  #if (GUI_WINSUPPORT)
    } WM_ITERATE_END();
  #endif
  GUI_UNLOCK();
}


?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美午夜寂寞影院| 三级在线观看一区二区| 国产麻豆精品久久一二三| 欧美一区二区三区成人| 看国产成人h片视频| 日韩精品一区二区三区在线观看| 美女性感视频久久| 国产亚洲成av人在线观看导航| 国产乱子轮精品视频| 久久色视频免费观看| 成人精品小蝌蚪| 一区二区三区在线免费播放| 欧美日韩国产另类一区| 看电影不卡的网站| 亚洲欧洲精品一区二区精品久久久| www.亚洲人| 午夜精品一区在线观看| 欧美mv日韩mv| 色综合天天综合网天天看片| 亚洲午夜av在线| 精品国产123| 91丨porny丨国产| 男女视频一区二区| 国产精品家庭影院| 在线成人午夜影院| 国产福利一区二区三区视频 | 69精品人人人人| 狠狠v欧美v日韩v亚洲ⅴ| 亚洲人成网站精品片在线观看| 91麻豆精品91久久久久久清纯| 欧美一区二区在线看| 99天天综合性| 免费国产亚洲视频| 亚洲欧美国产三级| 久久午夜色播影院免费高清| 91香蕉视频黄| 国产一区不卡精品| 午夜欧美电影在线观看| 国产夜色精品一区二区av| 91久久久免费一区二区| 国产精品一区不卡| 日韩电影免费在线观看网站| 亚洲欧美在线观看| 国产亚洲精品aa午夜观看| 欧美日韩一区视频| 色哟哟欧美精品| 国产成人啪午夜精品网站男同| 亚洲成人三级小说| 中文字幕亚洲在| 国产亚洲成aⅴ人片在线观看| 8x8x8国产精品| 欧美一a一片一级一片| 国产美女一区二区| 狠狠色丁香婷婷综合久久片| 三级成人在线视频| 一区二区三区不卡视频| 亚洲视频在线观看一区| 国产亚洲欧美日韩在线一区| 日韩精品中文字幕一区二区三区 | 中文字幕日韩精品一区| 久久日一线二线三线suv| 欧美一区二区性放荡片| 欧美日韩国产综合视频在线观看| 91香蕉视频在线| 91丨porny丨蝌蚪视频| 成人a级免费电影| 国产美女精品在线| 精品一区在线看| 日韩二区三区在线观看| 天堂成人国产精品一区| 亚洲国产一区视频| 亚洲大片免费看| 亚洲一卡二卡三卡四卡 | 性做久久久久久免费观看欧美| 日韩一区有码在线| 亚洲视频一区在线| 亚洲精品成a人| 亚洲精品菠萝久久久久久久| 一区二区三区免费| 亚洲精品ww久久久久久p站| 亚洲免费电影在线| 亚洲成人自拍一区| 视频一区欧美精品| 九九精品视频在线看| 狠狠v欧美v日韩v亚洲ⅴ| 国产乱国产乱300精品| 成人免费观看男女羞羞视频| gogogo免费视频观看亚洲一| 91亚洲国产成人精品一区二区三| 色吊一区二区三区| 欧美猛男gaygay网站| 91麻豆精品国产91久久久更新时间| 制服丝袜国产精品| 精品国产91乱码一区二区三区 | 日韩成人一区二区三区在线观看| 亚洲国产中文字幕| 日韩国产欧美三级| 狠狠狠色丁香婷婷综合激情| 国产成a人无v码亚洲福利| 色综合久久综合网97色综合| 欧美日韩和欧美的一区二区| 欧美成人精品福利| 国产精品短视频| 国产精品久久久久久久午夜片 | 欧洲av一区二区嗯嗯嗯啊| 免费在线观看一区| 国产综合色在线| 波多野结衣在线一区| 欧美日韩免费电影| 久久久99久久| 洋洋成人永久网站入口| 偷拍与自拍一区| 国产精品综合二区| 在线视频综合导航| 2021久久国产精品不只是精品| 中文字幕制服丝袜成人av| 亚洲国产欧美一区二区三区丁香婷| 日本不卡视频在线| av资源网一区| 日韩亚洲欧美高清| 亚洲手机成人高清视频| 奇米色一区二区| 91视视频在线观看入口直接观看www| 欧美一区二区三区公司| 亚洲精品高清视频在线观看| 国产一区视频在线看| 在线精品观看国产| 久久一二三国产| 日韩电影在线观看电影| 99久久久久久99| 欧美成人a视频| 午夜视黄欧洲亚洲| 99这里只有久久精品视频| 欧美一区二区三区免费观看视频| 亚洲三级理论片| 国产麻豆一精品一av一免费| 欧美美女黄视频| 亚洲欧美日韩国产综合| 高清不卡一区二区| 日韩美女天天操| 亚洲大型综合色站| 91久久精品网| 一区免费观看视频| 国产精品一区二区视频| 欧美群妇大交群中文字幕| 中文字幕亚洲一区二区av在线 | 国产大陆精品国产| 日韩女优毛片在线| 亚洲成在线观看| 在线欧美小视频| 亚洲同性同志一二三专区| 国产超碰在线一区| 精品国产三级电影在线观看| 日韩精品欧美精品| 在线不卡一区二区| 天天影视涩香欲综合网| 在线观看亚洲一区| 亚洲自拍偷拍av| 在线精品观看国产| 亚洲丶国产丶欧美一区二区三区| 日本久久电影网| 一区二区三区四区精品在线视频 | 日韩中文字幕不卡| 欧美三级韩国三级日本三斤| 一区二区三区四区高清精品免费观看 | 欧美图片一区二区三区| 亚洲色图.com| 欧美在线观看视频在线| 亚洲午夜影视影院在线观看| 色94色欧美sute亚洲线路一ni| 亚洲靠逼com| 91成人在线精品| 亚洲va欧美va天堂v国产综合| 欧美日韩免费在线视频| 三级久久三级久久久| 日韩三级av在线播放| 久久99久久99小草精品免视看| 欧美www视频| 国产成人亚洲综合a∨婷婷图片 | 99国产精品久久久久久久久久久| 欧美激情在线观看视频免费| 成人一区在线看| 亚洲欧美另类久久久精品2019| 在线观看欧美黄色| 日韩国产在线一| 欧美videos中文字幕| 国产精品88888| 国产精品理伦片| 日本高清不卡aⅴ免费网站| 性做久久久久久免费观看欧美| 日韩视频中午一区| 国产盗摄视频一区二区三区| 亚洲欧美日韩精品久久久久| 欧美日韩国产一级片| 精品影视av免费| 亚洲日本va午夜在线影院| 欧美美女一区二区| 国产精品456| 亚洲一区二区三区免费视频| 欧美电影免费观看高清完整版在线观看 |