GetPixelColor() public abstract method

Реализация должна вычислять цвет пикселя.
public abstract GetPixelColor ( int x, int y ) : Int32
x int Координата x
y int Координата y
return System.Int32
Example #1
0
        private void addSpans(Orientation orientation, List<PixelSpan> spans, List<float[]> pixelScanIntersections, int scanPosition, FillBase fill)
        {
            if (pixelScanIntersections.Count == 0)
                return;

            float min = float.MaxValue;
            float max = float.MinValue;

            foreach (float[] subPixelSpan in pixelScanIntersections)
                for (int i = 0; i < subPixelSpan.Length; i++)
                {
                    float spsi = subPixelSpan[i];
                    if (spsi < min)
                        min = spsi;
                    if (spsi > max)
                        max = spsi;
                }

            if (max <= min) return;

            float[] pixelCoverage = new float[(int)(max + 2) - (int)min];

            int shift = (int)min;

            // вычисление покрытия пикселей
            foreach (float[] subPixelSpan in pixelScanIntersections)
            {
                int subPixelSpanLength = subPixelSpan.Length; 
                if (subPixelSpanLength > 0)
                {
                    for (int k = 0; k < subPixelSpanLength; k += 2)
                    {
                        float spanStart = subPixelSpan[k];
                        float spanEnd = subPixelSpan[k + 1];

                        // длина пересечения сканирующего отрезка с объектом меньше единицы
                        // и это пересечение не пересекает границы пикселей
                        if ((int)spanEnd == (int)spanStart ||
                            (int)spanEnd == (int)spanStart + 1)
                            if (spanEnd - spanStart < 1)
                            {
                                pixelCoverage[(int)spanStart - shift] += spanEnd - spanStart;
                                continue;
                            }

                        // пиксели, пересеченные сканирующим отрезком "насквозь"
                        float hv = spanEnd - shift - 1;
                        for (int pixelIndex = (int)spanStart + 1 - shift; pixelIndex < hv; pixelIndex++)
                            pixelCoverage[pixelIndex]++;

                        // пиксель, в котором начался сканирующий отрезок
                        pixelCoverage[(int)spanStart - shift] += 1 - (spanStart - (int)spanStart);

                        // пиксель, в котором закончился сканирующий отрезок
                        if (hv == (int)hv)
                            pixelCoverage[(int)hv] += 1;
                        else
                            pixelCoverage[(int)hv + 1] += spanEnd - (int)spanEnd;
                    }
                }
            }

            // вычисление горизонтальных последовательностей символов
            int spanStartIndex = 0;
            bool spanStarted = false;
            int coverageArrayHiIndex = pixelCoverage.Length - 1;
            float alphaStep = 255f / _subPixelLevel;
            for (int i = 0; i <= coverageArrayHiIndex; i++)
            {
                if (!spanStarted)
                {
                    if (pixelCoverage[i] > 0)
                    {
                        spanStartIndex = i;
                        spanStarted = true;
                    }
                }
                else
                {
                    if (pixelCoverage[i] == 0 || i == coverageArrayHiIndex)
                    {
                        Int32[] pixelValues = new int[i - spanStartIndex];
                        int f = 0;
                        switch(orientation)
                        {
                            case Orientation.Horizontal:
                                for (int k = spanStartIndex; k < i; k++)
                                {
                                    double coverage = pixelCoverage[k];
                                    if (coverage > _subPixelLevel)
                                        coverage = _subPixelLevel;

                                    double antiAliasingAlpha = _alphaTable[(int)(coverage / _subPixelLevel * 254f)];

                                    Int32 color = fill.GetPixelColor((int)min + f + spanStartIndex, scanPosition);
                                    byte fillAlpha = (byte)(color >> 24 & 0xFF);
                                    if (fillAlpha == 0)
                                        pixelValues[f] = (byte)(antiAliasingAlpha * 255f) << 24 | color;
                                    else
                                        pixelValues[f] = (byte)(antiAliasingAlpha * fillAlpha) << 24 | (color & 0x00FFFFFF);

                                    f++;
                                }
                                spans.Add(new PixelSpan(Orientation.Horizontal, (int)min + spanStartIndex, scanPosition, pixelValues));
                                break;

                            case Orientation.Vertical:
                                for (int k = spanStartIndex; k < i; k++)
                                {
                                    double coverage = pixelCoverage[k];
                                    if (coverage > _subPixelLevel)
                                        coverage = _subPixelLevel;

                                    double antiAliasingAlpha = _alphaTable[(int)(coverage / _subPixelLevel * 254f)];

                                    Int32 color = fill.GetPixelColor(scanPosition, (int)min + f + spanStartIndex);
                                    byte fillAlpha = (byte)(color >> 24 & 0xFF);
                                    if (fillAlpha == 0)
                                        pixelValues[f] = (byte)(antiAliasingAlpha * 255f) << 24 | color;
                                    else
                                        pixelValues[f] = (byte)(antiAliasingAlpha * fillAlpha) << 24 | (color & 0x00FFFFFF);

                                    f++;
                                }
                                spans.Add(new PixelSpan(Orientation.Vertical, scanPosition, (int)min + spanStartIndex, pixelValues));
                                break;
                        }
                        spanStarted = false;
                    }
                }
            }
        }
Example #2
0
        private void addSpans(Orientation orientation, List <PixelSpan> spans, List <float[]> pixelScanIntersections, int scanPosition, FillBase fill)
        {
            if (pixelScanIntersections.Count == 0)
            {
                return;
            }

            float min = float.MaxValue;
            float max = float.MinValue;

            foreach (float[] subPixelSpan in pixelScanIntersections)
            {
                for (int i = 0; i < subPixelSpan.Length; i++)
                {
                    float spsi = subPixelSpan[i];
                    if (spsi < min)
                    {
                        min = spsi;
                    }
                    if (spsi > max)
                    {
                        max = spsi;
                    }
                }
            }

            if (max <= min)
            {
                return;
            }

            float[] pixelCoverage = new float[(int)(max + 2) - (int)min];

            int shift = (int)min;

            // вычисление покрытия пикселей
            foreach (float[] subPixelSpan in pixelScanIntersections)
            {
                int subPixelSpanLength = subPixelSpan.Length;
                if (subPixelSpanLength > 0)
                {
                    for (int k = 0; k < subPixelSpanLength; k += 2)
                    {
                        float spanStart = subPixelSpan[k];
                        float spanEnd   = subPixelSpan[k + 1];

                        // длина пересечения сканирующего отрезка с объектом меньше единицы
                        // и это пересечение не пересекает границы пикселей
                        if ((int)spanEnd == (int)spanStart ||
                            (int)spanEnd == (int)spanStart + 1)
                        {
                            if (spanEnd - spanStart < 1)
                            {
                                pixelCoverage[(int)spanStart - shift] += spanEnd - spanStart;
                                continue;
                            }
                        }

                        // пиксели, пересеченные сканирующим отрезком "насквозь"
                        float hv = spanEnd - shift - 1;
                        for (int pixelIndex = (int)spanStart + 1 - shift; pixelIndex < hv; pixelIndex++)
                        {
                            pixelCoverage[pixelIndex]++;
                        }

                        // пиксель, в котором начался сканирующий отрезок
                        pixelCoverage[(int)spanStart - shift] += 1 - (spanStart - (int)spanStart);

                        // пиксель, в котором закончился сканирующий отрезок
                        if (hv == (int)hv)
                        {
                            pixelCoverage[(int)hv] += 1;
                        }
                        else
                        {
                            pixelCoverage[(int)hv + 1] += spanEnd - (int)spanEnd;
                        }
                    }
                }
            }

            // вычисление горизонтальных последовательностей символов
            int   spanStartIndex       = 0;
            bool  spanStarted          = false;
            int   coverageArrayHiIndex = pixelCoverage.Length - 1;
            float alphaStep            = 255f / _subPixelLevel;

            for (int i = 0; i <= coverageArrayHiIndex; i++)
            {
                if (!spanStarted)
                {
                    if (pixelCoverage[i] > 0)
                    {
                        spanStartIndex = i;
                        spanStarted    = true;
                    }
                }
                else
                {
                    if (pixelCoverage[i] == 0 || i == coverageArrayHiIndex)
                    {
                        Int32[] pixelValues = new int[i - spanStartIndex];
                        int     f           = 0;
                        switch (orientation)
                        {
                        case Orientation.Horizontal:
                            for (int k = spanStartIndex; k < i; k++)
                            {
                                double coverage = pixelCoverage[k];
                                if (coverage > _subPixelLevel)
                                {
                                    coverage = _subPixelLevel;
                                }

                                double antiAliasingAlpha = _alphaTable[(int)(coverage / _subPixelLevel * 254f)];

                                Int32 color     = fill.GetPixelColor((int)min + f + spanStartIndex, scanPosition);
                                byte  fillAlpha = (byte)(color >> 24 & 0xFF);
                                if (fillAlpha == 0)
                                {
                                    pixelValues[f] = (byte)(antiAliasingAlpha * 255f) << 24 | color;
                                }
                                else
                                {
                                    pixelValues[f] = (byte)(antiAliasingAlpha * fillAlpha) << 24 | (color & 0x00FFFFFF);
                                }

                                f++;
                            }
                            spans.Add(new PixelSpan(Orientation.Horizontal, (int)min + spanStartIndex, scanPosition, pixelValues));
                            break;

                        case Orientation.Vertical:
                            for (int k = spanStartIndex; k < i; k++)
                            {
                                double coverage = pixelCoverage[k];
                                if (coverage > _subPixelLevel)
                                {
                                    coverage = _subPixelLevel;
                                }

                                double antiAliasingAlpha = _alphaTable[(int)(coverage / _subPixelLevel * 254f)];

                                Int32 color     = fill.GetPixelColor(scanPosition, (int)min + f + spanStartIndex);
                                byte  fillAlpha = (byte)(color >> 24 & 0xFF);
                                if (fillAlpha == 0)
                                {
                                    pixelValues[f] = (byte)(antiAliasingAlpha * 255f) << 24 | color;
                                }
                                else
                                {
                                    pixelValues[f] = (byte)(antiAliasingAlpha * fillAlpha) << 24 | (color & 0x00FFFFFF);
                                }

                                f++;
                            }
                            spans.Add(new PixelSpan(Orientation.Vertical, scanPosition, (int)min + spanStartIndex, pixelValues));
                            break;
                        }
                        spanStarted = false;
                    }
                }
            }
        }