Ejemplo n.º 1
0
        public static void stbtt__sort_edges_ins_sort(stbtt__edge *p, int n)
        {
            int i = 0;
            int j = 0;

            for (i = 1; (i) < (n); ++i)
            {
                stbtt__edge  t = p[i];
                stbtt__edge *a = &t;
                j = i;
                while ((j) > (0))
                {
                    stbtt__edge *b = &p[j - 1];
                    int          c = a->y0 < b->y0 ? 1 : 0;
                    if (c == 0)
                    {
                        break;
                    }
                    p[j] = p[j - 1];
                    --j;
                }
                if (i != j)
                {
                    p[j] = t;
                }
            }
        }
        public static void stbtt__sort_edges_ins_sort(stbtt__edge *p, int n)
        {
            int i = 0;
            int j = 0;

            for (i = (int)(1); (i) < (n); ++i)
            {
                stbtt__edge  t = (stbtt__edge)(p[i]);
                stbtt__edge *a = &t;
                j = (int)(i);
                while ((j) > (0))
                {
                    stbtt__edge *b = &p[j - 1];
                    int          c = (int)(a->y0 < b->y0 ? 1 : 0);
                    if (c == 0)
                    {
                        break;
                    }
                    p[j] = (stbtt__edge)(p[j - 1]);
                    --j;
                }
                if (i != j)
                {
                    p[j] = (stbtt__edge)(t);
                }
            }
        }
Ejemplo n.º 3
0
        public void stbtt__rasterize(stbtt__point[] pts, int[] wcount, int windings,
                                     float scale_x, float scale_y, float shift_x, float shift_y, int off_x, int off_y, int invert)
        {
            var y_scale_inv = invert != 0 ? -scale_y : scale_y;
            var n           = 0;
            var i           = 0;
            var j           = 0;
            var k           = 0;
            var m           = 0;
            var vsubsample  = 1;

            n = 0;
            for (i = 0; i < windings; ++i)
            {
                n += wcount[i];
            }
            var e = new stbtt__edge[n + 1];

            for (i = 0; i < e.Length; ++i)
            {
                e[i] = new stbtt__edge();
            }
            n = 0;
            m = 0;
            for (i = 0; i < windings; ++i)
            {
                var p = new FakePtr <stbtt__point>(pts, m);
                m += wcount[i];
                j  = wcount[i] - 1;
                for (k = 0; k < wcount[i]; j = k++)
                {
                    var a = k;
                    var b = j;
                    if (p[j].y == p[k].y)
                    {
                        continue;
                    }
                    e[n].invert = 0;
                    if (invert != 0 && p[j].y > p[k].y || invert == 0 && p[j].y < p[k].y)
                    {
                        e[n].invert = 1;
                        a           = j;
                        b           = k;
                    }

                    e[n].x0 = p[a].x * scale_x + shift_x;
                    e[n].y0 = (p[a].y * y_scale_inv + shift_y) * vsubsample;
                    e[n].x1 = p[b].x * scale_x + shift_x;
                    e[n].y1 = (p[b].y * y_scale_inv + shift_y) * vsubsample;
                    ++n;
                }
            }

            var ptr = new FakePtr <stbtt__edge>(e);

            stbtt__sort_edges(ptr, n);
            stbtt__rasterize_sorted_edges(ptr, n, vsubsample, off_x, off_y);
        }
Ejemplo n.º 4
0
 public static void stbtt__sort_edges_quicksort(stbtt__edge *p, int n)
 {
     while ((n) > (12))
     {
         stbtt__edge t   = new stbtt__edge();
         int         c01 = 0;
         int         c12 = 0;
         int         c   = 0;
         int         m   = 0;
         int         i   = 0;
         int         j   = 0;
         m   = n >> 1;
         c01 = ((&p[0])->y0) < ((&p[m])->y0) ? 1 : 0;
         c12 = ((&p[m])->y0) < ((&p[n - 1])->y0) ? 1 : 0;
         if (c01 != c12)
         {
             int z = 0;
             c    = ((&p[0])->y0) < ((&p[n - 1])->y0) ? 1 : 0;
             z    = ((c) == (c12)) ? 0 : n - 1;
             t    = p[z];
             p[z] = p[m];
             p[m] = t;
         }
         t    = p[0];
         p[0] = p[m];
         p[m] = t;
         i    = 1;
         j    = n - 1;
         for (; ;)
         {
             for (; ; ++i)
             {
                 if (!(((&p[i])->y0) < ((&p[0])->y0)))
                 {
                     break;
                 }
             }
             for (; ; --j)
             {
                 if (!(((&p[0])->y0) < ((&p[j])->y0)))
                 {
                     break;
                 }
             }
             if ((i) >= (j))
             {
                 break;
             }
             t    = p[i];
             p[i] = p[j];
             p[j] = t;
             ++i;
             --j;
         }
         if ((j) < (n - i))
         {
             stbtt__sort_edges_quicksort(p, j);
             p = p + i;
             n = n - i;
         }
         else
         {
             stbtt__sort_edges_quicksort(p + i, n - i);
             n = j;
         }
     }
 }
Ejemplo n.º 5
0
        public static void stbtt__sort_edges_quicksort(stbtt__edge *p, int n)
        {
            while (n > 12)
            {
                var t   = new stbtt__edge();
                var c01 = 0;
                var c12 = 0;
                var c   = 0;
                var m   = 0;
                var i   = 0;
                var j   = 0;
                m   = n >> 1;
                c01 = (&p[0])->y0 < (&p[m])->y0 ? 1 : 0;
                c12 = (&p[m])->y0 < (&p[n - 1])->y0 ? 1 : 0;
                if (c01 != c12)
                {
                    var z = 0;
                    c    = (&p[0])->y0 < (&p[n - 1])->y0 ? 1 : 0;
                    z    = c == c12 ? 0 : n - 1;
                    t    = p[z];
                    p[z] = p[m];
                    p[m] = t;
                }

                t    = p[0];
                p[0] = p[m];
                p[m] = t;
                i    = 1;
                j    = n - 1;
                for (; ;)
                {
                    for (; ; ++i)
                    {
                        if (!((&p[i])->y0 < (&p[0])->y0))
                        {
                            break;
                        }
                    }

                    for (; ; --j)
                    {
                        if (!((&p[0])->y0 < (&p[j])->y0))
                        {
                            break;
                        }
                    }

                    if (i >= j)
                    {
                        break;
                    }
                    t    = p[i];
                    p[i] = p[j];
                    p[j] = t;
                    ++i;
                    --j;
                }

                if (j < n - i)
                {
                    stbtt__sort_edges_quicksort(p, j);
                    p = p + i;
                    n = n - i;
                }
                else
                {
                    stbtt__sort_edges_quicksort(p + i, n - i);
                    n = j;
                }
            }
        }
 public static void stbtt__sort_edges_quicksort(stbtt__edge *p, int n)
 {
     while ((n) > (12))
     {
         stbtt__edge t   = new stbtt__edge();
         int         c01 = 0;
         int         c12 = 0;
         int         c   = 0;
         int         m   = 0;
         int         i   = 0;
         int         j   = 0;
         m   = (int)(n >> 1);
         c01 = (int)(((&p[0])->y0) < ((&p[m])->y0) ? 1 : 0);
         c12 = (int)(((&p[m])->y0) < ((&p[n - 1])->y0) ? 1 : 0);
         if (c01 != c12)
         {
             int z = 0;
             c    = (int)(((&p[0])->y0) < ((&p[n - 1])->y0) ? 1 : 0);
             z    = (int)(((c) == (c12)) ? 0 : n - 1);
             t    = (stbtt__edge)(p[z]);
             p[z] = (stbtt__edge)(p[m]);
             p[m] = (stbtt__edge)(t);
         }
         t    = (stbtt__edge)(p[0]);
         p[0] = (stbtt__edge)(p[m]);
         p[m] = (stbtt__edge)(t);
         i    = (int)(1);
         j    = (int)(n - 1);
         for (; ;)
         {
             for (; ; ++i)
             {
                 if (!(((&p[i])->y0) < ((&p[0])->y0)))
                 {
                     break;
                 }
             }
             for (; ; --j)
             {
                 if (!(((&p[0])->y0) < ((&p[j])->y0)))
                 {
                     break;
                 }
             }
             if ((i) >= (j))
             {
                 break;
             }
             t    = (stbtt__edge)(p[i]);
             p[i] = (stbtt__edge)(p[j]);
             p[j] = (stbtt__edge)(t);
             ++i;
             --j;
         }
         if ((j) < (n - i))
         {
             stbtt__sort_edges_quicksort(p, (int)(j));
             p = p + i;
             n = (int)(n - i);
         }
         else
         {
             stbtt__sort_edges_quicksort(p + i, (int)(n - i));
             n = (int)(j);
         }
     }
 }
        public static void stbtt__sort_edges_quicksort(stbtt__edge *p, int n)
        {
            while ((n) > (12))
            {
                stbtt__edge t   = new stbtt__edge();
                int         c01 = 0;
                int         c12 = 0;
                int         c   = 0;
                int         m   = 0;
                int         i   = 0;
                int         j   = 0;
                m   = (int)(n >> 1);
                c01 = (int)(((&p[0])->y0) < ((&p[m])->y0) ? 1 : 0);
                c12 = (int)(((&p[m])->y0) < ((&p[n - 1])->y0) ? 1 : 0);
                if (c01 != c12)
                {
                    int z = 0;
                    c    = (int)(((&p[0])->y0) < ((&p[n - 1])->y0) ? 1 : 0);
                    z    = (int)(((c) == (c12)) ? 0 : n - 1);
                    t    = (stbtt__edge)(p[z]);
                    p[z] = (stbtt__edge)(p[m]);
                    p[m] = (stbtt__edge)(t);
                }
                t    = (stbtt__edge)(p[0]);
                p[0] = (stbtt__edge)(p[m]);
                p[m] = (stbtt__edge)(t);
                i    = (int)(1);
                j    = (int)(n - 1);
                for (; ;)
                {
#pragma warning disable CS1717 // Assignment made to same variable
                    for (i = (int)(i); ; ++i)
                    {
                        if (!(((&p[i])->y0) < ((&p[0])->y0)))
                        {
                            break;
                        }
                    }
                    for (j = (int)(j); ; --j)
                    {
                        if (!(((&p[0])->y0) < ((&p[j])->y0)))
                        {
                            break;
                        }
                    }
                    if ((i) >= (j))
                    {
                        break;
                    }
                    t    = (stbtt__edge)(p[i]);
                    p[i] = (stbtt__edge)(p[j]);
                    p[j] = (stbtt__edge)(t);
                    ++i;
                    --j;
#pragma warning restore CS1717 // Assignment made to same variable
                }
                if ((j) < (n - i))
                {
                    stbtt__sort_edges_quicksort(p, (int)(j));
                    p = p + i;
                    n = (int)(n - i);
                }
                else
                {
                    stbtt__sort_edges_quicksort(p + i, (int)(n - i));
                    n = (int)(j);
                }
            }
        }