First pass at windowing, track df2mc, stonesense
parent
6aa2a3e676
commit
a45fc82743
@ -0,0 +1,275 @@
|
|||||||
|
/*
|
||||||
|
https://github.com/peterix/dfhack
|
||||||
|
Copyright (c) 2009-2011 Petr Mrázek (peterix@gmail.com)
|
||||||
|
|
||||||
|
This software is provided 'as-is', without any express or implied
|
||||||
|
warranty. In no event will the authors be held liable for any
|
||||||
|
damages arising from the use of this software.
|
||||||
|
|
||||||
|
Permission is granted to anyone to use this software for any
|
||||||
|
purpose, including commercial applications, and to alter it and
|
||||||
|
redistribute it freely, subject to the following restrictions:
|
||||||
|
|
||||||
|
1. The origin of this software must not be misrepresented; you must
|
||||||
|
not claim that you wrote the original software. If you use this
|
||||||
|
software in a product, an acknowledgment in the product documentation
|
||||||
|
would be appreciated but is not required.
|
||||||
|
|
||||||
|
2. Altered source versions must be plainly marked as such, and
|
||||||
|
must not be misrepresented as being the original software.
|
||||||
|
|
||||||
|
3. This notice may not be removed or altered from any source
|
||||||
|
distribution.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
#include <cstddef>
|
||||||
|
|
||||||
|
namespace DFHack
|
||||||
|
{
|
||||||
|
namespace Windows
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* DF window stuffs
|
||||||
|
*/
|
||||||
|
enum df_color
|
||||||
|
{
|
||||||
|
black,
|
||||||
|
blue,
|
||||||
|
green,
|
||||||
|
cyan,
|
||||||
|
red,
|
||||||
|
magenta,
|
||||||
|
brown,
|
||||||
|
lgray,
|
||||||
|
dgray,
|
||||||
|
lblue,
|
||||||
|
lgreen,
|
||||||
|
lcyan,
|
||||||
|
lred,
|
||||||
|
lmagenta,
|
||||||
|
yellow,
|
||||||
|
white
|
||||||
|
// maybe add transparency?
|
||||||
|
};
|
||||||
|
|
||||||
|
// The tile format DF uses internally
|
||||||
|
struct df_screentile
|
||||||
|
{
|
||||||
|
uint8_t symbol;
|
||||||
|
uint8_t foreground; ///< df_color
|
||||||
|
uint8_t background; ///< df_color
|
||||||
|
uint8_t bright;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// our silly painter things and window things follow.
|
||||||
|
class df_window;
|
||||||
|
struct df_tilebuf
|
||||||
|
{
|
||||||
|
df_tilebuf(unsigned int width, unsigned int height):width(width),height(height)
|
||||||
|
{
|
||||||
|
data = new df_screentile[width*height];
|
||||||
|
}
|
||||||
|
~df_tilebuf()
|
||||||
|
{
|
||||||
|
delete data;
|
||||||
|
}
|
||||||
|
df_screentile * data;
|
||||||
|
unsigned int width;
|
||||||
|
unsigned int height;
|
||||||
|
};
|
||||||
|
|
||||||
|
DFHACK_EXPORT df_screentile *getScreenBuffer();
|
||||||
|
|
||||||
|
class DFHACK_EXPORT painter
|
||||||
|
{
|
||||||
|
friend class df_window;
|
||||||
|
public:
|
||||||
|
df_screentile* get(unsigned int x, unsigned int y)
|
||||||
|
{
|
||||||
|
if(x >= width || y >= height)
|
||||||
|
return 0;
|
||||||
|
return &buffer[x*height + y];
|
||||||
|
};
|
||||||
|
bool set(unsigned int x, unsigned int y, df_screentile tile )
|
||||||
|
{
|
||||||
|
if(x >= width || y >= height)
|
||||||
|
return false;
|
||||||
|
buffer[x*height + y] = tile;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
df_color foreground (df_color change = (df_color) -1)
|
||||||
|
{
|
||||||
|
if(change != -1)
|
||||||
|
current_foreground = change;
|
||||||
|
return current_foreground;
|
||||||
|
}
|
||||||
|
df_color background (df_color change = (df_color) -1)
|
||||||
|
{
|
||||||
|
if(change != -1)
|
||||||
|
current_background = change;
|
||||||
|
return current_background;
|
||||||
|
}
|
||||||
|
void bright (bool change)
|
||||||
|
{
|
||||||
|
current_bright = change;
|
||||||
|
}
|
||||||
|
bool bright ()
|
||||||
|
{
|
||||||
|
return current_bright;
|
||||||
|
}
|
||||||
|
void printStr(std::string & str, bool wrap = false)
|
||||||
|
{
|
||||||
|
for ( auto iter = str.begin(); iter != str.end(); iter++)
|
||||||
|
{
|
||||||
|
auto elem = *iter;
|
||||||
|
if(cursor_y >= height)
|
||||||
|
break;
|
||||||
|
if(wrap)
|
||||||
|
{
|
||||||
|
if(cursor_x >= width)
|
||||||
|
cursor_x = wrap_column;
|
||||||
|
}
|
||||||
|
df_screentile & tile = buffer[cursor_x * height + cursor_y];
|
||||||
|
tile.symbol = elem;
|
||||||
|
tile.foreground = current_foreground;
|
||||||
|
tile.background = current_background;
|
||||||
|
tile.bright = current_bright;
|
||||||
|
cursor_x++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void set_wrap (int new_column)
|
||||||
|
{
|
||||||
|
wrap_column = new_column;
|
||||||
|
}
|
||||||
|
void gotoxy(unsigned int x, unsigned int y)
|
||||||
|
{
|
||||||
|
cursor_x = x;
|
||||||
|
cursor_y = y;
|
||||||
|
}
|
||||||
|
void reset()
|
||||||
|
{
|
||||||
|
cursor_x = 0;
|
||||||
|
cursor_y = 0;
|
||||||
|
current_background = black;
|
||||||
|
current_foreground = white;
|
||||||
|
current_bright = false;
|
||||||
|
wrap_column = 0;
|
||||||
|
}
|
||||||
|
private:
|
||||||
|
painter (df_window * orig, df_screentile * buf, unsigned int width, unsigned int height)
|
||||||
|
{
|
||||||
|
origin = orig;
|
||||||
|
this->width = width;
|
||||||
|
this->height = height;
|
||||||
|
this->buffer = buf;
|
||||||
|
reset();
|
||||||
|
}
|
||||||
|
df_window* origin;
|
||||||
|
unsigned int width;
|
||||||
|
unsigned int height;
|
||||||
|
df_screentile* buffer;
|
||||||
|
// current paint cursor position
|
||||||
|
int cursor_x;
|
||||||
|
int cursor_y;
|
||||||
|
int wrap_column;
|
||||||
|
// current foreground color
|
||||||
|
df_color current_foreground;
|
||||||
|
// current background color
|
||||||
|
df_color current_background;
|
||||||
|
// make bright?
|
||||||
|
bool current_bright;
|
||||||
|
};
|
||||||
|
|
||||||
|
class DFHACK_EXPORT df_window
|
||||||
|
{
|
||||||
|
friend class painter;
|
||||||
|
public:
|
||||||
|
df_window(int x, int y, unsigned int width, unsigned int height);
|
||||||
|
virtual ~df_window();
|
||||||
|
virtual bool move (int left_, int top_, unsigned int width_, unsigned int height_) = 0;
|
||||||
|
virtual void paint () = 0;
|
||||||
|
virtual painter * lock();
|
||||||
|
bool unlock (painter * painter);
|
||||||
|
virtual bool addChild(df_window *);
|
||||||
|
virtual df_screentile * getBuffer() = 0;
|
||||||
|
public:
|
||||||
|
df_screentile* buffer;
|
||||||
|
unsigned int width;
|
||||||
|
unsigned int height;
|
||||||
|
protected:
|
||||||
|
df_window * parent;
|
||||||
|
std::vector <df_window *> children;
|
||||||
|
int left;
|
||||||
|
int top;
|
||||||
|
// FIXME: FAKE
|
||||||
|
bool locked;
|
||||||
|
painter * current_painter;
|
||||||
|
};
|
||||||
|
|
||||||
|
class DFHACK_EXPORT top_level_window : public df_window
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
top_level_window();
|
||||||
|
virtual bool move (int left_, int top_, unsigned int width_, unsigned int height_);
|
||||||
|
virtual void paint ();
|
||||||
|
virtual painter * lock();
|
||||||
|
virtual df_screentile * getBuffer();
|
||||||
|
};
|
||||||
|
class DFHACK_EXPORT buffered_window : public df_window
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
buffered_window(int x, int y, unsigned int width, unsigned int height):df_window(x,y,width, height)
|
||||||
|
{
|
||||||
|
buffer = new df_screentile[width*height];
|
||||||
|
};
|
||||||
|
virtual ~buffered_window()
|
||||||
|
{
|
||||||
|
delete buffer;
|
||||||
|
}
|
||||||
|
virtual void blit_to_parent ()
|
||||||
|
{
|
||||||
|
df_screentile * parbuf = parent->getBuffer();
|
||||||
|
int parent_width = parent->width;
|
||||||
|
int parent_height = parent->height;
|
||||||
|
for(int xi = 0; xi < width; xi++)
|
||||||
|
{
|
||||||
|
for(int yi = 0; yi < height; yi++)
|
||||||
|
{
|
||||||
|
int parx = left + xi;
|
||||||
|
int pary = top + yi;
|
||||||
|
if(pary >= parent_height) continue;
|
||||||
|
if(parx >= parent_width) continue;
|
||||||
|
parbuf[parx * parent_height + pary] = buffer[xi * height + yi];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
virtual df_screentile* getBuffer()
|
||||||
|
{
|
||||||
|
return buffer;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
class DFHACK_EXPORT dfhack_dummy : public buffered_window
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
dfhack_dummy(int x, int y):buffered_window(x,y,6,1){};
|
||||||
|
virtual bool move (int left_, int top_, unsigned int width_, unsigned int height_)
|
||||||
|
{
|
||||||
|
top = top_;
|
||||||
|
left = left_;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
virtual void paint ()
|
||||||
|
{
|
||||||
|
painter * p = lock();
|
||||||
|
p->bright(true);
|
||||||
|
p->background(black);
|
||||||
|
p->foreground(white);
|
||||||
|
std::string dfhack = "DFHack";
|
||||||
|
p->printStr(dfhack);
|
||||||
|
blit_to_parent();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,114 @@
|
|||||||
|
/*
|
||||||
|
https://github.com/peterix/dfhack
|
||||||
|
Copyright (c) 2009-2011 Petr Mrázek (peterix@gmail.com)
|
||||||
|
|
||||||
|
This software is provided 'as-is', without any express or implied
|
||||||
|
warranty. In no event will the authors be held liable for any
|
||||||
|
damages arising from the use of this software.
|
||||||
|
|
||||||
|
Permission is granted to anyone to use this software for any
|
||||||
|
purpose, including commercial applications, and to alter it and
|
||||||
|
redistribute it freely, subject to the following restrictions:
|
||||||
|
|
||||||
|
1. The origin of this software must not be misrepresented; you must
|
||||||
|
not claim that you wrote the original software. If you use this
|
||||||
|
software in a product, an acknowledgment in the product documentation
|
||||||
|
would be appreciated but is not required.
|
||||||
|
|
||||||
|
2. Altered source versions must be plainly marked as such, and
|
||||||
|
must not be misrepresented as being the original software.
|
||||||
|
|
||||||
|
3. This notice may not be removed or altered from any source
|
||||||
|
distribution.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "Export.h"
|
||||||
|
#include "Module.h"
|
||||||
|
#include "Virtual.h"
|
||||||
|
#include "BitArray.h"
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#include "DataDefs.h"
|
||||||
|
#include "df/init.h"
|
||||||
|
#include "df/ui.h"
|
||||||
|
#include <df/graphic.h>
|
||||||
|
#include <llex.h>
|
||||||
|
#include "modules/Windows.h"
|
||||||
|
|
||||||
|
using namespace DFHack;
|
||||||
|
|
||||||
|
Windows::df_screentile *Windows::getScreenBuffer()
|
||||||
|
{
|
||||||
|
return (df_screentile *) df::global::gps->screen;
|
||||||
|
}
|
||||||
|
|
||||||
|
Windows::df_window::df_window(int x, int y, unsigned int width, unsigned int height)
|
||||||
|
:buffer(0), parent(0), left(x), top(y), width(width), height(height), current_painter(NULL)
|
||||||
|
{
|
||||||
|
buffer = 0;
|
||||||
|
};
|
||||||
|
Windows::df_window::~df_window()
|
||||||
|
{
|
||||||
|
for(auto iter = children.begin();iter != children.end();iter++)
|
||||||
|
{
|
||||||
|
delete *iter;
|
||||||
|
}
|
||||||
|
children.clear();
|
||||||
|
};
|
||||||
|
Windows::painter * Windows::df_window::lock()
|
||||||
|
{
|
||||||
|
locked = true;
|
||||||
|
current_painter = new Windows::painter(this,buffer,width, height);
|
||||||
|
return current_painter;
|
||||||
|
};
|
||||||
|
|
||||||
|
bool Windows::df_window::addChild( df_window * child)
|
||||||
|
{
|
||||||
|
children.push_back(child);
|
||||||
|
child->parent = this;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Windows::df_window::unlock (painter * painter)
|
||||||
|
{
|
||||||
|
if(current_painter == painter)
|
||||||
|
{
|
||||||
|
delete current_painter;
|
||||||
|
current_painter = 0;
|
||||||
|
locked = false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
Windows::top_level_window::top_level_window(): df_window(0,0,df::global::gps->dimx,df::global::gps->dimy)
|
||||||
|
{
|
||||||
|
buffer = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Windows::top_level_window::move (int left_, int top_, unsigned int width_, unsigned int height_)
|
||||||
|
{
|
||||||
|
width = width_;
|
||||||
|
height = height_;
|
||||||
|
// what if we are painting already? Is that possible?
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
|
||||||
|
Windows::painter * Windows::top_level_window::lock()
|
||||||
|
{
|
||||||
|
buffer = getScreenBuffer();
|
||||||
|
return df_window::lock();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Windows::top_level_window::paint ()
|
||||||
|
{
|
||||||
|
for(auto iter = children.begin();iter != children.end();iter++)
|
||||||
|
{
|
||||||
|
(*iter)->paint();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Windows::df_screentile * Windows::top_level_window::getBuffer()
|
||||||
|
{
|
||||||
|
return getScreenBuffer();
|
||||||
|
}
|
@ -1 +1 @@
|
|||||||
Subproject commit f149da6efead3c46845d7478d1ff3d11119c589d
|
Subproject commit 617a845f5d5c0d32fdbc59817b59de4c53a528e3
|
@ -1 +1 @@
|
|||||||
Subproject commit 34183f96b86394895975fb59ae3c4673cd78f502
|
Subproject commit 50bbecc544aa227fb7bfc4a5c90c6b27369d8bcd
|
Loading…
Reference in New Issue