You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

109 lines
3.2 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#ifndef SIGNPENPAINTER_H
#define SIGNPENPAINTER_H
#include <QObject>
#include <QPointF>
#include <QPainterPath>
#include "SWPosPointcut.h"
#include "signpenstructs.h"
#define MaxBrushCount 2
#define MinSpeed 300
#define MaxSpeed 400
#define MaxBrush 0.2f
class SignPainterCacheThread;
class SignPainterCacheThread_Linux;
class QPainter;
class SignPenPainter : public QObject
{
Q_OBJECT
public:
SignPenPainter();
~SignPenPainter();
void SetPainterRect(QRect rect);
void SetPenType(int type);
void SetPenColor(QColor penColor);
void SetCurrentPageIndex(int page);
void SetOffSetRect(QRect rect);
void Init();
void ClearDraw();
void DrawRect(QPainter* painter,QRect currentVisibleRect);
void MousePressed(CGPoint currentPoint,float radius,double force,double maxForce);//force 压感力度
void MouseMoved(CGPoint currentPoint,float radius,double force,double maxForce);
void MouseReleased(CGPoint currentPoint,float radius);
void SetUseCache(bool use){ isUseCache = use;}
bool GetUseCache(){return isUseCache;}
void SetUseDebug(bool use){ isOutDebug = use;}
bool GetUseDebug(){return isOutDebug;}
void SetStressSwitch(bool isStressSwitch);
bool GetStressSwitch();//是否使用压感设备
QList<SWAnnotPath*> GetAnnotPathLists();
QList<QPainterPath> GetPenPathData(QPainterPath &data, int pageIndex, QList<Element> penDataList, float factorW = 1.0, float factorH = 1.0, int offsetX = 0, int offsetY = 0);
private:
void SwPenPathDrawWithPainter(QPainter* bufPainter,bool isEnd);
void SwPenPathDraw(bool isEnd);
void SwPenPathDrawRightWithBezier(QPainterPath* bPath ,QList<Element>& elementList,SWRealPoint penPoint,CGPoint prevPoint,QList<SWRealPoint> rPoints,bool end);
bool CGPointEqualToPoint(const CGPoint &point1, const CGPoint &point2);
void CalculatePointcutWihtPoint(CGPoint point, float radius, bool stroke, bool circle);
bool GetPointValid(SWRealPoint penPoint);
CGPoint ConvertToCGPoint(SWPointcut cPoint);
float GetDistanceBetweenPoint(QPointF start, QPointF end);
QPaintDevice *PaintDevice();
void SynToBaseDevice();
signals:
void NeedsDisplay(QRect rect);
void NeedsRefresh();
void ReleasedExcuted();
//记录日志
void log(QString);
private:
QPointF CGPointZero;
int strokeSpl;
float stressSpl;
float penRadius;
SWAnnotPath *curAnnotPath;
QList<SWAnnotPath*> drawPaths;
CGPoint selectPoint;
//标记上次计算贝塞尔点
CGPoint preBezierPoint;
qint64 previousTimestamp;
float pointSpeed;
float preLineRadius;
int stressSwitch;//是否开启压感 1开启 0关闭
QImage* m_BaseBuf;
//渲染bug基于m_BaseBuf从上一次倒数10个点开始绘制绘制到倒数10个点时数据保存回m_BaseBuf
QImage* m_PaintingBuf;
QSize m_Size;
QRect m_PaintRect;
int m_StartIndex;//渲染开始的节点
int SyncCount;// 重新绘制的数据
bool isRelease;
int m_ToImageIndex;//图片后的开始渲染点
int m_FreshCount;//实时渲染的笔画数
#ifdef Q_OS_WIN
SignPainterCacheThread* cacheThread;
#else
SignPainterCacheThread_Linux* cacheThread;
#endif
bool isUseCache;
bool isOutDebug;
};
#endif // SIGNPENPAINTER_H