TRawImage:

- protect PerformEffect from all formats except desired (prevent potential misuse)
- add one more format for painting glyphs of non themed disabled buttons (1 bit instead of grey)
- draw disabled glyph of non themed button with introduced effect (under win32)

git-svn-id: trunk@12808 -
This commit is contained in:
paul 2007-11-10 09:44:50 +00:00
parent 1dee7c4bed
commit 329a78831a
2 changed files with 64 additions and 4 deletions

View File

@ -47,7 +47,8 @@ type
gdeNormal, // no effect
gdeDisabled, // grayed image
gdeHighlighted, // a bit highlighted image
gdeShadowed // a bit shadowed image
gdeShadowed, // a bit shadowed image
gde1Bit // 1 Bit image (for non-XP windows buttons)
);
//------------------------------------------------------------------------------
@ -1413,15 +1414,42 @@ end;
procedure TRawImage.PerformEffect(const ADrawEffect: TGraphicsDrawEffect;
CreateNewData: Boolean);
function CheckDescription: Boolean;
begin
Result :=
(Description.Format = ricfRGBA) and
(Description.PaletteColorCount = 0) and
(Description.MaskBitsPerPixel = 0) and
(Description.Depth = 32) and
(Description.BitOrder = riboBitsInOrder) and
(Description.ByteOrder = riboMSBFirst) and
(Description.LineOrder = riloTopToBottom) and
(Description.BitsPerPixel = 32) and
(Description.RedPrec = 8) and
(Description.RedShift = 8) and
(Description.GreenPrec = 8) and
(Description.GreenShift = 16) and
(Description.BluePrec = 8) and
(Description.BlueShift = 24) and
(Description.AlphaPrec = 8) and
(Description.AlphaShift = 0);
end;
const
GlowShadow = 48;
ColorMultiplier = (256 - GlowShadow) / 256;
// 1 Bit color weights. Total weight = 1000
R_Weight = 222;
G_Weight = 707;
B_Weight = 071;
H_Threshold = $D5; // threshold of highlight ($D5 is value from experiments. $80 is standard)
var
AData: PRGBAQuad;
P: Pointer;
i, j: integer;
begin
// TODO: add check here for Description. Only RGBA data can be processed here.
if CreateNewData then
begin
GetMem(AData, DataSize);
@ -1433,6 +1461,12 @@ begin
P := Data;
AData := P;
end;
// check here for Description. Only RGBA data can be processed here.
if not CheckDescription then
Exit;
case ADrawEffect of
gdeNormal: ;
gdeDisabled:
@ -1477,6 +1511,29 @@ begin
inc(AData);
end;
end;
gde1Bit:
begin
for i := 0 to Description.Height - 1 do
for j := 0 to Description.Width - 1 do
begin
with AData^ do
begin
// color should be either black or none
Alpha := ord
(
((R_Weight * Red + G_Weight * Green + B_Weight * Blue) < H_Threshold * 1000) and
(Alpha >= $80)
) * $FF;
if Alpha = $FF then
begin
Red := 00;
Green := 00;
Blue := 00;
end;
end;
inc(AData);
end;
end;
end;
Data := P;
end;

View File

@ -187,14 +187,17 @@ var
if (srcWidth <> 0) and (srcHeight <> 0) then
begin
TBitBtnAceess(BitBtn).FButtonGlyph.GetImageIndexAndEffect(AState, AIndex, AEffect);
if themesActive then
begin
// non-themed winapi wants white/other as background/picture-disabled colors
// themed winapi draws bitmap-as, with transparency defined by bitbtn.brush color
SetBkColor(hdcNewBitmap, ColorToRGB(BitBtn.Brush.Color));
SetTextColor(hdcNewBitmap, GetSysColor(COLOR_BTNSHADOW));
end;
TBitBtnAceess(BitBtn).FButtonGlyph.GetImageIndexAndEffect(AState, AIndex, AEffect);
end
else
if AEffect = gdeDisabled then
AEffect := gde1Bit;
TWin32WSCustomImageList.DrawToDC(TBitBtnAceess(BitBtn).FButtonGlyph.Images, AIndex,
hdcNewBitmap, Rect(XDestBitmap, YDestBitmap, glyphWidth, glyphHeight),