1 /* 2 Copyright (C) 2003 - 2018 by David White <dave@whitevine.net> 3 Part of the Battle for Wesnoth Project https://www.wesnoth.org/ 4 5 This program is free software; you can redistribute it and/or modify 6 it under the terms of the GNU General Public License as published by 7 the Free Software Foundation; either version 2 of the License, or 8 (at your option) any later version. 9 This program is distributed in the hope that it will be useful, 10 but WITHOUT ANY WARRANTY. 11 12 See the COPYING file for more details. 13 */ 14 15 /** @file */ 16 17 #pragma once 18 19 class display; 20 21 #include "map/location.hpp" 22 23 #include <memory> 24 25 namespace halo 26 { 27 28 29 class halo_impl; 30 31 class halo_record; 32 33 typedef std::shared_ptr<halo_record> handle; 34 35 enum ORIENTATION { NORMAL, HREVERSE, VREVERSE, HVREVERSE }; 36 37 const int NO_HALO = 0; 38 39 class manager 40 { 41 public: 42 manager(display& screen); 43 44 /** 45 * Add a haloing effect using 'image centered on (x,y). 46 * @return The handle to the halo object. 47 * @retval 0 is the invalid handle. 48 * 49 * If the halo is attached to an item, it needs to be hidden if the 50 * shroud is active. (Note it will be shown with the fog active.) 51 * If it is not attached to an item, the location should be set to -1, -1 52 */ 53 handle add(int x, int y, const std::string& image, const map_location& loc, 54 halo::ORIENTATION orientation=NORMAL, bool infinite=true); 55 56 /** Set the position of an existing haloing effect, according to its handle. */ 57 void set_location(const handle & h, int x, int y); 58 59 /** Remove the halo with the given handle. */ 60 void remove(const handle & h); 61 62 /** 63 * Render and unrender haloes. 64 * 65 * Which haloes are rendered is determined by invalidated_locations and the 66 * internal state in the control sets (in halo.cpp). 67 */ 68 void unrender(std::set<map_location> invalidated_locations); 69 void render(); 70 71 private: 72 std::shared_ptr<halo_impl> impl_; 73 }; 74 75 /** 76 * RAII object which manages a halo. When it goes out of scope it removes the corresponding halo entry. 77 */ 78 class halo_record 79 { 80 public: 81 halo_record(const halo_record&) = delete; 82 halo_record& operator=(const halo_record&) = delete; 83 84 halo_record(); 85 halo_record(int id, const std::shared_ptr<halo_impl> & my_manager); 86 ~halo_record(); 87 valid() const88 bool valid() const { 89 return id_ != NO_HALO && !my_manager_.expired(); 90 } 91 92 friend class manager; 93 private: 94 int id_; 95 std::weak_ptr<halo_impl> my_manager_; 96 97 }; 98 99 } // end namespace halo 100