Witam. Piszę funkcję która miksuje/zmywa ze sobą dwa kolory w formacie RGB565 (16bit).
Konkretnie chcę jej używać do rysowania obrazków z kanałem alpha oraz do generowania gradientów. Docelowa platforma to Rockchip 260x (odtwarzacz MP4). Rdzeń pracuje z częstotliwością 72Mhz.
Napisałem ową funkcje ale ona jest zbyt wolna - obrazek o rozdzielczości 320x50 przetwarza przez 600ms co jest nie do przyjęcia (przetworzenie całego ekranu 320x230 zajęło by prawie 3sek).
Oto co naskrobałem:
typedef unsigned char byte;
typedef unsigned int TColor;
typedef struct{
byte R;
byte G;
byte B;
}TRGB;
TRGB RGB(byte R, byte G, byte B){
TRGB temp;
temp.R = R;
temp.G = G;
temp.B = B;
return temp;
}
unsigned int RGB16bpp(TRGB RGB){
byte r16, g16, b16;
r16 = (double)RGB.R*(double)31/(double)255;
g16 = (double)RGB.G*(double)63/(double)255;
b16 = (double)RGB.B*(double)31/(double)255;
return (unsigned int)((r16 << 11) | (g16 << 5) | b16);
}
byte GetR16Value(unsigned int Color){
byte r16;
r16 = 0x001F & (Color >> 11);
return ((double)r16*(double)255/(double)31);
}
byte GetG16Value(unsigned int Color){
byte g16;
g16 = 0x003F & (Color >> 5);
return ((double)g16*(double)255/(double)63);
}
byte GetB16Value(unsigned int Color){
byte b16;
b16 = 0x001F & Color;
return ((double)b16*(double)255/(double)31);
}
TRGB GetRGB16bpp(unsigned int Color){
TRGB temp;
temp.R = GetR16Value(Color);
temp.G = GetG16Value(Color);
temp.B = GetB16Value(Color);
return temp;
}
unsigned int MixColors(unsigned int FirstColour, unsigned int SecondColour, int Transition, int Scale){
TRGB TempColor, First, Second;
First = GetRGB16bpp(FirstColour);
Second = GetRGB16bpp(SecondColour);
TempColor.R = First.R + (((long)Second.R - (long)First.R ) * Transition / Scale);
TempColor.G = First.G + (((long)Second.G - (long)First.G ) * Transition / Scale);
TempColor.B = First.B + (((long)Second.B - (long)First.B ) * Transition / Scale);
return RGB16bpp(TempColor);
Czy pomógłby mi ktoś zoptymalizować te funkcje? Pierwszą rzeczą którą jak mniemam trzeba będzie wywalić to zamiana wartości RGB do zakresy 0-255 (standardowo w RGB565 są to zakresy 0-63, 0-31, 0-63). Ale to tylko przypuszczenia, proszę o rady.
EDIT:
Muszę nadmienić że kompilator jest prymitywny, nie rozróżnia float od double i trzeba ciągle kombinować żeby uniknąć dziwnych zachowań np tutaj (musiałem dodać (long) chociaż nie wiem czemu:
TempColor.B = First.B + (((long)Second.B - (long)First.B ) * Transition / Scale);