123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226 |
- #include "GammaFilter.h"
- #include "api.h"
- int GammaFilter::filterBitmap(uint8_t *bits, int w, int h, int bpp, const wchar_t *element_id, const wchar_t *forcegroup)
- {
- int r = 0, g = 0, b = 0;
- int gray = 0;
- int boost = 0;
- const wchar_t *gammagroup;
- if (forcegroup && *forcegroup)
- gammagroup = forcegroup;
- else
- gammagroup = WASABI_API_PALETTE->getGammaGroupFromId(element_id);
- WASABI_API_COLORTHEMES->getGammaForGroup(gammagroup, &r, &g, &b, &gray, &boost);
- if (!r && !g && !b && !gray && !boost) return 1;
- if (bpp != 32) return 0;
- int *p;
- int l = w * h;
- int c;
- if (gray == 1)
- {
- int r, g, b;
- p = (int *)bits;
- while (l--)
- {
- r = (*p & 0xff0000) >> 16;
- g = (*p & 0xff00) >> 8;
- b = (*p & 0xff);
- c = MAX(MAX(r, g), b);
- c = (c << 16) | (c << 8) | c;
- *p = (*p & 0xff000000) | c;
- p++;
- }
- }
- if (gray == 2)
- {
- int r, g, b;
- p = (int *)bits;
- while (l--)
- {
- r = (*p & 0xff0000) >> 16;
- g = (*p & 0xff00) >> 8;
- b = (*p & 0xff);
- c = (r + g + b) / 3;
- c = (c << 16) | (c << 8) | c;
- *p = (*p & 0xff000000) | c;
- p++;
- }
- }
- if (boost)
- {
- l = w * h;
- int r, g, b, a;
- p = (int *)bits;
- while (l--)
- {
- a = (*p & 0xff000000) >> 25;
- r = ((*p & 0xff0000) >> 17) + a;
- g = ((*p & 0xff00) >> 9) + a;
- b = ((*p & 0xff) >> 1) + a;
- *p = (*p & 0xff000000) | (r << 16) | (g << 8) | b;
- p++;
- }
- }
- int rm = 65535 + (r << 4);
- int gm = 65535 + (g << 4);
- int bm = 65535 + (b << 4);
- l = w * h;
- p = (int *)bits;
- while (l--)
- {
- r = ((((*p & 0xff0000) >> 16) * rm)) & 0xffff0000;
- c = MAX(0, MIN(r, 0xFF0000));
- r = ((((*p & 0xff00) >> 8) * gm) >> 8) & 0xffff00;
- c |= MAX(0, MIN(r, 0xFF00));
- r = (((*p & 0xff) * bm) >> 16) & 0xffff;
- c |= MAX(0, MIN(r, 0xFF));
- c = (c & 0xFFFFFF) | (*p & 0xFF000000);
- *p = c;
- p++;
- }
- return 1;
- }
- ARGB32 GammaFilter::filterColor(ARGB32 color, const wchar_t *element_id, const wchar_t *forcegroup)
- {
- int r = 0, g = 0, b = 0, gray = 0, boost = 0;
- const wchar_t *gammagroup;
- if (forcegroup && *forcegroup)
- gammagroup = forcegroup;
- else
- gammagroup = WASABI_API_PALETTE->getGammaGroupFromId(element_id);
- WASABI_API_COLORTHEMES->getGammaForGroup(gammagroup, &r, &g, &b, &gray, &boost);
- if (!r && !g && !b && !gray && !boost) return color;
- ARGB32 c;
- if (gray == 1)
- {
- int r, g, b;
- r = (color & 0xff0000) >> 16;
- g = (color & 0xff00) >> 8;
- b = (color & 0xff);
- c = MAX(MAX(r, g), b);
- c = (c << 16) | (c << 8) | c;
- color = (color & 0xff000000) | c;
- }
- if (gray == 2)
- {
- int r, g, b;
- r = (color & 0xff0000) >> 16;
- g = (color & 0xff00) >> 8;
- b = (color & 0xff);
- c = (r + g + b) / 3;
- c = (c << 16) | (c << 8) | c;
- color = (color & 0xff000000) | c;
- }
- if (boost)
- {
- int r, g, b;
- r = ((color & 0xff0000) >> 17) + 0x80;
- g = ((color & 0xff00) >> 9) + 0x80;
- b = ((color & 0xff) >> 1) + 0x80;
- color = (color & 0xff000000) | (r << 16) | (g << 8) | b;
- }
- int bm = 65536 + (r << 4);
- int gm = 65536 + (g << 4);
- int rm = 65536 + (b << 4);
- r = ((((color & 0xff0000) >> 16) * rm)) & 0xffff0000;
- c = MAX(0, MIN(r, 0xFF0000));
- r = ((((color & 0xff00) >> 8) * gm) >> 8) & 0xffff00;
- c |= MAX(0, MIN(r, 0xFF00));
- r = (((color & 0xff) * bm) >> 16) & 0xffff;
- c |= MAX(0, MIN(r, 0xFF));
- c = (c & 0xFFFFFF) | (color & 0xFF000000);
- return c;
- }
- #define CBCLASS GammaFilter
- START_DISPATCH;
- CB(FILTERBITMAP, filterBitmap);
- CB(FILTERCOLOR, filterColor);
- END_DISPATCH;
- #undef CBCLASS
- static GammaFilter gammaFilterService;
- // {B092B4BD-32E1-4c35-B4AE-90B34565D9D6}
- static const GUID gammaFilterGUID =
- { 0xb092b4bd, 0x32e1, 0x4c35, { 0xb4, 0xae, 0x90, 0xb3, 0x45, 0x65, 0xd9, 0xd6 } };
- FOURCC GammaFilterFactory::GetServiceType()
- {
- return gammaFilterService.getServiceType();
- }
- const char *GammaFilterFactory::GetServiceName()
- {
- return gammaFilterService.getServiceName();
- }
- GUID GammaFilterFactory::GetGUID()
- {
- return gammaFilterGUID;
- }
- void *GammaFilterFactory::GetInterface(int global_lock)
- {
- // if (global_lock)
- // WASABI_API_SVC->service_lock(this, (void *)ifc);
- return &gammaFilterService;
- }
- int GammaFilterFactory::SupportNonLockingInterface()
- {
- return 1;
- }
- int GammaFilterFactory::ReleaseInterface(void *ifc)
- {
- //WASABI_API_SVC->service_unlock(ifc);
- return 1;
- }
- const char *GammaFilterFactory::GetTestString()
- {
- return 0;
- }
- int GammaFilterFactory::ServiceNotify(int msg, int param1, int param2)
- {
- return 1;
- }
- #define CBCLASS GammaFilterFactory
- START_DISPATCH;
- CB(WASERVICEFACTORY_GETSERVICETYPE, GetServiceType)
- CB(WASERVICEFACTORY_GETSERVICENAME, GetServiceName)
- CB(WASERVICEFACTORY_GETGUID, GetGUID)
- CB(WASERVICEFACTORY_GETINTERFACE, GetInterface)
- CB(WASERVICEFACTORY_SUPPORTNONLOCKINGGETINTERFACE, SupportNonLockingInterface)
- CB(WASERVICEFACTORY_RELEASEINTERFACE, ReleaseInterface)
- CB(WASERVICEFACTORY_GETTESTSTRING, GetTestString)
- CB(WASERVICEFACTORY_SERVICENOTIFY, ServiceNotify)
- END_DISPATCH;
- #undef CBCLASS
|