Xlib - Rotation and interpolation of pixmap - Performance problems


 
Thread Tools Search this Thread
Top Forums Programming Xlib - Rotation and interpolation of pixmap - Performance problems
# 1  
Old 07-14-2014
Xlib - Rotation and interpolation of pixmap - Performance problems

I need to rotate a pixmap in XLib with some kind of interpolation to reduce the aliasing.

I came up with the following code, which uses bilinear interpolation. It works fine: the rotated image looks perfect, but unfortunately it takes 5 or 6 seconds for each rotation. (in a 300x300, 16 colours pixmap)

The following is the code I am using:
Code:
#define CONST (double)((double)180/M_PI)

        cx = attrib.width/2;
        cy = attrib.height/2;

        unsigned long tleft_p, tright_p, bleft_p, bright_p;
        unsigned long background_p;
        XColor tleft_c, tright_c, bleft_c, bright_c;


        Display *dpy = XtDisplay(w);
        Colormap cmap = DefaultColormap(dpy, DefaultScreen(dpy));


        for (y=1; y<attrib.height; y++) {
                for (x=1; x<attrib.width; x++) {
                        XColor mycol;
                        int xx, yy, floor_x, floor_y, ceil_x, ceil_y;
                        float dist, ang, true_x, true_y, delta_x, delta_y;
                        float tred, tgreen, tblue, bred, bgreen, bblue;
                        int red, green, blue;

                        /* rotation */
                        xx = x - attrib.width/2;
                        yy = y - attrib.height/2;
                        true_x = (double)xx * cos((double)deg/CONST) + (double)yy * sin((double)deg/CONST);
                        true_y = (double)xx * -sin((double)deg/CONST) + (double)yy * cos((double)deg/CONST);
 
                        true_x += attrib.height/2;
                        true_y += attrib.width/2;
        
                        floor_x = (int)floor(true_x);
                        floor_y = (int)floor(true_y);
                        ceil_x = (int)ceil(true_x);
                        ceil_y = (int)ceil(true_y);
        
                        delta_x = true_x - (double)floor_x;
                        delta_y = true_y - (double)floor_y;
        
                        tleft_p = XGetPixel(src, floor_x, floor_y);
                        tright_p = XGetPixel(src, ceil_x, floor_y);
                        bleft_p = XGetPixel(src, floor_x, ceil_y);
                        bright_p = XGetPixel(src, ceil_x, ceil_y);
        
                        tleft_c.pixel = tleft_p;
                        tright_c.pixel= tright_p;
                        bleft_c.pixel = bleft_p;
                        bright_c.pixel= bright_p;
                        XQueryColor(dpy, cmap, &tleft_c);
                        XQueryColor(dpy, cmap, &tright_c); 
                        XQueryColor(dpy, cmap, &bleft_c);
                        XQueryColor(dpy, cmap, &bright_c);

                        /* interpolation */
                        /* tred = top red,  bred = bottom red ... */
                        tred = (1-delta_x)* (int)tleft_c.red + delta_x * tright_c.red;
                        tgreen = (1-delta_x)* (int)tleft_c.green + delta_x * tright_c.green;
                        tblue = (1-delta_x)* (int)tleft_c.blue + delta_x * tright_c.blue;

                        bred = (1-delta_x) * (int)bleft_c.red + delta_x * (int)bright_c.red;
                        bgreen = (1-delta_x)*(int)bleft_c.green+delta_x * (int)bright_c.green;
                        bblue = (1-delta_x)* (int)bleft_c.blue+ delta_x * (int)bright_c.blue;

                        red = (int)round((1-delta_y) * tred + delta_y * bred);
                        green = (int)round((1-delta_y) * tgreen + delta_y * bgreen);
                        blue = (int)round((1-delta_y) * tblue + delta_y * bblue);

                        if (red < 0) red = 0;
                        if (green<0) green=0;
                        if (blue<0)  blue =0;
                        if (blue>65535) blue=65535;
                        if (green>65535) green=65535;
                        if (red>65535) red=65535;

                        mycol.red = red;
                        mycol.green=green;
                        mycol.blue=blue;
                        XAllocColor(dpy, cmap, &mycol);

                        XPutPixel(dest, x, y, mycol.pixel);
                }
        }

I attached a working test program, if you wish to try it.
You should link with:
Code:
-lXm -lXt -lX11 -lXp -lXext -lXpm -lm

It requires Motif widget toolkit.

Could you suggest a way to get a reasonable speed?

Thank you very much for your kind help.
--mghis

P.S.: Sorry for my bad English: I'm not a native speaker.
# 2  
Old 07-14-2014
Aside from algorithmic changes (and those usually result in the best speeding up) I see that sine and cosine functions are called repetitively, so I'd call them once and store result in a local double variable, then use those variables in your formulas, like so:
Code:
 
 cos_var = cos((double)deg/CONST);
 sin_var = sin((double)deg/CONST);
 true_x = true_x = (double)xx * cos_var + (double)yy * sin_var;
 etc...

# 3  
Old 07-14-2014
Thank you, migurus, for your reply.
It did speed it up a bit, but I noticed the problem is mainly in the XAllocColor() call. In fact, if I remove that call and always put a black pixel, (still calculating the values), the program runs at less than half a second per rotation.

However I really don't know to get rid of XAllocColor().

I am writing pixels to an XImage. Is there a way to access directly the RGB values of each pixel?
# 4  
Old 07-16-2014
How are you creating the "dest" XImage? You should probably manipulate the data sent to XCreateImage directly, before calling XCreateImage() to create the dest image.
# 5  
Old 07-17-2014
Src and dest are created with:
Code:
src = XGetImage(dpy, pix, 0, 0, width, height, AllPlanes, ZPixmap);
dest = XGetImage(dpy, pix, 0, 0, width, height, AllPlanes, ZPixmap);

They are both XImages of the Pixmap I need to rotate.
# 6  
Old 07-19-2014
Here's an example of a program that rotates huge images almost instantly:

Simple Image Viewer for Linux/X11: Xiv | Blog L’Ordikc
Login or Register to Ask a Question

Previous Thread | Next Thread

9 More Discussions You Might Find Interesting

1. What is on Your Mind?

MySQL Performance Problems

Just restarted MySQL a few times. There seems to be a problem with MySQL performance because one table (our man page table) is too large and I need to move that table to a new database and out of the main forums DB. That table is over 7 GB, bigger than the rest of the DB combined: ... (14 Replies)
Discussion started by: Neo
14 Replies

2. Shell Programming and Scripting

An interpolation between two files

Dear all, I always appreciate your help. I am an electrical engineer. I am using a tool for timing analysis of a circuit. I would like to interpolate results from two timing reports at different voltages (0.945V and 0.78V). If voltage is decreased, data arrival time is increased. For... (4 Replies)
Discussion started by: jypark22
4 Replies

3. Shell Programming and Scripting

Hi ! whether it is possible to do interpolation in scripting...

Hi ! Experts... I just wanted to know whether it is possible in scripting...to do interpolation.... if so....have a look on my data file I need temperature and salinity value with a bin size of 0.5 m output looks somewhat like this dep temp sal 0.5 25 0.077 1 25 ... (12 Replies)
Discussion started by: nex_asp
12 Replies

4. Shell Programming and Scripting

Interpolation using awk

Hi all, Consider I have a text file containing: 1003 60 1005 80 1100 110 Based on that file I need to create another file which is containing value from 1001 till 1100 which is a linear interpolation between two point (for 1004; 1006;1007 until 1109) and extrapolation based on 2... (7 Replies)
Discussion started by: ardy_yana
7 Replies

5. AIX

AIX 5.3 performance problems

Hello, I encounter some performance issues on my AIX 5.3 server running in a LPAR on a P520. How do I investigate performance issues in AIX. Is there any kind of procedure that takes me to the steps to investigate my server and find the sub systems that is causing the issues? The performance... (1 Reply)
Discussion started by: petervg
1 Replies

6. SCO

CPU Performance Problems on VMWARE

hi We have migrated SCO 5.0.6 into ESX4, but the VM eats 100% of the virtual CPU. Here is top print from the SCO VM: last pid: 16773; load averages: 1.68, 1.25, 0.98 02:08:41 79 processes: 75 sleeping, 2 running, 1 zombie, 1 onproc CPU states: 0.0% idle, 17.0% user,... (7 Replies)
Discussion started by: ccc
7 Replies

7. AIX

Performance and paging problems

... a disk drive to be 100% busy? hdisk0 100.0 1.3K 342.7 1.3K 22.0 PgspIn 651 % Noncomp 75.5 hdisk1 100.0 1.3K 320.2 1.2K 20.0 PgspOut 6 % Client 75.5 It's really slowing down performance on my system and I would like to know what is causing this. ... (2 Replies)
Discussion started by: bbbngowc
2 Replies

8. Programming

problems with drawing in x using xlib

Hi all, I'm currently learning xlib and I've encountered a bizarre mistake: function calls such as XDrawPoint, XDrawLine, etc., don't seem to work; a blank window with nothing in is appears. I believe this has something to do with the window manager I use, fluxbox. After checking the code and... (0 Replies)
Discussion started by: hydronium
0 Replies

9. UNIX for Dummies Questions & Answers

variable interpolation

I've become obsessed with trying to get this to work. As of yet, I am unable to figure it out. Unfortunately, I don't have Linux or UNIX available when I get home. Anyone have tips for me on how I can pass param1 to ID via use of COUNTER and loop? thx. LIMIT=6 param1="999999999" export... (0 Replies)
Discussion started by: egkumpe
0 Replies
Login or Register to Ask a Question