Commit 1c066383 by Szeberényi Imre

SDL2

parent c23cec52
......@@ -16,7 +16,7 @@
/// Az objektum eseménykezelője ettől még dönthet úgy, hogy nem kezeli.
/// Kihasználható, hogy az eseménykezelő meghívása előtt mindig van contains hívás.
void AppShell::mainLoop() {
SDL_Flip(scr);
SDL_RenderPresent(renderer);
SDL_Event ev;
Point cursor;
while (SDL_WaitEvent(&ev) && ev.type != SDL_QUIT) {
......@@ -37,7 +37,7 @@ void AppShell::mainLoop() {
}
if (changed) { // ha változhatott a rajz, frissíti a képernyőt
draw();
SDL_Flip(scr);
SDL_RenderPresent(renderer);
}
}
}
......@@ -12,9 +12,9 @@
/// Az eseményhurokért, valamint az SDL és az alkalmazás kapcsolatáért felelős.
/// Widget konténerként tárolja a fő widgetpéldányokat.
struct AppShell : public Container {
/// @param scr - SDL screen pointere
AppShell(SDL_Surface *scr) {
Widget::setSurface(scr);
/// @param ren - SDL renderer pointere
AppShell(SDL_Renderer *ren) {
Widget::setRenderer(ren);
}
/// maninLoop
......
......@@ -30,20 +30,22 @@
</Target>
</Build>
<Compiler>
<Add option="-pedantic" />
<Add option="-Wall" />
<Add option="-std=c++11" />
<Add directory="$(#sdl.include)" />
</Compiler>
<Linker>
<Add library="mingw32" />
<Add library="SDLmain" />
<Add library="SDL.dll" />
<Add library="SDL2main" />
<Add library="SDL2" />
<Add library="user32" />
<Add library="gdi32" />
<Add library="winmm" />
<Add library="dxguid" />
<Add library="SDL_gfx" />
<Add library="SDL_image" />
<Add library="SDL_ttf" />
<Add library="SDL2_gfx" />
<Add library="SDL2_image" />
<Add library="SDL2_ttf" />
<Add directory="$(#sdl.lib)" />
</Linker>
<Unit filename="activebg.h" />
......
......@@ -8,11 +8,11 @@
/// Kört rajzoló fv.
void Circle::draw() const {
if (fill) {
filledCircleColor(scr, p0.x, p0.y, r, fg);
circleColor (scr, p0.x, p0.y, r, fg);
filledCircleColor(renderer, p0.x, p0.y, r, fg);
circleColor(renderer, p0.x, p0.y, r, fg);
} else {
filledCircleColor (scr, p0.x, p0.y, r, bg);
circleColor (scr, p0.x, p0.y, r, fg);
filledCircleColor (renderer, p0.x, p0.y, r, bg);
circleColor (renderer, p0.x, p0.y, r, fg);
}
}
......@@ -29,7 +29,7 @@ bool Circle::eventHandler(const SDL_Event& ev) {
draw();
}
return true;
} else if (ev.type == SDL_MOUSEMOTION && ev.motion.state) { // drag
} else if (ev.type == SDL_MOUSEMOTION && ev.motion.state != 0) { // drag
move(Point(ev.motion.xrel, ev.motion.yrel));
return true;
}
......
......@@ -44,15 +44,19 @@
#include "memtrace.h"
/// segédfüggvény az SDL inicializálásához
/// @return surface pointer vagy 0
SDL_Surface* init() {
if (SDL_Init( SDL_INIT_VIDEO ) < 0)
return NULL;
/// SDL jelen változata lezárja a szabványos kimeneteteket és fájlba ír.
/// Ezért újra kinyitjuk
std::freopen( "CON", "w", stdout );
std::freopen( "CON", "w", stderr );
return SDL_SetVideoMode(1024, 768, 0, SDL_ANYFORMAT);
/// @return renderer pointer vagy 0
SDL_Renderer* init() {
if (SDL_Init(SDL_INIT_EVERYTHING) < 0) {
return 0;
}
SDL_Window *sdlWindow;
SDL_Renderer *sdlRenderer;
if (SDL_CreateWindowAndRenderer(640, 480, SDL_WINDOW_RESIZABLE, &sdlWindow, &sdlRenderer) < 0) {
return 0;
}
SDL_RenderClear(sdlRenderer);
return sdlRenderer;
}
/// Bulletinboard kezelő panelje
......@@ -99,14 +103,15 @@ void quit(const SDL_Event&, int) {
}
int main(int argc, char** argv) {
{
SDL_Surface* screen = init();
if (screen == NULL) {
std::cerr << "Nem sikerult az SDL INIT: " << SDL_GetError() << std::endl;
SDL_Renderer* renderer = init();
if (renderer == NULL) {
std::cerr << "Nem sikerult az inicializálás " << SDL_GetError() << std::endl;
return 1;
}
// Application shell létrehozása
AppShell app(screen);
AppShell app(renderer);
Bboard* bb = new Bboard; // Bulletinboard
// Bbpanel olyan osztály, ami segít a gombokat kezelni.
Bbpanel panel(*bb); // ismernie kell a Bulletinboard-ot
......@@ -123,6 +128,5 @@ int main(int argc, char** argv) {
// eseményhurok
app.mainLoop();
SDL_Quit();
} /// memtrace miatt minden egy belső blokkban van.
return memtrace::mem_check(); /// SDL kilépésekor már nem tud kiírni.
return 0;
}
......@@ -3,7 +3,11 @@ Memoriaszivargas-detektor
Keszitette: Peregi Tamas, BME IIT, 2011
petamas@iit.bme.hu
Kanari: Szeberenyi Imre, 2013.
VS 2012: Szeberényi Imre, 2015.,
mem_dump: 2016.
meset felszabaditaskor: 2018.
typo: 2019.
singleton: 2019.
*********************************/
/*definialni kell, ha nem paracssorbol allitjuk be (-DMEMTRACE) */
......@@ -40,7 +44,7 @@ mem_dump: 2016.
/* Segedfuggvenyek es egyebek */
/*******************************************************************/
START_NAMESPACE
static FILE *fperror = stderr;
static FILE *fperror;
#ifdef MEMTRACE_TO_MEMORY
static const unsigned int CANARY_LEN = 64;
#else
......@@ -123,37 +127,37 @@ START_NAMESPACE
}
/* memoriateruletet dump */
static void dump_memory(void const *mem, size_t size, size_t can_len) {
static void dump_memory(void const *mem, size_t size, size_t can_len, FILE* fp) {
unsigned char const *m=(unsigned char const *) mem;
unsigned int s, o;
if (can_len > 0)
fprintf(fperror, "Dump (addr: %p kanari hossz: %d):\n", m+can_len, can_len);
fprintf(fp, "Dump (addr: %p kanari hossz: %d):\n", m+can_len, (int)can_len);
else
fprintf(fperror, "Dump: (addr: %p) \n", m);
fprintf(fp, "Dump: (addr: %p) \n", m);
size += 2*can_len;
for (s = 0; s < (size+15)/16; s++) {
fprintf(fperror, "%04x:%c ", s*16, s*16 < can_len || s*16 >= size-can_len ? ' ' : '*');
fprintf(fp, "%04x:%c ", s*16, s*16 < can_len || s*16 >= size-can_len ? ' ' : '*');
for (o = 0; o < 16; o++) {
if (o == 8) fprintf(fperror, " ");
if (o == 8) fprintf(fp, " ");
if (s*16+o < size)
fprintf(fperror, "%02x ", m[s*16+o]);
fprintf(fp, "%02x ", m[s*16+o]);
else
fprintf(fperror, " ");
fprintf(fp, " ");
}
fprintf(fperror, " ");
fprintf(fp, " ");
for (o = 0; o < 16; o++) {
if (s*16+o < size)
fprintf(fperror, "%c", isprint(m[s*16+o]) ? m[s*16+o] : '.');
fprintf(fp, "%c", isprint(m[s*16+o]) ? m[s*16+o] : '.');
else
fprintf(fperror, " ");
fprintf(fp, " ");
}
fprintf(fperror, "\n");
fprintf(fp, "\n");
}
}
void mem_dump(void const *mem, size_t size) {
dump_memory(mem, size, 0);
void mem_dump(void const *mem, size_t size, FILE* fp) {
dump_memory(mem, size, 0, fp);
}
static BOOL dying;
......@@ -165,12 +169,12 @@ START_NAMESPACE
fprintf(fperror,"%s\n",msg);
if (p) {
fprintf(fperror, "\tPointer:\t%p", PU(p));
if (size) fprintf(fperror," (%u byte)", (unsigned)size);
if (size) fprintf(fperror," (%d byte)", (int)size);
fprintf(fperror,"\n");
}
if (a) print_call("\tFoglalas:\t", *a);
if (d) print_call("\tFelszabaditas:\t", *d);
if (p) dump_memory(p, size, CANARY_LEN);
if (p) dump_memory(p, size, CANARY_LEN, fperror);
dying = TRUE;
exit(120);
......@@ -197,7 +201,7 @@ START_NAMESPACE
static void print_registry_item(registry_item * p) {
if (p) {
print_registry_item(p->next);
fprintf(fperror, "\t%p%5u byte ",p->p, (unsigned)p->size);
fprintf(fperror, "\t%p%5d byte ",p->p, (int)p->size);
print_call(NULL, p->call);
if(p->call.par_txt) free(p->call.par_txt);
if(p->call.file) free(p->call.file);
......@@ -205,9 +209,10 @@ START_NAMESPACE
}
}
/* ha nincs hiba, akkor 0-val tér vissza */
int mem_check(void) {
initialize();
if(dying) return 2;
if(dying) return 2; /* címzési hiba */
if(registry.next) {
/*szivarog*/
......@@ -217,7 +222,7 @@ START_NAMESPACE
fprintf(fperror, "Szivargas:\n");
print_registry_item(registry.next);
registry.next = NULL;
return 1;
return 1; /* memória fogyás */
}
return 0;
}
......@@ -239,10 +244,15 @@ END_NAMESPACE
/*******************************************************************/
START_NAMESPACE
static int allocated_blks;
int allocated_blocks() { return allocated_blks; }
static BOOL register_memory(void * p, size_t size, call_t call) {
initialize();
allocated_blks++;
#ifdef MEMTRACE_TO_FILE
fprintf(trace_file, "%p\t%d\t%s%s", PU(p), size, pretty[call.f], call.par_txt ? call.par_txt : "?");
fprintf(trace_file, "%p\t%d\t%s%s", PU(p), (int)size, pretty[call.f], call.par_txt ? call.par_txt : "?");
if (call.f <= 3) fprintf(trace_file, ")");
fprintf(trace_file, "\t%d\t%s\n", call.line, call.file ? call.file : "?");
fflush(trace_file);
......@@ -282,6 +292,7 @@ START_NAMESPACE
{ /*C-blokk*/
registry_item * n = find_registry_item(p);
if(n->next) {
allocated_blks--;
registry_item * r = n->next;
n->next = r->next;
if(COMP(r->call.f,call.f)) {
......@@ -295,13 +306,15 @@ START_NAMESPACE
if(r->call.par_txt) free(r->call.par_txt);
if(call.file) free(call.file);
if(r->call.file) free(r->call.file);
memset(PU(r->p), 'f', r->size);
PU(r->p)[r->size-1] = 0;
free(r);
} else {
/*hibas felszabaditas*/
die("Hibas felszabaditas:",r->p,r->size,&r->call,&call);
}
} else {
die("Nem letezo adat felszabaditasa:", p, 0,NULL,&call);
die("Nem letezo, vagy mar felszabaditott adat felszabaditasa:", p, 0,NULL,&call);
}
} /*C-blokk*/
#endif
......@@ -309,7 +322,7 @@ START_NAMESPACE
END_NAMESPACE
/*******************************************************************/
/* C-stlus memriakezels */
/* C-stílusú memóriakezelés */
/*******************************************************************/
#ifdef MEMTRACE_C
......@@ -403,7 +416,7 @@ END_NAMESPACE
#endif/*MEMTRACE_C*/
/*******************************************************************/
/* C++-stlus memriakezels */
/* C++-stílusú memóriakezelés */
/*******************************************************************/
#ifdef MEMTRACE_CPP
......@@ -420,7 +433,7 @@ START_NAMESPACE
void set_delete_call(int line, const char * file) {
initialize();
delete_call=pack(0,"",line,file); /*func rtke lnyegtelen, majd fellrjuk*/
delete_call=pack(0,"",line,file); /*func értéke lényegtelen, majd felülírjuk*/
delete_called = TRUE;
}
......@@ -475,6 +488,17 @@ void operator delete(void * p) THROW_NOTHING {
void operator delete[](void * p) THROW_NOTHING {
memtrace::traced_delete(p,FDELETEARR);
}
/* Visual C++ 2012 miatt kell, mert háklis, hogy nincs megfelelő delete, bár senki sem használja */
void operator delete(void * p, int, const char *) THROW_NOTHING {
memtrace::traced_delete(p,FDELETE);
}
void operator delete[](void * p, int, const char *) THROW_NOTHING {
memtrace::traced_delete(p,FDELETE);
}
#endif/*MEMTRACE_CPP*/
/*******************************************************************/
......@@ -492,7 +516,7 @@ START_NAMESPACE
#ifdef MEMTRACE_TO_MEMORY
registry.next = NULL;
#if !defined(USE_ATEXIT_OBJECT) && defined(MEMTRACE_AUTO)
atexit((void(*)())mem_check);
atexit((void(*)(void))mem_check);
#endif
#endif
#ifdef MEMTRACE_TO_FILE
......@@ -506,8 +530,5 @@ START_NAMESPACE
}
}
#if defined(MEMTRACE_TO_MEMORY) && defined(USE_ATEXIT_OBJECT)
int atexit_class::counter = 0;
#endif
END_NAMESPACE
#endif
......@@ -3,7 +3,10 @@ Memoriaszivargas-detektor
Keszitette: Peregi Tamas, BME IIT, 2011
petamas@iit.bme.hu
Kanari: Szeberenyi Imre, 2013.,
VS 2012: Szeberényi Imre, 2015.,
mem_dump: 2016.
inclue-ok: 2017., 2018. 2019.
singleton: 2019.
*********************************/
#ifndef MEMTRACE_H
......@@ -11,7 +14,7 @@ mem_dump: 2016.
#if defined(MEMTRACE)
/*ha definilva van, akkor a hibakat ebbe a fajlba rja, egybkent stderr-re*/
/*ha definiálva van, akkor a hibakat ebbe a fajlba írja, egyébkent stderr-re*/
/*#define MEMTRACE_ERRFILE MEMTRACE.ERR*/
/*ha definialva van, akkor futas kozben lancolt listat epit. Javasolt a hasznalata*/
......@@ -69,17 +72,34 @@ mem_dump: 2016.
#define TRACEC(func) func
#endif
/* A Visual Studio figyelmen kivul hagyja a "throw" deklaraciokat, a gcc -pedantic pedig igenyli.*/
#ifdef _MSC_VER
/* Ha studio */
// THROW deklaráció változatai
#if defined(_MSC_VER)
// VS rosszul kezeli az __cplusplus makrot
#if _MSC_VER < 1900
// * nem biztos, hogy jó így *
#define THROW_BADALLOC
#define THROW_NOTHING
#else
// C++11 vagy újabb
#define THROW_BADALLOC noexcept(false)
#define THROW_NOTHING noexcept
#endif
#else
/* Normalis forditok */
#if __cplusplus < 201103L
// C++2003 vagy régebbi
#define THROW_BADALLOC throw (std::bad_alloc)
#define THROW_NOTHING throw ()
#else
// C++11 vagy újabb
#define THROW_BADALLOC noexcept(false)
#define THROW_NOTHING noexcept
#endif
#endif
START_NAMESPACE
int allocated_blocks();
END_NAMESPACE
#if defined(MEMTRACE_TO_MEMORY)
START_NAMESPACE
int mem_check(void);
......@@ -87,22 +107,35 @@ END_NAMESPACE
#endif
#if defined(MEMTRACE_TO_MEMORY) && defined(USE_ATEXIT_OBJECT)
#include <cstdio>
START_NAMESPACE
class atexit_class {
private:
static int counter;
public:
atexit_class() {
counter++;
#if defined(CPORTA) && !defined(CPORTA_NOSETBUF)
setbuf(stdout, 0);
setbuf(stderr, 0);
#endif
}
public:
static atexit_class& get_atexit_obj() {
static atexit_class instance; // singleton példány
return instance;
}
int check() {
return mem_check();
}
~atexit_class() {
if(--counter==0)
mem_check();
check();
}
};
static atexit_class atexit_obj;
/// A statikus referencia minden fordítási egységben keletkezik, de
/// mindegyik egyetlen példányra fog hivatkozni a singleton minta miatt
static atexit_class& atexit_obj = atexit_class::get_atexit_obj();
END_NAMESPACE
#endif/*MEMTRACE_TO_MEMORY && USE_ATEXIT_OBJECT*/
......@@ -111,8 +144,15 @@ END_NAMESPACE
#include <stdlib.h>
#ifdef __cplusplus
#include <iostream>
/* ide gyjtjk a nemtrace-vel sszeakad headereket, hogy elbb legyenek */
#include <fstream> // VS 2013 headerjben van deleted definici
/* ide gyűjtjük a nemtrace-vel összeakadó headereket, hogy előbb legyenek */
#include <fstream> // VS 2013 headerjében van deleted definició
#include <sstream>
#include <vector>
#include <list>
#include <map>
#include <algorithm>
#include <functional>
#endif
#ifdef MEMTRACE_CPP
namespace std {
......@@ -138,7 +178,8 @@ START_NAMESPACE
#define realloc(old,size) TRACEC(traced_realloc)(old,size,#size,__LINE__,__FILE__)
void * traced_realloc(void * old, size_t size, const char *size_txt, int line, const char * file);
void mem_dump(void const *mem, size_t size);
void mem_dump(void const *mem, size_t size, FILE* fp);
END_NAMESPACE
#endif/*MEMTRACE_C*/
......@@ -159,8 +200,18 @@ void * operator new[](size_t size) THROW_BADALLOC;
void operator delete(void * p) THROW_NOTHING;
void operator delete[](void * p) THROW_NOTHING;
/* Visual C++ 2012 miatt kell, mert háklis, hogy nincs megfelelő delete, bár senki sem használja */
void operator delete(void *p, int, const char *) THROW_NOTHING;
void operator delete[](void *p, int, const char *) THROW_NOTHING;
#define new new(__LINE__, __FILE__)
#define delete memtrace::set_delete_call(__LINE__, __FILE__),delete
#ifdef CPORTA
#define system(...) // system(__VA_ARGS__)
#endif
#endif /*MEMTRACE_CPP*/
#endif /*FROM_MEMTRACE_CPP*/
......
......@@ -5,7 +5,7 @@
#include "widget.h"
#include "memtrace.h"
SDL_Surface* Widget::scr; ///< statikus tag létrehozása
SDL_Renderer* Widget::renderer; ///< statikus tag létrehozása
/// move - eltolja a widget origóját
/// @param d - eltolás
......
......@@ -6,8 +6,8 @@
#ifndef WIDGET_H
#define WIDGET_H
#include <SDL.h>
#include <SDL_gfxPrimitives.h>
#include <SDL2/sdl.h>
#include <SDL2/SDL2_gfxPrimitives.h>
#include "point.h"
#include "color.h"
......@@ -16,7 +16,7 @@
/// Nem szép megoldás, de szebb mintha globális lenne.
class Widget {
protected:
static SDL_Surface *scr; ///< eldugott globális változó
static SDL_Renderer *renderer; ///< eldugott globális változó
Point p0; ///< Widget origója
Color fg; ///< Előtér szín
Color bg; ///< Háttérszín
......@@ -27,9 +27,9 @@ public:
const Color& fg = WHITE,
const Color& bg = BLACK) :p0(p0), fg(fg), bg(bg) {}
/// suface beállítása
/// @param s - SDL surface
static void setSurface(SDL_Surface* s) { scr = s; }
/// renderer beállítása
/// @param r - SDL remderer
static void setRenderer(SDL_Renderer* r) { renderer = r; }
/// contains
/// Egy adott pontról eldönti, hogy a widget területére esik-e
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment