-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtexto.cpp
191 lines (150 loc) · 4.87 KB
/
texto.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
#include "constantes.h"
#include <iostream>
#include "texto.h"
#include <memory>
#include <thread>
#include <mutex>
void Texto::init(std::shared_ptr<SDL_Renderer> ext_render) // sin llamar a la función cargar texto
{
_ancho = 0;
_alto = 0;
static std::mutex mi_mutex;
std::lock_guard<std::mutex> mi_guard(mi_mutex);
_Render = ext_render;
}
void Texto::init_full(std::string texto_renderizar, std::shared_ptr<SDL_Renderer> ext_render) // con llamada a la función cargar texto
{
_ancho = 0;
_alto = 0;
static std::mutex mi_mutex;
std::lock_guard<std::mutex> mi_guard(mi_mutex);
_Render = ext_render;
cargar_texto(texto_renderizar);
}
//!Default Constructor
Texto::Texto():
_Textura (nullptr, SDL_DestroyTexture),
_Render (nullptr),
_ancho (0),
_alto (0)
{
std::cout << "Default Texto Constructor " << this << ": "<<std::endl;
}
//! Constructor II
Texto::Texto(std::shared_ptr<SDL_Renderer> ext_render):
_Textura (nullptr, SDL_DestroyTexture)
{
_Render = ext_render;
_ancho = 0;
_alto = 0;
std::cout << "Text Constructor II" << this << ": "<<std::endl;
}
//! Constructor III
Texto::Texto(std::string texto_renderizar, std::shared_ptr<SDL_Renderer> ext_render):
_Textura (nullptr, SDL_DestroyTexture)
{
_ancho = 0;
_alto = 0;
static std::mutex mi_mutex;
std::lock_guard<std::mutex> mi_guard(mi_mutex);
_Render = ext_render;
cargar_texto(texto_renderizar);
std::cout << "Text Constructor III" << this << ": ";
std::cout << _cadena_texto <<" "<<_Textura.get() <<std::endl;
}
// Rule of five implementation: https://cpppatterns.com/patterns/rule-of-five.html#line7
//! Copy Costructor
Texto::Texto(const Texto& original):
_Textura(nullptr, SDL_DestroyTexture)
{
_Render = original._Render;
_cadena_texto = original._cadena_texto;
_ancho = original._ancho;
_alto = original._alto;
cargar_texto(_cadena_texto);
}
//! Copy assignment operator
Texto& Texto::operator=(const Texto& original){
if (this == &original) // self-assignment protection
return *this;
_Render = original._Render;
_cadena_texto = original._cadena_texto;
_ancho = original._ancho;
_alto = original._alto;
cargar_texto(_cadena_texto);
return *this;
}
//! Move constructor
Texto::Texto(Texto&& original) noexcept:
_Textura(nullptr, SDL_DestroyTexture)
{
_Render = std::move(original._Render);
_Textura = std::move(original._Textura);
_cadena_texto = std::move(original._cadena_texto);
_ancho = std::move(original._ancho);
_alto = std::move(original._alto);
}
//! Move assignment operator
Texto& Texto::operator=(Texto&& original) noexcept{
if (this == &original) // self-assignment protection
return *this;
_Render = std::move(original._Render);
_Textura = std::move(original._Textura);
_cadena_texto = std::move(original._cadena_texto);
_ancho = std::move(original._ancho);
_alto = std::move(original._alto);
return *this;
}
//! Destructor
Texto::~Texto()
{
std::cout << "DESTRUCTOR TEXTO " << this << std::endl;
}
int Texto::get_ancho()
{
return _ancho;
}
std::string Texto::get_cadena_texto(){
return _cadena_texto;
}
// Store the text string to be rendered later
void Texto::_set_cadena_texto(std::string texto){
std::cout<<"setted "<< texto << " on " <<this<< std::endl;
_cadena_texto = texto;
}
// Converts the input string into rendered text for display in our game
bool Texto::cargar_texto(std::string inputText)
{
static std::mutex mi_mutex;
std::lock_guard<std::mutex> mi_guard(mi_mutex);
//static std::unique_ptr<TTF_Font, std::function<void(TTF_Font*)>> Fuente_TTF(TTF_OpenFont("/System/Library/Fonts/Supplemental/Arial Unicode.ttf", 18), [](TTF_Font* puntero)
static std::unique_ptr<TTF_Font, std::function<void(TTF_Font*)>> Fuente_TTF(TTF_OpenFont("../FreeSansBold.ttf", 18), [](TTF_Font* puntero)
{
std::cout << "No need to call deleter in a static uniquer pointer (avoid semgentation fault).\n";
});
if( Fuente_TTF == NULL ){
std::cout<< "Error en la carga de la fuente. SDL_ttf Error: " << TTF_GetError() <<std::endl;
return false;
}
_set_cadena_texto(inputText);
std::unique_ptr<SDL_Surface, std::function<void(SDL_Surface*)>>
Texto_Surface(TTF_RenderText_Blended(Fuente_TTF.get(), inputText.c_str(), {0,0,0}), [](SDL_Surface* puntero)
{
SDL_FreeSurface(puntero);
});
if( Texto_Surface == nullptr )
{
std::cout<< "TTF_RenderText_Blended Error: " << TTF_GetError() << std::endl;
return false;
}
_Textura.reset(SDL_CreateTextureFromSurface( _Render.get(), Texto_Surface.get()));
if( _Textura == nullptr )
{
std::cout<< "SDL_CreateTextureFromSurface Error: " << SDL_GetError() << std::endl;
return false;
}
_ancho = Texto_Surface->w;
_alto = Texto_Surface->h;
std::cout<< "Cadena de texto a RENDERIZADO: " << _cadena_texto <<std::endl;
return true;
}