rudimentary solid and bars support

This commit is contained in:
itsmattkc
2018-07-20 19:56:49 +01:00
parent 8845ba0577
commit 43dc221438
5 changed files with 156 additions and 2 deletions
+2
View File
@@ -15,6 +15,7 @@ void init_effects() {
video_effect_names[VIDEO_TRANSFORM_EFFECT] = "Transform";
video_effect_names[VIDEO_SHAKE_EFFECT] = "Shake";
video_effect_names[VIDEO_TEXT_EFFECT] = "Text";
video_effect_names[VIDEO_SOLID_EFFECT] = "Solid";
audio_effect_names[AUDIO_VOLUME_EFFECT] = "Volume";
audio_effect_names[AUDIO_PAN_EFFECT] = "Pan";
@@ -26,6 +27,7 @@ Effect* create_effect(int effect_id, Clip* c) {
case VIDEO_TRANSFORM_EFFECT: return new TransformEffect(c);
case VIDEO_SHAKE_EFFECT: return new ShakeEffect(c);
case VIDEO_TEXT_EFFECT: return new TextEffect(c);
case VIDEO_SOLID_EFFECT: return new SolidEffect(c);
}
} else {
switch (effect_id) {
+12
View File
@@ -20,6 +20,7 @@ enum VideoEffects {
VIDEO_TRANSFORM_EFFECT,
VIDEO_SHAKE_EFFECT,
VIDEO_TEXT_EFFECT,
VIDEO_SOLID_EFFECT,
VIDEO_EFFECT_COUNT
};
@@ -110,6 +111,17 @@ private:
QFont font;
};
class SolidEffect : public Effect {
Q_OBJECT
public:
SolidEffect(Clip* c);
void post_gl();
private slots:
void update_texture();
private:
QOpenGLTexture* texture;
};
// audio effects
class VolumeEffect : public Effect {
public:
+128
View File
@@ -0,0 +1,128 @@
#include "effects.h"
#include <QOpenGLTexture>
#include <QPainter>
#include <QtMath>
#include "project/clip.h"
#include "project/sequence.h"
#define SMPTE_BARS 7
#define SMPTE_STRIP_COUNT 3
#define SMPTE_LOWER_BARS 4
bool solid = false;
SolidEffect::SolidEffect(Clip* c) : Effect(c, EFFECT_TYPE_VIDEO, VIDEO_SOLID_EFFECT), texture(NULL) {
update_texture();
}
void SolidEffect::update_texture() {
QImage img(parent_clip->sequence->width, parent_clip->sequence->height, QImage::Format_RGB888);
if (solid) {
img.fill(Qt::red);
} else {
// draw smpte bars
img.fill(Qt::black);
QPainter p(&img);
int bar_width = qCeil((double) parent_clip->sequence->width / 7.0);
int first_bar_height = qCeil((double) parent_clip->sequence->height / 3.0 * 2.0);
int second_bar_height = qCeil((double) parent_clip->sequence->height / 12.5);
int third_bar_y = first_bar_height + second_bar_height;
int third_bar_height = parent_clip->sequence->height - third_bar_y;
int third_bar_width = 0;
int bar_x, strip_width;
QColor first_color, second_color, third_color;
for (int i=0;i<SMPTE_BARS;i++) {
bar_x = bar_width*i;
switch (i) {
case 0:
first_color = QColor(192, 192, 192);
second_color = QColor(0, 0, 192);
break;
case 1:
first_color = QColor(192, 192, 0);
second_color = QColor(19, 19, 19);
break;
case 2:
first_color = QColor(0, 192, 192);
second_color = QColor(192, 0, 192);
break;
case 3:
first_color = QColor(0, 192, 0);
second_color = QColor(19, 19, 19);
break;
case 4:
first_color = QColor(192, 0, 192);
second_color = QColor(0, 192, 192);
break;
case 5:
third_bar_width = bar_x / SMPTE_LOWER_BARS;
first_color = QColor(192, 0, 0);
second_color = QColor(19, 19, 19);
strip_width = qCeil(bar_width/SMPTE_STRIP_COUNT);
for (int j=0;j<SMPTE_STRIP_COUNT;j++) {
switch (j) {
case 0: third_color = QColor(9, 9, 9); break;
case 1: third_color = QColor(19, 19, 19); break;
case 2: third_color = QColor(29, 29, 29); break;
}
p.fillRect(QRect(bar_x + (strip_width*j), third_bar_y, strip_width, third_bar_height), third_color);
}
break;
case 6:
first_color = QColor(0, 0, 192);
second_color = QColor(192, 192, 192);
p.fillRect(QRect(bar_x, third_bar_y, bar_width, third_bar_height), QColor(19, 19, 19));
break;
}
p.fillRect(QRect(bar_x, 0, bar_width, first_bar_height), first_color);
p.fillRect(QRect(bar_x, first_bar_height, bar_width, second_bar_height), second_color);
}
for (int i=0;i<SMPTE_LOWER_BARS;i++) {
bar_x = third_bar_width*i;
switch (i) {
case 0: third_color = QColor(0, 33, 76); break;
case 1: third_color = QColor(255, 255, 255); break;
case 2: third_color = QColor(50, 0, 106); break;
case 3: third_color = QColor(19, 19, 19); break;
}
p.fillRect(QRect(bar_x, third_bar_y, third_bar_width, third_bar_height), third_color);
}
}
if (texture == NULL) {
texture = new QOpenGLTexture(img);
} else {
texture->destroy();
texture->setData(img);
}
field_changed();
}
void SolidEffect::post_gl() {
if (texture != NULL) {
texture->bind();
int half_width = parent_clip->sequence->width/2;
int half_height = parent_clip->sequence->height/2;
glBegin(GL_QUADS);
glTexCoord2f(0.0, 0.0);
glVertex2f(-half_width, -half_height);
glTexCoord2f(1.0, 0.0);
glVertex2f(half_width, -half_height);
glTexCoord2f(1.0, 1.0);
glVertex2f(half_width, half_height);
glTexCoord2f(0.0, 1.0);
glVertex2f(-half_width, half_height);
glEnd();
texture->release();
}
}
+2 -1
View File
@@ -64,7 +64,8 @@ SOURCES += \
effects/shakeeffect.cpp \
effects/texteffect.cpp \
ui/comboboxex.cpp \
ui/colorbutton.cpp
ui/colorbutton.cpp \
effects/solideffect.cpp
HEADERS += \
mainwindow.h \
+12 -1
View File
@@ -60,7 +60,18 @@ void EffectControls::show_menu(bool video) {
QAction* action = new QAction(&effects_menu);
action->setText(effect_names->at(i));
action->setData(i);
effects_menu.addAction(action);
// sort alphabetically
bool added = false;
for (int j=0;j<effects_menu.actions().size();j++) {
QAction* comp_action = effects_menu.actions().at(j);
if (comp_action->text() > effect_names->at(i)) {
effects_menu.insertAction(comp_action, action);
added = true;
break;
}
}
if (!added) effects_menu.addAction(action);
}
connect(&effects_menu, SIGNAL(triggered(QAction*)), this, SLOT(menu_select(QAction*)));