subject-two/entry/src/main/cpp/sdk/graphic/GraphicImage.cpp

294 lines
7.4 KiB
C++
Raw Normal View History

2025-03-26 17:01:46 +08:00
#include "GraphicImage.h"
//#include "opencv2/opencv.hpp"
GraphicImage::GraphicImage(int width, int height)
{
m_mapping.scaling = MAP_OPER_SCALING(m_scale);
resize(width, height);
// cv::Mat mat(600,600, 3);
// cv::resize(mat, mat, cv::Size(400, 300));
// cv::imwrite("", mat);
// cv::line(mat, cv::Point(0,0), cv::Point(100,100), cv::Scalar(0,0,0));
// cv::putText(mat, "desc" ,cv::Point(10, 40),1,2,cv::Scalar(0,0,0),2);
}
GraphicImage::~GraphicImage()
{
__DELETE__(m_img);
__FREE__(m_rgb);
}
void GraphicImage::recreating()
{
if(m_img)
{
__DELETE__(m_img);
}
if(m_rgb)
{
__FREE__(m_rgb);
}
m_img = __NEW__(CxxImage, m_mapping.width, m_mapping.height, m_depth, m_channel, m_default);
int siz = size();
m_rgb = (unsigned char*)__MALLOC__(siz);
memset(m_rgb, m_default, siz);
}
void GraphicImage::resize(int w, int h)
{
m_mapping.width = w;
m_mapping.height = h;
recreating();
}
void GraphicImage::setScaling(int s)
{
m_scale = s;
m_mapping.scaling = MAP_OPER_SCALING(m_scale);
}
int GraphicImage::scale()
{
return m_scale;
}
double GraphicImage::scaling()
{
return m_mapping.scaling;
}
int GraphicImage::width()
{
return m_mapping.width;
}
int GraphicImage::height()
{
return m_mapping.height;
}
int GraphicImage::depth()
{
return m_depth;
}
int GraphicImage::channel()
{
return m_channel; //m_img->spectrum();
}
const TMapping& GraphicImage::mapping()
{
return m_mapping;
}
int GraphicImage::size()
{
return m_img ? m_img->size() : 0;
}
const char* GraphicImage::data()
{
return m_img ? (const char*)m_img->data() : nullptr;
}
void GraphicImage::clean()
{
if(m_img)
{
SafeMemset(m_img->data(), m_default, m_img->size());
}
}
const char* GraphicImage::image()
{
//for-surface-test
#if 0
HELP_COST_TIME("");
clean();
int64 tick = Tools::nowTime();
std::string tm = Tools::toTimeString(tick/SECOND) + "." + std::to_string(tick%SECOND);
drawText(Pointi(10,10), tm);
drawText(Pointi(30,30), std::string("duolun judge draw..."));
for(int i = 10; i < 400; i++)
{
drawLine(Pointi(120,55), Pointi(600,i));
}
drawLine(Pointi(50,50), Pointi(50,100));
drawLine(Pointi(50,50), Pointi(100,50));
drawLine(Pointi(100,100), Pointi(50,100));
drawLine(Pointi(100,100), Pointi(100,50));
drawLine(Pointi(200,200), Pointi(400,200), RGB_PURPLE);
drawLine(Pointi(200,200), Pointi(200,300), RGB_PURPLE);
drawLine(Pointi(300,400), Pointi(400,200), RGB_PURPLE);
drawLine(Pointi(300,400), Pointi(200,300), RGB_PURPLE);
drawDashedLine(Pointi(10,150), Pointi(300,150), 10, RGB_ORANGE);
drawDashedLine(Pointi(10,180), Pointi(300,180), 10, RGB_GREEN);
drawPoint(Pointi(500,420), RGB_RED, 5);
drawText(Pointi(500,425), std::string("P1"));
#endif
int offset_y = 1;
if(m_showTime)
{
int64 tick = Tools::nowTime();
std::string tm = Tools::toTimeString(tick/SECOND) + "." + std::to_string(tick%SECOND);
drawText(Pointi(1, offset_y), tm.c_str(), RGB_PERILLA, 16);
offset_y += 16;
}
2025-05-14 11:17:05 +08:00
//if(m_showVersion)
//{
// drawText(Pointi(1, offset_y), JUDGE_VERSION_INFO, RGB_BLUE, 16);
// offset_y += 16;
//}
2025-03-26 17:01:46 +08:00
toRgb();
return (const char*)m_rgb;
}
void GraphicImage::display()
{
#if defined(cimg_display) && (cimg_display > 0)
if(m_img != nullptr) m_img->display();
#endif
}
void GraphicImage::drawLine(const Pointi& p1, const Pointi& p2, const RgbColor& color, int thickness)
{
if(m_img != nullptr)
{
const unsigned char c[] = { color.R, color.G, color.B, color.A };
m_img->draw_line(p1.x, p1.y, p2.x, p2.y, c, 1, ~0U, true);
}
}
void GraphicImage::drawLine(const Linei& line, const RgbColor& color, int thickness)
{
drawLine(line.p1, line.p2, color, thickness);
}
void GraphicImage::drawDashedLine(const Pointi& p1, const Pointi& p2, int divide, const RgbColor& color, int thickness)
{
//double a = angle(p1.x, p1.y, p2.x, p2.y);
int dx = p2.x - p1.x;
int dy = p2.y - p1.y;
double d = std::sqrt(dx*dx + dy*dy);
double kx = double(p2.x - p1.x) / d;
double ky = double(p2.y - p1.y) / d;
if(divide % 2 == 0) divide++;
double t = d / divide;
for(int i = 0; i < divide; i += 2)
{
int x1 = p1.x + kx * t * i;
int y1 = p1.y + ky * t * i;
int x2 = p1.x + kx * t * (i+1);
int y2 = p1.y + ky * t * (i+1);
drawLine({x1, y1}, {x2, y2}, color, thickness);
}
}
void GraphicImage::drawDashedLine(const Linei& line, int divide, const RgbColor& color, int thickness)
{
drawDashedLine(line.p1, line.p2, divide, color, thickness);
}
void GraphicImage::drawDottedLine(const Pointi& p1, const Pointi& p2, int divide, const RgbColor& color, int radius)
{
//double a = angle(p1.x, p1.y, p2.x, p2.y);
int dx = p2.x - p1.x;
int dy = p2.y - p1.y;
double d = std::sqrt(dx*dx + dy*dy);
double kx = double(p2.x - p1.x) / d;
double ky = double(p2.y - p1.y) / d;
if(divide % 2 == 0) divide++;
double t = d / divide;
for(int i = 0; i < divide; i += 2)
{
int x1 = p1.x + kx * t * i;
int y1 = p1.y + ky * t * i;
int x2 = p1.x + kx * t * (i+1);
int y2 = p1.y + ky * t * (i+1);
drawPoint({x1, y1}, color, radius);
drawPoint({x2, y2}, color, radius);
}
}
void GraphicImage::drawDottedLine(const Linei& line, int divide, const RgbColor& color, int radius)
{
drawDottedLine(line.p1, line.p2, divide, color, radius);
}
void GraphicImage::drawText(const Pointi& p, const std::string& text, const RgbColor& color, int size)
{
if(m_img != nullptr && !text.empty())
{
const unsigned char c[] = { color.R, color.G, color.B, color.A };
m_img->draw_text(p.x, p.y, text.c_str(), c, 0, 1, size);
}
}
void GraphicImage::drawText2(const Pointi& p, const std::string& text, const RgbColor& color, const RgbColor& bg, int size)
{
if(m_img != nullptr && !text.empty())
{
const unsigned char c[] = { color.R, color.G, color.B, color.A };
const unsigned char b[] = { bg.R, bg.G, bg.B, bg.A };
m_img->draw_text(p.x, p.y, text.c_str(), c, b, 1, size);
}
}
void GraphicImage::drawPoint(const Pointi& p, const RgbColor& color, int radius)
{
if(m_img != nullptr)
{
const unsigned char c[] = { color.R, color.G, color.B, color.A };
//m_img->draw_point(p.x, p.y, c);
m_img->draw_circle(p.x, p.y, radius, c, 1);
//m_img->draw_circle(p.x, p.y, radius, c, 1, ~0U);
//m_img->draw_ellipse(p.x, p.y, radius,radius, 1,c);
}
}
void GraphicImage::toRgb()
{
HELP_COST_TIME("");
if(m_img != nullptr)
{
const unsigned char* ptrR = m_img->data(0,0,0,0);
const unsigned char* ptrG = m_img->data(0,0,0,1);
const unsigned char* ptrB = m_img->data(0,0,0,2);
const unsigned char* ptrA = m_img->data(0,0,0,3);
int wh = m_img->width() * m_img->height();
unsigned char* buff = m_rgb;
// RGB image
for(int i = 0; i < wh; ++i)
{
//*(buff++) = *(ptrR++);
//*(buff++) = *(ptrG++);
//*(buff++) = *(ptrB++);
//*(buff++) = *(ptrA++); //杨海洋2023-07-10
buff[0] = *(ptrR++);
buff[1] = *(ptrG++);
buff[2] = *(ptrB++);
buff[3] = *(ptrA++);
buff += 4;
}
}
}