35 SDL_SetSurfaceBlendMode(surface.
get(), SDL_BLENDMODE_NONE);
36 SDL_BlitSurface(surface.
get(), &area, image2.get(), &area);
39 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
size[0],
size[1], 0,
40 GL_RGBA, GL_UNSIGNED_BYTE, image2->pixels);
49 return loadTexture(std::move(surface),
size);
50 }
catch (MSXException&
e) {
51 throw MSXException(
"Error loading image ", filename,
": ",
58 : texture(loadTexture(filename,
size))
63 : texture(loadTexture(filename,
size))
70 : texture(loadTexture(filename,
size))
81 bgR[i] = narrow_cast<uint8_t>((rgba >> 24) & 0xff);
82 bgG[i] = narrow_cast<uint8_t>((rgba >> 16) & 0xff);
83 bgB[i] = narrow_cast<uint8_t>((rgba >> 8) & 0xff);
84 auto alpha = narrow_cast<uint8_t>((rgba >> 0) & 0xff);
85 bgA[i] = (alpha == 255) ? 256 : alpha;
91 int borderSize_, uint32_t borderRGBA)
92 : borderSize(borderSize_)
93 , borderR(
narrow_cast<uint8_t>((borderRGBA >> 24) & 0xff))
94 , borderG(
narrow_cast<uint8_t>((borderRGBA >> 16) & 0xff))
95 , borderB(
narrow_cast<uint8_t>((borderRGBA >> 8) & 0xff))
100 bgR[i] = narrow_cast<uint8_t>((rgba[i] >> 24) & 0xff);
101 bgG[i] = narrow_cast<uint8_t>((rgba[i] >> 16) & 0xff);
102 bgB[i] = narrow_cast<uint8_t>((rgba[i] >> 8) & 0xff);
103 auto alpha = narrow_cast<uint8_t>((rgba[i] >> 0) & 0xff);
104 bgA[i] = (alpha == 255) ? 256 : alpha;
107 auto alpha = narrow_cast<uint8_t>((borderRGBA >> 0) & 0xff);
108 borderA = (alpha == 255) ? 256 : alpha;
118void GLImage::initBuffers()
121 std::array<uint8_t, 10> indices = {4, 0, 5, 1, 6, 2, 7, 3, 4, 0};
122 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, elementsBuffer.
get());
123 glBufferData(GL_ELEMENT_ARRAY_BUFFER,
sizeof(indices), indices.data(), GL_STATIC_DRAW);
124 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
137 int bx = (
size[0] > 0) ? borderSize : -borderSize;
138 int by = (
size[1] > 0) ? borderSize : -borderSize;
139 std::array<ivec2, 8> positions = {
140 pos +
ivec2( + bx, + by),
151 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
153 glBindBuffer(GL_ARRAY_BUFFER, vbo[0].
get());
154 glBufferData(GL_ARRAY_BUFFER,
sizeof(positions), positions.data(), GL_STREAM_DRAW);
158 std::array<vec2, 4> tex = {
165 glContext.progTex.activate();
166 glUniform4f(glContext.unifTexColor,
167 narrow<float>(r) / 255.0f,
168 narrow<float>(
g) / 255.0f,
169 narrow<float>(b) / 255.0f,
170 narrow<float>(alpha) / 255.0f);
171 glUniformMatrix4fv(glContext.unifTexMvp, 1, GL_FALSE,
172 &glContext.pixelMvp[0][0]);
173 const ivec2* offset =
nullptr;
174 glVertexAttribPointer(0, 2, GL_INT, GL_FALSE, 0, offset + 4);
175 glEnableVertexAttribArray(0);
176 glBindBuffer(GL_ARRAY_BUFFER, vbo[1].
get());
177 glBufferData(GL_ARRAY_BUFFER,
sizeof(tex), tex.data(), GL_STREAM_DRAW);
178 glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0,
nullptr);
179 glEnableVertexAttribArray(1);
181 glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
182 glDisableVertexAttribArray(1);
183 glDisableVertexAttribArray(0);
188 glContext.progFill.activate();
189 glUniformMatrix4fv(glContext.unifFillMvp, 1, GL_FALSE,
190 &glContext.pixelMvp[0][0]);
191 glVertexAttribPointer(0, 2, GL_INT, GL_FALSE, 0,
nullptr);
192 glEnableVertexAttribArray(0);
194 narrow<float>(borderR) / 255.0f,
195 narrow<float>(borderG) / 255.0f,
196 narrow<float>(borderB) / 255.0f,
197 narrow<float>(borderA * alpha) / (255.0f * 255.0f));
199 if ((2 * borderSize >= abs(
size[0])) ||
200 (2 * borderSize >= abs(
size[1]))) {
202 glDrawArrays(GL_TRIANGLE_FAN, 4, 4);
205 if (borderSize > 0) {
206 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, elementsBuffer.
get());
207 glDrawElements(GL_TRIANGLE_STRIP, 10, GL_UNSIGNED_BYTE,
nullptr);
208 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
213 std::array<uint8_t, 4>{bgR[0], bgG[0], bgB[0], uint8_t((bgA[0] * alpha) / 256)},
214 std::array<uint8_t, 4>{bgR[2], bgG[2], bgB[2], uint8_t((bgA[2] * alpha) / 256)},
215 std::array<uint8_t, 4>{bgR[3], bgG[3], bgB[3], uint8_t((bgA[3] * alpha) / 256)},
216 std::array<uint8_t, 4>{bgR[1], bgG[1], bgB[1], uint8_t((bgA[1] * alpha) / 256)},
218 glBindBuffer(GL_ARRAY_BUFFER, vbo[2].
get());
219 glBufferData(GL_ARRAY_BUFFER,
sizeof(col), col.data(), GL_STREAM_DRAW);
220 glVertexAttribPointer(1, 4, GL_UNSIGNED_BYTE, GL_TRUE, 0,
nullptr);
221 glEnableVertexAttribArray(1);
222 glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
223 glDisableVertexAttribArray(1);
225 glDisableVertexAttribArray(0);
227 glDisableVertexAttribArray(0);
228 glBindBuffer(GL_ARRAY_BUFFER, 0);
Wrapper around a SDL_Surface.
Most basic/generic texture: only contains a texture ID.
GLuint get() const
Returns the underlying openGL handler id.
void bind()
Makes this texture the active GL texture.
static void checkSize(gl::ivec2 size)
Performs a sanity check on image size.
void draw(OutputSurface &output, gl::ivec2 pos, uint8_t r, uint8_t g, uint8_t b, uint8_t alpha) override
GLImage(OutputSurface &output, const std::string &filename)
A frame buffer where pixels can be written to.
constexpr vecN< N, int > trunc(const vecN< N, T > &x)
std::optional< Context > context
SDLSurfacePtr load(const std::string &filename, bool want32bpp)
Load the given PNG file in a SDL_Surface.
This file implemented 3 utility functions:
const T & get(const Event &event)
size_t size(std::string_view utf8)
constexpr To narrow_cast(From &&from) noexcept
constexpr auto xrange(T e)