mirror of
https://github.com/ONLYOFFICE/core.git
synced 2026-04-07 13:55:33 +08:00
Fixed triangle interpolation, both parametric and color. Started developing Tensor Product gradient. (Does not work for now) A bit of refactoring.
305 lines
9.8 KiB
C++
305 lines
9.8 KiB
C++
#include "mainwindow.h"
|
||
#include "ui_mainwindow.h"
|
||
#include <QPixmap>
|
||
#include <iostream>
|
||
#include "../../../../DesktopEditor/graphics/pro/Graphics.h"
|
||
|
||
std::vector<Point> drawCircle1(int n, double cx, double cy, double r) {
|
||
std::vector<Point> res;
|
||
for (int i = 0; i < n; i++) {
|
||
double x = cx + r * cos(i * 8 * atan(1) / n);
|
||
double y = cy + r * sin(i * 8 * atan(1) / n);
|
||
res.push_back({x, y});
|
||
}
|
||
return res;
|
||
}
|
||
|
||
MainWindow::MainWindow(QWidget *parent)
|
||
: QMainWindow(parent)
|
||
, ui(new Ui::MainWindow)
|
||
, img("test.png")
|
||
, lable(new QLabel)
|
||
{
|
||
ui->setupUi(this);
|
||
ui->lable_test->setStyleSheet("QLabel { background-color : white;}");
|
||
points = {{0, 0}, {105, 0}, {105, 105}, {0, 105}};
|
||
}
|
||
|
||
|
||
|
||
MainWindow::~MainWindow()
|
||
{
|
||
delete ui;
|
||
}
|
||
|
||
|
||
void GenerateImg(QImage &img, std::vector<Point> &points, Info &info) {
|
||
NSGraphics::IGraphicsRenderer* pRasterRenderer = NSGraphics::Create();
|
||
pRasterRenderer->SetFontManager(NULL);
|
||
int nRasterW = img.size().width();
|
||
int nRasterH = img.size().height();
|
||
BYTE* pData = new BYTE[4 * nRasterW * nRasterH];
|
||
|
||
unsigned int back = 0xffffff;
|
||
unsigned int* pData32 = (unsigned int*)pData;
|
||
unsigned int* pData32End = pData32 + nRasterW * nRasterH ;
|
||
//дефолтный тон должен быть прозрачным, а не белым
|
||
while (pData32 < pData32End)
|
||
*pData32++ = back;
|
||
|
||
CBgraFrame oFrame;
|
||
oFrame.put_Data(pData);
|
||
oFrame.put_Width(nRasterW);
|
||
oFrame.put_Height(nRasterH);
|
||
oFrame.put_Stride(4 * nRasterW);
|
||
|
||
pRasterRenderer->CreateFromBgraFrame(&oFrame);
|
||
pRasterRenderer->SetSwapRGB(true);
|
||
|
||
double dW_MM = nRasterW * 25.4 / 96;
|
||
double dH_MM = nRasterH * 25.4 / 96;
|
||
|
||
pRasterRenderer->put_Width(dW_MM);
|
||
pRasterRenderer->put_Height(dH_MM);
|
||
|
||
NSStructures::GradientInfo ginfo = info.ginfo;
|
||
//ginfo.reflected = true;
|
||
ginfo.shading.f_type = NSStructures::ShadingInfo::UseNew;
|
||
pRasterRenderer->put_BrushGradInfo(ginfo);
|
||
auto a = info.c;
|
||
auto b = info.p;
|
||
LONG *c = a.data();
|
||
double *p = b.data();
|
||
pRasterRenderer->put_BrushType(info.gradient_type);
|
||
pRasterRenderer->put_BrushGradientColors(c, p, info.n_colors);
|
||
pRasterRenderer->PathCommandStart();
|
||
pRasterRenderer->BeginCommand(c_nPathType);
|
||
if (points.size() > 0) {
|
||
pRasterRenderer->PathCommandMoveTo(points[0].x, points[0].y);
|
||
for (uint i = 1; i < points.size(); i++) {
|
||
pRasterRenderer->PathCommandLineTo(points[i].x, points[i].y);
|
||
}
|
||
}
|
||
pRasterRenderer->Fill();
|
||
//pRasterRenderer->DrawPath(c_nStroke);
|
||
pRasterRenderer->EndCommand(c_nPathType);
|
||
pRasterRenderer->PathCommandEnd();
|
||
pData32 = (unsigned int*)pData;
|
||
for (long i = 0; i < img.size().height(); i++) {
|
||
for (long j = 0; j < img.size().width(); j++) {
|
||
img.setPixelColor(j, i, QColor(pData32[j + i * nRasterW]));
|
||
}
|
||
}
|
||
}
|
||
|
||
void MainWindow::on_RenderPic_clicked()
|
||
{
|
||
|
||
QImage pm(400, 400,QImage::Format_RGB888);
|
||
GenerateImg(pm, points, info);
|
||
//setColor2(pm, 0x0000FF);
|
||
//pm.invertPixels();
|
||
ui->lable_test->setPixmap(QPixmap::fromImage(pm));
|
||
ui->lable_test->setScaledContents(true);
|
||
ui->lable_test->resize(pm.size());
|
||
pm.save("test.bmp");
|
||
}
|
||
|
||
|
||
|
||
void MainWindow::on_AngleSlider_sliderMoved(int position)
|
||
{
|
||
double angleT = 360. / 100 * position;
|
||
ui->lable_angle->setText(std::to_string(angleT).c_str());
|
||
info.ginfo.setAngleDegrees(angleT);
|
||
this->on_RenderPic_clicked();
|
||
}
|
||
|
||
void MainWindow::on_OffsetSlider_sliderMoved(int position)
|
||
{
|
||
double offset = ((double)position - 50.0) / 25.0;
|
||
ui->lable_offset->setText(std::to_string(offset).c_str());
|
||
info.ginfo.linoffset = offset;
|
||
this->on_RenderPic_clicked();
|
||
}
|
||
|
||
void MainWindow::on_StretchSlide_sliderMoved(int position)
|
||
{
|
||
double stretch = pow(2.0, (position - 50.) / 25.0);
|
||
ui->lable_stretch->setText(std::to_string(stretch).c_str());
|
||
info.ginfo.linstretch = stretch;
|
||
this->on_RenderPic_clicked();
|
||
}
|
||
|
||
void MainWindow::on_DiscreteStepSlider_sliderMoved(int position)
|
||
{
|
||
if (position == 0) {
|
||
info.ginfo.discrete_step = 0.0;
|
||
ui->label_discrete->setText("Continious");
|
||
this->on_RenderPic_clicked();
|
||
return;
|
||
}
|
||
info.ginfo.setStepByNum(position);
|
||
ui->label_discrete->setText(std::to_string(position).c_str());
|
||
this->on_RenderPic_clicked();
|
||
}
|
||
|
||
void MainWindow::on_PathType_itemDoubleClicked(QListWidgetItem *item)
|
||
{
|
||
int tmp = info.gradient_type;
|
||
on_PathType_itemClicked(item);
|
||
this->on_RenderPic_clicked();
|
||
//info.gradient_type = tmp;
|
||
}
|
||
|
||
void MainWindow::on_PathType_itemClicked(QListWidgetItem *item)
|
||
{
|
||
if (item->text() == "Circle") {
|
||
points = drawCircle1(100, 53, 53, 50);
|
||
}
|
||
else if (item->text() == "Square") {
|
||
points = {{0, 0}, {105, 0}, {105, 105}, {0, 105}};
|
||
}
|
||
else if (item->text() == "Triangle") {
|
||
points = {{5, 10}, {40, 100}, {100, 1}};
|
||
/*
|
||
* Пока чтобы тестить прямую интерполяцию цвета, нужно редактировать код
|
||
* И вычтавить info.ginfo.shading.shading_type как NSStructures::ShadingInfo::TriangleInterpolation
|
||
* Чтобы тестить параметрическую нужно выставить NSStructures::ShadingInfo::Parametric
|
||
* С опцией Parametric можно тестить другие градиенты.
|
||
*
|
||
*/
|
||
info.gradient_type = c_BrushTypeTriagnleMeshGradient;
|
||
info.ginfo.shading.shading_type = NSStructures::ShadingInfo::TriangleInterpolation;
|
||
info.ginfo.shading.triangle = {{5 * 3.84, 10 * 3.84}, {40 * 3.84, 100 * 3.84}, {100 * 3.84, 1 * 3.84}};
|
||
info.ginfo.shading.triangle_parametrs = {0.0f, 0.5f, 1.0f} ;
|
||
info.ginfo.shading.triangle_colors = {{255,0,0, 255}, {255,255,0,255 }, {0,255,0,255}};
|
||
|
||
info.ginfo.shading.patch = {
|
||
{{10, 40}, {}, {}, {10,10}},
|
||
{{}, {}, {}, {}},
|
||
{{}, {}, {}, {}},
|
||
{{40,40}, {}, {}, {40,10}}
|
||
};
|
||
}
|
||
}
|
||
|
||
void MainWindow::on_GradientType_itemDoubleClicked(QListWidgetItem *item)
|
||
{
|
||
on_GradientType_itemClicked(item);
|
||
on_RenderPic_clicked();
|
||
}
|
||
|
||
void MainWindow::on_GradientType_itemClicked(QListWidgetItem *item)
|
||
{
|
||
if (item->text() == "Linear") {
|
||
info.gradient_type = c_BrushTypePathNewLinearGradient;
|
||
}
|
||
else if (item->text() == "Radial") {
|
||
info.gradient_type = c_BrushTypePathRadialGradient;
|
||
}
|
||
else if (item->text() == "Diamond") {
|
||
info.gradient_type = c_BrushTypePathDiamondGradient;
|
||
}
|
||
else if (item->text() == "Conical") {
|
||
info.gradient_type = c_BrushTypePathConicalGradient;
|
||
}
|
||
}
|
||
|
||
|
||
void MainWindow::on_LittleRadiusSlider_sliderMoved(int position)
|
||
{
|
||
double llr = (double)position / 100.0;
|
||
ui->lable_little_radius->setText(std::to_string(llr).c_str());
|
||
info.ginfo.littleRadius = llr;
|
||
this->on_RenderPic_clicked();
|
||
}
|
||
|
||
void MainWindow::on_LargeRadiusSlider_sliderMoved(int position)
|
||
{
|
||
double lgr = (double)position / 100.0;
|
||
ui->lable_large_radius->setText(std::to_string(lgr).c_str());
|
||
info.ginfo.largeRadius = lgr;
|
||
this->on_RenderPic_clicked();
|
||
}
|
||
|
||
void MainWindow::on_xcenterSlider_sliderMoved(int position)
|
||
{
|
||
double xc = ((double)position - 50.0) / 25.0;
|
||
ui->lable_xcenter->setText(std::to_string(xc).c_str());
|
||
info.ginfo.centerX = xc;
|
||
this->on_RenderPic_clicked();
|
||
}
|
||
|
||
void MainWindow::on_ycenterSlider_sliderMoved(int position)
|
||
{
|
||
double yc = ((double)position - 50.0) / 25.0;
|
||
ui->lable_ycenter->setText(std::to_string(yc).c_str());
|
||
info.ginfo.centerY = yc;
|
||
this->on_RenderPic_clicked();
|
||
}
|
||
|
||
void MainWindow::on_XSizeSlider_sliderMoved(int position)
|
||
{
|
||
double xsize = pow(2.0, (position - 50.) / 25.0);
|
||
ui->lable_xsize->setText(std::to_string(xsize).c_str());
|
||
info.ginfo.xsize = xsize;
|
||
this->on_RenderPic_clicked();
|
||
}
|
||
|
||
void MainWindow::on_YSizeSlider_sliderMoved(int position)
|
||
{
|
||
double ysize = pow(2.0, (position - 50.) / 25.0);
|
||
ui->lable_ysize->setText(std::to_string(ysize).c_str());
|
||
info.ginfo.ysize = ysize;
|
||
this->on_RenderPic_clicked();
|
||
}
|
||
|
||
void MainWindow::on_ColorSpaces_itemClicked(QListWidgetItem *item)
|
||
{
|
||
|
||
if (item->text() == "Rainbow") {
|
||
info.c = {(LONG)0xFFff0000, (LONG)0xFFffa500, (LONG)0xFFffff00, (LONG)0xFF008000, (LONG)0xFF0000ff, (LONG)0xFFFF00FF};
|
||
info.p = {0.0,0.2,0.4,0.6,0.8,1};
|
||
info.n_colors = 6;
|
||
info.ginfo.shading.function.set_linear_interpolation({0xFFff0000, 0xFFffa500, 0xFFffff00, 0xFF008000, 0xFF0000ff, 0xFFFF00FF}
|
||
, {0.0f,0.2f,0.4f,0.6f,0.8f,1.0f});
|
||
}
|
||
else if (item->text() == "Black and wh200ite") {
|
||
info.c = {(LONG)0xFFFFFFFF, (LONG)0xFF000000};
|
||
info.p = {0.0, 1};
|
||
info.n_colors = 2;
|
||
info.ginfo.shading.function.set_linear_interpolation({0xFFFFFFFF, 0xFF000000}, {0.0f, 1.0f});
|
||
}
|
||
else if (item->text() == "Red Blue") {
|
||
info.c = {(LONG)0xFFFF0000, (LONG)0xFF0000FF};
|
||
info.p = {0.0, 1};
|
||
info.n_colors = 2;
|
||
info.ginfo.shading.function.set_linear_interpolation({0xFFFF0000, 0xFF0000FF}, {0.0f, 1.0f});
|
||
}
|
||
else if (item->text() == "Pastel") {
|
||
info.c = {(LONG)0xfff39189, (LONG)0xff046582};
|
||
info.p = {0.0, 1};
|
||
info.n_colors = 2;
|
||
info.ginfo.shading.function.set_linear_interpolation({0xfff39189, 0xff046582}, {0.0f, 1.0f});
|
||
}
|
||
}
|
||
|
||
void MainWindow::on_ColorSpaces_itemDoubleClicked(QListWidgetItem *item)
|
||
{
|
||
on_ColorSpaces_itemClicked(item);
|
||
on_RenderPic_clicked();
|
||
}
|
||
|
||
void MainWindow::on_Reflected_CheckBox_clicked(bool checked)
|
||
{
|
||
info.ginfo.reflected = checked;
|
||
on_RenderPic_clicked();
|
||
}
|
||
|
||
void MainWindow::on_PeriodicCheckBox_clicked(bool checked)
|
||
{
|
||
info.ginfo.periodic = checked;
|
||
on_RenderPic_clicked();
|
||
}
|