X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fframebuffer.cpp;h=3d9b0133622b3bcec7590c440b8841f478217d16;hb=ccbcce1d5c7fae8ec644e465ac936f5c39000e57;hp=ea28d5db2d261eeb999d1e6c05eea38b6aefe70a;hpb=6fa59eb26c39443eb44feecd17b7a8ea45411730;p=libs%2Fgl.git diff --git a/source/framebuffer.cpp b/source/framebuffer.cpp index ea28d5db..3d9b0133 100644 --- a/source/framebuffer.cpp +++ b/source/framebuffer.cpp @@ -1,11 +1,12 @@ /* $Id$ This file is part of libmspgl -Copyright © 2007 Mikko Rasa, Mikkosoft Productions +Copyright © 2007-2011 Mikko Rasa, Mikkosoft Productions Distributed under the LGPL */ #include "extension.h" +#include "ext_framebuffer_blit.h" #include "ext_framebuffer_object.h" #include "framebuffer.h" #include "misc.h" @@ -146,6 +147,39 @@ void Framebuffer::clear(BufferBits bits) glClear(bits); } +void Framebuffer::blit_from(const Framebuffer &other, int sx0, int sy0, int sx1, int sy1, int dx0, int dy0, int dx1, int dy1, BufferBits bits, bool filter) +{ + static RequireExtension _ext("GL_EXT_framebuffer_blit"); + + const Framebuffer *old = current(); + if(set_current(this)) + { + glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, id); + if(dirty) + { + update_attachment(dirty); + dirty = 0; + } + } + if(old!=&other) + glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, other.id); + + glBlitFramebufferEXT(sx0, sy0, sx1, sy1, dx0, dy0, dx1, dy1, bits, (filter ? GL_LINEAR : GL_NEAREST)); + + set_current(old); + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, (old ? old->id : 0)); +} + +void Framebuffer::blit_from(const Framebuffer &other, int sx, int sy, unsigned wd, unsigned ht, int dx, int dy, BufferBits bits) +{ + blit_from(other, sx, sy, sx+wd, sy+ht, dx, dy, dx+wd, dy+ht, bits, false); +} + +void Framebuffer::blit_from(const Framebuffer &other, BufferBits bits, bool filter) +{ + blit_from(other, 0, 0, other.width, other.height, 0, 0, width, height, bits, filter); +} + void Framebuffer::bind() const { if(set_current(this))