From b36e5ac248d8fb972335d351d7acc30691c313ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Wed, 7 Dec 2011 20:50:37 +0100 Subject: [PATCH] Add missing files. --- library/include/dfhack/modules/Graphic.h | 91 ++++++++++++++ library/modules/Graphic.cpp | 112 +++++++++++++++++ plugins/versionosd.cpp | 148 +++++++++++++++++++++++ 3 files changed, 351 insertions(+) create mode 100644 library/include/dfhack/modules/Graphic.h create mode 100644 library/modules/Graphic.cpp create mode 100644 plugins/versionosd.cpp diff --git a/library/include/dfhack/modules/Graphic.h b/library/include/dfhack/modules/Graphic.h new file mode 100644 index 000000000..f9d6a88ec --- /dev/null +++ b/library/include/dfhack/modules/Graphic.h @@ -0,0 +1,91 @@ +/* +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. +*/ + +/******************************************************************************* + GRAPHIC + Changing tile cache +*******************************************************************************/ +#pragma once +#ifndef CL_MOD_GRAPHIC +#define CL_MOD_GRAPHIC + +#include +#include "dfhack/Export.h" +#include "dfhack/Module.h" + +namespace DFHack +{ + // SDL stuff + typedef signed short SINT16; + typedef struct + { + int16_t x, y; + uint16_t w, h; + } DFSDL_Rect; + typedef struct + { + uint32_t flags; + void* format; // PixelFormat* + int w, h; + int pitch; + void* pixels; + void* userdata; // as far as i could see DF doesnt use this + int locked; + void* lock_data; + DFSDL_Rect clip_rect; + void* map; + int refcount; + } DFSDL_Surface; + + // ========= + struct DFTileSurface + { + bool paintOver; // draw over original tile? + DFSDL_Surface* surface; // from where it should be drawn + DFSDL_Rect* rect; // from which coords (NULL to draw whole surface) + DFSDL_Rect* dstResize; // if not NULL dst rect will be resized (x/y/w/h will be added to original dst) + }; + + + class DFHACK_EXPORT Graphic : public Module + { + public: + Graphic(); + ~Graphic(); + bool Finish() + { + return true; + } + bool Register(DFTileSurface* (*func)(int,int)); + bool Unregister(DFTileSurface* (*func)(int,int)); + DFTileSurface* Call(int x, int y); + + private: + struct Private; + Private *d; + }; + +} + +#endif \ No newline at end of file diff --git a/library/modules/Graphic.cpp b/library/modules/Graphic.cpp new file mode 100644 index 000000000..25ec34f7d --- /dev/null +++ b/library/modules/Graphic.cpp @@ -0,0 +1,112 @@ +/* +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 "Internal.h" + +#include +#include +#include +#include +#include +#include +using namespace std; + +#include "dfhack/modules/Graphic.h" +#include "dfhack/Error.h" +#include "dfhack/VersionInfo.h" +#include "dfhack/Process.h" +#include "dfhack/Vector.h" +#include "ModuleFactory.h" +#include + +using namespace DFHack; + +Module* DFHack::createGraphic() +{ + return new Graphic(); +} + +struct Graphic::Private +{ + bool Started; + vector funcs; +}; + +Graphic::Graphic() +{ + d = new Private; + + d->Started = true; +} + +Graphic::~Graphic() +{ + delete d; +} + +bool Graphic::Register(DFTileSurface* (*func)(int,int)) +{ + d->funcs.push_back(func); + return true; +} + +bool Graphic::Unregister(DFTileSurface* (*func)(int,int)) +{ + if ( d->funcs.empty() ) return false; + + vector::iterator it = d->funcs.begin(); + while ( it != d->funcs.end() ) + { + if ( *it == func ) + { + d->funcs.erase(it); + return true; + } + it++; + } + + return false; +} + +// This will return first DFTileSurface it can get (or NULL if theres none) +DFTileSurface* Graphic::Call(int x, int y) +{ + if ( d->funcs.empty() ) return NULL; + + DFTileSurface* temp = NULL; + + vector::iterator it = d->funcs.begin(); + while ( it != d->funcs.end() ) + { + temp = (*it)(x,y); + if ( temp != NULL ) + { + return temp; + } + it++; + } + + return NULL; +} \ No newline at end of file diff --git a/plugins/versionosd.cpp b/plugins/versionosd.cpp new file mode 100644 index 000000000..b4d354ce5 --- /dev/null +++ b/plugins/versionosd.cpp @@ -0,0 +1,148 @@ +// This tool display dfhack version on df screen + +#include +#include +#include +#include +#include +#include +using namespace std; +#include +#include +#include +#include +#include +#include +using namespace DFHack; + +DFhackCExport command_result df_versionosd (Core * c, vector & parameters); +static DFSDL_Surface* (*_IMG_LoadPNG_RW)(void* src) = 0; +static vPtr (*_SDL_RWFromFile)(const char* file, const char *mode) = 0; +static int (*_SDL_SetAlpha)(vPtr surface, uint32_t flag, uint8_t alpha) = 0; +static int (*_SDL_SetColorKey)(vPtr surface, uint32_t flag, uint32_t key) = 0; +static uint32_t (*_SDL_MapRGB)(vPtr pixelformat, uint8_t r, uint8_t g, uint8_t b) = 0; +DFTileSurface* gettile(int x, int y); + +bool On = true; +DFSDL_Surface* surface; +DFTileSurface* tiles[10]; +char* file = "Cooz_curses_square_16x16.png"; +Gui* gui; + +DFhackCExport const char * plugin_name ( void ) +{ + return "versionosd"; +} + +DFTileSurface* createTile(int x, int y) +{ + DFTileSurface* tile = new DFTileSurface; + tile->paintOver = true; + tile->rect = new DFSDL_Rect; + tile->rect->x = x*16; + tile->rect->y = y*16; + tile->rect->w = 16; + tile->rect->h = 16; + tile->surface = surface; + tile->dstResize = NULL; + return tile; +} + +DFhackCExport command_result plugin_init ( Core * c, std::vector &commands) +{ + commands.clear(); + commands.push_back(PluginCommand("versionosd", + "Toggles displaying version in DF window", + df_versionosd)); + + HMODULE SDLImageLib = LoadLibrary("SDL_image.dll"); + _IMG_LoadPNG_RW = (DFHack::DFSDL_Surface* (*)(void*))GetProcAddress(SDLImageLib, "IMG_LoadPNG_RW"); + + HMODULE realSDLlib = LoadLibrary("SDLreal.dll"); + _SDL_RWFromFile = (void*(*)(const char*, const char*))GetProcAddress(realSDLlib,"SDL_RWFromFile"); + _SDL_SetAlpha = (int (*)(void*, uint32_t, uint8_t))GetProcAddress(realSDLlib,"SDL_SetAlpha"); + _SDL_SetColorKey = (int (*)(void*, uint32_t, uint32_t))GetProcAddress(realSDLlib,"SDL_SetColorKey"); + _SDL_MapRGB = (uint32_t (*)(void*, uint8_t, uint8_t, uint8_t))GetProcAddress(realSDLlib,"SDL_MapRGB"); + + void* RWop = _SDL_RWFromFile(file, "rb"); + surface = _IMG_LoadPNG_RW(RWop); + + if ( !surface ) + { + c->con.print("Couldnt load image from file %s", file); + return CR_FAILURE; + } + + UINT32 pink = _SDL_MapRGB(vPtr(surface->format), 0xff, 0x00, 0xff); + + _SDL_SetColorKey((vPtr)surface, 4096, pink); + _SDL_SetAlpha((vPtr)surface, 65536, 255); + + + // setup tiles + tiles[0] = createTile(4, 4); // D + tiles[1] = createTile(6, 4); // F + tiles[2] = createTile(8, 4); // H + tiles[3] = createTile(1, 6); // a + tiles[4] = createTile(3, 6); // c + tiles[5] = createTile(11, 6); // k + tiles[6] = createTile(0, 0); // " " + // FIXME: it should get REAL version not hardcoded one + tiles[7] = createTile(2, 7); // r + tiles[8] = createTile(8, 3); // 8 + + tiles[9] = createTile(9, 0); // o + + gui = c->getGui(); + + + Graphic* g = c->getGraphic(); + g->Register(gettile); + + return CR_OK; +} + +DFhackCExport command_result plugin_shutdown ( Core * c ) +{ + Graphic* g = c->getGraphic(); + g->Unregister(gettile); + delete surface; + + for (int i=0; i<10; i++) + { + delete tiles[i]; + } + delete [] tiles; + + return CR_OK; +} + +DFhackCExport command_result df_versionosd (Core * c, vector & parameters) +{ + On = !On; + c->Suspend(); + c->con.print("Version OSD is %s\n", On ? "On" : "Off"); + c->Resume(); + return CR_OK; +} + +DFTileSurface* gettile (int x, int y) +{ + if ( !On ) return NULL; + + if ( x == 0 && y-4 >= 0 && y-4 < 9 ) + { + return tiles[y-4]; + } + + int32_t cx, cy, cz; + int32_t vx, vy, vz; + if ( !gui->getViewCoords(vx, vy, vz) ) return NULL; + if ( !gui->getCursorCoords(cx, cy, cz) ) return NULL; + if ( cx-vx+1 == x && cy-vy+1 == y ) + { + return tiles[9]; + } + + return NULL; +} \ No newline at end of file