#include <iostream>
#include <stdexcept>
#define GET_COMPONENT(color, index) (((0xFF << (index * 8)) & color) >> (index * 8))
unsigned int get_component(unsigned int color, unsigned int index)
{
const unsigned int shift = index * 8;
const unsigned int mask = 0xFF << shift;
return (color & mask) >> shift;
}
enum color_component
{
A,B,G,R
};
unsigned int get_component(unsigned int color, color_component component)
{
switch (component)
{
case R:
case G:
case B:
case A:
{
const unsigned int shift = component * 8;
const unsigned int mask = 0xFF << shift;
return (color & mask) >> shift;
}
default:
throw std::invalid_argument("invalid color component");
}
return 0;
}
int main(int argc, char **argv)
{
unsigned int the_color = 0xAABBCCFF;
std::cout << std::hex << "With macro:\n"
<< "R: " << GET_COMPONENT(the_color, 3) << '\n'
<< "G: " << GET_COMPONENT(the_color, 2) << '\n'
<< "B: " << GET_COMPONENT(the_color, 1) << '\n'
<< "A: " << GET_COMPONENT(the_color, 0) << '\n';
std::cout << std::hex << "With function:\n"
<< "R: " << get_component(the_color, 3) << '\n'
<< "G: " << get_component(the_color, 2) << '\n'
<< "B: " << get_component(the_color, 1) << '\n'
<< "A: " << get_component(the_color, 0) << '\n';
std::cout << std::hex << "With function:\n"
<< "R: " << get_component(the_color, R) << '\n'
<< "G: " << get_component(the_color, G) << '\n'
<< "B: " << get_component(the_color, B) << '\n'
<< "A: " << get_component(the_color, A) << '\n';
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RkZXhjZXB0PgoKI2RlZmluZSBHRVRfQ09NUE9ORU5UKGNvbG9yLCBpbmRleCkgKCgoMHhGRiA8PCAoaW5kZXggKiA4KSkgJiBjb2xvcikgPj4gKGluZGV4ICogOCkpCgp1bnNpZ25lZCBpbnQgZ2V0X2NvbXBvbmVudCh1bnNpZ25lZCBpbnQgY29sb3IsIHVuc2lnbmVkIGludCBpbmRleCkKewogICAgY29uc3QgdW5zaWduZWQgaW50IHNoaWZ0ID0gaW5kZXggKiA4OwogICAgY29uc3QgdW5zaWduZWQgaW50IG1hc2sgPSAweEZGIDw8IHNoaWZ0OwogICAgcmV0dXJuIChjb2xvciAmIG1hc2spID4+IHNoaWZ0Owp9CgplbnVtIGNvbG9yX2NvbXBvbmVudAp7CiAgICBBLEIsRyxSCn07Cgp1bnNpZ25lZCBpbnQgZ2V0X2NvbXBvbmVudCh1bnNpZ25lZCBpbnQgY29sb3IsIGNvbG9yX2NvbXBvbmVudCBjb21wb25lbnQpCnsKICAgIHN3aXRjaCAoY29tcG9uZW50KQogICAgewogICAgICAgIGNhc2UgUjoKICAgICAgICBjYXNlIEc6CiAgICAgICAgY2FzZSBCOgogICAgICAgIGNhc2UgQToKICAgICAgICB7CiAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBzaGlmdCA9IGNvbXBvbmVudCAqIDg7CiAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBtYXNrID0gMHhGRiA8PCBzaGlmdDsKICAgICAgICAgICAgcmV0dXJuIChjb2xvciAmIG1hc2spID4+IHNoaWZ0OyAgICAgICAgICAgIAogICAgICAgIH0KICAgIAogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHRocm93IHN0ZDo6aW52YWxpZF9hcmd1bWVudCgiaW52YWxpZCBjb2xvciBjb21wb25lbnQiKTsKICAgIH0KCiAgICByZXR1cm4gMDsKfQoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQp7CiAgICB1bnNpZ25lZCBpbnQgdGhlX2NvbG9yID0gMHhBQUJCQ0NGRjsKICAgIHN0ZDo6Y291dCA8PCBzdGQ6OmhleCA8PCAiV2l0aCBtYWNybzpcbiIKICAgICAgICA8PCAiUjogIiA8PCBHRVRfQ09NUE9ORU5UKHRoZV9jb2xvciwgMykgPDwgJ1xuJwogICAgICAgIDw8ICJHOiAiIDw8IEdFVF9DT01QT05FTlQodGhlX2NvbG9yLCAyKSA8PCAnXG4nCiAgICAgICAgPDwgIkI6ICIgPDwgR0VUX0NPTVBPTkVOVCh0aGVfY29sb3IsIDEpIDw8ICdcbicKICAgICAgICA8PCAiQTogIiA8PCBHRVRfQ09NUE9ORU5UKHRoZV9jb2xvciwgMCkgPDwgJ1xuJzsKCiAgICBzdGQ6OmNvdXQgPDwgc3RkOjpoZXggPDwgIldpdGggZnVuY3Rpb246XG4iCiAgICAgICAgPDwgIlI6ICIgPDwgZ2V0X2NvbXBvbmVudCh0aGVfY29sb3IsIDMpIDw8ICdcbicKICAgICAgICA8PCAiRzogIiA8PCBnZXRfY29tcG9uZW50KHRoZV9jb2xvciwgMikgPDwgJ1xuJwogICAgICAgIDw8ICJCOiAiIDw8IGdldF9jb21wb25lbnQodGhlX2NvbG9yLCAxKSA8PCAnXG4nCiAgICAgICAgPDwgIkE6ICIgPDwgZ2V0X2NvbXBvbmVudCh0aGVfY29sb3IsIDApIDw8ICdcbic7CgogICAgc3RkOjpjb3V0IDw8IHN0ZDo6aGV4IDw8ICJXaXRoIGZ1bmN0aW9uOlxuIgogICAgICAgIDw8ICJSOiAiIDw8IGdldF9jb21wb25lbnQodGhlX2NvbG9yLCBSKSA8PCAnXG4nCiAgICAgICAgPDwgIkc6ICIgPDwgZ2V0X2NvbXBvbmVudCh0aGVfY29sb3IsIEcpIDw8ICdcbicKICAgICAgICA8PCAiQjogIiA8PCBnZXRfY29tcG9uZW50KHRoZV9jb2xvciwgQikgPDwgJ1xuJwogICAgICAgIDw8ICJBOiAiIDw8IGdldF9jb21wb25lbnQodGhlX2NvbG9yLCBBKSA8PCAnXG4nOwoKICAgIHJldHVybiAwOwp9Cg==