public abstract GetPixelColor ( int x, int y ) : |
||
x | int | Координата x |
y | int | Координата y |
Résultat |
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; } } } }
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; } } } }