tron@2186: /* $Id$ */ tron@2186: belugas@6919: /** @file viewport.h */ belugas@6919: truelight@0: #ifndef VIEWPORT_H truelight@0: #define VIEWPORT_H truelight@0: truelight@7120: #include "zoom.hpp" truelight@7120: truelight@0: struct ViewPort { rubidium@4344: int left,top; // screen coordinates for the viewport rubidium@4344: int width, height; // screen width/height for the viewport truelight@0: rubidium@4344: int virtual_left, virtual_top; // virtual coordinates rubidium@4344: int virtual_width, virtual_height; // these are just width << zoom, height << zoom truelight@0: truelight@7120: ZoomLevel zoom; truelight@0: }; truelight@0: tron@1990: void SetSelectionRed(bool); tron@1990: belugas@6919: /* viewport.cpp */ rubidium@6573: void InitViewports(); Darkvater@5122: void DeleteWindowViewport(Window *w); truelight@193: void AssignWindowViewport(Window *w, int x, int y, truelight@7120: int width, int height, uint32 follow_flags, ZoomLevel zoom); tron@2116: ViewPort *IsPtInWindowViewport(const Window *w, int x, int y); rubidium@6573: Point GetTileBelowCursor(); Darkvater@5044: void UpdateViewportPosition(Window *w); Darkvater@5044: Darkvater@5044: enum { Darkvater@5044: ZOOM_IN = 0, Darkvater@5044: ZOOM_OUT = 1, Darkvater@5044: ZOOM_NONE = 2, // hack, used to update the button status Darkvater@5044: }; Darkvater@5044: Darkvater@5044: bool DoZoomInOutWindow(int how, Window *w); darkvater@152: void ZoomInOrOutToCursorWindow(bool in, Window * w); darkvater@152: Point GetTileZoomCenterWindow(bool in, Window * w); Darkvater@5045: void HandleZoomMessage(Window *w, const ViewPort *vp, byte widget_zoom_in, byte widget_zoom_out); truelight@0: Darkvater@5046: static inline void MaxZoomInOut(int how, Window *w) Darkvater@5046: { rubidium@7814: while (DoZoomInOutWindow(how, w)) {}; Darkvater@5046: } Darkvater@5046: rubidium@8097: /** rubidium@8097: * Some values for constructing bounding boxes (BB). The Z positions under bridges are: rubidium@8097: * z=0..5 Everything that can be built under low bridges. rubidium@8097: * z=6 reserved, currently unused. rubidium@8097: * z=7 Z separator between bridge/tunnel and the things under/above it. rubidium@8097: */ rubidium@8097: enum { rubidium@8097: BB_HEIGHT_UNDER_BRIDGE = 6, ///< Everything that can be built under low bridges, must not exceed this Z height. rubidium@8097: BB_Z_SEPARATOR = 7, ///< Separates the bridge/tunnel from the things under/above it. rubidium@8097: }; rubidium@8097: truelight@0: void OffsetGroundSprite(int x, int y); truelight@0: rubidium@8177: void DrawGroundSprite(SpriteID image, SpriteID pal, const SubSprite *sub = NULL); rubidium@8177: void DrawGroundSpriteAt(SpriteID image, SpriteID pal, int32 x, int32 y, byte z, const SubSprite *sub = NULL); rubidium@8177: void AddSortableSpriteToDraw(SpriteID image, SpriteID pal, int x, int y, int w, int h, int dz, int z, bool transparent = false, int bb_offset_x = 0, int bb_offset_y = 0, int bb_offset_z = 0, const SubSprite *sub = NULL); rubidium@7502: void *AddStringToDraw(int x, int y, StringID string, uint64 params_1, uint64 params_2); rubidium@8177: void AddChildSpriteScreen(SpriteID image, SpriteID pal, int x, int y, bool transparent = false, const SubSprite *sub = NULL); truelight@0: truelight@0: rubidium@6573: void StartSpriteCombine(); rubidium@6573: void EndSpriteCombine(); truelight@0: tron@2116: void HandleViewportClicked(const ViewPort *vp, int x, int y); rubidium@6573: void PlaceObject(); truelight@0: void SetRedErrorSquare(TileIndex tile); truelight@0: void SetTileSelectSize(int w, int h); truelight@0: void SetTileSelectBigSize(int ox, int oy, int sx, int sy); truelight@0: maedhros@7165: void VpStartPlaceSizing(TileIndex tile, byte method, byte process); truelight@0: void VpSetPresizeRange(uint from, uint to); truelight@0: void VpSetPlaceSizingLimit(int limit); truelight@0: rubidium@6573: Vehicle *CheckMouseOverVehicle(); truelight@0: truelight@0: enum { rubidium@4344: VPM_X_OR_Y = 0, rubidium@4344: VPM_FIX_X = 1, rubidium@4344: VPM_FIX_Y = 2, rubidium@4344: VPM_RAILDIRS = 3, rubidium@4344: VPM_X_AND_Y = 4, truelight@0: VPM_X_AND_Y_LIMITED = 5, rubidium@4344: VPM_SIGNALDIRS = 6 dominik@1070: }; dominik@1070: belugas@6919: /* viewport highlight mode (for highlighting tiles below cursor) */ dominik@1070: enum { belugas@6919: VHM_NONE = 0, ///< default belugas@6919: VHM_RECT = 1, ///< rectangle (stations, depots, ...) belugas@6919: VHM_POINT = 2, ///< point (lower land, raise land, level land, ...) belugas@6919: VHM_SPECIAL = 3, ///< special mode used for highlighting while dragging (and for tunnels/docks) belugas@6919: VHM_DRAG = 4, ///< dragging items in the depot windows belugas@6919: VHM_RAIL = 5, ///< rail pieces truelight@0: }; truelight@0: truelight@0: void VpSelectTilesWithMethod(int x, int y, int method); truelight@0: belugas@6919: /* highlighting draw styles */ Darkvater@4799: typedef byte HighLightStyle; Darkvater@4799: enum HighLightStyles { rubidium@4344: HT_NONE = 0x00, rubidium@4344: HT_RECT = 0x80, rubidium@4344: HT_POINT = 0x40, belugas@6919: HT_LINE = 0x20, ///< used for autorail highlighting (longer streches) belugas@6919: ///< (uses lower bits to indicate direction) belugas@6919: HT_RAIL = 0x10, ///< autorail (one piece) belugas@6919: ///< (uses lower bits to indicate direction) Darkvater@4799: HT_DRAG_MASK = 0xF0, ///< masks the drag-type dominik@1070: tron@1109: /* lower bits (used with HT_LINE and HT_RAIL): dominik@1070: * (see ASCII art in autorail.h for a visual interpretation) */ Darkvater@4799: HT_DIR_X = 0, ///< X direction Darkvater@4799: HT_DIR_Y = 1, ///< Y direction Darkvater@4799: HT_DIR_HU = 2, ///< horizontal upper Darkvater@4799: HT_DIR_HL = 3, ///< horizontal lower Darkvater@4799: HT_DIR_VL = 4, ///< vertical left Darkvater@4799: HT_DIR_VR = 5, ///< vertical right Darkvater@4799: HT_DIR_MASK = 0x7 ///< masks the drag-direction truelight@0: }; truelight@0: rubidium@6574: struct TileHighlightData { truelight@0: Point size; truelight@0: Point outersize; truelight@0: Point pos; truelight@0: Point offs; truelight@0: truelight@0: Point new_pos; truelight@0: Point new_size; truelight@0: Point new_outersize; truelight@0: truelight@0: Point selend, selstart; truelight@0: truelight@0: byte dirty; truelight@0: byte sizelimit; truelight@0: dominik@1070: byte drawstyle; // lower bits 0-3 are reserved for detailed highlight information information dominik@1070: byte new_drawstyle; // only used in UpdateTileSelection() to as a buffer to compare if there was a change between old and new dominik@1070: byte next_drawstyle; // queued, but not yet drawn style truelight@0: truelight@0: byte place_mode; truelight@0: bool make_square_red; tron@873: WindowClass window_class; tron@873: WindowNumber window_number; truelight@0: maedhros@7165: byte select_method; maedhros@7165: byte select_proc; maedhros@7165: truelight@0: TileIndex redsq; rubidium@6574: }; truelight@0: truelight@0: belugas@6919: /* common button handler */ rubidium@5838: bool HandlePlacePushButton(Window *w, int widget, CursorID cursor, int mode, PlaceProc *placeproc); truelight@0: truelight@0: VARDEF Point _tile_fract_coords; truelight@0: tron@1863: extern TileHighlightData _thd; truelight@0: truelight@0: tron@430: void ViewportDoDraw(const ViewPort *vp, int left, int top, int right, int bottom); tron@430: tron@430: #endif /* VIEWPORT_H */