/** * $Id$ * * ***** BEGIN GPL/BL DUAL LICENSE BLOCK ***** * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. The Blender * Foundation also sells licenses for use in proprietary software under * the Blender License. See http://www.blender.org/BL/ for information * about this. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. * All rights reserved. * * The Original Code is: all of this file. * * Contributor(s): none yet. * * ***** END GPL/BL DUAL LICENSE BLOCK ***** */ #include #ifdef WIN32 #include "BLI_winstuff.h" #endif #include "BLI_blenlib.h" #include "BLI_arithb.h" #include "BLI_editVert.h" #include "DNA_scene_types.h" #include "DNA_sound_types.h" #include "DNA_space_types.h" #include "DNA_screen_types.h" #include "BKE_utildefines.h" #include "BKE_global.h" #include "BIF_gl.h" #include "BIF_mywindow.h" #include "BIF_screen.h" #include "BIF_editsound.h" #include "BSE_drawipo.h" /* local */ void drawsoundspace(void); /*implementation */ static void draw_wave(int startsamp, int endsamp, short sampdx, short offset, short *sp, float sampfac, float y) { float min, max, v1[2], v2[3]; int i, j; short value, deltasp; sp+= offset*startsamp; deltasp= offset*sampdx; glBegin(GL_LINES); for(i=startsamp; i max) max= value; } v1[1]= y + 0.002*min; v2[1]= y + 0.002*max; v1[0]=v2[0]= sampfac*i; glVertex2fv(v1); glVertex2fv(v2); } glEnd(); } static void draw_sample(bSample *sample) { float sampxlen, sampfac; int samples, startsamp, endsamp; short *sp, sampdx; /* one sample is where in v2d space? (v2d space in frames!) */ sampfac= 25.0/(sample->rate); /* how many samples? */ samples= sample->len/(sample->channels*(sample->bits/8)); /* total len in v2d space */ sampxlen= sampfac*samples; /* one pixel is how many samples? */ sampdx= (samples*((G.v2d->cur.xmax-G.v2d->cur.xmin)/sampxlen))/curarea->winx; if(sampdx==0) sampdx= 1; /* start and and */ startsamp = G.v2d->cur.xmin/sampfac; CLAMP(startsamp, 0, samples-1); endsamp= G.v2d->cur.xmax/sampfac; CLAMP(endsamp, 0, samples-1); endsamp-= sampdx; /* set 'tot' for sliders */ G.v2d->tot.xmax= sampfac*samples; /* channels? */ if(sample->channels==2) { cpack(0x905050); sp= (short *)(sample->data); draw_wave(startsamp, endsamp, sampdx, 2, sp, sampfac, 85.0); cpack(0x506890); sp++; draw_wave(startsamp, endsamp, sampdx, 2, sp, sampfac, 190.0); } else { cpack(0x905050); sp= (short *)(sample->data); draw_wave(startsamp, endsamp, sampdx, 1, sp, sampfac, 128.0); } } static void draw_cfra_sound(void) { float vec[2]; vec[0]= (G.scene->r.cfra); vec[0]*= G.scene->r.framelen; vec[1]= G.v2d->cur.ymin; glColor3ub(0x20, 0x80, 0x20); glLineWidth(3.0); glBegin(GL_LINE_STRIP); glVertex2fv(vec); vec[1]= G.v2d->cur.ymax; glVertex2fv(vec); glEnd(); glLineWidth(1.0); } void drawsoundspace(void) { short ofsx, ofsy; glClearColor(.6275, .6275, .6275, 0.0); glClear(GL_COLOR_BUFFER_BIT); calc_scrollrcts(G.v2d, curarea->winx, curarea->winy); if(curarea->winx>SCROLLB+10 && curarea->winy>SCROLLH+10) { if(G.v2d->scroll) { ofsx= curarea->winrct.xmin; /* ivm mywin */ ofsy= curarea->winrct.ymin; glViewport(ofsx+G.v2d->mask.xmin, ofsy+G.v2d->mask.ymin, ( ofsx+G.v2d->mask.xmax-1)-(ofsx+G.v2d->mask.xmin)+1, ( ofsy+G.v2d->mask.ymax-1)-( ofsy+G.v2d->mask.ymin)+1); glScissor(ofsx+G.v2d->mask.xmin, ofsy+G.v2d->mask.ymin, ( ofsx+G.v2d->mask.xmax-1)-(ofsx+G.v2d->mask.xmin)+1, ( ofsy+G.v2d->mask.ymax-1)-( ofsy+G.v2d->mask.ymin)+1); } } myortho2(G.v2d->cur.xmin, G.v2d->cur.xmax, G.v2d->cur.ymin, G.v2d->cur.ymax); /* boundbox_seq(); */ calc_ipogrid(); draw_ipogrid(); if (G.ssound->sound) { sound_initialize_sample(G.ssound->sound); draw_sample(G.ssound->sound->sample); } draw_cfra_sound(); /* restore viewport */ mywinset(curarea->win); if(curarea->winx>SCROLLB+10 && curarea->winy>SCROLLH+10) { /* ortho op pixelnivo curarea */ myortho2(-0.5, curarea->winx+0.5, -0.5, curarea->winy+0.5); if(G.v2d->scroll) { drawscroll(0); } } curarea->win_swap= WIN_BACK_OK; }