static void ApplyBlackOnBlackColors(HighlightDataColor *Colors) { for (int i=0; i<4; i++) { //Применим black on black. //Для файлов возьмем цвета панели не изменяя прозрачность. //Для пометки возьмем цвета файла включая прозрачность. if (!COLORVALUE(Colors->Color[HIGHLIGHTCOLORTYPE_FILE][i].ForegroundColor) && !COLORVALUE(Colors->Color[HIGHLIGHTCOLORTYPE_FILE][i].BackgroundColor)) { FarColor NewColor = Opt.Palette.CurrentPalette[PalColor[i]-COL_FIRSTPALETTECOLOR]; Colors->Color[HIGHLIGHTCOLORTYPE_FILE][i].BackgroundColor=ALPHAVALUE(Colors->Color[HIGHLIGHTCOLORTYPE_FILE][i].BackgroundColor)|COLORVALUE(NewColor.BackgroundColor); Colors->Color[HIGHLIGHTCOLORTYPE_FILE][i].ForegroundColor=ALPHAVALUE(Colors->Color[HIGHLIGHTCOLORTYPE_FILE][i].ForegroundColor)|COLORVALUE(NewColor.ForegroundColor); Colors->Color[HIGHLIGHTCOLORTYPE_FILE][i].Flags&=FCF_EXTENDEDFLAGS; Colors->Color[HIGHLIGHTCOLORTYPE_FILE][i].Flags |= NewColor.Flags; Colors->Color[HIGHLIGHTCOLORTYPE_FILE][i].Reserved = NewColor.Reserved; } if (!COLORVALUE(Colors->Color[HIGHLIGHTCOLORTYPE_MARKCHAR][i].ForegroundColor) && !COLORVALUE(Colors->Color[HIGHLIGHTCOLORTYPE_MARKCHAR][i].BackgroundColor)) { Colors->Color[HIGHLIGHTCOLORTYPE_MARKCHAR][i].BackgroundColor=ALPHAVALUE(Colors->Color[HIGHLIGHTCOLORTYPE_MARKCHAR][i].BackgroundColor)|COLORVALUE(Colors->Color[HIGHLIGHTCOLORTYPE_FILE][i].BackgroundColor); Colors->Color[HIGHLIGHTCOLORTYPE_MARKCHAR][i].ForegroundColor=ALPHAVALUE(Colors->Color[HIGHLIGHTCOLORTYPE_MARKCHAR][i].ForegroundColor)|COLORVALUE(Colors->Color[HIGHLIGHTCOLORTYPE_FILE][i].ForegroundColor); Colors->Color[HIGHLIGHTCOLORTYPE_MARKCHAR][i].Flags&=FCF_EXTENDEDFLAGS; Colors->Color[HIGHLIGHTCOLORTYPE_MARKCHAR][i].Flags |= Colors->Color[HIGHLIGHTCOLORTYPE_FILE][i].Flags; Colors->Color[HIGHLIGHTCOLORTYPE_MARKCHAR][i].Reserved = Colors->Color[HIGHLIGHTCOLORTYPE_FILE][i].Reserved; } } }
void HighlightDlgUpdateUserControl(FAR_CHAR_INFO *VBufColorExample,HighlightDataColor &Colors) { const wchar_t *ptr; FarColor Color; const PaletteColors PalColor[] = {COL_PANELTEXT,COL_PANELSELECTEDTEXT,COL_PANELCURSOR,COL_PANELSELECTEDCURSOR}; for (size_t i = 0; i < ARRAYSIZE(PalColor); ++i) { Color=Colors.Color[HIGHLIGHTCOLORTYPE_FILE][i]; if (!COLORVALUE(Color.BackgroundColor) && !COLORVALUE(Color.ForegroundColor)) { FARCOLORFLAGS ExFlags = Color.Flags&FCF_EXTENDEDFLAGS; Color=ColorIndexToColor(PalColor[i]); Color.Flags|=ExFlags; } if (Colors.MarkChar&0x0000FFFF) ptr=MSG(MHighlightExample2); else ptr=MSG(MHighlightExample1); for (int k=0; k<15; k++) { VBufColorExample[15*i+k].Char=ptr[k]; VBufColorExample[15*i+k].Attributes=Color; } if (LOWORD(Colors.MarkChar)) { // inherit only color mode, not style VBufColorExample[15*i+1].Attributes.Flags = Color.Flags&FCF_4BITMASK; VBufColorExample[15*i+1].Char=LOWORD(Colors.MarkChar); if (COLORVALUE(Colors.Color[HIGHLIGHTCOLORTYPE_MARKCHAR][i].ForegroundColor) || COLORVALUE(Colors.Color[HIGHLIGHTCOLORTYPE_MARKCHAR][i].BackgroundColor)) { VBufColorExample[15*i+1].Attributes=Colors.Color[HIGHLIGHTCOLORTYPE_MARKCHAR][i]; } else { // apply all except color mode FARCOLORFLAGS ExFlags = Colors.Color[HIGHLIGHTCOLORTYPE_MARKCHAR][i].Flags&FCF_EXTENDEDFLAGS; VBufColorExample[15*i+1].Attributes.Flags|=ExFlags; } } VBufColorExample[15*i].Attributes=ColorIndexToColor(COL_PANELBOX); VBufColorExample[15*i+14].Attributes=ColorIndexToColor(COL_PANELBOX); } }
/* Изменить значение цветовых атрибутов в соответствии с маской (применяется для "создания" тени) */ void ScreenBuf::ApplyShadow(int X1,int Y1,int X2,int Y2) { SCOPED_ACTION(CriticalSectionLock)(CS); int Width=X2-X1+1; int Height=Y2-Y1+1; int I, J; for (I=0; I < Height; I++) { FAR_CHAR_INFO *PtrBuf = Buf.data() + (Y1 + I)*BufX + X1; for (J=0; J < Width; J++, ++PtrBuf) { PtrBuf->Attributes.BackgroundColor = 0; if(PtrBuf->Attributes.Flags&FCF_FG_4BIT) { PtrBuf->Attributes.ForegroundColor&=~0x8; if(!COLORVALUE(PtrBuf->Attributes.ForegroundColor)) { PtrBuf->Attributes.ForegroundColor=0x8; } } else { PtrBuf->Attributes.ForegroundColor&=~0x808080; if(!COLORVALUE(PtrBuf->Attributes.ForegroundColor)) { PtrBuf->Attributes.ForegroundColor = 0x808080; } } } } #ifdef DIRECT_SCREEN_OUT Flush(); #elif defined(DIRECT_RT) if (Global->DirectRT) Flush(); #endif }