aboutsummaryrefslogtreecommitdiffstats
path: root/vstgui/vstgui.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'vstgui/vstgui.cpp')
-rw-r--r--vstgui/vstgui.cpp4008
1 files changed, 0 insertions, 4008 deletions
diff --git a/vstgui/vstgui.cpp b/vstgui/vstgui.cpp
deleted file mode 100644
index 6757b5e..0000000
--- a/vstgui/vstgui.cpp
+++ /dev/null
@@ -1,4008 +0,0 @@
-/* ----------------------------------------------------------------------------
- * VSTGUI for X11/LV2/PNG
- * Author: David Robillard
- * Released under the revised BSD license, as below
- * ----------------------------------------------------------------------------
- *
- * Based on:
- * ----------------------------------------------------------------------------
- * VSTGUIL: Graphical User Interface Framework for VST plugins on LINUX
- * Version: 0.1, Date: 2007/01/21
- * Author: kRAkEn/gORe
- *
- * Which was based on:
- * ----------------------------------------------------------------------------
- * VSTGUI: Graphical User Interface Framework for VST plugins
- * Version 3.0 $Date: 2005/08/12 12:45:00 $
- * ----------------------------------------------------------------------------
- * VSTGUI LICENSE
- * 2004, Steinberg Media Technologies, All Rights Reserved
- * ----------------------------------------------------------------------------
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * * Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * * Neither the name of the Steinberg Media Technologies nor the names of
- * its contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
- * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- * ----------------------------------------------------------------------------
- */
-
-#include <cstdio>
-#include <cstdlib>
-#include <cmath>
-#include <iostream>
-#include <string.h>
-
-#include "vstgui.h"
-#include "audioeffectx.h"
-#include "vstkeycode.h"
-
-//-----------------------------------------------------------------------------
-// Some defines
-//-----------------------------------------------------------------------------
-#ifdef DEBUG
- #define DBG(x) std::cout << x << std::endl;
- #define assertfalse assert (false);
-#else
- #define DBG(x)
- #define assertfalse
-#endif
-
-#define USE_ALPHA_BLEND 0
-#define USE_CLIPPING_DRAWRECT 1
-#define NEW_UPDATE_MECHANISM 1
-
-
-//-----------------------------------------------------------------------------
-// our global display
-Display* display = 0;
-
-
-//-----------------------------------------------------------------------------
-// AEffGUIEditor Implementation
-//-----------------------------------------------------------------------------
-#define kIdleRate 100 // host idle rate in ms
-#define kIdleRate2 50
-#define kIdleRateMin 4 // minimum time between 2 idles in ms
-
-//-----------------------------------------------------------------------------
-VstInt32 AEffGUIEditor::knobMode = kCircularMode;
-
-//-----------------------------------------------------------------------------
-AEffGUIEditor::AEffGUIEditor (AudioEffect* effect)
-: AEffEditor (effect),
- lLastTicks (0),
- inIdleStuff (false),
- frame (0)
-{
- rect.left = rect.top = rect.right = rect.bottom = 0;
- lLastTicks = getTicks ();
-
- effect->setEditor (this);
-}
-
-//-----------------------------------------------------------------------------
-AEffGUIEditor::~AEffGUIEditor ()
-{
-}
-
-//-----------------------------------------------------------------------------
-void AEffGUIEditor::setParameter (VstInt32 index, float value)
-{}
-
-//-----------------------------------------------------------------------------
-void AEffGUIEditor::beginEdit (VstInt32 index)
-{
- ((AudioEffectX*)effect)->beginEdit (index);
-}
-
-//-----------------------------------------------------------------------------
-void AEffGUIEditor::endEdit (VstInt32 index)
-{
- ((AudioEffectX*)effect)->endEdit (index);
-}
-
-//-----------------------------------------------------------------------------
-#if VST_2_1_EXTENSIONS
-long AEffGUIEditor::onKeyDown (VstKeyCode& keyCode)
-{
- return frame && frame->onKeyDown (keyCode) == 1 ? 1 : 0;
-}
-
-//-----------------------------------------------------------------------------
-long AEffGUIEditor::onKeyUp (VstKeyCode& keyCode)
-{
- return frame && frame->onKeyUp (keyCode) == 1 ? 1 : 0;
-}
-
-//-----------------------------------------------------------------------------
-long AEffGUIEditor::setKnobMode (VstInt32 val)
-{
- knobMode = val;
- return 1;
-}
-
-//-----------------------------------------------------------------------------
-bool AEffGUIEditor::onWheel (float distance)
-{
-/*
- if (frame)
- {
- CDrawContext context (frame, NULL, systemWindow);
- CPoint where;
- context.getMouseLocation (where);
- return frame->onWheel (&context, where, distance);
- }
-*/
- return false;
-}
-#endif
-
-//-----------------------------------------------------------------------------
-long AEffGUIEditor::getRect (ERect **ppErect)
-{
- *ppErect = &rect;
- return 1;
-}
-
-//-----------------------------------------------------------------------------
-void AEffGUIEditor::idle ()
-{
- if (inIdleStuff)
- return;
-
- AEffEditor::idle ();
- if (frame)
- frame->idle ();
-}
-
-//-----------------------------------------------------------------------------
-void AEffGUIEditor::wait (unsigned int ms)
-{
- usleep (ms * 1000);
-}
-
-//-----------------------------------------------------------------------------
-unsigned int AEffGUIEditor::getTicks ()
-{
- return _getTicks ();
-}
-
-//-----------------------------------------------------------------------------
-void AEffGUIEditor::doIdleStuff ()
-{
- // get the current time
- unsigned int currentTicks = getTicks ();
-
- // YG TEST idle ();
- if (currentTicks < lLastTicks)
- {
- wait (kIdleRateMin);
-
- currentTicks += kIdleRateMin;
- if (currentTicks < lLastTicks - kIdleRate2)
- return;
- }
-
- idle ();
-
- // save the next time
- lLastTicks = currentTicks + kIdleRate;
-
- inIdleStuff = true;
-
- if (effect)
- effect->masterIdle ();
-
- inIdleStuff = false;
-}
-
-void AEffGUIEditor::update ()
-{
- if (frame)
- frame->invalidate (CRect (0, 0, rect.right, rect.bottom));
-}
-
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-
-//---For Debugging------------------------
-#if DEBUG
-long gNbCBitmap = 0;
-long gNbCView = 0;
-long gNbCDrawContext = 0;
-long gNbCOffscreenContext = 0;
-long gBitmapAllocation = 0;
-long gNbDC = 0;
-#include <stdarg.h>
-void DebugPrint (const char *format, ...);
-void DebugPrint (const char *format, ...)
-{
- char string[300];
- va_list marker;
- va_start (marker, format);
- vsprintf (string, format, marker);
- if (!strcmp(string, ""))
- strcpy (string, "Empty string\n");
- fprintf (stderr, string);
-}
-#endif
-//---End For Debugging------------------------
-
-#include <assert.h>
-#include <time.h>
-#include <stdlib.h>
-#include <math.h>
-#include <X11/Xlib.h>
-#include <X11/Xutil.h>
-
-#define XDRAWPARAM display, (Window)pWindow, (GC) pSystemContext
-#define XWINPARAM display, (Window)pFrame->getWindow()
-#define XGCPARAM display, (GC) pSystemContext
-
-// #define XDRAWPARAM display, (Window)pWindow, (GC)pSystemContext
-// #define XWINPARAM display, (Window)pWindow
-// #define XGCPARAM display, (GC)pSystemContext
-
-// init the static variable about font
-bool gFontInit = false;
-XFontStruct *gFontStructs[] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
-
-struct SFontTable { const char* name; const char* string; };
-
-static SFontTable gFontTable[] = {
- {"SystemFont", "-*-fixed-*-*-*--12-*-*-*-*-*-*-*"}, // kSystemFont
- {"NormalFontVeryBig", "-*-fixed-*-*-*--18-*-*-*-*-*-*-*"}, // kNormalFontVeryBig
- {"NormalFontBig", "-*-fixed-*-*-*--18-*-*-*-*-*-*-*"}, // kNormalFontBig
- {"NormalFont", "-*-fixed-*-*-*--12-*-*-*-*-*-*-*"}, // kNormalFont
- {"NormalFontSmall", "-*-courier-*-*-*--10-*-*-*-*-*-*-*"}, // kNormalFontSmall
- {"NormalFontSmaller", "-*-courier-*-*-*--9-*-*-*-*-*-*-*"}, // kNormalFontSmaller
- {"NormalFontVerySmall", "-*-courier-*-*-*--8-*-*-*-*-*-*-*"}, // kNormalFontVerySmall
- {"SymbolFont", "-*-fixed-*-*-*--12-*-*-*-*-*-*-*"} // kSymbolFont
-};
-
-long gStandardFontSize[] = { 12, 18, 18, 12, 10, 9, 8, 13 };
-
-// declaration of different local functions
-static long convertPoint2Angle (CPoint &pm, CPoint &pt);
-
-// stuff for color
-long CDrawContext::nbNewColor = 0;
-
-//-----------------------------------------------------------------------------
-bool CRect::pointInside (const CPoint& where) const
-{
- return where.h >= left && where.h < right && where.v >= top && where.v < bottom;
-}
-
-//-----------------------------------------------------------------------------
-bool CRect::isEmpty () const
-{
- if (right <= left)
- return true;
- if (bottom <= top)
- return true;
- return false;
-}
-
-//-----------------------------------------------------------------------------
-void CRect::bound (const CRect& rect)
-{
- if (left < rect.left)
- left = rect.left;
- if (top < rect.top)
- top = rect.top;
- if (right > rect.right)
- right = rect.right;
- if (bottom > rect.bottom)
- bottom = rect.bottom;
- if (bottom < top)
- bottom = top;
- if (right < left)
- right = left;
-}
-
-namespace VSTGUI {
-
-char* bundlePath = NULL;
-void setBundlePath(const char* path) {
- VSTGUI::bundlePath = strdup(path);
-}
-
-CColor kTransparentCColor = {255, 255, 255, 0};
-CColor kBlackCColor = { 0, 0, 0, 255};
-CColor kWhiteCColor = {255, 255, 255, 255};
-CColor kGreyCColor = {127, 127, 127, 255};
-CColor kRedCColor = {255, 0, 0, 255};
-CColor kGreenCColor = { 0, 255, 0, 255};
-CColor kBlueCColor = { 0, 0, 255, 255};
-CColor kYellowCColor = {255, 255, 0, 255};
-CColor kMagentaCColor = {255, 0, 255, 255};
-CColor kCyanCColor = { 0, 255, 255, 255};
-
-#define kDragDelay 0
-
-//-----------------------------------------------------------------------------
-// CDrawContext Implementation
-//-----------------------------------------------------------------------------
-/**
- * CDrawContext constructor.
- * @param inFrame the parent CFrame
- * @param inSystemContext the platform system context, can be NULL
- * @param inWindow the platform window object
- */
-CDrawContext::CDrawContext (CFrame *inFrame, void *inSystemContext, void *inWindow)
-: pSystemContext (inSystemContext)
-, pWindow (inWindow)
-, pFrame (inFrame)
-, fontSize (-1)
-, fontStyle (0)
-, fontId (kNumStandardFonts)
-, frameWidth (0)
-, lineStyle (kLineOnOffDash)
-, drawMode (kAntialias)
-{
-#if DEBUG
- gNbCDrawContext++;
-#endif
-
- // initialize values
- if (pFrame)
- pFrame->getViewSize (clipRect);
- else
- clipRect (0, 0, 1000, 1000);
-
- const CColor notInitalized = {0, 0, 0, 0};
- frameColor = notInitalized;
- fillColor = notInitalized;
- fontColor = notInitalized;
-
- // offsets use by offscreen
- offset (0, 0);
- offsetScreen (0, 0);
-
- // set the current font
- if (pSystemContext)
- {
- // set the default values
- setFont (kNormalFont);
- setFrameColor (kWhiteCColor);
- setLineStyle (kLineSolid);
- setLineWidth (1);
- setFont (kSystemFont);
- setDrawMode (kCopyMode);
- }
-}
-
-//-----------------------------------------------------------------------------
-CDrawContext::~CDrawContext ()
-{
-#if DEBUG
- gNbCDrawContext--;
-#endif
-}
-
-//-----------------------------------------------------------------------------
-void CDrawContext::setLineStyle (CLineStyle style)
-{
- if (lineStyle == style)
- return;
-
- lineStyle = style;
-
- long line_width;
- long line_style;
- if (frameWidth == 1)
- line_width = 0;
- else
- line_width = frameWidth;
-
- switch (lineStyle)
- {
- case kLineOnOffDash:
- line_style = LineOnOffDash;
- break;
- default:
- line_style = LineSolid;
- break;
- }
-
- XSetLineAttributes (XGCPARAM, line_width, line_style, CapNotLast, JoinRound);
-}
-
-//-----------------------------------------------------------------------------
-void CDrawContext::setLineWidth (CCoord width)
-{
- if (frameWidth == width)
- return;
-
- frameWidth = width;
-
- setLineStyle (lineStyle);
-}
-
-//-----------------------------------------------------------------------------
-void CDrawContext::setDrawMode (CDrawMode mode)
-{
- if (drawMode == mode)
- return;
-
- drawMode = mode;
-
- long iMode = 0;
- switch (drawMode)
- {
- case kXorMode :
- iMode = GXinvert;
- break;
- case kOrMode :
- iMode = GXor;
- break;
- default:
- iMode = GXcopy;
- }
-
- ((XGCValues*)pSystemContext)->function = iMode;
-
- XChangeGC (XGCPARAM, GCFunction, (XGCValues*)pSystemContext);
-}
-
-//------------------------------------------------------------------------------
-void CDrawContext::setClipRect (const CRect &clip)
-{
- CRect _clip (clip);
- _clip.offset (offset.h, offset.v);
-
- if (clipRect == _clip)
- return;
-
- clipRect = _clip;
-
- XRectangle r;
- r.x = 0;
- r.y = 0;
- r.width = clipRect.right - clipRect.left + 1;
- r.height = clipRect.bottom - clipRect.top + 1;
-
- XSetClipRectangles (XGCPARAM, clipRect.left, clipRect.top, &r, 1, Unsorted);
-}
-
-//------------------------------------------------------------------------------
-void CDrawContext::resetClipRect ()
-{
- CRect newClip;
- if (pFrame)
- pFrame->getViewSize (newClip);
- else
- newClip (0, 0, 1000, 1000);
-
- setClipRect (newClip);
-
- clipRect = newClip;
-}
-
-//-----------------------------------------------------------------------------
-void CDrawContext::moveTo (const CPoint &_point)
-{
- CPoint point (_point);
- point.offset (offset.h, offset.v);
-
- penLoc = point;
-}
-
-//-----------------------------------------------------------------------------
-void CDrawContext::lineTo (const CPoint& _point)
-{
- CPoint point (_point);
- point.offset (offset.h, offset.v);
-
- CPoint start (penLoc);
- CPoint end (point);
- if (start.h == end.h)
- {
- if (start.v < -5)
- start.v = -5;
- else if (start.v > 10000)
- start.v = 10000;
-
- if (end.v < -5)
- end.v = -5;
- else if (end.v > 10000)
- end.v = 10000;
- }
- if (start.v == end.v)
- {
- if (start.h < -5)
- start.h = -5;
- else if (start.h > 10000)
- start.h = 10000;
-
- if (end.h < -5)
- end.h = -5;
- else if (end.h > 10000)
- end.h = 10000;
- }
-
- XDrawLine (XDRAWPARAM, start.h, start.v, end.h, end.v);
-
- // keep trace of the new position
- penLoc = point;
-}
-
-//-----------------------------------------------------------------------------
-void CDrawContext::drawLines (const CPoint* points, const long& numLines)
-{
- // default implementation, when no platform optimized code is implemented
- for (long i = 0; i < numLines * 2; i+=2)
- {
- moveTo (points[i]);
- lineTo (points[i+1]);
- }
-}
-
-//-----------------------------------------------------------------------------
-void CDrawContext::drawPolygon (const CPoint *pPoints, long numberOfPoints, const CDrawStyle drawStyle)
-{
- if (drawStyle == kDrawFilled || drawStyle == kDrawFilledAndStroked)
- fillPolygon (pPoints, numberOfPoints);
- if (drawStyle == kDrawStroked || drawStyle == kDrawFilledAndStroked)
- polyLine (pPoints, numberOfPoints);
-}
-
-//-----------------------------------------------------------------------------
-void CDrawContext::polyLine (const CPoint *pPoints, long numberOfPoints)
-{
- XPoint* pt = (XPoint*)malloc (numberOfPoints * sizeof (XPoint));
- if (!pt)
- return;
- for (long i = 0; i < numberOfPoints; i++)
- {
- pt[i].x = (short)pPoints[i].h + offset.h;
- pt[i].y = (short)pPoints[i].v + offset.v;
- }
-
- XDrawLines (XDRAWPARAM, pt, numberOfPoints, CoordModeOrigin);
-
- free (pt);
-}
-
-//-----------------------------------------------------------------------------
-void CDrawContext::fillPolygon (const CPoint *pPoints, long numberOfPoints)
-{
- // convert the points
- XPoint* pt = (XPoint*)malloc (numberOfPoints * sizeof (XPoint));
- if (!pt)
- return;
- for (long i = 0; i < numberOfPoints; i++)
- {
- pt[i].x = (short)pPoints[i].h + offset.h;
- pt[i].y = (short)pPoints[i].v + offset.v;
- }
-
- XFillPolygon (XDRAWPARAM, pt, numberOfPoints, Convex, CoordModeOrigin);
-
- free (pt);
-}
-
-//-----------------------------------------------------------------------------
-void CDrawContext::drawRect (const CRect &_rect, const CDrawStyle drawStyle)
-{
- CRect rect (_rect);
- rect.offset (offset.h, offset.v);
-
- XDrawRectangle (XDRAWPARAM, rect.left, rect.top, rect.width (), rect.height ());
-}
-
-//-----------------------------------------------------------------------------
-void CDrawContext::fillRect (const CRect &_rect)
-{
- CRect rect (_rect);
- rect.offset (offset.h, offset.v);
-
- // Don't draw boundary
- XFillRectangle (XDRAWPARAM, rect.left + 1, rect.top + 1, rect.width () - 1, rect.height () - 1);
-}
-
-//-----------------------------------------------------------------------------
-void CDrawContext::drawEllipse (const CRect &_rect, const CDrawStyle drawStyle)
-{
- CPoint point (_rect.left + (_rect.right - _rect.left) / 2, _rect.top);
- drawArc (_rect, point, point);
-}
-
-//-----------------------------------------------------------------------------
-void CDrawContext::fillEllipse (const CRect &_rect)
-{
- CRect rect (_rect);
- rect.offset (offset.h, offset.v);
-
- // Don't draw boundary
- CPoint point (_rect.left + ((_rect.right - _rect.left) / 2), _rect.top);
- fillArc (_rect, point, point);
-}
-
-//-----------------------------------------------------------------------------
-void CDrawContext::drawPoint (const CPoint &_point, CColor color)
-{
- CPoint point (_point);
-
- CColor oldframecolor = frameColor;
- setFrameColor (color);
-
- XDrawPoint (XDRAWPARAM, point.h, point.v);
-
- setFrameColor (oldframecolor);
-}
-
-//-----------------------------------------------------------------------------
-CColor CDrawContext::getPoint (const CPoint& _point)
-{
-// CPoint point (_point);
-// point.offset (offset.h, offset.v);
-
- assertfalse // not implemented !
-
- CColor color = kBlackCColor;
- return color;
-}
-
-//-----------------------------------------------------------------------------
-void CDrawContext::floodFill (const CPoint& _start)
-{
-// CPoint start (_start);
-// start.offset (offset.h, offset.v);
-
- assertfalse // not implemented !
-}
-
-//-----------------------------------------------------------------------------
-void CDrawContext::drawArc (const CRect &_rect, const float _startAngle, const float _endAngle, const CDrawStyle drawStyle) // in degree
-{
- CRect rect (_rect);
- rect.offset (offset.h, offset.v);
-
- XDrawArc (XDRAWPARAM, rect.left, rect.top, rect.width (), rect.height (),
- (int) _startAngle * 64, (int) _endAngle * 64);
-}
-
-//-----------------------------------------------------------------------------
-void CDrawContext::drawArc (const CRect &_rect, const CPoint &_point1, const CPoint &_point2)
-{
- CRect rect (_rect);
- rect.offset (offset.h, offset.v);
- CPoint point1 (_point1);
- point1.offset (offset.h, offset.v);
- CPoint point2 (_point2);
- point2.offset (offset.h, offset.v);
-
- int angle1, angle2;
- if ((point1.v == point2.v) && (point1.h == point2.h))
- {
- angle1 = 0;
- angle2 = 23040; // 360 * 64
- }
- else
- {
- CPoint pm ((rect.left + rect.right) / 2, (rect.top + rect.bottom) / 2);
- angle1 = convertPoint2Angle (pm, point1);
- angle2 = convertPoint2Angle (pm, point2) - angle1;
- if (angle2 < 0)
- angle2 += 23040; // 360 * 64
- }
-
- XDrawArc (XDRAWPARAM, rect.left, rect.top, rect.width (), rect.height (),
- angle1, angle2);
-}
-
-//-----------------------------------------------------------------------------
-void CDrawContext::fillArc (const CRect &_rect, const CPoint &_point1, const CPoint &_point2)
-{
- CRect rect (_rect);
- rect.offset (offset.h, offset.v);
- CPoint point1 (_point1);
- point1.offset (offset.h, offset.v);
- CPoint point2 (_point2);
- point2.offset (offset.h, offset.v);
-
- // Don't draw boundary
- int angle1, angle2;
- if ((point1.v == point2.v) && (point1.h == point2.h))
- {
- angle1 = 0;
- angle2 = 23040; // 360 * 64
- }
- else
- {
- CPoint pm ((rect.left + rect.right) / 2, (rect.top + rect.bottom) / 2);
- angle1 = convertPoint2Angle (pm, point1);
- angle2 = convertPoint2Angle (pm, point2);
- }
-
- XFillArc (XDRAWPARAM, rect.left, rect.top, rect.width (), rect.height (),
- angle1, angle2);
-}
-
-//-----------------------------------------------------------------------------
-void CDrawContext::setFontColor (const CColor color)
-{
- fontColor = color;
-
- setFrameColor (fontColor);
-}
-
-//-----------------------------------------------------------------------------
-void CDrawContext::setFrameColor (const CColor color)
-{
- if (frameColor == color)
- return;
-
- frameColor = color;
-
- XSetForeground (XGCPARAM, getIndexColor (frameColor));
-}
-
-//-----------------------------------------------------------------------------
-void CDrawContext::setFillColor (const CColor color)
-{
- if (fillColor == color)
- return;
-
- fillColor = color;
-
- // set the background for the text
- //XSetBackground (XGCPARAM, getIndexColor (fillColor));
- XSetBackground (display, pFrame->getGC(), getIndexColor (fillColor));
-
- // set the foreground for the fill
- setFrameColor (fillColor);
-}
-
-//-----------------------------------------------------------------------------
-void CDrawContext::setFont (CFont fontID, const long size, long style)
-{
- if (fontID < 0 || fontID >= kNumStandardFonts)
- fontID = kSystemFont;
-
- if (fontId == fontID && fontSize == (size != 0 ? size : gStandardFontSize[fontID]) && fontStyle == style)
- return;
-
- fontStyle = style;
- fontId = fontID;
- if (size != 0)
- fontSize = size;
- else
- fontSize = gStandardFontSize[fontID];
-
- if (gFontStructs[fontID] != NULL)
- XSetFont (display, pFrame->getGC(), gFontStructs[fontID]->fid);
- else
- fprintf(stderr, "ERROR: Font not defined\n");
-
- // keep trace of the current font
- pFontInfoStruct = gFontStructs[fontID];
-
-#ifdef DEBUG
-// if (!pFontInfoStruct) assert (false); // fonts have invalid pointers !
-#endif
-}
-
-//------------------------------------------------------------------------------
-CCoord CDrawContext::getStringWidth (const char *pStr)
-{
- CCoord result = 0;
-
- result = (long) XTextWidth (pFontInfoStruct, pStr, strlen (pStr));
-
- return result;
-}
-
-//-----------------------------------------------------------------------------
-void CDrawContext::drawString (const char *string, const CRect &_rect,
- const short opaque, const CHoriTxtAlign hAlign)
-{
- if (!string)
- return;
-
- CRect rect (_rect);
- rect.offset (offset.h, offset.v);
-
- int width;
- int fontHeight = pFontInfoStruct->ascent + pFontInfoStruct->descent;
- int xPos;
- int yPos;
- int rectHeight = rect.height ();
-
- if (rectHeight >= fontHeight)
- yPos = rect.bottom - (rectHeight - fontHeight) / 2;
- else
- yPos = rect.bottom;
- yPos -= pFontInfoStruct->descent;
-
- switch (hAlign)
- {
- case kCenterText:
- width = XTextWidth (pFontInfoStruct, string, strlen (string));
- xPos = (rect.right + rect.left - width) / 2;
- break;
-
- case kRightText:
- width = XTextWidth (pFontInfoStruct, string, strlen (string));
- xPos = rect.right - width;
- break;
-
- default: // left adjust
- xPos = rect.left + 1;
- }
-
- if (opaque)
- XDrawImageString (XDRAWPARAM, xPos, yPos, string, strlen (string));
- else
- XDrawString (XDRAWPARAM, xPos, yPos, string, strlen (string));
-}
-
-//-----------------------------------------------------------------------------
-long CDrawContext::getMouseButtons ()
-{
- long buttons = 0;
-
- Window root, child;
- int rootX, rootY, childX, childY;
- unsigned int mask;
-
- XQueryPointer (XWINPARAM,
- &root,
- &child,
- &rootX,
- &rootY,
- &childX,
- &childY,
- &mask);
-
- if (mask & Button1Mask)
- buttons |= kLButton;
- if (mask & Button2Mask)
- buttons |= kMButton;
- if (mask & Button3Mask)
- buttons |= kRButton;
-
- if (mask & ShiftMask)
- buttons |= kShift;
- if (mask & ControlMask)
- buttons |= kControl;
- if (mask & Mod1Mask)
- buttons |= kAlt;
-
- return buttons;
-}
-
-//-----------------------------------------------------------------------------
-void CDrawContext::getMouseLocation (CPoint &point)
-{
- Window root, child;
- int rootX, rootY, childX, childY;
- unsigned int mask;
-
- XQueryPointer (XWINPARAM,
- &root,
- &child,
- &rootX,
- &rootY,
- &childX,
- &childY,
- &mask);
-
- point (childX, childY);
-
- point.offset (-offsetScreen.h, -offsetScreen.v);
-}
-
-//-----------------------------------------------------------------------------
-bool CDrawContext::waitDoubleClick ()
-{
- bool doubleClick = false;
-
- long currentTime = _getTicks ();
- long clickTime = currentTime + 200; // XtGetMultiClickTime (display);
-
- XEvent e;
- while (currentTime < clickTime)
- {
- if (XCheckTypedEvent (display, ButtonPress, &e))
- {
- doubleClick = true;
- break;
- }
-
- currentTime = _getTicks ();
- }
-
- return doubleClick;
-}
-
-//-----------------------------------------------------------------------------
-bool CDrawContext::waitDrag ()
-{
- if (!pFrame)
- return false;
-
- CPoint mouseLoc;
- getMouseLocation (mouseLoc);
- CRect observe (mouseLoc.h - 2, mouseLoc.v - 2, mouseLoc.h + 2, mouseLoc.v + 2);
-
- long currentTime = pFrame->getTicks ();
- bool wasOutside = false;
-
- while (((getMouseButtons () & ~(kMButton|kRButton)) & kLButton) != 0)
- {
- pFrame->doIdleStuff ();
- if (!wasOutside)
- {
- getMouseLocation (mouseLoc);
- if (!observe.pointInside (mouseLoc))
- {
- if (kDragDelay <= 0)
- return true;
- wasOutside = true;
- }
- }
-
- if (wasOutside && (pFrame->getTicks () - currentTime > kDragDelay))
- return true;
- }
- return false;
-}
-
-//-----------------------------------------------------------------------------
-void CDrawContext::forget ()
-{
- CReferenceCounter::forget ();
-}
-
-//-----------------------------------------------------------------------------
-long CDrawContext::getIndexColor (CColor color)
-{
- /*XColor xcol;
- xcol.red = color.red << 8;
- xcol.green = color.green << 8;
- xcol.blue = color.blue << 8;
- xcol.flags = (DoRed | DoGreen | DoBlue);
- XAllocColor (display, getColormap(), &xcol);
- return xcol.pixel;*/
- return (color.red << 16) + (color.green << 8) + color.blue;
-}
-
-//-----------------------------------------------------------------------------
-Colormap CDrawContext::getColormap ()
-{
- if (pFrame)
- return pFrame->getColormap ();
- else
- return None;
-}
-
-//-----------------------------------------------------------------------------
-Visual* CDrawContext::getVisual ()
-{
- if (pFrame)
- return pFrame->getVisual ();
- else
- return None;
-}
-
-//-----------------------------------------------------------------------------
-unsigned int CDrawContext::getDepth ()
-{
- if (pFrame)
- return pFrame->getDepth ();
- else
- return None;
-}
-
-
-//-----------------------------------------------------------------------------
-// COffscreenContext Implementation
-//-----------------------------------------------------------------------------
-COffscreenContext::COffscreenContext (CDrawContext *pContext, CBitmap *pBitmapBg, bool drawInBitmap)
-: CDrawContext (pContext->pFrame, NULL, NULL)
-, pBitmap (0)
-, pBitmapBg (pBitmapBg)
-, height (20)
-, width (20)
-{
- std::cout << "COffscreenContext::COffscreenContext with bitmap" << std::endl;
-
- if (pBitmapBg)
- {
- height = pBitmapBg->getHeight ();
- width = pBitmapBg->getWidth ();
-
- clipRect (0, 0, width, height);
- }
-
-#if DEBUG
- gNbCOffscreenContext++;
- gBitmapAllocation += (long)height * (long)width;
-#endif
-
- bDestroyPixmap = false;
-
-// Window root = RootWindow (display, DefaultScreen (display));
-
- // if no bitmap handle => create one
- if (! pWindow)
- {
- pWindow = (void*) XCreatePixmap (display, pFrame->getWindow(), width, height, pFrame->getDepth ());
- bDestroyPixmap = true;
- }
-
- // set the current font
- if (pSystemContext)
- setFont (kNormalFont);
-
- if (!drawInBitmap)
- {
- // draw bitmap to Offscreen
- CRect r (0, 0, width, height);
- if (pBitmapBg)
- pBitmapBg->draw (this, r);
- else
- {
- setFillColor (kBlackCColor);
- fillRect (r);
- }
- }
-}
-
-//-----------------------------------------------------------------------------
-COffscreenContext::COffscreenContext (CFrame *pFrame, long width, long height, const CColor backgroundColor)
-: CDrawContext (pFrame, NULL, NULL)
-, pBitmap (0)
-, pBitmapBg (0)
-, height (height)
-, width (width)
-, backgroundColor (backgroundColor)
-{
- std::cout << "COffscreenContext::COffscreenContext without bitmap" << std::endl;
-
- clipRect (0, 0, width, height);
-
-#if DEBUG
- gNbCOffscreenContext++;
- gBitmapAllocation += height * width;
-#endif
-
- bDestroyPixmap = true;
-
- pWindow = (void*) XCreatePixmap (display,
- pFrame->getWindow(),
- width,
- height,
- pFrame->getDepth ());
-
-/*
- // clear the pixmap
- XGCValues values;
- values.foreground = getIndexColor (backgroundColor);
- GC gc = XCreateGC (display, (Window)pWindow, GCForeground, &values);
- XFillRectangle (display, (Window)pWindow, gc, 0, 0, width, height);
- XFreeGC (display, gc);
-*/
-
- XGCValues values;
- values.foreground = getIndexColor (backgroundColor);
- pSystemContext = XCreateGC (display, (Window)pWindow, GCForeground, &values);
- XFillRectangle (display, (Window)pWindow, (GC) pSystemContext, 0, 0, width, height);
-
- // set the current font
- if (pSystemContext)
- setFont (kNormalFont);
-}
-
-//-----------------------------------------------------------------------------
-COffscreenContext::~COffscreenContext ()
-{
-#if DEBUG
- gNbCOffscreenContext--;
- gBitmapAllocation -= (long)height * (long)width;
-#endif
-
- if (pBitmap)
- pBitmap->forget ();
-
- if (bDestroyPixmap && pWindow)
- XFreePixmap (display, (Pixmap)pWindow);
-
- if (pSystemContext)
- XFreeGC (display, (GC) pSystemContext);
-}
-
-//-----------------------------------------------------------------------------
-void COffscreenContext::copyTo (CDrawContext* pContext, CRect& srcRect, CPoint destOffset)
-{
- std::cout << "COffscreenContext::copyTo" << std::endl;
-
- XCopyArea (display,
- (Drawable) pContext->pWindow,
- (Drawable) pWindow,
- (GC) pSystemContext,
- srcRect.left,
- srcRect.top,
- srcRect.width (),
- srcRect.height (),
- destOffset.h,
- destOffset.v);
-}
-
-//-----------------------------------------------------------------------------
-void COffscreenContext::copyFrom (CDrawContext *pContext, CRect destRect, CPoint srcOffset)
-{
- //std::cout << "COffscreenContext::copyFrom ";
-
- XCopyArea (display,
- (Drawable) pContext->pWindow,
- (Drawable) pWindow,
- (GC) pSystemContext,
- srcOffset.h,
- srcOffset.v,
- destRect.width(),
- destRect.height(),
- destRect.left,
- destRect.top);
-
- pContext->setFrameColor (kRedCColor);
- pContext->drawRect (destRect);
-}
-
-
-//-----------------------------------------------------------------------------
-class CAttributeListEntry
-{
-public:
- CAttributeListEntry (long size, CViewAttributeID id)
- : nextEntry (0)
- , pointer (0)
- , sizeOfPointer (size)
- , id (id)
- {
- pointer = malloc (size);
- }
-
- ~CAttributeListEntry ()
- {
- if (pointer)
- free (pointer);
- }
-
- CViewAttributeID getID () const { return id; }
- long getSize () const { return sizeOfPointer; }
- void* getPointer () const { return pointer; }
- CAttributeListEntry* getNext () const { return nextEntry; }
-
- void setNext (CAttributeListEntry* entry) { nextEntry = entry; }
-
-protected:
- CAttributeListEntry () : nextEntry (0), pointer (0), sizeOfPointer (0), id (0) {}
-
- CAttributeListEntry* nextEntry;
- void* pointer;
- long sizeOfPointer;
- CViewAttributeID id;
-};
-
-//-----------------------------------------------------------------------------
-const char* kMsgCheckIfViewContainer = "kMsgCheckIfViewContainer";
-
-//-----------------------------------------------------------------------------
-// CView
-//-----------------------------------------------------------------------------
-/*! @class CView
-base class of all view objects
-*/
-//-----------------------------------------------------------------------------
-CView::CView (const CRect& size)
-: size (size)
-, mouseableArea (size)
-, pParentFrame (0)
-, pParentView (0)
-, bDirty (false)
-, bMouseEnabled (true)
-, bTransparencyEnabled (false)
-, bWantsFocus (false)
-, bVisible (true)
-, pBackground (0)
-, pAttributeList (0)
-{
-#if DEBUG
- gNbCView++;
-#endif
-}
-
-//-----------------------------------------------------------------------------
-CView::~CView ()
-{
- if (pBackground)
- pBackground->forget ();
-
- if (pAttributeList)
- {
- CAttributeListEntry* entry = pAttributeList;
- while (entry)
- {
- CAttributeListEntry* nextEntry = entry->getNext ();
- delete entry;
- entry = nextEntry;
- }
- }
-#if DEBUG
- gNbCView--;
-#endif
-}
-
-//-----------------------------------------------------------------------------
-void CView::getMouseLocation (CDrawContext* context, CPoint &point)
-{
- if (context)
- {
- if (pParentView && pParentView->notify (this, kMsgCheckIfViewContainer) == kMessageNotified)
- {
- CCoord save[4];
- ((CViewContainer*)pParentView)->modifyDrawContext (save, context);
- pParentView->getMouseLocation (context, point);
- ((CViewContainer*)pParentView)->restoreDrawContext (context, save);
- }
- else
- context->getMouseLocation (point);
- }
-}
-
-//-----------------------------------------------------------------------------
-CPoint& CView::frameToLocal (CPoint& point) const
-{
- if (pParentView && pParentView->isTypeOf ("CViewContainer"))
- return pParentView->frameToLocal (point);
- return point;
-}
-
-//-----------------------------------------------------------------------------
-CPoint& CView::localToFrame (CPoint& point) const
-{
- if (pParentView && pParentView->isTypeOf ("CViewContainer"))
- return pParentView->localToFrame (point);
- return point;
-}
-
-//-----------------------------------------------------------------------------
-void CView::redraw ()
-{
- if (pParentFrame)
- pParentFrame->draw (this);
-}
-
-//-----------------------------------------------------------------------------
-void CView::redrawRect (CDrawContext* context, const CRect& rect)
-{
- if (pParentView)
- pParentView->redrawRect (context, rect);
- else if (pParentFrame)
- pParentFrame->drawRect (context, rect);
-}
-
-//-----------------------------------------------------------------------------
-void CView::draw (CDrawContext *pContext)
-{
- if (pBackground)
- {
- if (bTransparencyEnabled)
- pBackground->drawTransparent (pContext, size);
- else
- pBackground->draw (pContext, size);
- }
- setDirty (false);
-}
-
-//-----------------------------------------------------------------------------
-void CView::mouse (CDrawContext *pContext, CPoint &where, long buttons)
-{}
-
-//-----------------------------------------------------------------------------
-bool CView::onWheel (CDrawContext *pContext, const CPoint &where, float distance)
-{
- return false;
-}
-
-//------------------------------------------------------------------------
-bool CView::onWheel (CDrawContext *pContext, const CPoint &where, const CMouseWheelAxis axis, float distance)
-{
- return onWheel (pContext, where, distance);
-}
-
-//------------------------------------------------------------------------
-void CView::update (CDrawContext *pContext)
-{
- if (isDirty ())
- {
-#if NEW_UPDATE_MECHANISM
- if (pContext)
- redrawRect (pContext, size);
- else
- redraw ();
-#else
- #if USE_ALPHA_BLEND
- if (pContext)
- {
- if (bTransparencyEnabled)
- getFrame ()->drawRect (pContext, size);
- else
- draw (pContext);
- }
- #else
- if (pContext)
- draw (pContext);
- #endif
- else
- redraw ();
-#endif
- setDirty (false);
- }
-}
-
-//------------------------------------------------------------------------------
-long CView::onKeyDown (VstKeyCode& keyCode)
-{
- return -1;
-}
-
-//------------------------------------------------------------------------------
-long CView::onKeyUp (VstKeyCode& keyCode)
-{
- return -1;
-}
-
-//------------------------------------------------------------------------------
-long CView::notify (CView* sender, const char* message)
-{
- return kMessageUnknown;
-}
-
-//------------------------------------------------------------------------------
-void CView::looseFocus (CDrawContext *pContext)
-{}
-
-//------------------------------------------------------------------------------
-void CView::takeFocus (CDrawContext *pContext)
-{}
-
-//------------------------------------------------------------------------------
-void CView::setViewSize (CRect &rect)
-{
- size = rect;
- setDirty ();
-}
-
-//-----------------------------------------------------------------------------
-void *CView::getEditor () const
-{
- return pParentFrame ? pParentFrame->getEditor () : 0;
-}
-
-//-----------------------------------------------------------------------------
-void CView::setBackground (CBitmap *background)
-{
- if (pBackground)
- pBackground->forget ();
- pBackground = background;
- if (pBackground)
- pBackground->remember ();
- setDirty (true);
-}
-
-//-----------------------------------------------------------------------------
-const CViewAttributeID kCViewAttributeReferencePointer = (CViewAttributeID) "cvrp";
-
-//-----------------------------------------------------------------------------
-/**
- * @param id the ID of the Attribute
- * @param outSize on return the size of the attribute
- */
-bool CView::getAttributeSize (const CViewAttributeID id, long& outSize) const
-{
- if (pAttributeList)
- {
- CAttributeListEntry* entry = pAttributeList;
- while (entry)
- {
- if (entry->getID () == id)
- break;
- entry = entry->getNext ();
- }
- if (entry)
- {
- outSize = entry->getSize ();
- return true;
- }
- }
- return false;
-}
-
-//-----------------------------------------------------------------------------
-/**
- * @param id the ID of the Attribute
- * @param inSize the size of the outData pointer
- * @param outData a pointer where to copy the attribute data
- * @param outSize the size in bytes which was copied into outData
- */
-bool CView::getAttribute (const CViewAttributeID id, const long inSize, void* outData, long& outSize) const
-{
- if (pAttributeList)
- {
- CAttributeListEntry* entry = pAttributeList;
- while (entry)
- {
- if (entry->getID () == id)
- break;
- entry = entry->getNext ();
- }
- if (entry && inSize >= entry->getSize ())
- {
- outSize = entry->getSize ();
- memcpy (outData, entry->getPointer (), outSize);
- return true;
- }
- }
- return false;
-}
-
-//-----------------------------------------------------------------------------
-/**
- * copies data into the attribute. If it does not exist, creates a new attribute.
- * @param id the ID of the Attribute
- * @param inSize the size of the outData pointer
- * @param inData a pointer to the data
- */
-bool CView::setAttribute (const CViewAttributeID id, const long inSize, void* inData)
-{
- CAttributeListEntry* lastEntry = 0;
- if (pAttributeList)
- {
- CAttributeListEntry* entry = pAttributeList;
- while (entry)
- {
- if (entry->getID () == id)
- break;
- if (entry->getNext () == 0)
- lastEntry = entry;
- entry = entry->getNext ();
- }
- if (entry)
- {
- if (entry->getSize () >= inSize)
- {
- memcpy (entry->getPointer (), inData, inSize);
- return true;
- }
- else
- return false;
- }
- }
-
- // create a new attribute
- CAttributeListEntry* newEntry = new CAttributeListEntry (inSize, id);
- memcpy (newEntry->getPointer (), inData, inSize);
- if (lastEntry)
- lastEntry->setNext (newEntry);
- else if (!pAttributeList)
- pAttributeList = newEntry;
- else
- {
- delete newEntry;
- return false;
- }
- return true;
-}
-
-#if DEBUG
-//-----------------------------------------------------------------------------
-void CView::dumpInfo ()
-{
- CRect viewRect = getViewSize (viewRect);
- DebugPrint ("left:%4d, top:%4d, width:%4d, height:%4d ", viewRect.left, viewRect.top, viewRect.getWidth (), viewRect.getHeight ());
- if (getMouseEnabled ())
- DebugPrint ("(Mouse Enabled) ");
- if (getTransparency ())
- DebugPrint ("(Transparent) ");
- CRect mouseRect = getMouseableArea (mouseRect);
- if (mouseRect != viewRect)
- DebugPrint (" (Mouseable Area: left:%4d, top:%4d, width:%4d, height:%4d ", mouseRect.left, mouseRect.top, mouseRect.getWidth (), mouseRect.getHeight ());
-}
-#endif
-
-#define FOREACHSUBVIEW for (CCView *pSv = pFirstView; pSv; pSv = pSv->pNext) {CView *pV = pSv->pView;
-#define FOREACHSUBVIEW_REVERSE(reverse) for (CCView *pSv = reverse ? pLastView : pFirstView; pSv; pSv = reverse ? pSv->pPrevious : pSv->pNext) {CView *pV = pSv->pView;
-#define ENDFOR }
-
-//-----------------------------------------------------------------------------
-// CFrame Implementation
-//-----------------------------------------------------------------------------
-/*! @class CFrame
-It creates a platform dependend view object.
-On classic Mac OS it just draws into the provided window.
-On Mac OS X it is a ControlRef.
-On Windows it's a WS_CHILD Window.
-*/
-CFrame::CFrame (const CRect &inSize, void *inSystemWindow, void *inEditor)
-: CViewContainer (inSize, 0, 0)
-, pEditor (inEditor)
-, pModalView (0)
-, pFocusView (0)
-, bFirstDraw (true)
-, bDropActive (false)
-, bUpdatesDisabled (false)
-, pSystemWindow ((Window)inSystemWindow)
-, pFrameContext (0)
-, bAddedWindow (false)
-, defaultCursor (0)
-{
- setOpenFlag (true);
-
- pParentFrame = this;
-
- depth = 0;
- pVisual = 0;
- window = 0;
- gc = 0;
-
- if (display == NULL)
- display = XOpenDisplay(NULL);
-
- initFrame ((void*)pSystemWindow);
- backBuffer = XdbeAllocateBackBufferName(display, (Window)window, XdbeUndefined);
-
- XGCValues values;
- values.foreground = 1;
- gc = XCreateGC (display, (Window)backBuffer, GCForeground, &values);
-
- pFrameContext = new CDrawContext (this, gc, (void*)backBuffer);
-}
-
-//-----------------------------------------------------------------------------
-CFrame::~CFrame ()
-{
- if (pModalView)
- removeView (pModalView, false);
-
- setCursor (kCursorDefault);
-
- setDropActive (false);
-
- if (pFrameContext)
- pFrameContext->forget ();
-
- if (getOpenFlag ())
- close ();
-
- if (window)
- XDestroyWindow (display, (Window) window);
- window = 0;
-
- // remove callbacks to avoid undesirable update
- if (gc)
- freeGc ();
-}
-
-//-----------------------------------------------------------------------------
-bool CFrame::open ()
-{
- if (! window)
- return false;
-
- XMapRaised (display, window);
-
- return getOpenFlag ();
-}
-
-//-----------------------------------------------------------------------------
-bool CFrame::close ()
-{
- if (!window || !getOpenFlag () || !pSystemWindow)
- return false;
-
- XUnmapWindow (display, window);
-
- return true;
-}
-
-//-----------------------------------------------------------------------------
-bool xerror;
-int errorHandler (Display *dp, XErrorEvent *e)
-{
- xerror = true;
- return 0;
-}
-int getProperty (Window handle, Atom atom)
-{
- int result = 0, userSize;
- unsigned long bytes, userCount;
- unsigned char *data;
- Atom userType;
- xerror = false;
- XErrorHandler olderrorhandler = XSetErrorHandler (errorHandler);
- XGetWindowProperty (display, handle, atom, 0, 1, false, AnyPropertyType,
- &userType, &userSize, &userCount, &bytes, &data);
- if (xerror == false && userCount == 1)
- result = *(int*)data;
- XSetErrorHandler (olderrorhandler);
- return result;
-}
-
-void eventProc (XEvent* ev)
-{
- CFrame* frame = (CFrame*) getProperty (ev->xany.window, XInternAtom (display, "_this", false));
- if (frame == 0)
- return;
-
- switch (ev->type)
- {
- case ButtonPress:
- {
- CPoint where (ev->xbutton.x, ev->xbutton.y);
- frame->mouse (frame->createDrawContext(), where);
- break;
- }
-
- case MotionNotify:
- {
- CPoint where (ev->xbutton.x, ev->xbutton.y);
- frame->mouse (frame->createDrawContext(), where);
- break;
- }
-
- case ButtonRelease:
- {
- break;
- }
-
- case Expose:
- {
- CRect rc (ev->xexpose.x, ev->xexpose.y,
- ev->xexpose.x + ev->xexpose.width, ev->xexpose.y + ev->xexpose.height);
-
- while (XCheckTypedWindowEvent (display, ev->xexpose.window, Expose, ev))
- {
- rc.left = std::min ((int) rc.left, ev->xexpose.x);
- rc.top = std::min ((int) rc.top, ev->xexpose.y);
- rc.right = std::max ((int) rc.right, ev->xexpose.x + ev->xexpose.width);
- rc.bottom = std::max ((int) rc.bottom, ev->xexpose.y + ev->xexpose.height);
- }
-
- frame->drawRect (0, rc);
- break;
- }
-
- case EnterNotify:
- break;
-
- case LeaveNotify:
- {
- XCrossingEvent *xevent = (XCrossingEvent*) ev;
- if (frame->getFocusView ())
- {
- if (xevent->x < 0 || xevent->x >= frame->getWidth ()
- || xevent->y < 0 || xevent->y >= frame->getHeight ())
- {
- // if button pressed => don't defocus
- if (xevent->state & (Button1Mask | Button2Mask | Button3Mask))
- break;
-
- frame->getFocusView ()->looseFocus ();
- frame->setFocusView (0);
- }
- }
- break;
- }
-
- case ConfigureNotify:
- {
- frame->draw (); // @XXX - keep out ?
- break;
- }
- }
-}
-
-//-----------------------------------------------------------------------------
-bool CFrame::initFrame (void *systemWin)
-{
- if (!systemWin)
- return false;
-
- // window attributes
- XSetWindowAttributes swa;
- swa.override_redirect = false;
- swa.background_pixmap = None;
- swa.colormap = 0;
- swa.event_mask =
- StructureNotifyMask | ExposureMask | KeyPressMask | KeyReleaseMask |
- ButtonPressMask | ButtonReleaseMask | FocusChangeMask | PointerMotionMask |
- EnterWindowMask | LeaveWindowMask | PropertyChangeMask;
-
- // create child window of host supplied window
- window = XCreateWindow (display, (Window)systemWin,
- 0, 0, size.width(), size.height(),
- 0, CopyFromParent, InputOutput, (Visual*) CopyFromParent,
- CWEventMask | CWOverrideRedirect | CWColormap | CWBackPixmap | CWEventMask, &swa);
-
- XGrabButton (display, AnyButton, AnyModifier, window, False,
- ButtonPressMask | ButtonReleaseMask | EnterWindowMask | LeaveWindowMask | PointerMotionMask,
- GrabModeAsync, GrabModeAsync, None, None);
-
-#if 0
- // remove window caption/frame
- #define MWM_HINTS_DECORATIONS (1L << 1)
- #define PROP_MOTIF_WM_HINTS_ELEMENTS 5
- typedef struct
- {
- unsigned long flags;
- unsigned long functions;
- unsigned long decorations;
- long inputMode;
- unsigned long status;
- }
- PropMotifWmHints;
-
- PropMotifWmHints motif_hints;
- motif_hints.flags = MWM_HINTS_DECORATIONS;
- motif_hints.decorations = 0;
- Atom prop = XInternAtom (display, "_MOTIF_WM_HINTS", True );
- XChangeProperty (display, window, prop, prop, 32, PropModeReplace,
- (unsigned char *) &motif_hints, PROP_MOTIF_WM_HINTS_ELEMENTS);
-#endif
-
- Atom atom;
- void* data = this;
- atom = XInternAtom (display, "_this", false);
- XChangeProperty (display, (Window)window, atom, atom, 32,
- PropModeReplace, (unsigned char*)&data, 1);
-
- data = (void*)&eventProc;
- atom = XInternAtom (display, "_XEventProc", false);
- XChangeProperty (display, (Window)window, atom, atom, 32,
- PropModeReplace, (unsigned char*)&data, 1);
-
- XGCValues values;
- values.foreground = 1;
- gc = XCreateGC (display, (Window)window, GCForeground, &values);
-
- // get the std colormap
- XWindowAttributes attr;
- XGetWindowAttributes (display, (Window) window, &attr);
- colormap = attr.colormap;
- pVisual = attr.visual;
- depth = attr.depth;
-
- // init and load the fonts
- if (! gFontInit) {
- for (long i = 0; i < kNumStandardFonts; i++) {
- DBG (gFontTable[i].string);
- gFontStructs[i] = XLoadQueryFont (display, gFontTable[i].string);
- assert (gFontStructs[i] != 0);
- }
- gFontInit = true;
- }
-
- setDropActive (true);
- bAddedWindow = true;
-
- //XReparentWindow (display, window, (Window) systemWin, 0, 0);
- //XMapRaised (display, window);
-
- return true;
-}
-
-//-----------------------------------------------------------------------------
-bool CFrame::setDropActive (bool val)
-{
- if (!bDropActive && !val)
- return true;
-
- bDropActive = val;
- return true;
-}
-
-//-----------------------------------------------------------------------------
-void CFrame::freeGc ()
-{
- XFreeGC (display, gc);
-}
-
-//-----------------------------------------------------------------------------
-CDrawContext* CFrame::createDrawContext ()
-{
- if (pFrameContext)
- {
- pFrameContext->remember ();
- return pFrameContext;
- }
-
- pFrameContext = new CDrawContext (this, gc, (void*)window);
-
- return pFrameContext;
-}
-
-//-----------------------------------------------------------------------------
-void CFrame::draw (CDrawContext *pContext)
-{
- if (bFirstDraw)
- bFirstDraw = false;
-
- bool localContext = false;
- if (! pContext)
- {
- localContext = true;
- pContext = createDrawContext ();
- }
-
- // draw the background and the children
- CViewContainer::draw (pContext);
-
- if (localContext)
- pContext->forget ();
-}
-
-//-----------------------------------------------------------------------------
-void CFrame::drawRect (CDrawContext *pContext, const CRect& updateRect)
-{
- if (bFirstDraw)
- bFirstDraw = false;
-
- bool localContext = false;
- if (! pContext)
- {
- localContext = true;
- pContext = createDrawContext ();
- }
-
-#if USE_CLIPPING_DRAWRECT
- CRect oldClip;
- pContext->getClipRect (oldClip);
- CRect newClip (updateRect);
- newClip.bound (oldClip);
- pContext->setClipRect (newClip);
-#endif
-
- // draw the background and the children
- if (updateRect.getWidth () > 0 && updateRect.getHeight () > 0)
- CViewContainer::drawRect (pContext, updateRect);
-
-#if USE_CLIPPING_DRAWRECT
- pContext->setClipRect (oldClip);
-#endif
-
- if (localContext)
- pContext->forget ();
-}
-
-//-----------------------------------------------------------------------------
-void CFrame::draw (CView *pView)
-{
- CView *pViewToDraw = 0;
-
- // Search it in the view list
- if (pView && isChild(pView))
- pViewToDraw = pView;
-
- CDrawContext *pContext = createDrawContext ();
- if (pContext)
- {
- if (pViewToDraw && pViewToDraw->isVisible())
- pViewToDraw->draw (pContext);
- else
- draw (pContext);
-
- pContext->forget ();
- }
-}
-
-//-----------------------------------------------------------------------------
-void CFrame::mouse (CDrawContext *pContext, CPoint &where, long buttons)
-{
-/*
- XGrabPointer (display,
- window,
- False,
- ButtonPressMask | ButtonReleaseMask |
- EnterWindowMask | LeaveWindowMask |
- PointerMotionMask | Button1MotionMask |
- Button2MotionMask | Button3MotionMask |
- Button4MotionMask | Button5MotionMask,
- GrabModeAsync,
- GrabModeAsync,
- None,
- None,
- CurrentTime);
-*/
-
- if (!pContext)
- pContext = pFrameContext;
-
- if (pFocusView)
- setFocusView (NULL);
-
- if (buttons == -1 && pContext)
- buttons = pContext->getMouseButtons ();
-
- if (pModalView && pModalView->isVisible())
- {
- if (pModalView->hitTest (where, buttons))
- pModalView->mouse (pContext, where, buttons);
- }
- else
- {
- CViewContainer::mouse (pContext, where, buttons);
- }
-
-// XUngrabPointer (display, CurrentTime);
-}
-
-//-----------------------------------------------------------------------------
-long CFrame::onKeyDown (VstKeyCode& keyCode)
-{
- long result = -1;
-
- if (pFocusView && pFocusView->isVisible())
- result = pFocusView->onKeyDown (keyCode);
-
- if (result == -1 && pModalView && pModalView->isVisible())
- result = pModalView->onKeyDown (keyCode);
-
- if (result == -1 && keyCode.virt == VKEY_TAB)
- result = advanceNextFocusView (pFocusView, (keyCode.modifier & MODIFIER_SHIFT) ? true : false) ? 1 : -1;
-
- return result;
-}
-
-//-----------------------------------------------------------------------------
-long CFrame::onKeyUp (VstKeyCode& keyCode)
-{
- long result = -1;
-
- if (pFocusView && pFocusView->isVisible())
- result = pFocusView->onKeyUp (keyCode);
-
- if (result == -1 && pModalView && pModalView->isVisible())
- result = pModalView->onKeyUp (keyCode);
-
- return result;
-}
-
-//------------------------------------------------------------------------
-bool CFrame::onWheel (CDrawContext *pContext, const CPoint &where, const CMouseWheelAxis axis, float distance)
-{
- bool result = false;
-
- CView *view = pModalView ? pModalView : getViewAt (where);
- if (view && view->isVisible())
- {
- bool localContext = false;
- if (!pContext)
- {
- localContext = true;
- pContext = createDrawContext ();
- }
-
- result = view->onWheel (pContext, where, axis, distance);
-
- if (localContext)
- pContext->forget ();
- }
- return result;
-}
-
-//-----------------------------------------------------------------------------
-bool CFrame::onWheel (CDrawContext *pContext, const CPoint &where, float distance)
-{
- return onWheel (pContext, where, kMouseWheelAxisY, distance);
-}
-
-//-----------------------------------------------------------------------------
-void CFrame::update (CDrawContext *pContext)
-{
- if (!getOpenFlag () || updatesDisabled ())
- return;
-
- CDrawContext* dc = pContext;
-
- if (bDirty)
- {
- draw (dc);
- setDirty (false);
- }
- else
- {
-#if USE_CLIPPING_DRAWRECT
- CRect oldClipRect;
- dc->getClipRect (oldClipRect);
-#endif
-#if NEW_UPDATE_MECHANISM
- if (pModalView && pModalView->isVisible () && pModalView->isDirty ())
- pModalView->update (dc);
-#endif
- FOREACHSUBVIEW
-#if USE_CLIPPING_DRAWRECT
- CRect viewSize (pV->size);
- viewSize.bound (oldClipRect);
- dc->setClipRect (viewSize);
-#endif
- pV->update (dc);
- ENDFOR
-#if USE_CLIPPING_DRAWRECT
- dc->setClipRect (oldClipRect);
-#endif
- }
-}
-
-//-----------------------------------------------------------------------------
-void CFrame::idle ()
-{
- if (!getOpenFlag ())
- return;
-
- // don't do an idle before a draw
- if (bFirstDraw)
- return;
-
- if (!isDirty ())
- return;
-
- XdbeBeginIdiom(display);
- XdbeSwapInfo swap_info;
- swap_info.swap_window = window;
- swap_info.swap_action = XdbeUndefined;
- XdbeSwapBuffers(display, &swap_info, 1);
-
- CDrawContext *pContext = createDrawContext ();
-
- update (pContext);
-
- pContext->forget ();
-
- XdbeEndIdiom(display);
-}
-
-//-----------------------------------------------------------------------------
-void CFrame::doIdleStuff ()
-{
- if (pEditor)
- ((AEffGUIEditor*)pEditor)->doIdleStuff ();
-}
-
-//-----------------------------------------------------------------------------
-unsigned long CFrame::getTicks () const
-{
- if (pEditor)
- return ((AEffGUIEditor*)pEditor)->getTicks ();
- return 0;
-}
-
-//-----------------------------------------------------------------------------
-long CFrame::getKnobMode () const
-{
- return AEffGUIEditor::getKnobMode ();
-}
-
-//-----------------------------------------------------------------------------
-bool CFrame::setPosition (CCoord x, CCoord y)
-{
- size.left = 0;
- size.top = 0;
-
- XWindowChanges attr;
- attr.x = x;
- attr.y = y;
-
- XConfigureWindow (display, window, CWX | CWY, &attr);
-
- return false;
-}
-
-//-----------------------------------------------------------------------------
-bool CFrame::getPosition (CCoord &x, CCoord &y) const
-{
- x = size.left;
- y = size.top;
- return true;
-}
-
-//-----------------------------------------------------------------------------
-void CFrame::setViewSize (CRect& inRect)
-{
- setSize (inRect.width (), inRect.height ());
-}
-
-//-----------------------------------------------------------------------------
-bool CFrame::setSize (CCoord width, CCoord height)
-{
- if ((width == size.width ()) && (height == size.height ()))
- return false;
-
- // set the new size
- size.right = size.left + width;
- size.bottom = size.top + height;
-
- XResizeWindow (display, window, size.width (), size.height ());
-
- CRect myViewSize (0, 0, size.width (), size.height ());
- CViewContainer::setViewSize (myViewSize);
-
- return true;
-}
-
-//-----------------------------------------------------------------------------
-bool CFrame::getSize (CRect *pRect) const
-{
-// if (!getOpenFlag ())
-// return false;
-
- pRect->left = 0;
- pRect->top = 0;
- pRect->right = size.width () + pRect->left;
- pRect->bottom = size.height () + pRect->top;
-
- return true;
-}
-
-//-----------------------------------------------------------------------------
-bool CFrame::getSize (CRect& outSize) const
-{
- return getSize (&outSize);
-}
-
-//-----------------------------------------------------------------------------
-long CFrame::setModalView (CView *pView)
-{
- // There's already a modal view so we get out
- if (pView && pModalView)
- return 0;
-
- if (pModalView)
- removeView (pModalView, false);
-
- pModalView = pView;
- if (pModalView)
- addView (pModalView);
-
- return 1;
-}
-
-//-----------------------------------------------------------------------------
-void CFrame::beginEdit (long index)
-{
- if (pEditor)
- ((AEffGUIEditor*)pEditor)->beginEdit (index);
-}
-
-//-----------------------------------------------------------------------------
-void CFrame::endEdit (long index)
-{
- if (pEditor)
- ((AEffGUIEditor*)pEditor)->endEdit (index);
-}
-
-//-----------------------------------------------------------------------------
-CView *CFrame::getCurrentView () const
-{
- if (pModalView)
- return pModalView;
-
- return CViewContainer::getCurrentView ();
-}
-
-//-----------------------------------------------------------------------------
-bool CFrame::getCurrentLocation (CPoint &where)
-{
- // create a local context
- CDrawContext *pContext = createDrawContext ();
- if (pContext)
- {
- // get the current position
- pContext->getMouseLocation (where);
- pContext->forget ();
- }
- return true;
-}
-
-//-----------------------------------------------------------------------------
-void CFrame::setCursor (CCursorType type)
-{
-}
-
-//-----------------------------------------------------------------------------
-void CFrame::setFocusView (CView *pView)
-{
- if (pView && ! pView->isVisible())
- return;
-
- CView *pOldFocusView = pFocusView;
- pFocusView = pView;
-
- if (pFocusView && pFocusView->wantsFocus ())
- pFocusView->setDirty ();
-
- if (pOldFocusView)
- {
- pOldFocusView->looseFocus ();
- if (pOldFocusView->wantsFocus ())
- pOldFocusView->setDirty ();
- }
-}
-
-//-----------------------------------------------------------------------------
-bool CFrame::advanceNextFocusView (CView* oldFocus, bool reverse)
-{
- if (pModalView)
- return false; // currently not supported, but should be done sometime
- if (oldFocus == 0)
- {
- if (pFocusView == 0)
- return CViewContainer::advanceNextFocusView (0, reverse);
- oldFocus = pFocusView;
- }
- if (isChild (oldFocus))
- {
- if (CViewContainer::advanceNextFocusView (oldFocus, reverse))
- return true;
- else
- {
- setFocusView (NULL);
- return false;
- }
- }
- CView* parentView = oldFocus->getParentView ();
- if (parentView && parentView->isTypeOf ("CViewContainer"))
- {
- CView* tempOldFocus = oldFocus;
- CViewContainer* vc = (CViewContainer*)parentView;
- while (vc)
- {
- if (vc->advanceNextFocusView (tempOldFocus, reverse))
- return true;
- else
- {
- tempOldFocus = vc;
- if (vc->getParentView () && vc->getParentView ()->isTypeOf ("CViewContainer"))
- vc = (CViewContainer*)vc->getParentView ();
- else
- vc = 0;
- }
- }
- }
- return CViewContainer::advanceNextFocusView (oldFocus, reverse);
-}
-
-//-----------------------------------------------------------------------------
-void CFrame::invalidate (const CRect &rect)
-{
- CRect rectView;
- FOREACHSUBVIEW
- if (pV)
- {
- pV->getViewSize (rectView);
- if (rect.rectOverlap (rectView))
- pV->setDirty (true);
- }
- ENDFOR
-
- XClearArea (display,
- window,
- rect.left,
- rect.top,
- rect.right - rect.left,
- rect.bottom - rect.top,
- true);
-
- XSync (display, false);
-
-/*
- XEvent ev;
- memset (&ev, 0, sizeof (XEvent));
- ev.xexpose.type = Expose;
- ev.xexpose.display = display;
- ev.xexpose.window = (Window) window;
-
- ev.xexpose.x = rect.left;
- ev.xexpose.y = rect.top;
- ev.xexpose.width = rect.right - rect.left;
- ev.xexpose.height = rect.bottom - rect.top;
-
- XSendEvent (display, (Window) window, False, 0L, &ev);
- XFlush (display);
-*/
-}
-
-#if DEBUG
-//-----------------------------------------------------------------------------
-void CFrame::dumpHierarchy ()
-{
- dumpInfo ();
- DebugPrint ("\n");
- CViewContainer::dumpHierarchy ();
-}
-#endif
-
-//-----------------------------------------------------------------------------
-// CCView Implementation
-//-----------------------------------------------------------------------------
-CCView::CCView (CView *pView)
- : pView (pView), pNext (0), pPrevious (0)
-{
- if (pView)
- pView->remember ();
-}
-
-//-----------------------------------------------------------------------------
-CCView::~CCView ()
-{
- if (pView)
- pView->forget ();
-}
-
-//-----------------------------------------------------------------------------
-// CViewContainer Implementation
-//-----------------------------------------------------------------------------
-/**
- * CViewContainer constructor.
- * @param rect the size of the container
- * @param pParent the parent CFrame
- * @param pBackground the background bitmap, can be NULL
- */
-CViewContainer::CViewContainer (const CRect &rect, CFrame *pParent, CBitmap *pBackground)
- : CView (rect),
- pFirstView (0),
- pLastView (0),
- mode (kNormalUpdate),
- pOffscreenContext (0),
- bDrawInOffscreen (false),
- currentDragView (0)
-{
- pParentFrame = pParent;
-
- backgroundOffset (0, 0);
-
- setBackground (pBackground);
- backgroundColor = kBlackCColor;
-
-#if NEW_UPDATE_MECHANISM
- mode = kOnlyDirtyUpdate;
-#endif
-}
-
-//-----------------------------------------------------------------------------
-CViewContainer::~CViewContainer ()
-{
- // remove all views
- removeAll (true);
-
- if (pOffscreenContext)
- pOffscreenContext->forget ();
- pOffscreenContext = 0;
-}
-
-//-----------------------------------------------------------------------------
-/**
- * @param rect the new size of the container
- */
-void CViewContainer::setViewSize (CRect &rect)
-{
- CView::setViewSize (rect);
-
- if (pOffscreenContext && bDrawInOffscreen)
- {
- pOffscreenContext->forget ();
- pOffscreenContext = new COffscreenContext (pParentFrame, (long)size.width (), (long)size.height (), kBlackCColor);
- }
-}
-
-//-----------------------------------------------------------------------------
-/**
- * @param color the new background color of the container
- */
-void CViewContainer::setBackgroundColor (CColor color)
-{
- backgroundColor = color;
- setDirty (true);
-}
-
-//------------------------------------------------------------------------------
-long CViewContainer::notify (CView* sender, const char* message)
-{
- if (message == kMsgCheckIfViewContainer)
- return kMessageNotified;
- return kMessageUnknown;
-}
-
-//-----------------------------------------------------------------------------
-/**
- * @param pView the view object to add to this container
- */
-void CViewContainer::addView (CView *pView)
-{
- if (!pView)
- return;
-
- CCView *pSv = new CCView (pView);
-
- pView->pParentFrame = pParentFrame;
- pView->pParentView = this;
-
- CCView *pV = pFirstView;
- if (!pV)
- {
- pLastView = pFirstView = pSv;
- }
- else
- {
- while (pV->pNext)
- pV = pV->pNext;
- pV->pNext = pSv;
- pSv->pPrevious = pV;
- pLastView = pSv;
- }
- pView->attached (this);
- pView->setDirty ();
-}
-
-//-----------------------------------------------------------------------------
-/**
- * @param pView the view object to add to this container
- * @param mouseableArea the view area in where the view will get mouse events
- * @param mouseEnabled bool to set if view will get mouse events
- */
-void CViewContainer::addView (CView *pView, CRect &mouseableArea, bool mouseEnabled)
-{
- if (!pView)
- return;
-
- pView->setMouseEnabled (mouseEnabled);
- pView->setMouseableArea (mouseableArea);
-
- addView (pView);
-}
-
-//-----------------------------------------------------------------------------
-/**
- * @param withForget bool to indicate if the view's reference counter should be decreased after removed from the container
- */
-void CViewContainer::removeAll (const bool &withForget)
-{
- CCView *pV = pFirstView;
- while (pV)
- {
- CCView *pNext = pV->pNext;
- if (pV->pView)
- {
- pV->pView->removed (this);
- if (withForget)
- pV->pView->forget ();
- }
-
- delete pV;
-
- pV = pNext;
- }
- pFirstView = 0;
- pLastView = 0;
-}
-
-//-----------------------------------------------------------------------------
-/**
- * @param pView the view which should be removed from the container
- * @param withForget bool to indicate if the view's reference counter should be decreased after removed from the container
- */
-void CViewContainer::removeView (CView *pView, const bool &withForget)
-{
- if (pParentFrame && pParentFrame->getFocusView () == pView)
- pParentFrame->setFocusView (0);
- CCView *pV = pFirstView;
- while (pV)
- {
- if (pView == pV->pView)
- {
- CCView *pNext = pV->pNext;
- CCView *pPrevious = pV->pPrevious;
- if (pV->pView)
- {
- pV->pView->removed (this);
- if (withForget)
- pV->pView->forget ();
- }
- delete pV;
- if (pPrevious)
- {
- pPrevious->pNext = pNext;
- if (pNext)
- pNext->pPrevious = pPrevious;
- else
- pLastView = pPrevious;
- }
- else
- {
- pFirstView = pNext;
- if (pNext)
- pNext->pPrevious = 0;
- else
- pLastView = 0;
- }
- break;
- }
- else
- pV = pV->pNext;
- }
-}
-
-//-----------------------------------------------------------------------------
-/**
- * @param pView the view which should be checked if it is a child of this container
- */
-bool CViewContainer::isChild (CView *pView) const
-{
- bool found = false;
-
- CCView *pV = pFirstView;
- while (pV)
- {
- if (pView == pV->pView)
- {
- found = true;
- break;
- }
- pV = pV->pNext;
- }
- return found;
-}
-
-//-----------------------------------------------------------------------------
-long CViewContainer::getNbViews () const
-{
- long nb = 0;
- CCView *pV = pFirstView;
- while (pV)
- {
- pV = pV->pNext;
- nb++;
- }
- return nb;
-}
-
-//-----------------------------------------------------------------------------
-/**
- * @param index the index of the view to return
- */
-CView *CViewContainer::getView (long index) const
-{
- long nb = 0;
- CCView *pV = pFirstView;
- while (pV)
- {
- if (nb == index)
- return pV->pView;
- pV = pV->pNext;
- nb++;
- }
- return 0;
-}
-
-//-----------------------------------------------------------------------------
-/**
- * @param pContext the context which to use to draw this container and its subviews
- */
-void CViewContainer::draw (CDrawContext *pContext)
-{
- CDrawContext *pC;
- CCoord save[4];
-
- if (!pOffscreenContext && bDrawInOffscreen)
- pOffscreenContext = new COffscreenContext (pParentFrame, (long)size.width (), (long)size.height (), kBlackCColor);
-
-#if USE_ALPHA_BLEND
- if (pOffscreenContext && bTransparencyEnabled)
- pOffscreenContext->copyTo (pContext, size);
-#endif
-
- if (bDrawInOffscreen)
- pC = pOffscreenContext;
- else
- {
- pC = pContext;
- modifyDrawContext (save, pContext);
- }
-
- CRect r (0, 0, size.width (), size.height ());
-
-#if USE_CLIPPING_DRAWRECT
- CRect oldClip;
- pContext->getClipRect (oldClip);
- CRect oldClip2 (oldClip);
- if (bDrawInOffscreen && getFrame () != this)
- oldClip.offset (-oldClip.left, -oldClip.top);
-
- CRect newClip (r);
- newClip.bound (oldClip);
- pC->setClipRect (newClip);
-#endif
-
- // draw the background
- if (pBackground)
- {
- if (bTransparencyEnabled)
- pBackground->drawTransparent (pC, r, backgroundOffset);
- else
- pBackground->draw (pC, r, backgroundOffset);
- }
- else if (!bTransparencyEnabled)
- {
- pC->setFillColor (backgroundColor);
- pC->fillRect (r);
- }
-
- // draw each view
- FOREACHSUBVIEW
-#if USE_CLIPPING_DRAWRECT
- CRect vSize (pV->size);
- vSize.bound (oldClip);
- pC->setClipRect (vSize);
-#endif
- if (pV->isVisible())
- pV->draw (pC);
- ENDFOR
-
-#if USE_CLIPPING_DRAWRECT
- pC->setClipRect (oldClip2);
-#endif
-
- // transfert offscreen
- if (bDrawInOffscreen)
- ((COffscreenContext*)pC)->copyFrom (pContext, size);
- else
- restoreDrawContext (pContext, save);
-
- setDirty (false);
-}
-
-//-----------------------------------------------------------------------------
-/**
- * @param pContext the context which to use to draw the background
- * @param _updateRect the area which to draw
- */
-void CViewContainer::drawBackgroundRect (CDrawContext *pContext, CRect& _updateRect)
-{
- if (pBackground)
- {
- CRect oldClip;
- pContext->getClipRect (oldClip);
- CRect newClip (_updateRect);
- newClip.bound (oldClip);
- pContext->setClipRect (newClip);
- CRect tr (0, 0, pBackground->getWidth (), pBackground->getHeight ());
- if (bTransparencyEnabled)
- pBackground->drawTransparent (pContext, tr, backgroundOffset);
- else
- pBackground->draw (pContext, tr, backgroundOffset);
- pContext->setClipRect (oldClip);
- }
- else if (!bTransparencyEnabled)
- {
- pContext->setFillColor (backgroundColor);
- pContext->fillRect (_updateRect);
- }
-}
-
-//-----------------------------------------------------------------------------
-/**
- * @param pContext the context which to use to draw
- * @param _updateRect the area which to draw
- */
-void CViewContainer::drawRect (CDrawContext *pContext, const CRect& _updateRect)
-{
- CDrawContext *pC;
- CCoord save[4];
-
- if (!pOffscreenContext && bDrawInOffscreen)
- pOffscreenContext = new COffscreenContext (pParentFrame, (long)size.width (), (long)size.height (), kBlackCColor);
-
-#if USE_ALPHA_BLEND
- if (pOffscreenContext && bTransparencyEnabled)
- pOffscreenContext->copyTo (pContext, size);
-#endif
-
- if (bDrawInOffscreen)
- pC = pOffscreenContext;
- else
- {
- pC = pContext;
- modifyDrawContext (save, pContext);
- }
-
- CRect updateRect (_updateRect);
- updateRect.bound (size);
-
- CRect clientRect (updateRect);
- clientRect.offset (-size.left, -size.top);
-
-#if USE_CLIPPING_DRAWRECT
- CRect oldClip;
- pContext->getClipRect (oldClip);
- CRect oldClip2 (oldClip);
- if (bDrawInOffscreen && getFrame () != this)
- oldClip.offset (-oldClip.left, -oldClip.top);
-
- CRect newClip (clientRect);
- newClip.bound (oldClip);
- pC->setClipRect (newClip);
-#endif
-
- // draw the background
- drawBackgroundRect (pC, clientRect);
-
- // draw each view
- FOREACHSUBVIEW
- if (pV->isVisible() && pV->checkUpdate (clientRect))
- {
-#if USE_CLIPPING_DRAWRECT
- CRect viewSize (pV->size);
- viewSize.bound (newClip);
- if (viewSize.getWidth () == 0 || viewSize.getHeight () == 0)
- continue;
- pC->setClipRect (viewSize);
-#endif
-
- bool wasDirty = pV->isDirty ();
- pV->drawRect (pC, clientRect);
-
-#if DEBUG_FOCUS_DRAWING
- if (getFrame ()->getFocusView() == pV && pV->wantsFocus ())
- {
- pC->setDrawMode (kCopyMode);
- pC->setFrameColor (kRedCColor);
- pC->drawRect (pV->size);
- }
-#endif
- if (wasDirty && /* pV->size != viewSize &&*/ !isTypeOf ("CScrollContainer"))
- {
- pV->setDirty (true);
- }
- }
- ENDFOR
-
-#if USE_CLIPPING_DRAWRECT
- pC->setClipRect (oldClip2);
-#endif
-
- // transfer offscreen
- if (bDrawInOffscreen)
- ((COffscreenContext*)pC)->copyFrom (pContext, updateRect, CPoint (clientRect.left, clientRect.top));
- else
- restoreDrawContext (pContext, save);
-
-#if EVENT_DRAW_FIX
- if (bDirty && newClip == size)
-#endif
- setDirty (false);
-}
-
-//-----------------------------------------------------------------------------
-/**
- * @param context the context which to use to redraw this container
- * @param rect the area which to redraw
- */
-void CViewContainer::redrawRect (CDrawContext* context, const CRect& rect)
-{
- CRect _rect (rect);
- _rect.offset (size.left, size.top);
- if (bTransparencyEnabled)
- {
- // as this is transparent, we call the parentview to redraw this area.
- if (pParentView)
- pParentView->redrawRect (context, _rect);
- else if (pParentFrame)
- pParentFrame->drawRect (context, _rect);
- }
- else
- {
- CCoord save[4];
- if (pParentView)
- {
- CPoint off;
- pParentView->localToFrame (off);
- // store
- save[0] = context->offsetScreen.h;
- save[1] = context->offsetScreen.v;
- save[2] = context->offset.h;
- save[3] = context->offset.v;
-
- context->offsetScreen.h += off.x;
- context->offsetScreen.v += off.y;
- context->offset.h += off.x;
- context->offset.v += off.y;
-
- drawRect (context, _rect);
-
- // restore
- context->offsetScreen.h = save[0];
- context->offsetScreen.v = save[1];
- context->offset.h = save[2];
- context->offset.v = save[3];
- }
- else
- {
- drawRect (context, _rect);
- }
- }
-}
-
-//-----------------------------------------------------------------------------
-bool CViewContainer::hitTestSubViews (const CPoint& where, const long buttons)
-{
- CPoint where2 (where);
- where2.offset (-size.left, -size.top);
-
- CCView *pSv = pLastView;
- while (pSv)
- {
- CView *pV = pSv->pView;
- if (pV && pV->getMouseEnabled () && pV->hitTest (where2, buttons))
- return true;
- pSv = pSv->pPrevious;
- }
- return false;
-}
-
-//-----------------------------------------------------------------------------
-bool CViewContainer::hitTest (const CPoint& where, const long buttons)
-{
- //return hitTestSubViews (where); would change default behavior
- return CView::hitTest (where, buttons);
-}
-
-//-----------------------------------------------------------------------------
-void CViewContainer::mouse (CDrawContext *pContext, CPoint &where, long buttons)
-{
- // convert to relativ pos
- CPoint where2 (where);
- where2.offset (-size.left, -size.top);
-
- if (buttons == -1 && pContext)
- buttons = pContext->getMouseButtons ();
-
- CCView *pSv = pLastView;
- while (pSv)
- {
- CView *pV = pSv->pView;
- if (pV && pV->getMouseEnabled () && pV->hitTest (where2, buttons))
- {
- pV->mouse (pContext, where2, buttons);
- break;
- }
- pSv = pSv->pPrevious;
- }
-}
-
-//-----------------------------------------------------------------------------
-long CViewContainer::onKeyDown (VstKeyCode& keyCode)
-{
- long result = -1;
-
- CCView* pSv = pLastView;
- while (pSv)
- {
- long result = pSv->pView->onKeyDown (keyCode);
- if (result != -1)
- break;
-
- pSv = pSv->pPrevious;
- }
-
- return result;
-}
-
-//-----------------------------------------------------------------------------
-long CViewContainer::onKeyUp (VstKeyCode& keyCode)
-{
- long result = -1;
-
- CCView* pSv = pLastView;
- while (pSv)
- {
- long result = pSv->pView->onKeyUp (keyCode);
- if (result != -1)
- break;
-
- pSv = pSv->pPrevious;
- }
-
- return result;
-}
-
-//-----------------------------------------------------------------------------
-bool CViewContainer::onWheel (CDrawContext *pContext, const CPoint &where, const CMouseWheelAxis axis, float distance)
-{
- bool result = false;
- CView *view = getViewAt (where);
- if (view)
- {
- // convert to relativ pos
- CPoint where2 (where);
- where2.offset (-size.left, -size.top);
-
- CCoord save[4];
- modifyDrawContext (save, pContext);
-
- result = view->onWheel (pContext, where2, axis, distance);
-
- restoreDrawContext (pContext, save);
- }
- return result;
-}
-
-//-----------------------------------------------------------------------------
-bool CViewContainer::onWheel (CDrawContext *pContext, const CPoint &where, float distance)
-{
- return onWheel (pContext, where, kMouseWheelAxisY, distance);
-}
-
-//-----------------------------------------------------------------------------
-bool CViewContainer::onDrop (CDrawContext* context, CDragContainer* drag, const CPoint& where)
-{
- if (!pParentFrame)
- return false;
-
- bool result = false;
-
- CCoord save[4];
- modifyDrawContext (save, context);
-
- // convert to relativ pos
- CPoint where2 (where);
- where2.offset (-size.left, -size.top);
-
- CView* view = getViewAt (where);
- if (view != currentDragView)
- {
- if (currentDragView)
- currentDragView->onDragLeave (context, drag, where2);
- currentDragView = view;
- }
- if (currentDragView)
- {
- result = currentDragView->onDrop (context, drag, where2);
- currentDragView->onDragLeave (context, drag, where2);
- }
- currentDragView = 0;
-
- restoreDrawContext (context, save);
-
- return result;
-}
-
-//-----------------------------------------------------------------------------
-void CViewContainer::onDragEnter (CDrawContext* context, CDragContainer* drag, const CPoint& where)
-{
- if (!pParentFrame)
- return;
-
- CCoord save[4];
- modifyDrawContext (save, context);
-
- // convert to relativ pos
- CPoint where2 (where);
- where2.offset (-size.left, -size.top);
-
- if (currentDragView)
- currentDragView->onDragLeave (context, drag, where2);
- CView* view = getViewAt (where);
- currentDragView = view;
- if (view)
- view->onDragEnter (context, drag, where2);
-
- restoreDrawContext (context, save);
-}
-
-//-----------------------------------------------------------------------------
-void CViewContainer::onDragLeave (CDrawContext* context, CDragContainer* drag, const CPoint& where)
-{
- if (!pParentFrame)
- return;
-
- CCoord save[4];
- modifyDrawContext (save, context);
-
- // convert to relativ pos
- CPoint where2 (where);
- where2.offset (-size.left, -size.top);
-
- if (currentDragView)
- currentDragView->onDragLeave (context, drag, where2);
- currentDragView = 0;
-
- restoreDrawContext (context, save);
-}
-
-//-----------------------------------------------------------------------------
-void CViewContainer::onDragMove (CDrawContext* context, CDragContainer* drag, const CPoint& where)
-{
- if (!pParentFrame)
- return;
-
- CCoord save[4];
- modifyDrawContext (save, context);
-
- // convert to relativ pos
- CPoint where2 (where);
- where2.offset (-size.left, -size.top);
-
- CView* view = getViewAt (where);
- if (view != currentDragView)
- {
- if (currentDragView)
- currentDragView->onDragLeave (context, drag, where2);
- if (view)
- view->onDragEnter (context, drag, where2);
- currentDragView = view;
- }
- else if (currentDragView)
- currentDragView->onDragMove (context, drag, where2);
-
- restoreDrawContext (context, save);
-}
-
-//-----------------------------------------------------------------------------
-void CViewContainer::update (CDrawContext *pContext)
-{
- switch (mode)
- {
- //---Normal : redraw all...
- case kNormalUpdate:
- if (isDirty ())
- {
-#if NEW_UPDATE_MECHANISM
- CRect ur (0, 0, size.width (), size.height ());
- redrawRect (pContext, ur);
-#else
- #if USE_ALPHA_BLEND
- if (bTransparencyEnabled)
- {
- CRect updateRect (size);
- CPoint offset (0,0);
- localToFrame (offset);
- updateRect.offset (offset.x, offset.y);
- getFrame ()->drawRect (pContext, updateRect);
- }
- else
- #endif
- draw (pContext);
- #endif
- setDirty (false);
- }
- break;
-
- //---Redraw only dirty controls-----
- case kOnlyDirtyUpdate:
- {
-#if NEW_UPDATE_MECHANISM
- if (bDirty)
- {
- CRect ur (0, 0, size.width (), size.height ());
- redrawRect (pContext, ur);
- }
- else
- {
- CRect updateRect (size);
- updateRect.offset (-size.left, -size.top);
- FOREACHSUBVIEW
- if (pV->isDirty () && pV->checkUpdate (updateRect))
- {
- if (pV->notify (this, kMsgCheckIfViewContainer))
- pV->update (pContext);
- else
- {
- CRect drawSize (pV->size);
- drawSize.bound (updateRect);
- pV->redrawRect (pContext, drawSize);
- }
- }
- ENDFOR
- }
-#else
- #if USE_ALPHA_BLEND
- if (bTransparencyEnabled)
- {
- if (bDirty)
- {
- CRect updateRect (size);
- CPoint offset (0,0);
- localToFrame (offset);
- updateRect.offset (offset.x, offset.y);
- getFrame ()->drawRect (pContext, updateRect);
- }
- else
- {
- CRect updateRect (size);
- updateRect.offset (-size.left, -size.top);
- FOREACHSUBVIEW
- if (pV->isDirty () && pV->checkUpdate (updateRect))
- {
- if (pV->notify (this, kMsgCheckIfViewContainer))
- {
- pV->update (pContext);
- }
- else
- {
- CPoint offset;
- CRect viewSize (pV->size);
- pV->localToFrame (offset);
- viewSize.offset (offset.x, offset.y);
- getFrame ()->drawRect (pContext, viewSize);
- }
- }
- ENDFOR
- }
- setDirty (false);
- return;
- }
- #endif
- if (bDirty)
- draw (pContext);
- else if (bDrawInOffscreen && pOffscreenContext)
- {
- bool doCopy = false;
- if (isDirty ())
- doCopy = true;
-
- FOREACHSUBVIEW
- pV->update (pOffscreenContext);
- ENDFOR
-
- // transfert offscreen
- if (doCopy)
- pOffscreenContext->copyFrom (pContext, size);
- }
- else
- {
- long save[4];
- modifyDrawContext (save, pContext);
-
- FOREACHSUBVIEW
- if (pV->isDirty ())
- {
- long oldMode = 0;
- CViewContainer* child = 0;
- if (pV->notify (this, kMsgCheckIfViewContainer))
- {
- child = (CViewContainer*)pV;
- oldMode = child->getMode ();
- child->setMode (kNormalUpdate);
- }
- CRect viewSize (pV->size);
- drawBackgroundRect (pContext, viewSize);
- pV->update (pContext);
- if (child)
- child->setMode (oldMode);
- }
- ENDFOR
-
- restoreDrawContext (pContext, save);
- }
-#endif
- setDirty (false);
- break;
- }
- }
-}
-
-//-----------------------------------------------------------------------------
-void CViewContainer::looseFocus (CDrawContext *pContext)
-{
- FOREACHSUBVIEW
- pV->looseFocus (pContext);
- ENDFOR
-}
-
-//-----------------------------------------------------------------------------
-void CViewContainer::takeFocus (CDrawContext *pContext)
-{
- FOREACHSUBVIEW
- pV->takeFocus (pContext);
- ENDFOR
-}
-
-//-----------------------------------------------------------------------------
-bool CViewContainer::advanceNextFocusView (CView* oldFocus, bool reverse)
-{
- bool foundOld = false;
- FOREACHSUBVIEW_REVERSE(reverse)
- if (oldFocus && !foundOld)
- {
- if (oldFocus == pV)
- {
- foundOld = true;
- continue;
- }
- }
- else
- {
- if (pV->wantsFocus ())
- {
- getFrame ()->setFocusView (pV);
- return true;
- }
- else if (pV->isTypeOf ("CViewContainer"))
- {
- if (((CViewContainer*)pV)->advanceNextFocusView (0, reverse))
- return true;
- }
- }
- ENDFOR
- return false;
-}
-
-//-----------------------------------------------------------------------------
-bool CViewContainer::isDirty () const
-{
- if (bDirty)
- return true;
-
- CRect viewSize (size);
- viewSize.offset (-size.left, -size.top);
-
- FOREACHSUBVIEW
- if (pV->isDirty ())
- {
- CRect r (pV->size);
- r.bound (viewSize);
- if (r.getWidth () > 0 && r.getHeight () > 0)
- return true;
- }
- ENDFOR
- return false;
-}
-
-//-----------------------------------------------------------------------------
-CView *CViewContainer::getCurrentView () const
-{
- if (!pParentFrame)
- return 0;
-
- // get the current position
- CPoint where;
- pParentFrame->getCurrentLocation (where);
-
- frameToLocal (where);
-
- CCView *pSv = pLastView;
- while (pSv)
- {
- CView *pV = pSv->pView;
- if (pV && where.isInside (pV->mouseableArea))
- return pV;
- pSv = pSv->pPrevious;
- }
-
- return 0;
-}
-
-//-----------------------------------------------------------------------------
-CView *CViewContainer::getViewAt (const CPoint& p, bool deep) const
-{
- if (!pParentFrame)
- return 0;
-
- CPoint where (p);
-
- // convert to relativ pos
- where.offset (-size.left, -size.top);
-
- CCView *pSv = pLastView;
- while (pSv)
- {
- CView *pV = pSv->pView;
- if (pV && where.isInside (pV->mouseableArea))
- {
- if (deep)
- {
- if (pV->isTypeOf ("CViewContainer"))
- return ((CViewContainer*)pV)->getViewAt (where, deep);
- }
- return pV;
- }
- pSv = pSv->pPrevious;
- }
-
- return 0;
-}
-
-//-----------------------------------------------------------------------------
-CPoint& CViewContainer::frameToLocal (CPoint& point) const
-{
- point.offset (-size.left, -size.top);
- if (pParentView && pParentView->isTypeOf ("CViewContainer"))
- return pParentView->frameToLocal (point);
- return point;
-}
-
-//-----------------------------------------------------------------------------
-CPoint& CViewContainer::localToFrame (CPoint& point) const
-{
- point.offset (size.left, size.top);
- if (pParentView && pParentView->isTypeOf ("CViewContainer"))
- return pParentView->localToFrame (point);
- return point;
-}
-
-//-----------------------------------------------------------------------------
-bool CViewContainer::removed (CView* parent)
-{
- if (pOffscreenContext)
- pOffscreenContext->forget ();
- pOffscreenContext = 0;
-
- return true;
-}
-
-//-----------------------------------------------------------------------------
-bool CViewContainer::attached (CView* view)
-{
- // create offscreen bitmap
- if (!pOffscreenContext && bDrawInOffscreen)
- pOffscreenContext = new COffscreenContext (pParentFrame, (long)size.width (), (long)size.height (), kBlackCColor);
-
- return true;
-}
-
-//-----------------------------------------------------------------------------
-void CViewContainer::useOffscreen (bool b)
-{
- bDrawInOffscreen = b;
-
- if (!bDrawInOffscreen && pOffscreenContext)
- {
- pOffscreenContext->forget ();
- pOffscreenContext = 0;
- }
-}
-
-//-----------------------------------------------------------------------------
-void CViewContainer::modifyDrawContext (CCoord save[4], CDrawContext* pContext)
-{
- // store
- save[0] = pContext->offsetScreen.h;
- save[1] = pContext->offsetScreen.v;
- save[2] = pContext->offset.h;
- save[3] = pContext->offset.v;
-
- pContext->offsetScreen.h += size.left;
- pContext->offsetScreen.v += size.top;
- pContext->offset.h += size.left;
- pContext->offset.v += size.top;
-}
-
-//-----------------------------------------------------------------------------
-void CViewContainer::restoreDrawContext (CDrawContext* pContext, CCoord save[4])
-{
- // restore
- pContext->offsetScreen.h = save[0];
- pContext->offsetScreen.v = save[1];
- pContext->offset.h = save[2];
- pContext->offset.v = save[3];
-}
-
-#if DEBUG
-static long _debugDumpLevel = 0;
-//-----------------------------------------------------------------------------
-void CViewContainer::dumpInfo ()
-{
- static const char* modeString[] = { "Normal Update Mode", "Only Dirty Update Mode"};
- DebugPrint ("CViewContainer: Mode: %s, Offscreen:%s ", modeString[mode], bDrawInOffscreen ? "Yes" : "No");
- CView::dumpInfo ();
-}
-
-//-----------------------------------------------------------------------------
-void CViewContainer::dumpHierarchy ()
-{
- _debugDumpLevel++;
- FOREACHSUBVIEW
- for (long i = 0; i < _debugDumpLevel; i++)
- DebugPrint ("\t");
- pV->dumpInfo ();
- DebugPrint ("\n");
- if (pV->isTypeOf ("CViewContainer"))
- ((CViewContainer*)pV)->dumpHierarchy ();
- ENDFOR
- _debugDumpLevel--;
-}
-
-#endif
-
-
-//-----------------------------------------------------------------------------
-// CBitmap Implementation
-//-----------------------------------------------------------------------------
-/*! @class CBitmap
- * Image resources must be in PNG format.
- * Filenames are specified by the pngResources table defined in the GUI.
- */
-CBitmap::CBitmap (long ID)
- : resourceID (ID), width (0), height (0), noAlpha (true)
-{
-#if DEBUG
- gNbCBitmap++;
-#endif
-
- pHandle = 0;
- pngRead = NULL;
- pngInfo = NULL;
-
- bool found = false;
- long i = 0;
-
- const char* p = NULL;
- while (pngResources[i].id != 0) {
- if (pngResources[i].id == resourceID) {
- if (pngResources[i].path != NULL) {
- found = true;
- p = pngResources[i].path;
- break;
- }
- }
- ++i;
- }
-
- if (VSTGUI::bundlePath == NULL) {
- std::cerr << "ERROR: No bundle path set, unable to load images" << std::endl;
- } else {
- std::string path = std::string(VSTGUI::bundlePath) + p;
- if (openPng(path.c_str())) // reads width, height
- closePng();
- }
-
- setTransparentColor (kTransparentCColor);
-
-#if DEBUG
- gBitmapAllocation += (long)height * (long)width;
-#endif
-}
-
-//-----------------------------------------------------------------------------
-CBitmap::CBitmap (CFrame &frame, CCoord width, CCoord height)
- : width (width), height (height), noAlpha (true), pMask (0)
-{
-#if DEBUG
- gNbCBitmap++;
-#endif
-
- pHandle = (void*) XCreatePixmap (display,
- frame.getBackBuffer (),
- width,
- height,
- frame.getDepth ());
-
- setTransparentColor (kTransparentCColor);
-}
-
-//-----------------------------------------------------------------------------
-CBitmap::CBitmap ()
- : resourceID (0)
- , width (0)
- , height (0)
- , noAlpha (true)
-{
- pMask = 0;
- pHandle = 0;
-}
-
-//-----------------------------------------------------------------------------
-CBitmap::~CBitmap ()
-{
- dispose ();
-}
-
-//-----------------------------------------------------------------------------
-void CBitmap::dispose ()
-{
-#if DEBUG
- gNbCBitmap--;
- gBitmapAllocation -= (long)height * (long)width;
-#endif
-
- if (pHandle)
- XFreePixmap (display, (Pixmap)pHandle);
- if (pMask)
- XFreePixmap (display, (Pixmap)pMask);
-
- pHandle = 0;
- pMask = 0;
-
- width = 0;
- height = 0;
-
-}
-
-//-----------------------------------------------------------------------------
-void *CBitmap::getHandle () const
-{
- return pHandle;
-}
-
-//-----------------------------------------------------------------------------
-bool CBitmap::loadFromResource (long resourceID)
-{
- dispose ();
- fprintf (stderr, "CBitmap::loadFromResource not implemented\n");
- return false;
-}
-
-//-----------------------------------------------------------------------------
-bool CBitmap::loadFromPath (const void* platformPath)
-{
- if (pHandle != NULL)
- dispose ();
-
- bool success = openPng ((char*)platformPath);
- if (success)
- closePng ();
-
- return success;
-}
-
-//-----------------------------------------------------------------------------
-bool CBitmap::isLoaded () const
-{
- return (pHandle != NULL);
-}
-
-//-----------------------------------------------------------------------------
-void CBitmap::draw (CDrawContext *pContext, CRect &rect, const CPoint &offset)
-{
- if (!pHandle)
- {
- // the first time try to decode the pixmap
- pHandle = createPixmapFromPng (pContext);
- if (!pHandle)
- return;
- }
-
- CFrame* frame = pContext->pFrame;
-
- XCopyArea (display,
- (Drawable) pHandle,
- (Drawable) frame->getBackBuffer(),
- (GC) frame->getGC(),
- offset.h,
- offset.v,
- std::min (rect.width (), getWidth()),
- std::min (rect.height (), getHeight()),
- rect.left + pContext->offset.h,
- rect.top + pContext->offset.v);
-}
-
-//-----------------------------------------------------------------------------
-void CBitmap::drawTransparent (CDrawContext *pContext, CRect &rect, const CPoint &offset)
-{
- if (!pHandle)
- {
- // the first time try to decode the pixmap
- pHandle = createPixmapFromPng (pContext);
- if (!pHandle)
- return;
- }
-
- CFrame* frame = pContext->pFrame;
-
- if (pMask == 0)
- {
- // get image from the pixmap
- XImage* image = XGetImage (display, (Drawable)pHandle,
- 0, 0, width, height, AllPlanes, ZPixmap);
- assert (image);
-
- // create the bitmap mask
- pMask = (void*) XCreatePixmap (display, (Drawable)frame->getWindow(),
- width, height, 1);
- assert (pMask);
-
- // create a associated GC
- XGCValues values;
- values.foreground = 1;
- GC gc = XCreateGC (display, (Drawable)pMask, GCForeground, &values);
-
- // clear the mask
- XFillRectangle (display, (Drawable)pMask, gc, 0, 0, width, height);
-
- // get the transparent color index
- int color = pContext->getIndexColor (transparentCColor);
-
- // inverse the color
- values.foreground = 0;
- XChangeGC (display, gc, GCForeground, &values);
-
- // compute the mask
- XPoint *points = new XPoint [height * width];
- int x, y, nbPoints = 0;
- switch (image->depth)
- {
- case 8:
- for (y = 0; y < height; y++)
- {
- char* src = image->data + (y * image->bytes_per_line);
-
- for (x = 0; x < width; x++)
- {
- if (src[x] == color)
- {
- points[nbPoints].x = x;
- points[nbPoints].y = y;
- nbPoints++;
- }
- }
- }
- break;
-
- case 24: {
- int bytesPerPixel = image->bits_per_pixel >> 3;
- char *lp = image->data;
- for (y = 0; y < height; y++)
- {
- char* cp = lp;
- for (x = 0; x < width; x++)
- {
- if (*(int*)cp == color)
- {
- points[nbPoints].x = x;
- points[nbPoints].y = y;
- nbPoints++;
- }
- cp += bytesPerPixel;
- }
- lp += image->bytes_per_line;
- }
- } break;
-
- default :
- break;
- }
-
- XDrawPoints (display, (Drawable)pMask, gc,
- points, nbPoints, CoordModeOrigin);
-
- // free
- XFreeGC (display, gc);
- delete []points;
-
- // delete
- XDestroyImage (image);
- }
-
- // set the new clipmask
- XGCValues value;
- value.clip_mask = (Pixmap)pMask;
- value.clip_x_origin = (rect.left + pContext->offset.h) - offset.h;
- value.clip_y_origin = (rect.top + pContext->offset.v) - offset.v;
-
- XChangeGC (display,
- (GC) /*frame->getGC(),*/ pContext->pSystemContext,
- GCClipMask | GCClipXOrigin | GCClipYOrigin,
- &value);
-
- XCopyArea (display,
- (Drawable) pHandle,
- (Drawable) frame->getBackBuffer(),
- (GC) frame->getGC(),
- offset.h,
- offset.v,
- rect.width (),
- rect.height (),
- rect.left + pContext->offset.h,
- rect.top + pContext->offset.v);
-
- // unset the clipmask
- XSetClipMask (display, (GC)frame->getGC(), None);
-}
-
-//-----------------------------------------------------------------------------
-void CBitmap::drawAlphaBlend (CDrawContext *pContext, CRect &rect, const CPoint &offset, unsigned char alpha)
-{
- std::cout << "CBitmap::drawAlphaBlend (not implemented!)" << std::endl;
-}
-
-//-----------------------------------------------------------------------------
-void CBitmap::setTransparentColor (const CColor color)
-{
- transparentCColor = color;
-}
-
-//-----------------------------------------------------------------------------
-void CBitmap::setTransparencyMask (CDrawContext* pContext, const CPoint& offset)
-{
- // todo: implement me!
-}
-
-
-//-----------------------------------------------------------------------------
-bool CBitmap::openPng (const char* path)
-{
- assert(path);
-
- FILE* fp = fopen(path, "rb");
- if (!fp) {
- fprintf(stderr, "Unable to open file %s\n", path);
- return false;
- }
-
- png_byte header[8];
- fread(header, 1, 8, fp);
- if (png_sig_cmp(header, 0, 8)) {
- fprintf(stderr, "File not recognized as a PNG image");
- fclose(fp);
- return false;
- }
-
- pngRead = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
- if (!pngRead) {
- fprintf(stderr, "Unable to initialize libpng\n");
- fclose(fp);
- return false;
- }
-
- pngInfo = png_create_info_struct(pngRead);
- if (!pngInfo) {
- png_destroy_read_struct(&pngRead, NULL, NULL);
- pngRead = NULL;
- fclose(fp);
- return false;
- }
-
- png_init_io(pngRead, fp);
- png_set_sig_bytes(pngRead, 8);
-
- png_read_info(pngRead, pngInfo);
-
- width = pngInfo->width;
- height = pngInfo->height;
-
- pngFp = fp;
- pngRead = pngRead;
- pngPath = path;
-
- return true;
-}
-
-//-----------------------------------------------------------------------------
-bool CBitmap::closePng ()
-{
- png_destroy_read_struct(&pngRead, &pngInfo, NULL);
- fclose(pngFp);
- pngFp = NULL;
- pngRead = NULL;
- pngInfo = NULL;
- return true;
-}
-
-//-----------------------------------------------------------------------------
-void* CBitmap::createPixmapFromPng (CDrawContext *pContext)
-{
- if (!openPng(pngPath.c_str()))
- return NULL;
-
- assert(width > 0 && height > 0);
-
- png_byte** rows = (png_byte**)malloc(height * sizeof(png_byte*));
- for (int i = 0; i < height; ++i)
- rows[i] = (png_byte*)(malloc(pngInfo->width * sizeof(uint32_t)));
-
- png_read_image(pngRead, rows);
-
- CFrame* frame = pContext->pFrame;
-
- Pixmap p = XCreatePixmap(display, frame->getBackBuffer(),
- pngInfo->width, pngInfo->height, 24);
-
- XGCValues values;
- values.foreground = 0xFFFFFFFF;
-
- // Draw
- GC gc = XCreateGC (display, p, GCForeground, &values);
- for (unsigned y = 0; y < pngInfo->height; y++) {
- for (unsigned x = 0; x < pngInfo->width; ++x) {
- char r = rows[y][(x*3)];
- char g = rows[y][(x*3)+1];
- char b = rows[y][(x*3)+2];
- uint32_t color = (r << 16) + (g << 8) + b;
- XSetForeground(display, gc, color);
- XDrawPoint(display, p, gc, x, y);
- }
- }
- XFreeGC (display, gc);
-
- closePng();
-
- return (void*)p;
-}
-
-//-----------------------------------------------------------------------------
-// CDragContainer Implementation
-//-----------------------------------------------------------------------------
-CDragContainer::CDragContainer (void* platformDrag)
-: platformDrag (platformDrag)
-, nbItems (0)
-, iterator (0)
-, lastItem (0)
-{
-}
-
-//-----------------------------------------------------------------------------
-CDragContainer::~CDragContainer ()
-{
- if (lastItem)
- {
- free (lastItem);
- lastItem = 0;
- }
-}
-
-//-----------------------------------------------------------------------------
-long CDragContainer::getType (long idx) const
-{
- // not implemented
- return kUnknown;
-}
-
-//-----------------------------------------------------------------------------
-void* CDragContainer::first (long& size, long& type)
-{
- iterator = 0;
- return next (size, type);
-}
-
-//-----------------------------------------------------------------------------
-void* CDragContainer::next (long& size, long& type)
-{
- if (lastItem)
- {
- free (lastItem);
- lastItem = 0;
- }
- size = 0;
- type = kUnknown;
-
- // not implemented
-
- return NULL;
-}
-
-} // namespace VSTGUI
-
-//-----------------------------------------------------------------------------
-// return a degre value between [0, 360 * 64[
-static long convertPoint2Angle (CPoint &pm, CPoint &pt)
-{
- long angle;
- if (pt.h == pm.h)
- {
- if (pt.v < pm.v)
- angle = 5760; // 90 * 64
- else
- angle = 17280; // 270 * 64
- }
- else if (pt.v == pm.v)
- {
- if (pt.h < pm.h)
- angle = 11520; // 180 * 64
- else
- angle = 0;
- }
- else
- {
- // 3666.9299 = 180 * 64 / pi
- angle = (long)(3666.9298 * atan ((double)(pm.v - pt.v) / (double)(pt.h - pm.h)));
-
- if (pt.v < pm.v)
- {
- if (pt.h < pm.h)
- angle += 11520; // 180 * 64
- }
- else
- {
- if (pt.h < pm.h)
- angle += 11520; // 180 * 64
- else
- angle += 23040; // 360 * 64
- }
- }
- return angle;
-}
-
-
-
-#if !PLUGGUI
-//-----------------------------------------------------------------------------
-// CFileSelector Implementation
-//-----------------------------------------------------------------------------
-#define stringAnyType "Any Type (*.*)"
-#define stringAllTypes "All Types: ("
-#define stringSelect "Select"
-#define stringCancel "Cancel"
-#define stringLookIn "Look in"
-#define kPathMax 1024
-
-namespace VSTGUI {
-
-//-----------------------------------------------------------------------------
-CFileSelector::CFileSelector (AudioEffectX* effect)
-: effect (effect), vstFileSelect (0)
-{}
-
-//-----------------------------------------------------------------------------
-CFileSelector::~CFileSelector ()
-{
- if (vstFileSelect)
- {
- if (effect && effect->canHostDo ("closeFileSelector"))
- effect->closeFileSelector (vstFileSelect);
- else
- {
- if (vstFileSelect->reserved == 1 && vstFileSelect->returnPath)
- {
- delete []vstFileSelect->returnPath;
- vstFileSelect->returnPath = 0;
- vstFileSelect->sizeReturnPath = 0;
- }
- if (vstFileSelect->returnMultiplePaths)
- {
- for (long i = 0; i < vstFileSelect->nbReturnPath; i++)
- {
- delete []vstFileSelect->returnMultiplePaths[i];
- vstFileSelect->returnMultiplePaths[i] = 0;
- }
- delete[] vstFileSelect->returnMultiplePaths;
- vstFileSelect->returnMultiplePaths = 0;
- }
- }
- }
-}
-
-//-----------------------------------------------------------------------------
-long CFileSelector::run (VstFileSelect *vstFileSelect_)
-{
- vstFileSelect = vstFileSelect_;
- vstFileSelect->nbReturnPath = 0;
- vstFileSelect->returnPath[0] = 0;
-
- if (effect
- && effect->canHostDo ("openFileSelector")
- && effect->canHostDo ("closeFileSelector"))
- {
- if (effect->openFileSelector (vstFileSelect))
- return vstFileSelect->nbReturnPath;
- }
- return 0;
-}
-
-} // namespace VSTGUI
-
-//-----------------------------------------------------------------------------
-#endif // !PLUGGUI
-//-----------------------------------------------------------------------------
-