src/emu/tilemap.c
| r982 | r983 | |
| 25 | 25 | /* invalid logical index */ |
| 26 | 26 | #define INVALID_LOGICAL_INDEX ((tilemap_logical_index)~0) |
| 27 | 27 | |
| 28 | /* tilemap pixel grouping optimization */ |
| 29 | #ifdef MESS |
| 30 | #define TILE_PIXEL_GROUPING 0x01 |
| 31 | #else |
| 32 | #define TILE_PIXEL_GROUPING 0x02 |
| 33 | #endif |
| 28 | 34 | |
| 29 | 35 | |
| 36 | |
| 30 | 37 | /*************************************************************************** |
| 31 | 38 | TYPE DEFINITIONS |
| 32 | 39 | ***************************************************************************/ |
| r982 | r983 | |
| 1272 | 1279 | dx0 = -1; |
| 1273 | 1280 | } |
| 1274 | 1281 | |
| 1275 | | /* we draw in groups of 2 pixels, so halve the width now */ |
| 1276 | | width /= 2; |
| 1282 | /* we draw in groups of TILE_PIXEL_GROUPING pixels, so divide it out now */ |
| 1283 | if ((width % TILE_PIXEL_GROUPING) != 0) |
| 1284 | fatalerror("Odd tilemap width; tilemap.c draws in groups of %d, and width=%d", TILE_PIXEL_GROUPING, width); |
| 1285 | width /= TILE_PIXEL_GROUPING; |
| 1277 | 1286 | |
| 1278 | 1287 | /* iterate over rows */ |
| 1279 | 1288 | for (ty = 0; ty < height; ty++) |
| r982 | r983 | |
| 1281 | 1290 | UINT16 *pixptr = BITMAP_ADDR16(pixmap, y0, x0); |
| 1282 | 1291 | UINT8 *flagsptr = BITMAP_ADDR8(flagsmap, y0, x0); |
| 1283 | 1292 | int xoffs = 0; |
| 1293 | int nibble = 0; |
| 1284 | 1294 | |
| 1285 | 1295 | /* pre-advance to the next row */ |
| 1286 | 1296 | y0 += dy0; |
| r982 | r983 | |
| 1291 | 1301 | for (tx = 0; tx < width; tx++) |
| 1292 | 1302 | { |
| 1293 | 1303 | UINT8 pen, map; |
| 1304 | int i; |
| 1294 | 1305 | |
| 1295 | | pen = *pendata++; |
| 1296 | | map = penmap[pen]; |
| 1297 | | pixptr[xoffs] = palette_base + pen; |
| 1298 | | flagsptr[xoffs] = map | category; |
| 1299 | | andmask &= map; |
| 1300 | | ormask |= map; |
| 1301 | | xoffs += dx0; |
| 1302 | | |
| 1303 | | pen = *pendata++; |
| 1304 | | map = penmap[pen]; |
| 1305 | | pixptr[xoffs] = palette_base + pen; |
| 1306 | | flagsptr[xoffs] = map | category; |
| 1307 | | andmask &= map; |
| 1308 | | ormask |= map; |
| 1309 | | xoffs += dx0; |
| 1306 | for (i = 0; i < TILE_PIXEL_GROUPING; i++) |
| 1307 | { |
| 1308 | pen = *pendata++; |
| 1309 | map = penmap[pen]; |
| 1310 | pixptr[xoffs] = palette_base + pen; |
| 1311 | flagsptr[xoffs] = map | category; |
| 1312 | andmask &= map; |
| 1313 | ormask |= map; |
| 1314 | xoffs += dx0; |
| 1315 | } |
| 1310 | 1316 | } |
| 1311 | 1317 | } |
| 1312 | 1318 | |
| r982 | r983 | |
| 1315 | 1321 | { |
| 1316 | 1322 | for (tx = 0; tx < width; tx++) |
| 1317 | 1323 | { |
| 1318 | | UINT8 data = *pendata++; |
| 1324 | UINT8 data = 0; |
| 1319 | 1325 | UINT8 pen, map; |
| 1326 | int i; |
| 1320 | 1327 | |
| 1321 | | pen = data & 0x0f; |
| 1322 | | map = penmap[pen]; |
| 1323 | | pixptr[xoffs] = palette_base + pen; |
| 1324 | | flagsptr[xoffs] = map | category; |
| 1325 | | andmask &= map; |
| 1326 | | ormask |= map; |
| 1327 | | xoffs += dx0; |
| 1328 | | |
| 1329 | | pen = data >> 4; |
| 1330 | | map = penmap[pen]; |
| 1331 | | pixptr[xoffs] = palette_base + pen; |
| 1332 | | flagsptr[xoffs] = map | category; |
| 1333 | | andmask &= map; |
| 1334 | | ormask |= map; |
| 1335 | | xoffs += dx0; |
| 1328 | for (i = 0; i < TILE_PIXEL_GROUPING; i++) |
| 1329 | { |
| 1330 | if ((nibble++ % 2) == 0) |
| 1331 | { |
| 1332 | data = *pendata++; |
| 1333 | pen = data & 0x0f; |
| 1334 | } |
| 1335 | else |
| 1336 | pen = data >> 4; |
| 1337 | map = penmap[pen]; |
| 1338 | pixptr[xoffs] = palette_base + pen; |
| 1339 | flagsptr[xoffs] = map | category; |
| 1340 | andmask &= map; |
| 1341 | ormask |= map; |
| 1342 | xoffs += dx0; |
| 1343 | } |
| 1336 | 1344 | } |
| 1337 | 1345 | } |
| 1338 | 1346 | } |
| r982 | r983 | |
| 1376 | 1384 | dx0 = -1; |
| 1377 | 1385 | } |
| 1378 | 1386 | |
| 1379 | | /* we draw in groups of 2 pixels, so halve the width now */ |
| 1380 | | width /= 2; |
| 1387 | /* we draw in groups of TILE_PIXEL_GROUPING pixels, so divide it out now */ |
| 1388 | if ((width % TILE_PIXEL_GROUPING) != 0) |
| 1389 | fatalerror("Odd tilemap width; tilemap.c draws in groups of %d, and width=%d", TILE_PIXEL_GROUPING, width); |
| 1390 | width /= TILE_PIXEL_GROUPING; |
| 1381 | 1391 | |
| 1382 | 1392 | /* iterate over rows */ |
| 1383 | 1393 | for (ty = 0; ty < height; ty++) |
| r982 | r983 | |
| 1385 | 1395 | UINT16 *pixptr = BITMAP_ADDR16(pixmap, y0, x0); |
| 1386 | 1396 | UINT8 *flagsptr = BITMAP_ADDR8(flagsmap, y0, x0); |
| 1387 | 1397 | int xoffs = 0; |
| 1398 | int nibble = 0; |
| 1388 | 1399 | |
| 1389 | 1400 | /* pre-advance to the next row */ |
| 1390 | 1401 | y0 += dy0; |
| r982 | r983 | |
| 1396 | 1407 | { |
| 1397 | 1408 | pen_t pen; |
| 1398 | 1409 | UINT8 map; |
| 1410 | int i; |
| 1399 | 1411 | |
| 1400 | | pen = *pendata++; |
| 1401 | | map = penmap[pen]; |
| 1402 | | pixptr[xoffs] = palette_lookup[pen]; |
| 1403 | | flagsptr[xoffs] = map | category; |
| 1404 | | andmask &= map; |
| 1405 | | ormask |= map; |
| 1406 | | xoffs += dx0; |
| 1407 | | |
| 1408 | | pen = *pendata++; |
| 1409 | | map = penmap[pen]; |
| 1410 | | pixptr[xoffs] = palette_lookup[pen]; |
| 1411 | | flagsptr[xoffs] = map | category; |
| 1412 | | andmask &= map; |
| 1413 | | ormask |= map; |
| 1414 | | xoffs += dx0; |
| 1412 | for (i = 0; i < TILE_PIXEL_GROUPING; i++) |
| 1413 | { |
| 1414 | pen = *pendata++; |
| 1415 | map = penmap[pen]; |
| 1416 | pixptr[xoffs] = palette_lookup[pen]; |
| 1417 | flagsptr[xoffs] = map | category; |
| 1418 | andmask &= map; |
| 1419 | ormask |= map; |
| 1420 | xoffs += dx0; |
| 1421 | } |
| 1415 | 1422 | } |
| 1416 | 1423 | } |
| 1417 | 1424 | |
| r982 | r983 | |
| 1420 | 1427 | { |
| 1421 | 1428 | for (tx = 0; tx < width; tx++) |
| 1422 | 1429 | { |
| 1423 | | UINT8 data = *pendata++; |
| 1430 | UINT8 data = 0; |
| 1424 | 1431 | pen_t pen; |
| 1425 | 1432 | UINT8 map; |
| 1433 | int i; |
| 1426 | 1434 | |
| 1427 | | pen = data & 0x0f; |
| 1428 | | map = penmap[pen]; |
| 1429 | | pixptr[xoffs] = palette_lookup[pen]; |
| 1430 | | flagsptr[xoffs] = map | category; |
| 1431 | | andmask &= map; |
| 1432 | | ormask |= map; |
| 1433 | | xoffs += dx0; |
| 1434 | | |
| 1435 | | pen = data >> 4; |
| 1436 | | map = penmap[pen]; |
| 1437 | | pixptr[xoffs] = palette_lookup[pen]; |
| 1438 | | flagsptr[xoffs] = map | category; |
| 1439 | | andmask &= map; |
| 1440 | | ormask |= map; |
| 1441 | | xoffs += dx0; |
| 1435 | for (i = 0; i < TILE_PIXEL_GROUPING; i++) |
| 1436 | { |
| 1437 | if ((nibble++ % 2) == 0) |
| 1438 | { |
| 1439 | data = *pendata++; |
| 1440 | pen = data & 0x0f; |
| 1441 | } |
| 1442 | else |
| 1443 | pen = data >> 4; |
| 1444 | map = penmap[pen]; |
| 1445 | pixptr[xoffs] = palette_lookup[pen]; |
| 1446 | flagsptr[xoffs] = map | category; |
| 1447 | andmask &= map; |
| 1448 | ormask |= map; |
| 1449 | xoffs += dx0; |
| 1450 | } |
| 1442 | 1451 | } |
| 1443 | 1452 | } |
| 1444 | 1453 | } |
| r982 | r983 | |
| 1481 | 1490 | dx0 = -1; |
| 1482 | 1491 | } |
| 1483 | 1492 | |
| 1484 | | /* we draw in groups of 2 pixels, so halve the width now */ |
| 1485 | | width /= 2; |
| 1493 | /* we draw in groups of TILE_PIXEL_GROUPING pixels, so divide it out now */ |
| 1494 | if ((width % TILE_PIXEL_GROUPING) != 0) |
| 1495 | fatalerror("Odd tilemap width; tilemap.c draws in groups of %d, and width=%d", TILE_PIXEL_GROUPING, width); |
| 1496 | width /= TILE_PIXEL_GROUPING; |
| 1486 | 1497 | |
| 1487 | 1498 | /* iterate over rows */ |
| 1488 | 1499 | for (ty = 0; ty < height; ty++) |
| r982 | r983 | |
| 1490 | 1501 | UINT16 *pixptr = BITMAP_ADDR16(pixmap, y0, x0); |
| 1491 | 1502 | UINT8 *flagsptr = BITMAP_ADDR8(flagsmap, y0, x0); |
| 1492 | 1503 | int xoffs = 0; |
| 1504 | int nibble = 0; |
| 1493 | 1505 | |
| 1494 | 1506 | /* pre-advance to the next row */ |
| 1495 | 1507 | y0 += dy0; |
| r982 | r983 | |
| 1501 | 1513 | { |
| 1502 | 1514 | pen_t pen; |
| 1503 | 1515 | UINT8 map; |
| 1516 | int i; |
| 1504 | 1517 | |
| 1505 | | pen = palette_lookup[*pendata++]; |
| 1506 | | map = penmap[pen]; |
| 1507 | | pixptr[xoffs] = pen; |
| 1508 | | flagsptr[xoffs] = map | category; |
| 1509 | | andmask &= map; |
| 1510 | | ormask |= map; |
| 1511 | | xoffs += dx0; |
| 1512 | | |
| 1513 | | pen = palette_lookup[*pendata++]; |
| 1514 | | map = penmap[pen]; |
| 1515 | | pixptr[xoffs] = pen; |
| 1516 | | flagsptr[xoffs] = map | category; |
| 1517 | | andmask &= map; |
| 1518 | | ormask |= map; |
| 1519 | | xoffs += dx0; |
| 1518 | for (i = 0; i < TILE_PIXEL_GROUPING; i++) |
| 1519 | { |
| 1520 | pen = palette_lookup[*pendata++]; |
| 1521 | map = penmap[pen]; |
| 1522 | pixptr[xoffs] = pen; |
| 1523 | flagsptr[xoffs] = map | category; |
| 1524 | andmask &= map; |
| 1525 | ormask |= map; |
| 1526 | xoffs += dx0; |
| 1527 | } |
| 1520 | 1528 | } |
| 1521 | 1529 | } |
| 1522 | 1530 | |
| r982 | r983 | |
| 1525 | 1533 | { |
| 1526 | 1534 | for (tx = 0; tx < width; tx++) |
| 1527 | 1535 | { |
| 1528 | | UINT8 data = *pendata++; |
| 1536 | UINT8 data = 0; |
| 1529 | 1537 | pen_t pen; |
| 1530 | 1538 | UINT8 map; |
| 1539 | int i; |
| 1531 | 1540 | |
| 1532 | | pen = palette_lookup[data & 0x0f]; |
| 1533 | | map = penmap[pen]; |
| 1534 | | pixptr[xoffs] = pen; |
| 1535 | | flagsptr[xoffs] = map | category; |
| 1536 | | andmask &= map; |
| 1537 | | ormask |= map; |
| 1538 | | xoffs += dx0; |
| 1539 | | |
| 1540 | | pen = palette_lookup[data >> 4]; |
| 1541 | | map = penmap[pen]; |
| 1542 | | pixptr[xoffs] = pen; |
| 1543 | | flagsptr[xoffs] = map | category; |
| 1544 | | andmask &= map; |
| 1545 | | ormask |= map; |
| 1546 | | xoffs += dx0; |
| 1541 | for (i = 0; i < TILE_PIXEL_GROUPING; i++) |
| 1542 | { |
| 1543 | if ((nibble++ % 2) == 0) |
| 1544 | { |
| 1545 | data = *pendata++; |
| 1546 | pen = palette_lookup[data & 0x0f]; |
| 1547 | } |
| 1548 | else |
| 1549 | pen = palette_lookup[data >> 4]; |
| 1550 | map = penmap[pen]; |
| 1551 | pixptr[xoffs] = pen; |
| 1552 | flagsptr[xoffs] = map | category; |
| 1553 | andmask &= map; |
| 1554 | ormask |= map; |
| 1555 | xoffs += dx0; |
| 1556 | } |
| 1547 | 1557 | } |
| 1548 | 1558 | } |
| 1549 | 1559 | } |