From 381bf04bab14528ab47b95a944f67c2769d44b81 Mon Sep 17 00:00:00 2001 From: frosch Date: Sat, 16 Jan 2010 22:44:03 +0000 Subject: [PATCH] (svn r18839) -Codechange: Detriplicate drawing of spritelayouts in the GUI. --- src/newgrf_station.cpp | 34 +++------------------------------- src/rail_cmd.cpp | 22 +++++++--------------- src/sprite.cpp | 40 ++++++++++++++++++++++++++++++++++++++++ src/sprite.h | 1 + src/station_cmd.cpp | 6 +----- 5 files changed, 52 insertions(+), 51 deletions(-) diff --git a/src/newgrf_station.cpp b/src/newgrf_station.cpp index 418da8a6a3..992d5d8aaa 100644 --- a/src/newgrf_station.cpp +++ b/src/newgrf_station.cpp @@ -11,7 +11,6 @@ #include "stdafx.h" #include "variables.h" -#include "landscape.h" #include "debug.h" #include "station_base.h" #include "waypoint_base.h" @@ -28,7 +27,6 @@ #include "animated_tile_func.h" #include "functions.h" #include "tunnelbridge_map.h" -#include "spritecache.h" #include "newgrf.h" #include "core/random_func.hpp" @@ -880,17 +878,14 @@ bool DrawStationTile(int x, int y, RailType railtype, Axis axis, StationClassID { const StationSpec *statspec; const DrawTileSprites *sprites; - const DrawTileSeqStruct *seq; const RailtypeInfo *rti = GetRailTypeInfo(railtype); - SpriteID relocation; - SpriteID image; SpriteID palette = COMPANY_SPRITE_COLOUR(_local_company); uint tile = 2; statspec = GetCustomStationSpec(sclass, station); if (statspec == NULL) return false; - relocation = GetCustomStationRelocation(statspec, NULL, INVALID_TILE); + uint relocation = GetCustomStationRelocation(statspec, NULL, INVALID_TILE); if (HasBit(statspec->callback_mask, CBM_STATION_SPRITE_LAYOUT)) { uint16 callback = GetStationCallback(CBID_STATION_SPRITE_LAYOUT, 0x2110000, 0, statspec, NULL, INVALID_TILE); @@ -903,7 +898,7 @@ bool DrawStationTile(int x, int y, RailType railtype, Axis axis, StationClassID sprites = &statspec->renderdata[(tile < statspec->tiles) ? tile + axis : (uint)axis]; } - image = sprites->ground.sprite; + SpriteID image = sprites->ground.sprite; SpriteID pal = sprites->ground.pal; if (HasBit(image, SPRITE_MODIFIER_USE_OFFSET)) { image += GetCustomStationGroundRelocation(statspec, NULL, INVALID_TILE); @@ -914,30 +909,7 @@ bool DrawStationTile(int x, int y, RailType railtype, Axis axis, StationClassID DrawSprite(image, GroundSpritePaletteTransform(image, pal, palette), x, y); - Point child_offset = {0, 0}; - - foreach_draw_tile_seq(seq, sprites->seq) { - image = seq->image.sprite; - if (HasBit(image, SPRITE_MODIFIER_USE_OFFSET)) { - image += rti->total_offset; - } else { - image += relocation; - } - - pal = SpriteLayoutPaletteTransform(image, seq->image.pal, palette); - - if ((byte)seq->delta_z != 0x80) { - Point pt = RemapCoords(seq->delta_x, seq->delta_y, seq->delta_z); - DrawSprite(image, pal, x + pt.x, y + pt.y); - - const Sprite *spr = GetSprite(image & SPRITE_MASK, ST_NORMAL); - child_offset.x = pt.x + spr->x_offs; - child_offset.y = pt.y + spr->y_offs; - } else { - /* For stations and original spritelayouts delta_x and delta_y are signed */ - DrawSprite(image, pal, x + child_offset.x + seq->delta_x, y + child_offset.y + seq->delta_y); - } - } + DrawCommonTileSeqInGUI(x, y, sprites, rti->total_offset, relocation, palette); return true; } diff --git a/src/rail_cmd.cpp b/src/rail_cmd.cpp index f1e74e9995..d7622d8315 100644 --- a/src/rail_cmd.cpp +++ b/src/rail_cmd.cpp @@ -1986,28 +1986,20 @@ static void DrawTile_Track(TileInfo *ti) DrawBridgeMiddle(ti); } - -static void DrawTileSequence(int x, int y, SpriteID ground, const DrawTileSeqStruct *dtss, uint32 offset) -{ - SpriteID palette = COMPANY_SPRITE_COLOUR(_local_company); - - DrawSprite(ground, PAL_NONE, x, y); - for (; dtss->image.sprite != 0; dtss++) { - Point pt = RemapCoords(dtss->delta_x, dtss->delta_y, dtss->delta_z); - SpriteID image = dtss->image.sprite + offset; - - DrawSprite(image, HasBit(image, PALETTE_MODIFIER_COLOUR) ? palette : PAL_NONE, x + pt.x, y + pt.y); - } -} - void DrawTrainDepotSprite(int x, int y, int dir, RailType railtype) { const DrawTileSprites *dts = &_depot_gfx_table[dir]; SpriteID image = dts->ground.sprite; uint32 offset = GetRailTypeInfo(railtype)->total_offset; + x += 33; + y += 17; + if (image != SPR_FLAT_GRASS_TILE) image += offset; - DrawTileSequence(x + 33, y + 17, image, dts->seq, offset); + SpriteID palette = COMPANY_SPRITE_COLOUR(_local_company); + + DrawSprite(image, PAL_NONE, x, y); + DrawCommonTileSeqInGUI(x, y, dts, offset, 0, palette); } static uint GetSlopeZ_Track(TileIndex tile, uint x, uint y) diff --git a/src/sprite.cpp b/src/sprite.cpp index 1edaa29095..574cc1d31f 100644 --- a/src/sprite.cpp +++ b/src/sprite.cpp @@ -13,6 +13,8 @@ #include "sprite.h" #include "tile_cmd.h" #include "viewport_func.h" +#include "landscape.h" +#include "spritecache.h" #include "table/sprites.h" @@ -56,3 +58,41 @@ void DrawCommonTileSeq(const TileInfo *ti, const DrawTileSprites *dts, Transpare } } } + +/** + * Draws a tile sprite sequence in the GUI + * @param x X position to draw to + * @param y Y position to draw to + * @param dts Sprite and subsprites to draw + * @param orig_offset Sprite-Offset for original sprites + * @param newgrf_offset Sprite-Offset for NewGRF defined sprites + * @param default_palette The default recolour sprite to use (typically company colour) + */ +void DrawCommonTileSeqInGUI(int x, int y, const DrawTileSprites *dts, int32 orig_offset, uint32 newgrf_offset, SpriteID default_palette) +{ + const DrawTileSeqStruct *dtss; + Point child_offset = {0, 0}; + + foreach_draw_tile_seq(dtss, dts->seq) { + SpriteID image = dtss->image.sprite; + if (newgrf_offset == 0 || HasBit(image, SPRITE_MODIFIER_USE_OFFSET)) { + image += orig_offset; + } else { + image += newgrf_offset; + } + + SpriteID pal = SpriteLayoutPaletteTransform(image, dtss->image.pal, default_palette); + + if ((byte)dtss->delta_z != 0x80) { + Point pt = RemapCoords(dtss->delta_x, dtss->delta_y, dtss->delta_z); + DrawSprite(image, pal, x + pt.x, y + pt.y); + + const Sprite *spr = GetSprite(image & SPRITE_MASK, ST_NORMAL); + child_offset.x = pt.x + spr->x_offs; + child_offset.y = pt.y + spr->y_offs; + } else { + /* For stations and original spritelayouts delta_x and delta_y are signed */ + DrawSprite(image, pal, x + child_offset.x + dtss->delta_x, y + child_offset.y + dtss->delta_y); + } + } +} diff --git a/src/sprite.h b/src/sprite.h index c0d37d9ce0..5251f7a3b4 100644 --- a/src/sprite.h +++ b/src/sprite.h @@ -69,6 +69,7 @@ struct DrawBuildingsTileStruct { #define foreach_draw_tile_seq(idx, list) for (idx = list; ((byte) idx->delta_x) != 0x80; idx++) void DrawCommonTileSeq(const struct TileInfo *ti, const DrawTileSprites *dts, TransparencyOption to, int32 orig_offset, uint32 newgrf_offset, SpriteID default_palette); +void DrawCommonTileSeqInGUI(int x, int y, const DrawTileSprites *dts, int32 orig_offset, uint32 newgrf_offset, SpriteID default_palette); bool SkipSpriteData(byte type, uint16 num); diff --git a/src/station_cmd.cpp b/src/station_cmd.cpp index e3e0411957..9fcd078f2a 100644 --- a/src/station_cmd.cpp +++ b/src/station_cmd.cpp @@ -2476,11 +2476,7 @@ void StationPickerDrawSprite(int x, int y, StationType st, RailType railtype, Ro DrawSprite(SPR_TRAMWAY_TRAM + (t->ground.sprite == SPR_ROAD_PAVED_STRAIGHT_X ? 1 : 0), PAL_NONE, x, y); } - const DrawTileSeqStruct *dtss; - foreach_draw_tile_seq(dtss, t->seq) { - Point pt = RemapCoords(dtss->delta_x, dtss->delta_y, dtss->delta_z); - DrawSprite(dtss->image.sprite + total_offset, pal, x + pt.x, y + pt.y); - } + DrawCommonTileSeqInGUI(x, y, t, total_offset, 0, pal); } static uint GetSlopeZ_Station(TileIndex tile, uint x, uint y)