Introduce the possiblity to draw certain frames with alpha blending on top of

an existing background. It's not supported by many frame types yet, but BButton
and TextControl frames work as well as the soft recessed frame which many
controls use.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@29762 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Stephan Aßmus
2009-03-28 19:37:43 +00:00
parent 06ab171868
commit 4f57909806
2 changed files with 106 additions and 47 deletions
+4 -1
View File
@@ -61,7 +61,9 @@ public:
B_ACTIVATED = 1 << 2, B_ACTIVATED = 1 << 2,
B_HOVER = 1 << 3, B_HOVER = 1 << 3,
B_DISABLED = 1 << 4, B_DISABLED = 1 << 4,
B_DEFAULT_BUTTON = 1 << 5 B_DEFAULT_BUTTON = 1 << 5,
B_BLEND_FRAME = 1 << 16
}; };
virtual BAlignment DefaultLabelAlignment() const; virtual BAlignment DefaultLabelAlignment() const;
@@ -253,6 +255,7 @@ protected:
BRect& rect, const rgb_color& base, BRect& rect, const rgb_color& base,
float contrast = 1.0f, float contrast = 1.0f,
float brightness = 1.0f, float brightness = 1.0f,
uint32 flags = 0,
uint32 borders = B_ALL_BORDERS); uint32 borders = B_ALL_BORDERS);
void _DrawFrame(BView* view, BRect& rect, void _DrawFrame(BView* view, BRect& rect,
+102 -46
View File
@@ -480,7 +480,7 @@ BControlLook::DrawCheckBox(BView* view, BRect& rect, const BRect& updateRect,
rgb_color navigationColor = ui_color(B_KEYBOARD_NAVIGATION_COLOR); rgb_color navigationColor = ui_color(B_KEYBOARD_NAVIGATION_COLOR);
if (flags & B_DISABLED) { if (flags & B_DISABLED) {
_DrawOuterResessedFrame(view, rect, base, 0.0); _DrawOuterResessedFrame(view, rect, base, 0.0, 1.0, flags);
dark1BorderColor = tint_color(base, 1.15); dark1BorderColor = tint_color(base, 1.15);
dark2BorderColor = tint_color(base, 1.15); dark2BorderColor = tint_color(base, 1.15);
@@ -494,7 +494,7 @@ BControlLook::DrawCheckBox(BView* view, BRect& rect, const BRect& updateRect,
dark2BorderColor = dark1BorderColor; dark2BorderColor = dark1BorderColor;
} else { } else {
_DrawOuterResessedFrame(view, rect, base, 0.6); _DrawOuterResessedFrame(view, rect, base, 0.6, 1.0, flags);
dark1BorderColor = tint_color(base, 1.40); dark1BorderColor = tint_color(base, 1.40);
dark2BorderColor = tint_color(base, 1.38); dark2BorderColor = tint_color(base, 1.38);
@@ -713,7 +713,7 @@ BControlLook::DrawScrollViewFrame(BView* view, BRect& rect,
rgb_color scrollbarFrameColor = tint_color(base, B_DARKEN_2_TINT); rgb_color scrollbarFrameColor = tint_color(base, B_DARKEN_2_TINT);
if (border == B_FANCY_BORDER) if (border == B_FANCY_BORDER)
_DrawOuterResessedFrame(view, rect, base, 1.0, 1.0, borders); _DrawOuterResessedFrame(view, rect, base, 1.0, 1.0, flags, borders);
if (flags & B_FOCUSED) { if (flags & B_FOCUSED) {
rgb_color focusColor = ui_color(B_KEYBOARD_NAVIGATION_COLOR); rgb_color focusColor = ui_color(B_KEYBOARD_NAVIGATION_COLOR);
@@ -731,7 +731,7 @@ BControlLook::DrawScrollViewFrame(BView* view, BRect& rect,
borders = _borders; borders = _borders;
borders &= ~B_TOP_BORDER; borders &= ~B_TOP_BORDER;
_DrawOuterResessedFrame(view, horizontalScrollBarFrame, base, _DrawOuterResessedFrame(view, horizontalScrollBarFrame, base,
1.0, 1.0, borders); 1.0, 1.0, flags, borders);
_DrawFrame(view, horizontalScrollBarFrame, scrollbarFrameColor, _DrawFrame(view, horizontalScrollBarFrame, scrollbarFrameColor,
scrollbarFrameColor, scrollbarFrameColor, scrollbarFrameColor, scrollbarFrameColor, scrollbarFrameColor, scrollbarFrameColor,
borders); borders);
@@ -743,7 +743,7 @@ BControlLook::DrawScrollViewFrame(BView* view, BRect& rect,
borders = _borders; borders = _borders;
borders &= ~B_LEFT_BORDER; borders &= ~B_LEFT_BORDER;
_DrawOuterResessedFrame(view, verticalScrollBarFrame, base, _DrawOuterResessedFrame(view, verticalScrollBarFrame, base,
1.0, 1.0, borders); 1.0, 1.0, flags, borders);
_DrawFrame(view, verticalScrollBarFrame, scrollbarFrameColor, _DrawFrame(view, verticalScrollBarFrame, scrollbarFrameColor,
scrollbarFrameColor, scrollbarFrameColor, scrollbarFrameColor, scrollbarFrameColor, scrollbarFrameColor, scrollbarFrameColor,
borders); borders);
@@ -1433,7 +1433,7 @@ BControlLook::DrawBorder(BView* view, BRect& rect, const BRect& updateRect,
scrollbarFrameColor = ui_color(B_KEYBOARD_NAVIGATION_COLOR); scrollbarFrameColor = ui_color(B_KEYBOARD_NAVIGATION_COLOR);
if (border == B_FANCY_BORDER) if (border == B_FANCY_BORDER)
_DrawOuterResessedFrame(view, rect, base, 1.0, 1.0, borders); _DrawOuterResessedFrame(view, rect, base, 1.0, 1.0, flags, borders);
_DrawFrame(view, rect, scrollbarFrameColor, scrollbarFrameColor, _DrawFrame(view, rect, scrollbarFrameColor, scrollbarFrameColor,
scrollbarFrameColor, scrollbarFrameColor, borders); scrollbarFrameColor, scrollbarFrameColor, borders);
@@ -1474,24 +1474,33 @@ BControlLook::DrawTextControlBorder(BView* view, BRect& rect,
rgb_color navigationColor = ui_color(B_KEYBOARD_NAVIGATION_COLOR); rgb_color navigationColor = ui_color(B_KEYBOARD_NAVIGATION_COLOR);
if (flags & B_DISABLED) { if (flags & B_DISABLED) {
_DrawOuterResessedFrame(view, rect, base, 0.0, 1.0, borders); _DrawOuterResessedFrame(view, rect, base, 0.0, 1.0, flags, borders);
dark1BorderColor = tint_color(base, 1.15); if (flags & B_BLEND_FRAME)
dark2BorderColor = tint_color(base, 1.15); dark1BorderColor = (rgb_color){ 0, 0, 0, 40 };
else
dark1BorderColor = tint_color(base, 1.15);
dark2BorderColor = dark1BorderColor;
} else if (flags & B_CLICKED) { } else if (flags & B_CLICKED) {
dark1BorderColor = tint_color(base, 1.50); dark1BorderColor = tint_color(base, 1.50);
dark2BorderColor = tint_color(base, 1.49); dark2BorderColor = tint_color(base, 1.49);
// BCheckBox uses this to indicate the clicked state...
_DrawFrame(view, rect, _DrawFrame(view, rect,
dark1BorderColor, dark1BorderColor, dark1BorderColor, dark1BorderColor,
dark2BorderColor, dark2BorderColor); dark2BorderColor, dark2BorderColor);
dark2BorderColor = dark1BorderColor; dark2BorderColor = dark1BorderColor;
} else { } else {
_DrawOuterResessedFrame(view, rect, base, 0.6, 1.0, borders); _DrawOuterResessedFrame(view, rect, base, 0.6, 1.0, flags, borders);
dark1BorderColor = tint_color(base, 1.40); if (flags & B_BLEND_FRAME) {
dark2BorderColor = tint_color(base, 1.38); dark1BorderColor = (rgb_color){ 0, 0, 0, 102 };
dark2BorderColor = (rgb_color){ 0, 0, 0, 97 };
} else {
dark1BorderColor = tint_color(base, 1.40);
dark2BorderColor = tint_color(base, 1.38);
}
} }
if ((flags & B_DISABLED) == 0 && (flags & B_FOCUSED)) { if ((flags & B_DISABLED) == 0 && (flags & B_FOCUSED)) {
@@ -1499,9 +1508,20 @@ BControlLook::DrawTextControlBorder(BView* view, BRect& rect,
dark2BorderColor = navigationColor; dark2BorderColor = navigationColor;
} }
_DrawFrame(view, rect, if (flags & B_BLEND_FRAME) {
dark1BorderColor, dark1BorderColor, drawing_mode oldMode = view->DrawingMode();
dark2BorderColor, dark2BorderColor, borders); view->SetDrawingMode(B_OP_ALPHA);
_DrawFrame(view, rect,
dark1BorderColor, dark1BorderColor,
dark2BorderColor, dark2BorderColor, borders);
view->SetDrawingMode(oldMode);
} else {
_DrawFrame(view, rect,
dark1BorderColor, dark1BorderColor,
dark2BorderColor, dark2BorderColor, borders);
}
} }
@@ -1618,14 +1638,21 @@ BControlLook::_DrawButtonFrame(BView* view, BRect& rect,
rgb_color dark2BorderColor; rgb_color dark2BorderColor;
if ((flags & B_DISABLED) == 0) { if ((flags & B_DISABLED) == 0) {
dark1BorderColor = tint_color(base, 1.33); if (flags & B_BLEND_FRAME) {
dark2BorderColor = tint_color(base, 1.45); dark1BorderColor = (rgb_color){ 0, 0, 0, 75 };
dark2BorderColor = (rgb_color){ 0, 0, 0, 95 };
} else {
dark1BorderColor = tint_color(base, 1.33);
dark2BorderColor = tint_color(base, 1.45);
}
if (flags & B_DEFAULT_BUTTON) { if (flags & B_DEFAULT_BUTTON) {
// TODO: B_BLEND_FRAME
dark2BorderColor = tint_color(dark1BorderColor, 1.5); dark2BorderColor = tint_color(dark1BorderColor, 1.5);
dark1BorderColor = tint_color(dark1BorderColor, 1.35); dark1BorderColor = tint_color(dark1BorderColor, 1.35);
} }
} else { } else {
// TODO: B_BLEND_FRAME
dark1BorderColor = tint_color(base, 1.147); dark1BorderColor = tint_color(base, 1.147);
dark2BorderColor = tint_color(base, 1.24); dark2BorderColor = tint_color(base, 1.24);
@@ -1648,6 +1675,7 @@ BControlLook::_DrawButtonFrame(BView* view, BRect& rect,
} }
if (flags & B_DEFAULT_BUTTON) { if (flags & B_DEFAULT_BUTTON) {
// TODO: B_BLEND_FRAME
float focusTint = 1.2; float focusTint = 1.2;
if (flags & B_DISABLED) if (flags & B_DISABLED)
focusTint = (B_NO_TINT + focusTint) / 2; focusTint = (B_NO_TINT + focusTint) / 2;
@@ -1668,49 +1696,77 @@ BControlLook::_DrawButtonFrame(BView* view, BRect& rect,
_DrawOuterResessedFrame(view, rect, focusColor, _DrawOuterResessedFrame(view, rect, focusColor,
contrast * (((flags & B_DISABLED) ? 0.3 : 0.8)), contrast * (((flags & B_DISABLED) ? 0.3 : 0.8)),
brightness * (((flags & B_DISABLED) ? 1.0 : 0.9)), brightness * (((flags & B_DISABLED) ? 1.0 : 0.9)),
borders); flags, borders);
} else { } else {
// bevel around external border // bevel around external border
_DrawOuterResessedFrame(view, rect, background, _DrawOuterResessedFrame(view, rect, background,
contrast * ((flags & B_DISABLED) ? 0.0 : 1.0), brightness * 1.0, contrast * ((flags & B_DISABLED) ? 0.0 : 1.0), brightness * 1.0,
borders); flags, borders);
} }
_DrawFrame(view, rect, dark1BorderColor, dark1BorderColor, if (flags & B_BLEND_FRAME) {
dark2BorderColor, dark2BorderColor, borders); drawing_mode oldDrawingMode = view->DrawingMode();
view->SetDrawingMode(B_OP_ALPHA);
_DrawFrame(view, rect, dark1BorderColor, dark1BorderColor,
dark2BorderColor, dark2BorderColor, borders);
view->SetDrawingMode(oldDrawingMode);
} else {
_DrawFrame(view, rect, dark1BorderColor, dark1BorderColor,
dark2BorderColor, dark2BorderColor, borders);
}
} }
void void
BControlLook::_DrawOuterResessedFrame(BView* view, BRect& rect, BControlLook::_DrawOuterResessedFrame(BView* view, BRect& rect,
const rgb_color& base, float contrast, float brightness, uint32 borders) const rgb_color& base, float contrast, float brightness, uint32 flags,
uint32 borders)
{ {
// colors if (flags & B_BLEND_FRAME) {
float tintLight = kEdgeBevelLightTint; // assumes the background has already been painted
float tintShadow = kEdgeBevelShadowTint; drawing_mode oldDrawingMode = view->DrawingMode();
view->SetDrawingMode(B_OP_ALPHA);
if (contrast == 0.0) { uint8 alpha = uint8(20 * contrast);
tintLight = B_NO_TINT; uint32 white = uint8(255 * brightness);
tintShadow = B_NO_TINT;
} else if (contrast != 1.0) { rgb_color borderBevelShadow = (rgb_color){ 0, 0, 0, alpha };
tintLight = B_NO_TINT + (tintLight - B_NO_TINT) * contrast; rgb_color borderBevelLight = (rgb_color){ white, white, white, alpha };
tintShadow = B_NO_TINT + (tintShadow - B_NO_TINT) * contrast;
_DrawFrame(view, rect, borderBevelShadow, borderBevelShadow,
borderBevelLight, borderBevelLight, borders);
view->SetDrawingMode(oldDrawingMode);
} else {
// colors
float tintLight = kEdgeBevelLightTint;
float tintShadow = kEdgeBevelShadowTint;
if (contrast == 0.0) {
tintLight = B_NO_TINT;
tintShadow = B_NO_TINT;
} else if (contrast != 1.0) {
tintLight = B_NO_TINT + (tintLight - B_NO_TINT) * contrast;
tintShadow = B_NO_TINT + (tintShadow - B_NO_TINT) * contrast;
}
rgb_color borderBevelShadow = tint_color(base, tintShadow);
rgb_color borderBevelLight = tint_color(base, tintLight);
if (brightness < 1.0) {
borderBevelShadow.red = uint8(borderBevelShadow.red * brightness);
borderBevelShadow.green = uint8(borderBevelShadow.green * brightness);
borderBevelShadow.blue = uint8(borderBevelShadow.blue * brightness);
borderBevelLight.red = uint8(borderBevelLight.red * brightness);
borderBevelLight.green = uint8(borderBevelLight.green * brightness);
borderBevelLight.blue = uint8(borderBevelLight.blue * brightness);
}
_DrawFrame(view, rect, borderBevelShadow, borderBevelShadow,
borderBevelLight, borderBevelLight, borders);
} }
rgb_color borderBevelShadow = tint_color(base, tintShadow);
rgb_color borderBevelLight = tint_color(base, tintLight);
if (brightness < 1.0) {
borderBevelShadow.red = uint8(borderBevelShadow.red * brightness);
borderBevelShadow.green = uint8(borderBevelShadow.green * brightness);
borderBevelShadow.blue = uint8(borderBevelShadow.blue * brightness);
borderBevelLight.red = uint8(borderBevelLight.red * brightness);
borderBevelLight.green = uint8(borderBevelLight.green * brightness);
borderBevelLight.blue = uint8(borderBevelLight.blue * brightness);
}
_DrawFrame(view, rect, borderBevelShadow, borderBevelShadow,
borderBevelLight, borderBevelLight, borders);
} }