void Design::drawPolygon(Graphics::ManagedSurface *surface, Common::ReadStream &in, Patterns &patterns, byte fillType, byte borderThickness, byte borderFillType) { byte ignored = in.readSint16BE(); // ignored if (ignored) warning("Ignored: %d", ignored); int numBytes = in.readSint16BE(); // #bytes used by polygon data, including the numBytes int16 by1 = in.readSint16BE(); int16 bx1 = in.readSint16BE(); int16 by2 = in.readSint16BE(); int16 bx2 = in.readSint16BE(); Common::Rect bbox(bx1, by1, bx2, by2); numBytes -= 8; int y1 = in.readSint16BE(); int x1 = in.readSint16BE(); Common::Array<int> xcoords; Common::Array<int> ycoords; numBytes -= 6; while (numBytes > 0) { int y2 = y1; int x2 = x1; int b = in.readSByte(); if (b == -128) { y2 = in.readSint16BE(); numBytes -= 3; } else { y2 += b; numBytes -= 1; } b = in.readSByte(); if (b == -128) { x2 = in.readSint16BE(); numBytes -= 3; } else { x2 += b; numBytes -= 1; } xcoords.push_back(x1); ycoords.push_back(y1); x1 = x2; y1 = y2; } xcoords.push_back(x1); ycoords.push_back(y1); int npoints = xcoords.size(); int *xpoints = (int *)calloc(npoints, sizeof(int)); int *ypoints = (int *)calloc(npoints, sizeof(int)); for (int i = 0; i < npoints; i++) { xpoints[i] = xcoords[i]; ypoints[i] = ycoords[i]; } PlotData pd(surface, &patterns, fillType, 1, this); if (fillType <= patterns.size()) { Graphics::drawPolygonScan(xpoints, ypoints, npoints, bbox, kColorBlack, drawPixel, &pd); } pd.fillType = borderFillType; pd.thickness = borderThickness; if (borderThickness > 0 && borderFillType <= patterns.size()) { for (int i = 1; i < npoints; i++) Graphics::drawLine(xpoints[i-1], ypoints[i-1], xpoints[i], ypoints[i], kColorBlack, drawPixel, &pd); } free(xpoints); free(ypoints); }