// Work out min and max X and Y int minX = min((int)x1, (int)x2, (int)x3); int maxX = max((int)x1, (int)x2, (int)x3); int minY = min((int)y1, (int)y2, (int)y3); int maxY = max((int)y1, (int)y2, (int)y3); // Make sure they're not outside of the screen if (minX < 0) minX = 0; if (minY < 0) minY = 0; if (maxX >= _width) maxX = _width - 1; if (maxY >= _height) maxY = _height - 1; // Precalculate half-space function coefficients int dx1 = (int)(x1 - x2); int dx2 = (int)(x2 - x3); int dx3 = (int)(x3 - x1); int dy1 = (int)(y1 - y2); int dy2 = (int)(y2 - y3); int dy3 = (int)(y3 - y1); int check1 = (int)((dx1 * minY) - (dx1 * y1) - (dy1 * minX) + (dy1 * x1)); int check2 = (int)((dx2 * minY) - (dx2 * y2) - (dy2 * minX) + (dy2 * x2)); int check3 = (int)((dx3 * minY) - (dx3 * y3) - (dy3 * minX) + (dy3 * x3)); unsigned int* buffer = (unsigned int*)_pixelBuffer; buffer += minY * _width; for (int y = minY; y < maxY; y++) { // Create temporary copies of the checks because they'll be needed when loop ends int check1Temp = check1; int check2Temp = check2; int check3Temp = check3; for (int x = minX; x < maxX; x++) { if(check1Temp > 0 && check2Temp > 0 && check3Temp > 0) { buffer[x] = 0; } check1Temp -= dy1; check2Temp -= dy2; check3Temp -= dy3; } buffer += _width; check1 += dx1; check2 += dx2; check3 += dx3; }