Previous 15994 Revisions Next

r983 Sunday 16th September, 2007 at 16:20:04 UTC by Nathan Woods
Fixed an Apple II regression that occured because of an assumption that tilemaps
would always have even widths
[src/emu]tilemap.c

src/emu/tilemap.c
r982r983
2525/* invalid logical index */
2626#define INVALID_LOGICAL_INDEX         ((tilemap_logical_index)~0)
2727
28/* tilemap pixel grouping optimization */
29#ifdef MESS
30#define TILE_PIXEL_GROUPING            0x01
31#else
32#define TILE_PIXEL_GROUPING            0x02
33#endif
2834
2935
36
3037/***************************************************************************
3138    TYPE DEFINITIONS
3239***************************************************************************/
r982r983
12721279      dx0 = -1;
12731280   }
12741281
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;
12771286
12781287   /* iterate over rows */
12791288   for (ty = 0; ty < height; ty++)
r982r983
12811290      UINT16 *pixptr = BITMAP_ADDR16(pixmap, y0, x0);
12821291      UINT8 *flagsptr = BITMAP_ADDR8(flagsmap, y0, x0);
12831292      int xoffs = 0;
1293      int nibble = 0;
12841294
12851295      /* pre-advance to the next row */
12861296      y0 += dy0;
r982r983
12911301         for (tx = 0; tx < width; tx++)
12921302         {
12931303            UINT8 pen, map;
1304            int i;
12941305
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            }
13101316         }
13111317      }
13121318
r982r983
13151321      {
13161322         for (tx = 0; tx < width; tx++)
13171323         {
1318            UINT8 data = *pendata++;
1324            UINT8 data = 0;
13191325            UINT8 pen, map;
1326            int i;
13201327
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            }
13361344         }
13371345      }
13381346   }
r982r983
13761384      dx0 = -1;
13771385   }
13781386
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;
13811391
13821392   /* iterate over rows */
13831393   for (ty = 0; ty < height; ty++)
r982r983
13851395      UINT16 *pixptr = BITMAP_ADDR16(pixmap, y0, x0);
13861396      UINT8 *flagsptr = BITMAP_ADDR8(flagsmap, y0, x0);
13871397      int xoffs = 0;
1398      int nibble = 0;
13881399
13891400      /* pre-advance to the next row */
13901401      y0 += dy0;
r982r983
13961407         {
13971408            pen_t pen;
13981409            UINT8 map;
1410            int i;
13991411
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            }
14151422         }
14161423      }
14171424
r982r983
14201427      {
14211428         for (tx = 0; tx < width; tx++)
14221429         {
1423            UINT8 data = *pendata++;
1430            UINT8 data = 0;
14241431            pen_t pen;
14251432            UINT8 map;
1433            int i;
14261434
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            }
14421451         }
14431452      }
14441453   }
r982r983
14811490      dx0 = -1;
14821491   }
14831492
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;
14861497
14871498   /* iterate over rows */
14881499   for (ty = 0; ty < height; ty++)
r982r983
14901501      UINT16 *pixptr = BITMAP_ADDR16(pixmap, y0, x0);
14911502      UINT8 *flagsptr = BITMAP_ADDR8(flagsmap, y0, x0);
14921503      int xoffs = 0;
1504      int nibble = 0;
14931505
14941506      /* pre-advance to the next row */
14951507      y0 += dy0;
r982r983
15011513         {
15021514            pen_t pen;
15031515            UINT8 map;
1516            int i;
15041517
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            }
15201528         }
15211529      }
15221530
r982r983
15251533      {
15261534         for (tx = 0; tx < width; tx++)
15271535         {
1528            UINT8 data = *pendata++;
1536            UINT8 data = 0;
15291537            pen_t pen;
15301538            UINT8 map;
1539            int i;
15311540
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            }
15471557         }
15481558      }
15491559   }

Previous 15994 Revisions Next


© 1998-2018 The MESS Team