mirror of
https://github.com/OpenTTD/OpenTTD.git
synced 2025-03-13 02:52:37 +00:00
(svn r24068) -Change/fix [FS#5103]: significantly reduce the area that is redrawn for text effects (Rhamphoryncus)
This commit is contained in:
parent
180e4e4c66
commit
113746b3a6
@ -89,9 +89,9 @@ void MoveAllTextEffects()
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
te->MarkDirty();
|
te->MarkDirty(ZOOM_LVL_OUT_8X);
|
||||||
te->top -= ZOOM_LVL_BASE;
|
te->top -= ZOOM_LVL_BASE;
|
||||||
te->MarkDirty();
|
te->MarkDirty(ZOOM_LVL_OUT_8X);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -144,6 +144,8 @@ struct ViewportDrawer {
|
|||||||
Point foundation_offset[FOUNDATION_PART_END]; ///< Pixel offset for ground sprites on the foundations.
|
Point foundation_offset[FOUNDATION_PART_END]; ///< Pixel offset for ground sprites on the foundations.
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static void MarkViewportDirty(const ViewPort *vp, int left, int top, int right, int bottom);
|
||||||
|
|
||||||
static ViewportDrawer _vd;
|
static ViewportDrawer _vd;
|
||||||
|
|
||||||
TileHighlightData _thd;
|
TileHighlightData _thd;
|
||||||
@ -1245,20 +1247,31 @@ void ViewportSign::UpdatePosition(int center, int top, StringID str)
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Mark the sign dirty in all viewports.
|
* Mark the sign dirty in all viewports.
|
||||||
|
* @param maxzoom Maximum %ZoomLevel at which the text is visible.
|
||||||
*
|
*
|
||||||
* @ingroup dirty
|
* @ingroup dirty
|
||||||
*/
|
*/
|
||||||
void ViewportSign::MarkDirty() const
|
void ViewportSign::MarkDirty(ZoomLevel maxzoom) const
|
||||||
{
|
{
|
||||||
/* We use ZOOM_LVL_MAX here, as every viewport can have another zoom,
|
Rect zoomlevels[ZOOM_LVL_COUNT];
|
||||||
* and there is no way for us to know which is the biggest. So make the
|
|
||||||
* biggest area dirty, and we are safe for sure.
|
for (ZoomLevel zoom = ZOOM_LVL_BEGIN; zoom != ZOOM_LVL_END; zoom++) {
|
||||||
* We also add 1 to make sure the whole thing is redrawn. */
|
/* FIXME: This doesn't switch to width_small when appropriate. */
|
||||||
MarkAllViewportsDirty(
|
zoomlevels[zoom].left = this->center - ScaleByZoom(this->width_normal / 2 + 1, zoom);
|
||||||
this->center - ScaleByZoom(this->width_normal / 2 + 1, ZOOM_LVL_MAX),
|
zoomlevels[zoom].top = this->top - ScaleByZoom(1, zoom);
|
||||||
this->top - ScaleByZoom(1, ZOOM_LVL_MAX),
|
zoomlevels[zoom].right = this->center + ScaleByZoom(this->width_normal / 2 + 1, zoom);
|
||||||
this->center + ScaleByZoom(this->width_normal / 2 + 1, ZOOM_LVL_MAX),
|
zoomlevels[zoom].bottom = this->top + ScaleByZoom(VPSM_TOP + FONT_HEIGHT_NORMAL + VPSM_BOTTOM + 1, zoom);
|
||||||
this->top + ScaleByZoom(VPSM_TOP + FONT_HEIGHT_NORMAL + VPSM_BOTTOM + 1, ZOOM_LVL_MAX));
|
}
|
||||||
|
|
||||||
|
Window *w;
|
||||||
|
FOR_ALL_WINDOWS_FROM_BACK(w) {
|
||||||
|
ViewPort *vp = w->viewport;
|
||||||
|
if (vp != NULL && vp->zoom <= maxzoom) {
|
||||||
|
assert(vp->width != 0);
|
||||||
|
Rect &zl = zoomlevels[vp->zoom];
|
||||||
|
MarkViewportDirty(vp, zl.left, zl.top, zl.right, zl.bottom);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ViewportDrawTileSprites(const TileSpriteToDrawVector *tstdv)
|
static void ViewportDrawTileSprites(const TileSpriteToDrawVector *tstdv)
|
||||||
|
@ -48,7 +48,7 @@ struct ViewportSign {
|
|||||||
uint16 width_small; ///< The width when zoomed out (small font)
|
uint16 width_small; ///< The width when zoomed out (small font)
|
||||||
|
|
||||||
void UpdatePosition(int center, int top, StringID str);
|
void UpdatePosition(int center, int top, StringID str);
|
||||||
void MarkDirty() const;
|
void MarkDirty(ZoomLevel maxzoom = ZOOM_LVL_MAX) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
Reference in New Issue
Block a user