# Thread: Ncurses colours without allocating colour pairs?

1. ## Ncurses colours without allocating colour pairs?

Is there a way to use colours in ncurses without having to declare the colour pair? I ask because I need to have 128 different combinations and surely declaring all those is a bad idea. Thanks

2. I don't see any way in the man pages to do that. What are you doing that you need 128 different combinations? Perhaps you could write a small program to generate the code necessary for that. And start_color() gives you 8 colors without having to do much, so it's like you only need 120 :P

3. Originally Posted by joshdick
I don't see any way in the man pages to do that. What are you doing that you need 128 different combinations? Perhaps you could write a small program to generate the code necessary for that. And start_color() gives you 8 colors without having to do much, so it's like you only need 120 :P
Well I'm making a program to load a zzt world file and display it like zzt would. Where I go from there I'm not sure

I can't think of a way to make the function though, the zzt colour code thing is similar but not the same as ncurses's colours.

Say if I defined the basic colours like this:

Code:
```#define BLACK 0
#define DARK_BLUE 1
#define DARK_GREEN 2
#define DARK_CYAN 3
#define DARK_RED 4
#define DARK_PURPLE 5
#define DARK_YELLOW 6
#define LIGHT_GREY 7
#define DARK_GREY 8
#define LIGHT_BLUE 9
#define LIGHT_GREEN 10
#define LIGHT_CYAN 11
#define LIGHT_RED 12
#define LIGHT_PURPLE 13
#define LIGHT_YELLOW 14
#define WHITE 15```
Then I could declare colour pairs for each cobinations:

Code:
```init_pair ( BLACK_BLACK, BLACK, BLACK );
init_pair ( DARK_BLUE_BLACK, DARK_BLUE, BLACK);
/* .... */```
But I need to think of a clever way to get from BLACK BLACK to BLACK_BLACK. Its all a bit confusing !

4. To find out what foreground color and background color is used by a color pair, use the function int pair_content(short pair, short *f, short *b). To find out the definition of a color use the function int color_content(short color, short *r, short *g, short *b)

From http://www.apmaths.uwo.ca/~xli/ncurses.html

5. Originally Posted by joshdick
To find out what foreground color and background color is used by a color pair, use the function int pair_content(short pair, short *f, short *b). To find out the definition of a color use the function int color_content(short color, short *r, short *g, short *b)

From http://www.apmaths.uwo.ca/~xli/ncurses.html
Do you think a simple loop through all the pairs checking for the right colours would be really inefficient? If I could do that I could just allocate all the pairs at the start of the program and then make a little function that takes two colours and returns the right pair's number.

6. I think that sounds efficient and downright swell.

7. Russled up some code . Not totaly sorted yet but you get the idea Thanks

Code:
```int pair_count = 0;

/* Colours */
#define BLACK 0
#define DARK_BLUE 1
#define DARK_GREEN 2
#define DARK_CYAN 3
#define DARK_RED 4
#define DARK_PURPLE 5
#define DARK_YELLOW 6
#define LIGHT_GREY 7
#define DARK_GREY 8
#define LIGHT_BLUE 9
#define LIGHT_GREEN 10
#define LIGHT_CYAN 11
#define LIGHT_RED 12
#define LIGHT_PURPLE 13
#define LIGHT_YELLOW 14
#define WHITE 15

void init()
{
/* Initialise colours */
short i, j;

for (i = 0; i < 8; i++)
for (j = 0; j < 16; j++)
{
init_pair ( pair_count, j, i);
pair_count++;
}
}

short pair(short wanted_fore, int wanted_back)
{
int i;
short fore, back;

for (i = 0; i < pair_count; i++)
{
pair_content(i, &fore, &back);
if ( (fore == wanted_fore) & (back == wanted_back) )
return i;
}
}

/* Being used */
attron (COLOR_PAIR(pair(LIGHT_RED,LIGHT_YELLOW)));
printw("TEST");```

8. It was all going so well and then I had a few problems with wierd colours showing up. After a while of chucking print's everywhere I have just figured out that theres a limit of 64 colour pairs! ARGH! Now I'm totaly buggered

9. Have you tried upping the number for COLOR_PAIR? If you can't, then you need to build a "palette". Set up constants for all of the pairs. Now define all of your items to have a set color pair value. (For example, you needed 128 color sets, thus, all of your items should have a value of 0 - 128 defining what color set they use.) Now then, when building a scene, you need to just make sure that you don't have more than 64 different colors selected. You can change your "palette" between scenes by making a list of what colors are already in the palette that are to be reused, and then replacing any of the ones you aren't going to be using this time through.

Read this, paying attention to the pharagraph starting with: "The init_pair routine changes the definition of a color-pair."

You're not buggered. You just need to rethink it a bit.

Quzah.

10. Originally Posted by quzah
Have you tried upping the number for COLOR_PAIR? If you can't, then you need to build a "palette". Set up constants for all of the pairs. Now define all of your items to have a set color pair value. (For example, you needed 128 color sets, thus, all of your items should have a value of 0 - 128 defining what color set they use.) Now then, when building a scene, you need to just make sure that you don't have more than 64 different colors selected. You can change your "palette" between scenes by making a list of what colors are already in the palette that are to be reused, and then replacing any of the ones you aren't going to be using this time through.

Read this, paying attention to the pharagraph starting with: "The init_pair routine changes the definition of a color-pair."

You're not buggered. You just need to rethink it a bit.

Quzah.
I have read that link lots but I really can't see how to increase the color_pair limit on it.

The idea of just using the colours you need is clever, I could always not initilise any, and when my pairs function is called it searches for the colour pair, if it can't be found it makes it / throws a colour limit reached error.

The thing is I'm sure normaly 64 colour pairs is pleanty but its kind of a shame having a limit incase someones map has more than that on it.

11. Well I got it working-ish. (Although it made me see that I'm not getting the player's colour properly!)

Code:
```short pair(short wanted_fore, short wanted_back)
{
int i;
short fore, back;

if ( (wanted_fore > 16) | (wanted_back > 8) | (wanted_fore < 0) | (wanted_back < 0) )
{
perror("Colour pair wanted is out of range");
return 0;
}

for (i = 0; i < pair_count; i++)
{
pair_content(i, &fore, &back);
if ( (fore == wanted_fore) & (back == wanted_back) )
return i;
}

if (pair_count >= 64)
{
perror("Colour pair limit reached");
return 0;
}
else
{
init_pair ( pair_count, wanted_fore, wanted_back);
pair_count++;

return pair_count - 1;
}
}```

12. Code:
``` if ( (wanted_fore > 16) | (wanted_back > 8) | (wanted_fore < 0) | (wanted_back < 0) )
{
perror("Colour pair wanted is out of range");
return 0;
}```
Just in case you aren't aware, you're using a bit-wise OR there. Did you mean to? You would be better served using the logical-OR there due to short circuiting of the if check.

It doesn't save you a lot, but it is faster there because in the even the first check is true, it will stop testing the rest of the check. Where as with with the bit-wise or, it still tests all of the checks, and ORs the results together to give you one final true / false.

You do the same thing later on with a bit-wise AND. You want || and && for logical tests.

Quzah.

13. ok learn somthing new every day