summaryrefslogtreecommitdiff
path: root/src/uqm/oscill.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/uqm/oscill.c')
-rw-r--r--src/uqm/oscill.c191
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 ();
+ }
+}
+