diff --git a/binding-mri/bitmap-binding.cpp b/binding-mri/bitmap-binding.cpp index 11a0697..4a31d1f 100644 --- a/binding-mri/bitmap-binding.cpp +++ b/binding-mri/bitmap-binding.cpp @@ -445,6 +445,28 @@ RB_METHOD(bitmapWriteToPng) return self; } +RB_METHOD(bitmapVFlip) +{ + RB_UNUSED_PARAM; + + Bitmap *b = getPrivateData(self); + + b->vFlip(); + + return Qnil; +} + +RB_METHOD(bitmapHFlip) +{ + RB_UNUSED_PARAM; + + Bitmap *b = getPrivateData(self); + + b->hFlip(); + + return Qnil; +} + void bitmapBindingInit() @@ -479,6 +501,8 @@ bitmapBindingInit() } _rb_define_method(klass, "write_to_png", bitmapWriteToPng); + _rb_define_method(klass, "v_flip", bitmapVFlip); + _rb_define_method(klass, "h_flip", bitmapHFlip); INIT_PROP_BIND(Bitmap, Font, "font"); } diff --git a/doc/extension_doc.md b/doc/extension_doc.md index 98085a8..9a3caa7 100644 --- a/doc/extension_doc.md +++ b/doc/extension_doc.md @@ -14,6 +14,11 @@ returns: self Writes the contents of the bitmap to `filename`, in PNG format. +## Bitmap.v_flip() / .h_flip() +returns: nil + +Flips the bitmap image vertically / horizontally. + ## Input.scroll_v() returns: Integer diff --git a/src/bitmap.cpp b/src/bitmap.cpp index a8d2aab..bebb8b0 100644 --- a/src/bitmap.cpp +++ b/src/bitmap.cpp @@ -259,6 +259,34 @@ struct BitmapPrivate glState.viewport.pop(); } + + void flip(const IntRect &srcRect) + { + TEXFBO newTex = shState->texPool().request(gl.width, gl.height); + + SimpleShader &shader = shState->shaders().simple; + shader.bind(); + shader.setTexOffsetX(0); + bindTexture(shader); + + Quad &quad = shState->gpQuad(); + quad.setTexPosRect(srcRect, IntRect(0, 0, gl.width, gl.height)); + quad.setColor(Vec4(1, 1, 1, 1)); + + glState.blend.pushSet(false); + pushSetViewport(shader); + + FBO::bind(newTex.fbo); + blitQuad(quad); + + popViewport(); + glState.blend.pop(); + + shState->texPool().release(gl); + gl = newTex; + + onModified(); + } }; struct BitmapOpenHandler : FileSystem::OpenHandler @@ -1410,6 +1438,22 @@ void Bitmap::writeToPng(const char *filename) IMG_SavePNG(p->surface, filename); } +void Bitmap::vFlip() +{ + guardDisposed(); + GUARD_MEGA; + + p->flip(IntRect(0, p->gl.height, p->gl.width, -p->gl.height)); +} + +void Bitmap::hFlip() +{ + guardDisposed(); + GUARD_MEGA; + + p->flip(IntRect(p->gl.width, 0, -p->gl.width, p->gl.height)); +} + TEXFBO &Bitmap::getGLTypes() { return p->gl; diff --git a/src/bitmap.h b/src/bitmap.h index 68bb7f9..ed0a749 100644 --- a/src/bitmap.h +++ b/src/bitmap.h @@ -108,6 +108,9 @@ public: /* extensions */ void writeToPng(const char *filename); + void vFlip(); + void hFlip(); + /* */ TEXFBO &getGLTypes(); SDL_Surface *megaSurface() const;