rendlay: add optional alpha attribute to digit elements

This commit is contained in:
hap 2022-02-25 19:29:20 +01:00
parent 45b02a490f
commit d196d072ff
3 changed files with 60 additions and 37 deletions

View File

@ -517,36 +517,24 @@ text
be an integer, where 0 (zero) means centred, 1 (one) means left-aligned, and
2 (two) means right-aligned. If the ``align`` attribute is absent, the text
will be centred.
dotmatrix
Draws an eight-pixel horizontal segment of a dot matrix display, using
circular pixels in the specified colour. The bits of the elements state
determine which pixels are lit, with the least significant bit corresponding
to the leftmost pixel. Unlit pixels are drawn at low intensity (0x20/0xff).
dotmatrix5dot
Draws a five-pixel horizontal segment of a dot matrix display, using
circular pixels in the specified colour. The bits of the elements state
determine which pixels are lit, with the least significant bit corresponding
to the leftmost pixel. Unlit pixels are drawn at low intensity (0x20/0xff).
dotmatrixdot
Draws a single element of a dot matrix display as a circular pixels in the
specified colour. The least significant bit of the elements state
determines whether the pixel is lit. An unlit pixel is drawn at low
intensity (0x20/0xff).
led7seg
Draws a standard seven-segment (plus decimal point) digital LED/fluorescent
display in the specified colour. The low eight bits of the elements state
control which segments are lit. Starting from the least significant bit,
the bits correspond to the top segment, the upper right-hand segment,
continuing clockwise to the upper left segment, the middle bar, and the
decimal point. Unlit segments are drawn at low intensity (0x20/0xff).
decimal point. An optional ``alpha`` attribute determines the opacity for
unlit segments. It ranges from 0.0 to 1.0 as with ``color``, and when
omitted, it defaults to 0.125.
led8seg_gts1
Draws an eight-segment digital fluorescent display of the type used in
Gottlieb System 1 pinball machines (actually a Futaba part). Compared to
standard seven-segment displays, these displays have no decimal point, the
horizontal middle bar is broken in the centre, and there is a broken
vertical middle bar controlled by the bit that would control the decimal
point in a standard seven-segment display. Unlit segments are drawn at low
intensity (0x20/0xff).
point in a standard seven-segment display. An optional ``alpha`` attribute
determines the opacity for unlit segments. It ranges from 0.0 to 1.0 as
with ``color``, and when omitted, it defaults to 0.125.
led14seg
Draws a standard fourteen-segment alphanumeric LED/fluorescent display in
the specified colour. The low fourteen bits of the elements state control
@ -554,15 +542,18 @@ led14seg
correspond to the top segment, the upper right-hand segment, continuing
clockwise to the upper left segment, the left-hand and right-hand halves of
the horizontal middle bar, the upper and lower halves of the vertical middle
bar, and the diagonal bars clockwise from lower left to lower right. Unlit
segments are drawn at low intensity (0x20/0xff).
bar, and the diagonal bars clockwise from lower left to lower right. An
optional ``alpha`` attribute determines the opacity for unlit segments. It
ranges from 0.0 to 1.0 as with ``color``, and when omitted, it defaults to
0.125.
led14segsc
Draws a standard fourteen-segment alphanumeric LED/fluorescent display with
decimal point/comma in the specified colour. The low sixteen bits of the
elements state control which segments are lit. The low fourteen bits
correspond to the same segments as in the ``led14seg`` component. Two
additional bits correspond to the decimal point and comma tail. Unlit
segments are drawn at low intensity (0x20/0xff).
additional bits correspond to the decimal point and comma tail. An optional
``alpha`` attribute determines the opacity for unlit segments. It ranges
from 0.0 to 1.0 as with ``color``, and when omitted, it defaults to 0.125.
led16seg
Draws a standard sixteen-segment alphanumeric LED/fluorescent display in the
specified colour. The low sixteen bits of the elements state control which
@ -571,14 +562,17 @@ led16seg
top bar, continuing clockwise to the upper left segment, the left-hand and
right-hand halves of the horizontal middle bar, the upper and lower halves
of the vertical middle bar, and the diagonal bars clockwise from lower left
to lower right. Unlit segments are drawn at low intensity (0x20/0xff).
to lower right. An optional ``alpha`` attribute determines the opacity for
unlit segments. It ranges from 0.0 to 1.0 as with ``color``, and when
omitted, it defaults to 0.125.
led16segsc
Draws a standard sixteen-segment alphanumeric LED/fluorescent display with
decimal point/comma in the specified colour. The low eighteen bits of the
elements state control which segments are lit. The low sixteen bits
correspond to the same segments as in the ``led16seg`` component. Two
additional bits correspond to the decimal point and comma tail. Unlit
segments are drawn at low intensity (0x20/0xff).
additional bits correspond to the decimal point and comma tail. An optional
``alpha`` attribute determines the opacity for unlit segments. It ranges
from 0.0 to 1.0 as with ``color``, and when omitted, it defaults to 0.125.
simplecounter
Displays the numeric value of the elements state using the system font in
the specified colour. The value is formatted in decimal notation. A

View File

@ -2465,6 +2465,7 @@ public:
// construction/destruction
led7seg_component(environment &env, util::xml::data_node const &compnode)
: component(env, compnode)
, m_alpha(std::clamp(env.get_attribute_float(compnode, "alpha", 0.125F), 0.0F, 1.0F))
{
}
@ -2475,7 +2476,7 @@ protected:
virtual void draw_aligned(running_machine &machine, bitmap_argb32 &dest, const rectangle &bounds, int state) override
{
rgb_t const onpen = rgb_t(0xff, 0xff, 0xff, 0xff);
rgb_t const offpen = rgb_t(0x20, 0xff, 0xff, 0xff);
rgb_t const offpen = rgb_t(m_alpha * 0xff, 0xff, 0xff, 0xff);
// sizes for computation
int const bmwidth = 250;
@ -2517,6 +2518,10 @@ protected:
// resample to the target size
render_resample_argb_bitmap_hq(dest, tempbitmap, color(state));
}
private:
// internal state
float m_alpha; // opacity for off-segments
};
@ -2527,6 +2532,7 @@ public:
// construction/destruction
led8seg_gts1_component(environment &env, util::xml::data_node const &compnode)
: component(env, compnode)
, m_alpha(std::clamp(env.get_attribute_float(compnode, "alpha", 0.125F), 0.0F, 1.0F))
{
}
@ -2537,7 +2543,7 @@ protected:
virtual void draw_aligned(running_machine &machine, bitmap_argb32 &dest, const rectangle &bounds, int state) override
{
rgb_t const onpen = rgb_t(0xff, 0xff, 0xff, 0xff);
rgb_t const offpen = rgb_t(0x20, 0xff, 0xff, 0xff);
rgb_t const offpen = rgb_t(m_alpha * 0xff, 0xff, 0xff, 0xff);
rgb_t const backpen = rgb_t(0x00, 0x00, 0x00, 0x00);
// sizes for computation
@ -2585,6 +2591,10 @@ protected:
// resample to the target size
render_resample_argb_bitmap_hq(dest, tempbitmap, color(state));
}
private:
// internal state
float m_alpha; // opacity for off-segments
};
@ -2595,6 +2605,7 @@ public:
// construction/destruction
led14seg_component(environment &env, util::xml::data_node const &compnode)
: component(env, compnode)
, m_alpha(std::clamp(env.get_attribute_float(compnode, "alpha", 0.125F), 0.0F, 1.0F))
{
}
@ -2605,7 +2616,7 @@ protected:
virtual void draw_aligned(running_machine &machine, bitmap_argb32 &dest, const rectangle &bounds, int state) override
{
rgb_t const onpen = rgb_t(0xff, 0xff, 0xff, 0xff);
rgb_t const offpen = rgb_t(0x20, 0xff, 0xff, 0xff);
rgb_t const offpen = rgb_t(m_alpha * 0xff, 0xff, 0xff, 0xff);
// sizes for computation
int const bmwidth = 250;
@ -2697,6 +2708,10 @@ protected:
// resample to the target size
render_resample_argb_bitmap_hq(dest, tempbitmap, color(state));
}
private:
// internal state
float m_alpha; // opacity for off-segments
};
@ -2707,6 +2722,7 @@ public:
// construction/destruction
led16seg_component(environment &env, util::xml::data_node const &compnode)
: component(env, compnode)
, m_alpha(std::clamp(env.get_attribute_float(compnode, "alpha", 0.125F), 0.0F, 1.0F))
{
}
@ -2716,14 +2732,14 @@ protected:
virtual void draw_aligned(running_machine &machine, bitmap_argb32 &dest, const rectangle &bounds, int state) override
{
const rgb_t onpen = rgb_t(0xff, 0xff, 0xff, 0xff);
const rgb_t offpen = rgb_t(0x20, 0xff, 0xff, 0xff);
rgb_t const onpen = rgb_t(0xff, 0xff, 0xff, 0xff);
rgb_t const offpen = rgb_t(m_alpha * 0xff, 0xff, 0xff, 0xff);
// sizes for computation
int bmwidth = 250;
int bmheight = 400;
int segwidth = 40;
int skewwidth = 40;
int const bmwidth = 250;
int const bmheight = 400;
int const segwidth = 40;
int const skewwidth = 40;
// allocate a temporary bitmap for drawing
bitmap_argb32 tempbitmap(bmwidth + skewwidth, bmheight);
@ -2819,6 +2835,10 @@ protected:
// resample to the target size
render_resample_argb_bitmap_hq(dest, tempbitmap, color(state));
}
private:
// internal state
float m_alpha; // opacity for off-segments
};
@ -2829,6 +2849,7 @@ public:
// construction/destruction
led14segsc_component(environment &env, util::xml::data_node const &compnode)
: component(env, compnode)
, m_alpha(std::clamp(env.get_attribute_float(compnode, "alpha", 0.125F), 0.0F, 1.0F))
{
}
@ -2839,7 +2860,7 @@ protected:
virtual void draw_aligned(running_machine &machine, bitmap_argb32 &dest, const rectangle &bounds, int state) override
{
rgb_t const onpen = rgb_t(0xff, 0xff, 0xff, 0xff);
rgb_t const offpen = rgb_t(0x20, 0xff, 0xff, 0xff);
rgb_t const offpen = rgb_t(m_alpha * 0xff, 0xff, 0xff, 0xff);
// sizes for computation
int const bmwidth = 250;
@ -2942,6 +2963,10 @@ protected:
// resample to the target size
render_resample_argb_bitmap_hq(dest, tempbitmap, color(state));
}
private:
// internal state
float m_alpha; // opacity for off-segments
};
@ -2952,6 +2977,7 @@ public:
// construction/destruction
led16segsc_component(environment &env, util::xml::data_node const &compnode)
: component(env, compnode)
, m_alpha(std::clamp(env.get_attribute_float(compnode, "alpha", 0.125F), 0.0F, 1.0F))
{
}
@ -2962,7 +2988,7 @@ protected:
virtual void draw_aligned(running_machine &machine, bitmap_argb32 &dest, const rectangle &bounds, int state) override
{
rgb_t const onpen = rgb_t(0xff, 0xff, 0xff, 0xff);
rgb_t const offpen = rgb_t(0x20, 0xff, 0xff, 0xff);
rgb_t const offpen = rgb_t(m_alpha * 0xff, 0xff, 0xff, 0xff);
// sizes for computation
int const bmwidth = 250;
@ -3074,6 +3100,10 @@ protected:
// resample to the target size
render_resample_argb_bitmap_hq(dest, tempbitmap, color(state));
}
private:
// internal state
float m_alpha; // opacity for off-segments
};

View File

@ -183,7 +183,6 @@ private:
// internal helpers
static void element_scale(bitmap_argb32 &dest, bitmap_argb32 &source, const rectangle &sbounds, void *param);
template <typename T> static component::ptr make_component(environment &env, util::xml::data_node const &compnode);
template <int D> static component::ptr make_dotmatrix_component(environment &env, util::xml::data_node const &compnode);
static make_component_map const s_make_component; // maps component XML names to creator functions