rudimentary solid and bars support
This commit is contained in:
@@ -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) {
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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 \
|
||||
|
||||
@@ -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*)));
|
||||
|
||||
Reference in New Issue
Block a user