Thread overview
1 more header file conversion question
May 17, 2005
Oliver
May 17, 2005
Walter
May 17, 2005
Ben Hinkle
May 17, 2005
pragma
May 22, 2005
James Dunne
May 17, 2005
Hello and thanks for the help I already received !

I have another problem concerning converting a C header file to D.

I have :

#define BLACK           rgb(0x00,0x00,0x00);
#define WHITE           rgb(0xFF,0xFF,0xFF);
#define BLUE            rgb(0x00,0x00,0xFF);
...

where Color rgb(int,int,int) is a function defined in the same file. Any ideas ? I tried with aliases and typedefs but no success...

Oliver


May 17, 2005
"Oliver" <Oliver_member@pathlink.com> wrote in message news:d6d7sb$9d4$1@digitaldaemon.com...
> Hello and thanks for the help I already received !
>
> I have another problem concerning converting a C header file to D.
>
> I have :
>
> #define BLACK           rgb(0x00,0x00,0x00);
> #define WHITE           rgb(0xFF,0xFF,0xFF);
> #define BLUE            rgb(0x00,0x00,0xFF);
> ...
>
> where Color rgb(int,int,int) is a function defined in the same file. Any ideas ? I tried with aliases and typedefs but no success...

int BLACK() { return rgb(0,0,0); }


May 17, 2005
"Oliver" <Oliver_member@pathlink.com> wrote in message news:d6d7sb$9d4$1@digitaldaemon.com...
> Hello and thanks for the help I already received !
>
> I have another problem concerning converting a C header file to D.
>
> I have :
>
> #define BLACK           rgb(0x00,0x00,0x00);
> #define WHITE           rgb(0xFF,0xFF,0xFF);
> #define BLUE            rgb(0x00,0x00,0xFF);
> ...
>
> where Color rgb(int,int,int) is a function defined in the same file. Any ideas ? I tried with aliases and typedefs but no success...
>
> Oliver

Let me mention just in case: if you also have extern(C) global variables in the header be sure to look at http://www.digitalmars.com/d/htomodule.html the section about extern variables. You won't be able to have one module contain the "macros" (that Walter's post contains) and the extern variables since the macros need to be linked in and the extern vars can't be linked in.


May 17, 2005
In article <d6d7sb$9d4$1@digitaldaemon.com>, Oliver says...
>
>Hello and thanks for the help I already received !
>
>I have another problem concerning converting a C header file to D.
>
>I have :
>
>#define BLACK           rgb(0x00,0x00,0x00);
>#define WHITE           rgb(0xFF,0xFF,0xFF);
>#define BLUE            rgb(0x00,0x00,0xFF);
>...
>
>where Color rgb(int,int,int) is a function defined in the same file. Any ideas ? I tried with aliases and typedefs but no success...

Here, I think you're at the limits of what D's templates and aliases can provide you.  You're stuck either using functions (and relying on the compiler to inline for efficency) or go up the call chain to what 'rgb' is returing.

Color WHITE(){ return rgb(0xFF,0xFF,0xFF); }

In case of the latter, most graphics libs recognize certain bit-packed formats for color that are pretty easy to declare w/o need of a funciton.

// assuming AARRGGBB (where AA = alpha channel)
static const uint BLACK = 0xFF000000;
static const uint WHITE = 0xFFFFFFFF;
static const uint BLUE =  0xFF0000FF;

Even if this isn't the color format you had in mind, I'd highly reccomend it as it makes working with existing graphics libs (like openGL for instance) much easier.  If you must have the ability to access the components by name, then I'd suggest something like the following:

> struct ARGB{
>     byte alpha,red,green,blue;
> }
> 
> struct Color{
>     union{
>         uint bits;
>         ARGB argb;
>     }
>     byte alpha(){ return argb.alpha; }
>     byte red(){ return argb.red; }
>     byte green(){ return argb.green; }
>     byte blue(){ return argb.blue; }
> 
>     Color create(uint bits){ Color value; value.bits=bits; return value; }
> }
> 
> static Color BLACK = Color.create(0x00000000);

- EricAnderton at yahoo
May 22, 2005
In article <d6ddk5$eo1$1@digitaldaemon.com>, pragma says...
>
>In article <d6d7sb$9d4$1@digitaldaemon.com>, Oliver says...
>>
>>Hello and thanks for the help I already received !
>>
>>I have another problem concerning converting a C header file to D.
>>
>>I have :
>>
>>#define BLACK           rgb(0x00,0x00,0x00);
>>#define WHITE           rgb(0xFF,0xFF,0xFF);
>>#define BLUE            rgb(0x00,0x00,0xFF);
>>...
>>
>>where Color rgb(int,int,int) is a function defined in the same file. Any ideas ? I tried with aliases and typedefs but no success...
>
>Here, I think you're at the limits of what D's templates and aliases can provide you.  You're stuck either using functions (and relying on the compiler to inline for efficency) or go up the call chain to what 'rgb' is returing.
>
>Color WHITE(){ return rgb(0xFF,0xFF,0xFF); }
>
>In case of the latter, most graphics libs recognize certain bit-packed formats for color that are pretty easy to declare w/o need of a funciton.
>
>// assuming AARRGGBB (where AA = alpha channel)
>static const uint BLACK = 0xFF000000;
>static const uint WHITE = 0xFFFFFFFF;
>static const uint BLUE =  0xFF0000FF;
>
>Even if this isn't the color format you had in mind, I'd highly reccomend it as it makes working with existing graphics libs (like openGL for instance) much easier.  If you must have the ability to access the components by name, then I'd suggest something like the following:
>
>> struct ARGB{
>>     byte alpha,red,green,blue;
>> }

I think you want that a ubyte (unsigned) so as to get the full 0-255 range. Simple typo, I know.  But for those learning the language, best to not confuse :)

>> 
>> struct Color{
>>     union{
>>         uint bits;
>>         ARGB argb;
>>     }
>>     byte alpha(){ return argb.alpha; }
>>     byte red(){ return argb.red; }
>>     byte green(){ return argb.green; }
>>     byte blue(){ return argb.blue; }
>> 
>>     Color create(uint bits){ Color value; value.bits=bits; return value; }
>> }
>> 
>> static Color BLACK = Color.create(0x00000000);
>
>- EricAnderton at yahoo

Regards,
James Dunne