INLINE void set_coloralphamode(SDL_Texture *texture_id, const render_color *color) { UINT32 sr = (UINT32)(255.0f * color->r); UINT32 sg = (UINT32)(255.0f * color->g); UINT32 sb = (UINT32)(255.0f * color->b); UINT32 sa = (UINT32)(255.0f * color->a); if (color->r >= 1.0f && color->g >= 1.0f && color->b >= 1.0f && IS_OPAQUE(color->a)) { SDL_SetTextureColorMod(texture_id, 0xFF, 0xFF, 0xFF); SDL_SetTextureAlphaMod(texture_id, 0xFF); } /* coloring-only case */ else if (IS_OPAQUE(color->a)) { SDL_SetTextureColorMod(texture_id, sr, sg, sb); SDL_SetTextureAlphaMod(texture_id, 0xFF); } /* alpha and/or coloring case */ else if (!IS_TRANSPARENT(color->a)) { SDL_SetTextureColorMod(texture_id, sr, sg, sb); SDL_SetTextureAlphaMod(texture_id, sa); } else { SDL_SetTextureColorMod(texture_id, 0xFF, 0xFF, 0xFF); SDL_SetTextureAlphaMod(texture_id, 0xFF); } }
static void ApplyColors(HighlightDataColor *DestColors, HighlightDataColor *SrcColors) { //Обработаем black on black чтоб наследовать правильные цвета //и чтоб после наследования были правильные цвета. ApplyBlackOnBlackColors(DestColors); ApplyBlackOnBlackColors(SrcColors); for (int j=0; j<2; j++) { for (int i=0; i<4; i++) { //Если текущие цвета в Src (fore и/или back) не прозрачные //то унаследуем их в Dest. if (IS_OPAQUE(SrcColors->Color[j][i].ForegroundColor)) { DestColors->Color[j][i].ForegroundColor=SrcColors->Color[j][i].ForegroundColor; SrcColors->Color[j][i].Flags&FCF_FG_4BIT? DestColors->Color[j][i].Flags|=FCF_FG_4BIT : DestColors->Color[j][i].Flags&=~FCF_FG_4BIT; } if (IS_OPAQUE(SrcColors->Color[j][i].BackgroundColor)) { DestColors->Color[j][i].BackgroundColor=SrcColors->Color[j][i].BackgroundColor; SrcColors->Color[j][i].Flags&FCF_BG_4BIT? DestColors->Color[j][i].Flags|=FCF_BG_4BIT : DestColors->Color[j][i].Flags&=~FCF_BG_4BIT; } DestColors->Color[j][i].Flags |= SrcColors->Color[j][i].Flags&FCF_EXTENDEDFLAGS; } } //Унаследуем пометку из Src если она не прозрачная if (!(SrcColors->MarkChar&0x00FF0000)) DestColors->MarkChar=SrcColors->MarkChar; }