Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to flip a pixmap to draw to a texture in libgdx?

So what I'm trying to do is to generate a background image for my game by drawing pixmaps to a texture. So far I can do that, but now I need to draw the pixmaps flipped in the X or Y axis to the texture. However I can't find anything to do so. The pixmap class does not provide that functionality. Then I thought I could draw a flipped texture region to a texture, but so far I haven't found how to do so. So I was wondering how can I do such a thing, would it be possible to flip a png image with other java libraries and then create a pixmap from that flipped image?

like image 903
Leonso Medina Lopez Avatar asked Sep 22 '12 23:09

Leonso Medina Lopez


People also ask

How do you flip a texture in Libgdx?

Texture tex = new Texture("path"); Sprite sprite = new Sprite(tex); sprite. flip(true, false); true as the first parameter for flipping over x-axis and false for y-axis, which is what you are looking for in your specific example.

What is pixmap Libgdx?

Introduction. A Pixmap (code) encapsulates image data resident in memory. It supports simple file loading and draw operations for basic image manipulation. The most typical use is preparation of an image for upload to the GPU by wrapping in a Texture (code) instance.


2 Answers

I also don't see other option except to iterate the pixels:

public Pixmap flipPixmap(Pixmap src) {
    final int width = src.getWidth();
    final int height = src.getHeight();
    Pixmap flipped = new Pixmap(width, height, src.getFormat());

    for (int x = 0; x < width; x++) {
        for (int y = 0; y < height; y++) {
            flipped.drawPixel(x, y, src.getPixel(width - x - 1, y));
        }
    }
    return flipped;
}
like image 94
Petko Petkov Avatar answered Oct 08 '22 16:10

Petko Petkov


Here's a solution that doesn't require the creation of a new Pixmap. This code can also be modified to flip a Pixmap horizontally and vertically by swapping corners of a pixmap image instead of swapping pixels on opposite sides of the image.

public static void flipPixmap( Pixmap p ){
    int w = p.getWidth();
    int h = p.getHeight();
    int hold;

    //change blending to 'none' so that alpha areas will not show
      //previous orientation of image
    p.setBlending(Pixmap.Blending.None);
    for (int y = 0; y < h / 2; y++) {
        for (int x = 0; x < w / 2; x++) {
            //get color of current pixel
            hold = p.getPixel(x,y);
            //draw color of pixel from opposite side of pixmap to current position
            p.drawPixel(x,y, p.getPixel(w-x-1, y));
            //draw saved color to other side of pixmap
            p.drawPixel(w-x-1,y, hold);
            //repeat for height/width inverted pixels
            hold = p.getPixel(x, h-y-1);
            p.drawPixel(x,h-y-1, p.getPixel(w-x-1,h-y-1));
            p.drawPixel(w-x-1,h-y-1, hold);
        }
    }
    //set blending back to default
    p.setBlending(Pixmap.Blending.SourceOver);
}
like image 45
jigritsn Avatar answered Oct 08 '22 14:10

jigritsn