Files
oboe/osx/tools/graphtool.h

144 lines
4.7 KiB
C++

/*
* graphtool.h
* BoE
*
* Created by Celtic Minstrel on 16/04/09.
*
*/
#ifndef GRAPHTOOL_H
#define GRAPHTOOL_H
#include <string>
#include <functional>
#include <boost/filesystem/path.hpp>
#include <SFML/Graphics.hpp>
#include "location.h"
namespace fs = boost::filesystem;
#define LINES_IN_TEXT_WIN 11
#define NUM_TER_SHEETS 7
#define NUM_MONST_SHEETS 11
struct m_pic_index_t {
unsigned char i, x, y;
};
enum eFont {
FONT_PLAIN,
FONT_BOLD,
FONT_DUNGEON,
FONT_MAIDWORD
};
struct TextStyle {
bool italic = false, underline = false;
eFont font = FONT_BOLD;
int pointSize = 10, lineHeight;
sf::Color colour;
TextStyle() : colour(sf::Color::Black) {}
void applyTo(sf::Text& text);
};
class Region {
std::vector<std::shared_ptr<sf::Shape>> shapes;
void setStencil(sf::RenderWindow& where);
friend void clip_region(sf::RenderWindow& where, Region& region);
public:
void addEllipse(RECT frame);
void addRect(RECT rect);
void clear();
void offset(int x, int y);
void offset(location off);
Region& operator-=(Region& other);
RECT getEnclosingRect();
};
typedef unsigned short pic_num_t;
static const pic_num_t NO_PIC = std::numeric_limits<pic_num_t>::max();
using graf_pos = std::pair<sf::Texture*,RECT>;
using graf_pos_ref = std::pair<sf::Texture*&,RECT&>;
using hilite_t = std::pair<size_t,size_t>;
struct cCustomGraphics {
size_t numSheets;
sf::Texture* sheets = NULL;
sf::Texture* party = NULL;
bool is_old = false;
void clear() {
if(sheets != NULL) delete[] sheets;
sheets = NULL;
}
~cCustomGraphics() {
if(party != NULL) delete party;
}
explicit operator bool() {
return sheets;
}
graf_pos find_graphic(pic_num_t pic, bool party = false);
size_t count();
};
struct snippet_t {
std::string text;
location at;
bool hilited;
};
struct tessel_ref_t {
int key;
};
bool operator==(const tessel_ref_t& a, const tessel_ref_t& b);
enum class eTextMode {
WRAP,
CENTRE,
LEFT_TOP,
LEFT_BOTTOM,
};
void init_graph_tool();
void rect_draw_some_item(sf::RenderTarget& targ_gworld,RECT targ_rect);
void rect_draw_some_item(const sf::Texture& src_gworld,RECT src_rect,sf::RenderTarget& targ_gworld,RECT targ_rect,sf::BlendMode mode = sf::BlendNone);
void rect_draw_some_item(const sf::Texture& src_gworld,RECT src_rect,RECT targ_rect,location offset,sf::BlendMode mode = sf::BlendNone);
void rect_draw_some_item(const sf::Texture& src_gworld,RECT src_rect,const sf::Texture& mask_gworld,RECT mask_rect,sf::RenderTarget& targ_gworld,RECT targ_rect);
std::vector<RECT> draw_string_hilite(sf::RenderTarget& dest_window,RECT dest_rect,std::string str,TextStyle style,std::vector<hilite_t> hilites,sf::Color hiliteClr);
std::vector<snippet_t> draw_string_sel(sf::RenderTarget& dest_window,RECT dest_rect,std::string str,TextStyle style,std::vector<hilite_t> hilites,sf::Color hiliteClr);
void win_draw_string(sf::RenderTarget& dest_window,RECT dest_rect,std::string str,eTextMode mode,TextStyle style, location offset = {0,0});
short string_length(std::string str, TextStyle style);
//OSStatus flip_pict(OSType domain, OSType type, short id, void *ptr, UInt32 size, bool isNative, void *refcon);
//void draw_terrain();
RECT calc_rect(short i, short j);
void setActiveRenderTarget(sf::RenderTarget& where);
void flushTessels(sf::Texture& alteredImg);
tessel_ref_t prepareForTiling(sf::Texture& srcImg, RECT srcRect);
void tileImage(sf::RenderTarget& target, RECT area, tessel_ref_t tessel, sf::BlendMode mode = sf::BlendNone);
void tileImage(sf::RenderWindow& target, Region& rgn, tessel_ref_t tessel, sf::BlendMode mode = sf::BlendNone);
void fill_rect(sf::RenderTarget& target, RECT rect, sf::Color colour);
void frame_rect(sf::RenderTarget& target, RECT rect, sf::Color colour);
void fill_circle(sf::RenderTarget& target, RECT rect, sf::Color colour);
void frame_circle(sf::RenderTarget& target, RECT rect, sf::Color colour);
void fill_roundrect(sf::RenderTarget& target, RECT rect, int rad, sf::Color colour);
void frame_roundrect(sf::RenderTarget& target, RECT rect, int rad, sf::Color colour);
void fill_region(sf::RenderWindow& target, Region& region, sf::Color colour);
void frame_region(sf::RenderWindow& target, Region& region, sf::Color colour);
void draw_line(sf::RenderTarget& target, location from, location to, int thickness, sf::Color colour, sf::BlendMode mode = sf::BlendNone);
void clip_rect(sf::RenderTarget& where, RECT rect);
void clip_region(sf::RenderWindow& where, Region& region);
void undo_clip(sf::RenderTarget& where);
// This probably doesn't quite fit here, but it fits worse pretty much everywhere else in the common sources
short can_see(location p1,location p2,std::function<short(short,short)> get_obscurity);
std::string get_str(std::string list, short j);
#ifndef GRAPHTOOL_CPP
extern m_pic_index_t m_pic_index[200];
extern tessel_ref_t bg[];
#endif
#endif