home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format 119 / af119sub.adf / SamEd.lzx / SamEd / Developers / WaveEditClassDraw.c < prev   
Text File  |  2001-06-09  |  14KB  |  382 lines

  1. /*32bit is integer ?!?!!. Messy code - BIG TIME!*/
  2.  
  3. SAVEDS ULONG mDraw(struct IClass *cl,Object *obj,struct MUIP_Draw *msg)
  4. {
  5.     struct WaveData *data = INST_DATA(cl,obj);
  6.  
  7.     /* First draw super class */
  8.     DoSuperMethodA(cl,obj,(VOID *)msg);
  9.  
  10.     /*make sure range values are allowed*/
  11.     if (data->start < 0) data->start = 0;
  12.     if (data->start > data->length) data->start = data->length;
  13.     if (data->end < 0) data->end = 0;
  14.     if (data->end > data->length) data->end = data->length;
  15.     data->x[0] = 0;
  16.     ;data->x[data->used -1] = 65535;
  17.  
  18.     if ((msg->flags & MADF_DRAWOBJECT) || (msg->flags & MADF_DRAWUPDATE))
  19.     {
  20.  
  21.         if ( (data->draw & WDM_RANGE) && (data->quickdraw != QDM_ENVPNT) && (msg->flags & MADF_DRAWUPDATE))
  22.         {
  23.             DrawOldRange(cl,obj);
  24.         }
  25.  
  26.         if ( (data->draw & WDM_VFILL) && (data->quickdraw == QDM_WAVE))
  27.         {
  28.             DrawWave(cl,obj);
  29.         }
  30.  
  31.         if ( (data->draw & WDM_ENVBLOCKS) || (data->draw & WDM_ENVLINES) && (data->quickdraw == QDM_ENVPNT))
  32.         {
  33.             DrawEnvPnt(cl,obj);
  34.         }
  35.  
  36.         if(!data->quickdraw)
  37.         {
  38.             if (data->draw & WDM_HGRID)
  39.             {
  40.                 ULONG height = _mheight(obj);
  41.                 SetAPen(_rp(obj),_dri(obj)->dri_Pens[SHINEPEN]);
  42.                 Move(_rp(obj), _mleft(obj), _mtop(obj) + height / 4);
  43.                 Draw(_rp(obj), _mright(obj), _mtop(obj) + height / 4);
  44.                 Move(_rp(obj), _mleft(obj), _mtop(obj) + height * 2 / 4);
  45.                 Draw(_rp(obj), _mright(obj), _mtop(obj) + height * 2 / 4);
  46.                 Move(_rp(obj), _mleft(obj), _mtop(obj) + height * 3 / 4);
  47.                 Draw(_rp(obj), _mright(obj), _mtop(obj) + height * 3 / 4);
  48.             }
  49.  
  50.             if ((data->draw & WDM_VGRID) && data->vlinegap)
  51.             {
  52.                 SetAPen(_rp(obj),_dri(obj)->dri_Pens[SHINEPEN]);
  53.  
  54.                 if (data->length)
  55.                 {
  56.                     ULONG first = data->vlinegap - data->shown % data->vlinegap;
  57.                     for(ULONG n = first; n < data->visible; n += data->vlinegap)
  58.                     {
  59.                         Move(_rp(obj), n * _mwidth(obj) / data->visible + _mleft(obj), _mtop(obj));
  60.                         Draw(_rp(obj), n * _mwidth(obj) / data->visible + _mleft(obj), _mbottom(obj));
  61.                     }
  62.                 }
  63.  
  64.                 if(data->editmode == EM_ENV)
  65.                 {
  66.                     for(ULONG n = 0; n < data->vlinegap; n++)
  67.                     {
  68.                         Move(_rp(obj), n * _mwidth(obj) / data->vlinegap + _mleft(obj), _mtop(obj));
  69.                         Draw(_rp(obj), n * _mwidth(obj) / data->vlinegap + _mleft(obj), _mbottom(obj));
  70.                     }
  71.                 }
  72.  
  73.             }
  74.  
  75.             if (data->draw & WDM_VFILL)
  76.             {
  77.                 DrawWave(cl,obj);
  78.             }
  79.  
  80.             if ( (data->draw & WDM_ENVBLOCKS) || (data->draw & WDM_ENVLINES) && (data->quickdraw == QDM_ENVPNT))
  81.             {
  82.                 DrawEnv(cl,obj);
  83.             }
  84.         }
  85.  
  86.         if ( (data->draw & WDM_RANGE) && (data->quickdraw != QDM_ENVPNT))
  87.         {
  88.             DrawNewRange(cl,obj);
  89.         }
  90.     }
  91.  
  92.     return(0);
  93. }
  94.  
  95. void DrawWave(struct IClass *cl,Object *obj)
  96. {
  97.     struct WaveData *data = INST_DATA(cl,obj);
  98.     ULONG height = _mheight(obj) / 2, x, y;
  99.     UBYTE chan = 0;
  100.  
  101.     SetAPen(_rp(obj),_dri(obj)->dri_Pens[TEXTPEN]);
  102.  
  103.     if (data->length)
  104.     {
  105.         if (data->type & STYPE_S8) height /= 2;
  106.         for (UBYTE n = 0; n <= chan; n++)
  107.         {
  108.         Move(_rp(obj), _mleft(obj), FindPnt(cl, obj, _mleft(obj)*8, chan));
  109.  
  110.         if((data->draw & 7) == WDM_PIXEL2)
  111.         {
  112.             for (x = 0; x < _mwidth(obj)*4; x++)
  113.             {
  114.                 y = FindPnt(cl, obj, x*2, chan);
  115.                 WritePixel(_rp(obj), _mleft(obj) + x / 4, y);
  116.             }
  117.         }
  118.  
  119.         if((data->draw & 7) == WDM_PIXEL3)
  120.         {
  121.             for (x = 0; x < _mwidth(obj)*8; x++)
  122.             {
  123.                 y = FindPnt(cl, obj, x, chan);
  124.                 WritePixel(_rp(obj), _mleft(obj) + x / 8, y);
  125.             }
  126.         }
  127.  
  128.         if((data->draw & 7) == WDM_PIXELALL)
  129.         {
  130.             for (x = 0; x < data->visible; x++)
  131.             {
  132.                 y = FindSamp(cl, obj, x, chan);
  133.                 /*wave = (data->waveform + data->shown + x);
  134.                 y = *wave * height / 128 + height + _mtop(obj);*/
  135.                 WritePixel(_rp(obj), _mleft(obj) + x * _mwidth(obj) / data->visible, y);
  136.             }
  137.         }
  138.  
  139.         for (x = 0; x < _mwidth(obj); x++)
  140.         {
  141.             y = FindPnt(cl, obj, x*8, chan);
  142.             if ((data->draw & 7) == WDM_LINE) Draw(_rp(obj), _mleft(obj) + x, y);
  143.             if ((data->draw & 7) == WDM_PIXEL1) WritePixel(_rp(obj), _mleft(obj) + x, y);
  144.             if ((data->draw & 7) == WDM_VFILLHALF) {Move(_rp(obj), _mleft(obj) + x, height + _mtop(obj));Draw(_rp(obj), _mleft(obj) + x, y);}
  145.             if ((data->draw & 7) == WDM_VFILL) {Move(_rp(obj), _mleft(obj) + x, height*2 + _mtop(obj)*2 - y -1);Draw(_rp(obj), _mleft(obj) + x, y);}
  146.         }
  147.             if (data->type & 2)
  148.             {
  149.                 chan = 1;
  150.                 height *= 3;
  151.             }
  152.         }
  153.     }
  154. }
  155.  
  156. void DrawEnv(struct IClass *cl,Object *obj)
  157. {
  158.     struct WaveData *data = INST_DATA(cl,obj);
  159.     ULONG n;
  160.     if (data->used < 2) return();
  161.  
  162.     SetAPen(_rp(obj),_dri(obj)->dri_Pens[TEXTPEN]);
  163.     if(data->draw & WDM_ENVLINES)
  164.     {
  165.         Move(_rp(obj), _mleft(obj) +1, _mbottom(obj) -1 - data->lev[0] * (_mheight(obj) -3) / 65535);
  166.         for (n = 0; n < data->used-1; n++)
  167.         {
  168.             Draw(_rp(obj), _mleft(obj) +1 + data->x[n] * (_mwidth(obj) -3) / 65535, _mbottom(obj) -1 - data->lev[n] * (_mheight(obj) -3) / 65535);
  169.         }
  170.         Draw(_rp(obj), _mright(obj) -1, _mbottom(obj) -1 - data->lev[n] * (_mheight(obj) -3) / 65535);
  171.     }
  172.  
  173.     if(data->draw & WDM_ENVBLOCKS)
  174.     {
  175.         ULONG x, y;
  176.         for (n = 0; n < data->used-1; n++)
  177.         {
  178.             x = _mleft(obj) + data->x[n] * (_mwidth(obj) -3) / 65535;
  179.             y = _mbottom(obj) -2 - data->lev[n] * (_mheight(obj) -3) / 65535;
  180.             RectFill(_rp(obj), x , y , x + 2, y + 2);
  181.         }
  182.         x = _mright(obj) -2;
  183.         y = _mbottom(obj) -2 - data->lev[n] * (_mheight(obj) -3) / 65535;
  184.         RectFill(_rp(obj), x , y , x + 2, y + 2);
  185.  
  186.         SetAPen(_rp(obj),_dri(obj)->dri_Pens[SHINEPEN]);
  187.         x = _mleft(obj) + data->x[data->current] * (_mwidth(obj) -3) / 65535;
  188.         y = _mbottom(obj) -2 - data->lev[data->current] * (_mheight(obj) -3) / 65535;
  189.         RectFill(_rp(obj), x , y , x + 2, y + 2);
  190.         SetAPen(_rp(obj),_dri(obj)->dri_Pens[TEXTPEN]);
  191.     }
  192.  
  193. }
  194.  
  195. void DrawEnvPnt(struct IClass *cl,Object *obj)
  196. {
  197.     struct WaveData *data = INST_DATA(cl,obj);
  198.     SetAPen(_rp(obj),_dri(obj)->dri_Pens[TEXTPEN]);
  199.     SetDrMd(_rp(obj),COMPLEMENT);
  200.     ULONG x, y;
  201.  
  202.     x = _mleft(obj) + data->oldx * (_mwidth(obj) -3) / 65535;
  203.     y = _mbottom(obj) -2 - data->oldlev * (_mheight(obj) -3) / 65535;
  204.  
  205.     if (data->current > 0) Move(_rp(obj), _mleft(obj) +1 + data->x[data->current -1] * (_mwidth(obj) -3) / 65535, _mbottom(obj) -1 - data->lev[data->current -1] * (_mheight(obj) -3) / 65535);
  206.     else Move(_rp(obj), x +1, y +1);
  207.  
  208.     if (data->current > 0) Draw(_rp(obj), x +1, y +1);
  209.     if (data->current < data->used -1) Draw(_rp(obj), _mleft(obj) +1 + data->x[data->current +1] * (_mwidth(obj) -3) / 65535, _mbottom(obj) -1 - data->lev[data->current +1] * (_mheight(obj) -3) / 65535);
  210.  
  211.     RectFill(_rp(obj), x , y , x + 2, y + 2);
  212.  
  213.  
  214.     x = _mleft(obj) + data->x[data->current] * (_mwidth(obj) -3) / 65535;
  215.     y = _mbottom(obj) -2 - data->lev[data->current] * (_mheight(obj) -3) / 65535;
  216.  
  217.     if (data->current > 0) Move(_rp(obj), _mleft(obj) +1 + data->x[data->current -1] * (_mwidth(obj) -3) / 65535, _mbottom(obj) -1 - data->lev[data->current -1] * (_mheight(obj) -3) / 65535);
  218.     else Move(_rp(obj), x +1, y +1);
  219.  
  220.     if (data->current > 0) Draw(_rp(obj), x +1, y +1);
  221.     if (data->current < data->used -1) Draw(_rp(obj), _mleft(obj) +1 + data->x[data->current +1] * (_mwidth(obj) -3) / 65535, _mbottom(obj) -1 - data->lev[data->current +1] * (_mheight(obj) -3) / 65535);
  222.  
  223.     RectFill(_rp(obj), x , y , x + 2, y + 2);
  224.  
  225.     SetDrMd(_rp(obj),JAM1);
  226.     data->oldx = data->x[data->current];
  227.     data->oldlev = data->lev[data->current];
  228. }
  229.  
  230. VOID DrawOldRange(struct IClass *cl,Object *obj)
  231. {
  232.     struct WaveData *data = INST_DATA(cl,obj);
  233.  
  234.     SetAPen(_rp(obj),_dri(obj)->dri_Pens[TEXTPEN]);
  235.     SetDrMd(_rp(obj),COMPLEMENT);
  236.     LONG x1, x2;
  237.     if (data->oldstart < data->oldend)
  238.     {
  239.         x1 = (data->oldstart - data->shown) * _mwidth(obj) / data->visible + _mleft(obj);
  240.         x2 = (data->oldend - data->shown) * _mwidth(obj) / data->visible + _mleft(obj);
  241.     }
  242.     else
  243.     {
  244.         x2 = (data->oldstart - data->shown) * _mwidth(obj) / data->visible + _mleft(obj);
  245.         x1 = (data->oldend - data->shown) * _mwidth(obj) / data->visible + _mleft(obj);
  246.     }
  247.  
  248.     if(x1 < _mleft(obj)) x1 = _mleft(obj);
  249.     if(x1 > _mright(obj)) x1 = _mright(obj);
  250.     if(x2 < _mleft(obj)) x2 = _mleft(obj);
  251.     if(x2 > _mright(obj)) x2 = _mright(obj);
  252.     RectFill(_rp(obj), x1, _mtop(obj), x2, _mbottom(obj));
  253.  
  254.     /*data->oldstart = data->start;
  255.     data->oldend = data->end;*/
  256.     SetDrMd(_rp(obj),JAM1);
  257. }
  258.  
  259. VOID DrawNewRange(struct IClass *cl,Object *obj)
  260. {
  261.     struct WaveData *data = INST_DATA(cl,obj);
  262.  
  263.     SetAPen(_rp(obj),_dri(obj)->dri_Pens[TEXTPEN]);
  264.     SetDrMd(_rp(obj),COMPLEMENT);
  265.     LONG x1, x2;
  266.     if (data->start < data->end)
  267.     {
  268.         x1 = (data->start - data->shown) * _mwidth(obj) / data->visible + _mleft(obj);
  269.         x2 = (data->end - data->shown) * _mwidth(obj) / data->visible + _mleft(obj);
  270.     }
  271.     else
  272.     {
  273.         x2 = (data->start - data->shown) * _mwidth(obj) / data->visible + _mleft(obj);
  274.         x1 = (data->end - data->shown) * _mwidth(obj) / data->visible + _mleft(obj);
  275.     }
  276.  
  277.     if(x1 < _mleft(obj)) x1 = _mleft(obj);
  278.     if(x1 > _mright(obj)) x1 = _mright(obj);
  279.     if(x2 < _mleft(obj)) x2 = _mleft(obj);
  280.     if(x2 > _mright(obj)) x2 = _mright(obj);
  281.     RectFill(_rp(obj), x1, _mtop(obj), x2, _mbottom(obj));
  282.  
  283.     data->oldstart = data->start;
  284.     data->oldend = data->end;
  285.     SetDrMd(_rp(obj),JAM1);
  286. }
  287.  
  288.  
  289. LONG FindPnt(struct IClass *cl, Object *obj, ULONG x, UBYTE chan)
  290. {
  291.     struct WaveData *data = INST_DATA(cl,obj);
  292.     ULONG height = _mheight(obj)/2;
  293.     LONG y;
  294.  
  295.     if (data->type == STYPE_M8)
  296.     {
  297.         BYTE *wave = (data->waveform + data->shown) + ((data->visible) * x /8 / _mwidth(obj));
  298.         y = *wave * height / 128 + height + _mtop(obj);
  299.     }
  300.     if (data->type == STYPE_M16)
  301.     {
  302.         WORD *wave = (WORD *)(data->waveform + (data->shown *2)) + ((data->visible) * x /8 / _mwidth(obj));
  303.         y = *wave * height / 32768 + height + _mtop(obj);
  304.     }
  305.     if (data->type == STYPE_M32)
  306.     {
  307.         WORD *wave = (WORD *)(data->waveform + (data->shown *4)) + ((data->visible) * x /4 / _mwidth(obj));
  308.         wave /= (WORD *)4; wave *= (WORD *)4;
  309.         y = *wave * height / 32768 + height + _mtop(obj);  /*2147483648*/
  310.     }
  311.  
  312.     height /=2;
  313.  
  314.     if (data->type == STYPE_S8)
  315.     {
  316.         BYTE *wave = (data->waveform + (data->shown *2)) + ((data->visible) * x /4 /_mwidth(obj));
  317.         wave /= (BYTE *)2; wave *= (BYTE *)2; wave += (BYTE *)chan;
  318.         y = *wave * height / 128 + height + _mtop(obj) + height*chan*2;
  319.     }
  320.     if (data->type == STYPE_S16)
  321.     {
  322.         WORD *wave = (WORD *)(data->waveform + (data->shown *4)) + ((data->visible) * x /4 / _mwidth(obj));
  323.         wave /= (WORD *)4; wave *= (WORD *)4; wave += (WORD *)(chan*2);
  324.         y = *wave * height / 32768 + height + _mtop(obj)+ height*chan*2;
  325.     }
  326.     if (data->type == STYPE_S32)
  327.     {
  328.         WORD *wave = (WORD *)(data->waveform + (data->shown *8)) + ((data->visible) * x /2 / _mwidth(obj));
  329.         wave /= (WORD *)8; wave *= (WORD *)8; wave += (WORD *)(chan*4);
  330.         y = *wave * height / 32768 + height + _mtop(obj)+ height*chan*2;
  331.     }
  332.     return(y);
  333. }
  334.  
  335.  
  336. ULONG FindSamp(struct IClass *cl, Object *obj, ULONG sam, UBYTE chan)
  337. {
  338.     struct WaveData *data = INST_DATA(cl,obj);
  339.     ULONG height = _mheight(obj)/2, y;
  340.  
  341.     if (data->type == STYPE_M8)
  342.     {
  343.         BYTE *wave = data->waveform + data->shown + sam;
  344.         y = *wave * height / 128 + height + _mtop(obj);
  345.     }
  346.     if (data->type == STYPE_M16)
  347.     {
  348.         WORD *wave = (WORD *)data->waveform + data->shown + sam;
  349.         y = *wave * height / 32768 + height + _mtop(obj);
  350.     }
  351.     if (data->type == STYPE_M32)
  352.     {
  353.         WORD *wave = (WORD *)data->waveform + data->shown *2 + sam *2;
  354.         wave /= (WORD *)2; wave *= (WORD *)2;
  355.         y = *wave * height / 32768 + height + _mtop(obj);
  356.     }
  357.  
  358.     height /=2;
  359.  
  360.     if (data->type == STYPE_S8)
  361.     {
  362.         BYTE *wave = data->waveform + data->shown *2+ sam *2;
  363.         wave /= (BYTE *)2; wave *= (BYTE *)2; wave += (BYTE *)chan;
  364.         y = *wave * height / 128 + height + _mtop(obj) + height*chan*2;
  365.     }
  366.     if (data->type == STYPE_S16)
  367.     {
  368.         WORD *wave = (WORD *)data->waveform + data->shown *2 + sam *2;
  369.         wave /= (WORD *)4; wave *= (WORD *)4; wave += (WORD *)(chan*2);
  370.         y = *wave * height / 32768 + height + _mtop(obj)+ height*chan*2;
  371.     }
  372.     if (data->type == STYPE_S32)
  373.     {
  374.         WORD *wave = (WORD *)data->waveform + data->shown *4 + sam *4;
  375.         wave /= (WORD *)8; wave *= (WORD *)8; wave += (WORD *)(chan*4);
  376.         y = *wave * height / 32768 + height + _mtop(obj)+ height*chan*2;
  377.     }
  378.     return(y);
  379. }
  380.  
  381.  
  382.