diff options
Diffstat (limited to 'src/uqm/oscill.c')
-rw-r--r-- | src/uqm/oscill.c | 191 |
1 files changed, 191 insertions, 0 deletions
diff --git a/src/uqm/oscill.c b/src/uqm/oscill.c new file mode 100644 index 0000000..7c37b64 --- /dev/null +++ b/src/uqm/oscill.c @@ -0,0 +1,191 @@ +//Copyright Paul Reiche, Fred Ford. 1992-2002 + +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include "oscill.h" + +#include "setup.h" + // for OffScreenContext +#include "libs/graphics/gfx_common.h" +#include "libs/graphics/drawable.h" +#include "libs/sound/sound.h" +#include "libs/sound/trackplayer.h" + + +static FRAME scope_frame; +static int scope_init = 0; +static FRAME scopeWork; +static Color scopeColor; +static EXTENT scopeSize; +BOOLEAN oscillDisabled = FALSE; + +void +InitOscilloscope (FRAME scopeBg) +{ + scope_frame = scopeBg; + if (!scope_init) + { + EXTENT size = GetFrameBounds (scope_frame); + POINT midPt = {size.width / 2, size.height / 2}; + + // mid-image pixel defines the color of scope lines + scopeColor = GetFramePixel (scope_frame, midPt); + // insist that scope lines be purely opaque + scopeColor.a = 0xff; + + scopeWork = CaptureDrawable (CreateDrawable ( + WANT_PIXMAP | MAPPED_TO_DISPLAY, + size.width, size.height, 1)); + + // assume and subtract the borders + scopeSize.width = size.width - 2; + scopeSize.height = size.height - 2; + + scope_init = 1; + } +} + +void +UninitOscilloscope (void) +{ + // XXX: Is never called (BUG?) + DestroyDrawable (ReleaseDrawable (scopeWork)); + scopeWork = NULL; + scope_init = 0; +} + +// draws the oscilloscope +void +DrawOscilloscope (void) +{ + STAMP s; + BYTE scope_data[128]; + + if (oscillDisabled) + return; + + assert ((size_t)scopeSize.width <= sizeof scope_data); + assert (scopeSize.height < 256); + + if (GraphForegroundStream (scope_data, scopeSize.width, scopeSize.height, + usingSpeech)) + { + int i; + CONTEXT oldContext; + + oldContext = SetContext (OffScreenContext); + SetContextFGFrame (scopeWork); + SetContextClipRect (NULL); + + // draw the background image + s.origin.x = 0; + s.origin.y = 0; + s.frame = scope_frame; + DrawStamp (&s); + + // draw the scope lines + SetContextForeGroundColor (scopeColor); + for (i = 0; i < scopeSize.width - 1; ++i) + { + LINE line; + + line.first.x = i + 1; + line.first.y = scope_data[i] + 1; + line.second.x = i + 2; + line.second.y = scope_data[i + 1] + 1; + DrawLine (&line); + } + + SetContext (oldContext); + + s.frame = scopeWork; + } + else + { // no data -- draw blank scope background + s.frame = scope_frame; + } + + // draw the final scope image to screen + s.origin.x = 0; + s.origin.y = 0; + DrawStamp (&s); +} + + +static STAMP sliderStamp; +static STAMP buttonStamp; +static BOOLEAN sliderChanged = FALSE; +int sliderSpace; // slider width - button width +BOOLEAN sliderDisabled = FALSE; + +/* + * Initialise the communication progress bar + * x - x location of slider + * y - y location of slider + * width - width of slider + * height - height of slider + * bwidth - width of button indicating current progress + * bheight - height of button indicating progress + * f - image for the slider + */ + +void +InitSlider (int x, int y, int width, FRAME sliderFrame, FRAME buttonFrame) +{ + EXTENT sliderSize = GetFrameBounds (sliderFrame); + EXTENT buttonSize = GetFrameBounds (buttonFrame); + + sliderStamp.origin.x = x; + sliderStamp.origin.y = y; + sliderStamp.frame = sliderFrame; + + buttonStamp.origin.x = x; + buttonStamp.origin.y = y - ((buttonSize.height - sliderSize.height) / 2); + buttonStamp.frame = buttonFrame; + + sliderSpace = width - buttonSize.width; +} + +void +SetSliderImage (FRAME f) +{ + sliderChanged = TRUE; + buttonStamp.frame = f; +} + +void +DrawSlider (void) +{ + int offs; + static int last_offs = -1; + + if (sliderDisabled) + return; + + offs = GetTrackPosition (sliderSpace); + if (offs != last_offs || sliderChanged) + { + sliderChanged = FALSE; + last_offs = offs; + buttonStamp.origin.x = sliderStamp.origin.x + offs; + BatchGraphics (); + DrawStamp (&sliderStamp); + DrawStamp (&buttonStamp); + UnbatchGraphics (); + } +} + |