| 1124 | // specified coordinates. |
| 1125 | |
| 1126 | void DrawFill(int x, int y, KV kv) |
| 1127 | { |
| 1128 | KV kvB, kvF; |
| 1129 | // Variables for bitmap implementation. |
| 1130 | PT2S rgpt[iFillMax]; |
| 1131 | int iTop = 1, iCur = 0, xnew, ynew, d; |
| 1132 | |
| 1133 | if (!FOnWin(x, y)) |
| 1134 | return; |
| 1135 | if (gi.fFile && (!gi.fBmp || gs.ft == ftWmf)) { |
| 1136 | // Use nearest palette fill color in more limited environments. |
| 1137 | kvB = gi.kiOff; |
| 1138 | kvF = KiFromKv(kv, fFalse); |
| 1139 | } else { |
| 1140 | // 24 bit color bitmap environments allow all possible colors. |
| 1141 | kvB = KvFromKi(gi.kiOff); |
| 1142 | kvF = kv; |
| 1143 | } |
| 1144 | if (kvF == kvB) |
| 1145 | return; |
| 1146 | |
| 1147 | if (gi.fFile) { |
| 1148 | if (gs.ft == ftBmp) { |
| 1149 | if (GetXY(x, y) != kvB) |
| 1150 | return; |
| 1151 | SetXY(x, y, kvF); |
| 1152 | rgpt[0].x = x; rgpt[0].y = y; |
| 1153 | // Do a breadth first search to fill in the bitmap area. |
| 1154 | while (iCur != iTop) { |
| 1155 | x = rgpt[iCur].x; y = rgpt[iCur].y; |
| 1156 | for (d = 0; d < 4; d++) { |
| 1157 | xnew = x + dxOff[d]; ynew = y + dyOff[d]; |
| 1158 | if (!FOnWin(xnew, ynew) || GetXY(xnew, ynew) != kvB) |
| 1159 | continue; |
| 1160 | if (iTop == iCur) // If array completely full, skip and don't add! |
| 1161 | continue; |
| 1162 | SetXY(xnew, ynew, kvF); |
| 1163 | rgpt[iTop].x = xnew; rgpt[iTop].y = ynew; |
| 1164 | iTop++; |
| 1165 | if (iTop >= iFillMax) |
| 1166 | iTop = 0; |
| 1167 | } |
| 1168 | iCur++; |
| 1169 | if (iCur >= iFillMax) |
| 1170 | iCur = 0; |
| 1171 | } |
| 1172 | } |
| 1173 | #ifdef META |
| 1174 | else if (gs.ft == ftWmf) { |
| 1175 | // Doesn't seem to work for background colors other than black. |
| 1176 | gi.kiFillDes = kvF; |
| 1177 | MetaSelect(); |
| 1178 | MetaFill(x, y, kvB); |
| 1179 | return; |
| 1180 | } |
| 1181 | #endif |
| 1182 | // Not implemented in PostScript, SVG, or wireframe formats. |
| 1183 | } |
no test coverage detected