From 0b020810b2029dad50b00e59c516f5d6dc0ffee7 Mon Sep 17 00:00:00 2001 From: Apex Liu Date: Tue, 3 Sep 2019 05:40:52 +0800 Subject: [PATCH] .temp. new rdp-player. --- client/tp-player/main.cpp | 15 + client/tp-player/mainwindow.cpp | 199 ++++++ client/tp-player/mainwindow.h | 48 ++ client/tp-player/mainwindow.ui | 36 ++ client/tp-player/record_format.h | 96 +++ client/tp-player/res/bg.png | Bin 0 -> 64835 bytes client/tp-player/res/cursor.png | Bin 0 -> 1225 bytes client/tp-player/res/tp-player.ico | Bin 0 -> 16958 bytes client/tp-player/rle.c | 974 +++++++++++++++++++++++++++++ client/tp-player/rle.h | 31 + client/tp-player/thr_play.cpp | 87 +++ client/tp-player/thr_play.h | 25 + client/tp-player/tp-player.pro | 26 + client/tp-player/tp-player.qrc | 7 + client/tp-player/tp-player.rc | 2 + client/tp-player/update_data.cpp | 30 + client/tp-player/update_data.h | 33 + resource/icon-tp-player.psd | Bin 0 -> 58282 bytes 18 files changed, 1609 insertions(+) create mode 100644 client/tp-player/main.cpp create mode 100644 client/tp-player/mainwindow.cpp create mode 100644 client/tp-player/mainwindow.h create mode 100644 client/tp-player/mainwindow.ui create mode 100644 client/tp-player/record_format.h create mode 100644 client/tp-player/res/bg.png create mode 100644 client/tp-player/res/cursor.png create mode 100644 client/tp-player/res/tp-player.ico create mode 100644 client/tp-player/rle.c create mode 100644 client/tp-player/rle.h create mode 100644 client/tp-player/thr_play.cpp create mode 100644 client/tp-player/thr_play.h create mode 100644 client/tp-player/tp-player.pro create mode 100644 client/tp-player/tp-player.qrc create mode 100644 client/tp-player/tp-player.rc create mode 100644 client/tp-player/update_data.cpp create mode 100644 client/tp-player/update_data.h create mode 100644 resource/icon-tp-player.psd diff --git a/client/tp-player/main.cpp b/client/tp-player/main.cpp new file mode 100644 index 0000000..23849ce --- /dev/null +++ b/client/tp-player/main.cpp @@ -0,0 +1,15 @@ +#include "mainwindow.h" +#include + +int main(int argc, char *argv[]) +{ +//#if (QT_VERSION >= QT_VERSION_CHECK(5, 6, 0)) +// QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); +//#endif + + QApplication a(argc, argv); + MainWindow w; + w.show(); + + return a.exec(); +} diff --git a/client/tp-player/mainwindow.cpp b/client/tp-player/mainwindow.cpp new file mode 100644 index 0000000..2259562 --- /dev/null +++ b/client/tp-player/mainwindow.cpp @@ -0,0 +1,199 @@ +#include "mainwindow.h" +#include "ui_mainwindow.h" +#include "rle.h" + +#include +#include +#include + +bool rdpimg2QImage(QImage& out, int w, int h, int bitsPerPixel, bool isCompressed, uint8_t* dat, uint32_t len) { + switch(bitsPerPixel) { + case 15: + if(isCompressed) { + uint8_t* _dat = (uint8_t*)calloc(1, w*h*2); + if(!bitmap_decompress1(_dat, w, h, dat, len)) { + free(_dat); + return false; + } + out = QImage(_dat, w, h, QImage::Format_RGB555); + free(_dat); + } + else { + out = QImage(dat, w, h, QImage::Format_RGB555).transformed(QMatrix(1.0, 0.0, 0.0, -1.0, 0.0, 0.0)) ; + } + break; + case 16: + if(isCompressed) { + uint8_t* _dat = (uint8_t*)calloc(1, w*h*2); + if(!bitmap_decompress2(_dat, w, h, dat, len)) { + free(_dat); + return false; + } + out = QImage(_dat, w, h, QImage::Format_RGB16); + free(_dat); + } + else { + out = QImage(dat, w, h, QImage::Format_RGB16).transformed(QMatrix(1.0, 0.0, 0.0, -1.0, 0.0, 0.0)) ; + } + break; + case 24: + qDebug() << "--------NOT support 24"; + break; + case 32: + qDebug() << "--------NOT support 32"; + break; + } + + return true; +} + + +MainWindow::MainWindow(QWidget *parent) : + QMainWindow(parent), + ui(new Ui::MainWindow) +{ + m_shown = false; + m_show_bg = true; + m_bg = QImage(":/tp-player/res/bg"); + m_pt_normal = QImage(":/tp-player/res/cursor.png"); + + qDebug() << m_pt_normal.width() << "x" << m_pt_normal.height(); + + ui->setupUi(this); + + //qRegisterMetaType("update_data"); + + // frame-less window. +//#ifdef __APPLE__ +// setWindowFlags(Qt::FramelessWindowHint | Qt::MSWindowsFixedSizeDialogHint | Qt::Window); +// OSXCode::fixWin(winId()); +//#else +// setWindowFlags(Qt::FramelessWindowHint | Qt::MSWindowsFixedSizeDialogHint | windowFlags()); +//#endif //__APPLE__ + + setWindowFlags(windowFlags()&~Qt::WindowMaximizeButtonHint); // 禁止最大化按钮 + //setFixedSize(this->width(),this->height()); // 禁止拖动窗口大小 + + resize(m_bg.width(), m_bg.height()); + + connect(&m_thr_play, SIGNAL(signal_update_data(update_data*)), this, SLOT(on_update_data(update_data*))); +} + +MainWindow::~MainWindow() +{ + m_thr_play.stop(); + m_thr_play.wait(); + delete ui; +} + +void MainWindow::paintEvent(QPaintEvent *) +{ + QPainter painter(this); + + if(m_show_bg) { + //qDebug() << "draw bg."; + painter.setBrush(Qt::black); + painter.drawRect(this->rect()); + + int x = (rect().width() - m_bg.width()) / 2; + int y = (rect().height() - m_bg.height()) / 2; + painter.drawImage(x, y, m_bg); + //painter.drawPixmap(rect(), m_bg1); + } + + else { + painter.drawImage(m_img_update_x, m_img_update_y, m_img_update, 0, 0, m_img_update_w, m_img_update_h, Qt::AutoColor); + //qDebug() << "draw pt (" << m_pt.x << "," << m_pt.y << ")"; + painter.drawImage(m_pt.x, m_pt.y, m_pt_normal); + } + + + if(!m_shown) { + m_shown = true; + m_thr_play.start(); + } +} + +void MainWindow::on_update_data(update_data* dat) { + if(!dat) + return; +// qDebug() << "slot-event: " << dat->data_type(); + + if(dat->data_type() == TYPE_DATA) { + m_show_bg = false; + + if(dat->data_len() <= sizeof(TS_RECORD_PKG)) { + qDebug() << "invalid record package(1)."; + delete dat; + return; + } + + TS_RECORD_PKG* pkg = (TS_RECORD_PKG*)dat->data_buf(); + + if(pkg->type == TS_RECORD_TYPE_RDP_POINTER) { + if(dat->data_len() != sizeof(TS_RECORD_PKG) + sizeof(TS_RECORD_RDP_POINTER)) { + qDebug() << "invalid record package(2)."; + delete dat; + return; + } + + memcpy(&m_pt, dat->data_buf() + sizeof(TS_RECORD_PKG), sizeof(TS_RECORD_RDP_POINTER)); + update(); + //update(m_pt.x - 8, m_pt.y - 8, 32, 32); + } + else if(pkg->type == TS_RECORD_TYPE_RDP_IMAGE) { + if(dat->data_len() <= sizeof(TS_RECORD_PKG) + sizeof(TS_RECORD_RDP_IMAGE_INFO)) { + qDebug() << "invalid record package(3)."; + delete dat; + return; + } + + TS_RECORD_RDP_IMAGE_INFO* info = (TS_RECORD_RDP_IMAGE_INFO*)(dat->data_buf() + sizeof(TS_RECORD_PKG)); + uint8_t* img_dat = dat->data_buf() + sizeof(TS_RECORD_PKG) + sizeof(TS_RECORD_RDP_IMAGE_INFO); + uint32_t img_len = dat->data_len() - sizeof(TS_RECORD_PKG) - sizeof(TS_RECORD_RDP_IMAGE_INFO); + + rdpimg2QImage(m_img_update, info->width, info->height, info->bitsPerPixel, (info->format == TS_RDP_IMG_BMP) ? true : false, img_dat, img_len); + m_img_update_x = info->destLeft; + m_img_update_y = info->destTop; + m_img_update_w = info->destRight - info->destLeft + 1; + m_img_update_h = info->destBottom - info->destTop + 1; + + qDebug() << "img " << ((info->format == TS_RDP_IMG_BMP) ? "+" : " ") << " (" << m_img_update_x << "," << m_img_update_y << "), [" << m_img_update.width() << "x" << m_img_update.height() << "]"; + + + update(m_img_update_x, m_img_update_y, m_img_update_w, m_img_update_h); + } + + delete dat; + return; + } + + + if(dat->data_type() == TYPE_HEADER_INFO) { + if(dat->data_len() != sizeof(TS_RECORD_HEADER)) { + qDebug() << "invalid record header."; + delete dat; + return; + } + memcpy(&m_rec_hdr, dat->data_buf(), sizeof(TS_RECORD_HEADER)); + delete dat; + + qDebug() << "resize (" << m_rec_hdr.basic.width << "," << m_rec_hdr.basic.height << ")"; + if(m_rec_hdr.basic.width > 0 && m_rec_hdr.basic.height > 0) { + resize(m_rec_hdr.basic.width, m_rec_hdr.basic.height); + } + + QString title; + if (m_rec_hdr.basic.conn_port == 3389) + title.sprintf("[%s] %s@%s [Teleport-RDP录像回放]", m_rec_hdr.basic.acc_username, m_rec_hdr.basic.user_username, m_rec_hdr.basic.conn_ip); + else + title.sprintf("[%s] %s@%s:%d [Teleport-RDP录像回放]", m_rec_hdr.basic.acc_username, m_rec_hdr.basic.user_username, m_rec_hdr.basic.conn_ip, m_rec_hdr.basic.conn_port); + + setWindowTitle(title); + + return; + } + + + delete dat; +} diff --git a/client/tp-player/mainwindow.h b/client/tp-player/mainwindow.h new file mode 100644 index 0000000..cd593c0 --- /dev/null +++ b/client/tp-player/mainwindow.h @@ -0,0 +1,48 @@ +#ifndef MAINWINDOW_H +#define MAINWINDOW_H + +#include +#include "thr_play.h" +#include "update_data.h" +#include "record_format.h" + +namespace Ui { +class MainWindow; +} + +class MainWindow : public QMainWindow +{ + Q_OBJECT + +public: + explicit MainWindow(QWidget *parent = nullptr); + ~MainWindow(); + +private: + void paintEvent(QPaintEvent *); + + +private slots: + void on_update_data(update_data*); + +private: + Ui::MainWindow *ui; + QImage m_bg; + QImage m_pt_normal; + QImage m_img_update; + //QPixmap m_bg1; + bool m_shown; + + ThreadPlay m_thr_play; + + bool m_show_bg; + TS_RECORD_HEADER m_rec_hdr; + TS_RECORD_RDP_POINTER m_pt; + + int m_img_update_x; + int m_img_update_y; + int m_img_update_w; + int m_img_update_h; +}; + +#endif // MAINWINDOW_H diff --git a/client/tp-player/mainwindow.ui b/client/tp-player/mainwindow.ui new file mode 100644 index 0000000..db843d5 --- /dev/null +++ b/client/tp-player/mainwindow.ui @@ -0,0 +1,36 @@ + + + MainWindow + + + + 0 + 0 + 500 + 360 + + + + Teleport Replayer + + + + + + 0 + 0 + 500 + 17 + + + + + + false + + + + + + + diff --git a/client/tp-player/record_format.h b/client/tp-player/record_format.h new file mode 100644 index 0000000..09a1c66 --- /dev/null +++ b/client/tp-player/record_format.h @@ -0,0 +1,96 @@ +#ifndef RECORD_FORMAT_H +#define RECORD_FORMAT_H + +#include + + +#define TYPE_HEADER_INFO 0 +#define TYPE_DATA 1 + + +#define TS_RECORD_TYPE_RDP_POINTER 0x12 // 鼠标坐标位置改变,用于绘制虚拟鼠标 +#define TS_RECORD_TYPE_RDP_IMAGE 0x13 // 服务端返回的图像,用于展示 + +#define TS_RDP_BTN_FREE 0 +#define TS_RDP_BTN_PRESSED 1 +#define TS_RDP_IMG_RAW 0 // 未压缩,原始数据(根据bitsPerPixel,多个字节对应一个点的颜色) +#define TS_RDP_IMG_BMP 1 // 压缩的BMP数据 + +#pragma pack(push,1) + +// 录像文件头(随着录像数据写入,会改变的部分) +typedef struct TS_RECORD_HEADER_INFO { + uint32_t magic; // "TPPR" 标志 TelePort Protocol Record + uint16_t ver; // 录像文件版本,目前为3 + uint32_t packages; // 总包数 + uint32_t time_ms; // 总耗时(毫秒) + //uint32_t file_size; // 数据文件大小 +}TS_RECORD_HEADER_INFO; +#define ts_record_header_info_size sizeof(TS_RECORD_HEADER_INFO) + +// 录像文件头(固定不变部分) +typedef struct TS_RECORD_HEADER_BASIC { + uint16_t protocol_type; // 协议:1=RDP, 2=SSH, 3=Telnet + uint16_t protocol_sub_type; // 子协议:100=RDP-DESKTOP, 200=SSH-SHELL, 201=SSH-SFTP, 300=Telnet + uint64_t timestamp; // 本次录像的起始时间(UTC时间戳) + uint16_t width; // 初始屏幕尺寸:宽 + uint16_t height; // 初始屏幕尺寸:高 + char user_username[64]; // teleport账号 + char acc_username[64]; // 远程主机用户名 + + char host_ip[40]; // 远程主机IP + char conn_ip[40]; // 远程主机IP + uint16_t conn_port; // 远程主机端口 + + char client_ip[40]; // 客户端IP + +// // RDP专有 +// uint8_t rdp_security; // 0 = RDP, 1 = TLS + +// uint8_t _reserve[512 - 2 - 2 - 8 - 2 - 2 - 64 - 64 - 40 - 40 - 2 - 40 - 1 - ts_record_header_info_size]; + uint8_t _reserve[512 - 2 - 2 - 8 - 2 - 2 - 64 - 64 - 40 - 40 - 2 - 40 - ts_record_header_info_size]; +}TS_RECORD_HEADER_BASIC; +#define ts_record_header_basic_size sizeof(TS_RECORD_HEADER_BASIC) + +typedef struct TS_RECORD_HEADER { + TS_RECORD_HEADER_INFO info; + TS_RECORD_HEADER_BASIC basic; +}TS_RECORD_HEADER; + +// header部分(header-info + header-basic) = 512B +#define ts_record_header_size sizeof(TS_RECORD_HEADER) + +// 一个数据包的头 +typedef struct TS_RECORD_PKG { + uint8_t type; // 包的数据类型 + uint32_t size; // 这个包的总大小(不含包头) + uint32_t time_ms; // 这个包距起始时间的时间差(毫秒,意味着一个连接不能持续超过49天) + uint8_t _reserve[3]; // 保留 +}TS_RECORD_PKG; + + +typedef struct TS_RECORD_RDP_POINTER { + uint16_t x; + uint16_t y; + uint8_t button; + uint8_t pressed; +}TS_RECORD_RDP_POINTER; + +// RDP图像更新 +typedef struct TS_RECORD_RDP_IMAGE_INFO { + uint16_t destLeft; + uint16_t destTop; + uint16_t destRight; + uint16_t destBottom; + uint16_t width; + uint16_t height; + uint16_t bitsPerPixel; + uint8_t format; + uint8_t _reserved; +}TS_RECORD_RDP_IMAGE_INFO; + + +#pragma pack(pop) + + +#endif // RECORD_FORMAT_H diff --git a/client/tp-player/res/bg.png b/client/tp-player/res/bg.png new file mode 100644 index 0000000000000000000000000000000000000000..e35d6711e2651f8378e29ecdd7cafb6d4fd40a8f GIT binary patch literal 64835 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 A?*IS* literal 0 HcmV?d00001 diff --git a/client/tp-player/res/cursor.png b/client/tp-player/res/cursor.png new file mode 100644 index 0000000000000000000000000000000000000000..5728f4f4ae6dce7fd6f91a5873b42fd43aae5496 GIT binary patch literal 1225 zcmbVMTWs4@7&dGjBcjznXbjd0%i}5*+sA3_+G-e%9j{53wn~DUah+qIrf%vBwzH%~ zWg=XpsS_JiY)A-H(V*bJXCwYvVG3^ z{eRzo_x^#tovoqULKud%CVS)zS~msH#trCw`|np&wA|_^@_yDH@++zfF;TY*5Ko$F z5oVyOk3Df3c4OGOAtRUf^XXlJW}BoM=#W*@L1+x?-cfZ_tpt6%0E>ndBYyqhBLX+{ z7%>=4(`iS7!$!}z3$x>WIc>b8@j9{Ne!ROXAOaKmDqb~5El;S%h-F>@?E^7I;L9q0 zDMqX~l}``glI=n~N=CvO4FJxvBw z*g~fmG3@(}Kv9)Sg{(wK+bvRn=lOtxVZulw?2TEzS`Ay?wkCrNJ@w_U{nis z*^d#()0GfRC!Jm;w!B87P|B#P>QI2BDboz%TGsab4E)!PHMPCmm;$p?VB$ zYl2bku5Kt$MBWJfu7Qf8j>@)HHlgJw0Dweud;)EFB`!({g^{Ci zfFx3rV=b)2$P(MhMG{QeQu}RDGRZD|Sy9Tn`z%p0G3X%&| z-*$7hJ=*MmfnnRXy%Ci!!3|(U{)D_n@@#Xvq#v1lzF2W|b z2+hcx7{o2c6+YfYGaxR?QiP+423G$+Iirv>RL~s%X_lr4bzrbvZGCiD9Uf?*iE+_r z>?`fwi^ggxDT}%4xua9{(5LjK=f8gFc*i@vlT)wG)Sl^|K5;R-G4$cn(=$`=UwETq zM4Y{H`b0Ze+`R8k{Jry!zI0~sHR17*+Ln3ofrs0^_;&r=xwC`XEx!2uS5u)5XZ>}* z9ct-sxtyw{@BE`&zVh5y~k{45jla(7UpGrOW=7FX8lkLSb2QT&R{A=@1_RXKY&<3_{pN{=J fclTpUGsm!X*!dJg{&?xaWbkuICi>*L_@3H7ta+gB literal 0 HcmV?d00001 diff --git a/client/tp-player/res/tp-player.ico b/client/tp-player/res/tp-player.ico new file mode 100644 index 0000000000000000000000000000000000000000..d3fce7a44aff8e01e3bd5b95363c6fe11fdab784 GIT binary patch literal 16958 zcmd^Gdr*|u75~sE@_vfxV>-z{iId56l9{&S^pB2pI@30F(o9V=O{TRoN%NS*q$U#U z0~HYjMA(SJ!tN5aPNGIMg7_ek0HO&>RS-l4QPCKcJQ_2a1O-peZL;4gP6c8uVS1G5FHBD}&0>0uX)e=Zre#dIOodFVB(ie6TzbYgq(NHb$zVbm zuQ0v9G?VFZrbn2jG5vz+0j8fYB{Gc}4nEEYOtYC#cLmc{roBuDnNBfXV!F;mcK}^w z9xpJpGc_^oVA{ZBVFJcvSw?tfI?Hq?U<(J2!0MI($03t&lzS(YFS_yyEXyd<7F^0}LVyMTF#FR*<9m#aQVthE-akynvN%-r-h5uv5*0@c*9K%GLUcZZWExVic=A_X6{3tqUn@E@5ylwrkUc!HP zr1;M{qG*3Xk`t>p&QPAWE{tb+Bvb2}6uMAx*Kpf5n0$vN{N2OFf8G&EO$8~md2Xbs zZ9~EAEA5u~G1QQkKt1;OVDN;Rrdz`QX{h+2r>(`Yv~@vj*m3LRQI`|Xa)=8Rqrdc@ zO8EOj!QabmUbj5qw%|6)B7z!Mq)@M8f|JFs^zOo#ps-i6ZtTfU zchf8L0t4_Az*_m{^}P1fD?&b+9g%7i?ibL}PZ;TS6?Fm|kc zgOXWiNhECvz~}ZQsq|q%9Ch1M=#vn}a*TDSc>Hh7i=*v}lY^4QzJf_3l|d?Fzb6>{ z9jnI^<}0&44$WujW4Ij?smqo`joAjhmuXN>nL(G=1}9hV`Z2Z~FH5EOvJ>_7N%LsU zl2|%pj}EH+yz3dlj=iJb{LuN$bH{6W*^?Dd-8Rp-bg{FBtm*fY{Uw7A~eVNTq~6=nnnwsh$8FDDYSh_8tu-W#A8MRuX`h@vpkKkj`GEa{2sc{ zY)MtxMDzvlccEfjP-P8ahb>7-k9z8I%=%W95#<*<%JKEPb?X)#Y^bF4r|zX!A2rDG zv_TtYd-ekuUv@7`rK78png6j0KQfQt4QsDWJnjnIa#+V>G1AC+e8hqMuext%>}Kqk za|7uX>J0R|(fdgK5cl?!6%qoPEfKO_8NXe(C7B_W3v zi)T#M;Tw7f?9b`GH{_b}cb52{W6rbA)#s-Mg75zR-%l@6+48^9^S_OtrB52p`2u65 z;2+`kj5s=B)sHiR=N5~89g1~IPvCj+A6yRXswO#OE%MI4Cb)UoSCHygpU&8$2z>)Q zhx$9+d61UAG=*k8Vo?4}gVw!bIOhx@2k3Znk?;DUb06fXV>I&DWykvEn{f*pwF&=` zV$Zq*dhc%^inWJ4KZc4Q=`l7O*!vcxKY1_B`J+Lro-vONz|!bvtp}Tf%!7~}!jolw z_l~g7&+~47?7u}B2a9~`A7o#>$fGC7Gm>Bbx7T=VSVprRji&{V8)SXKJT~}~L1$^4 zn`gm0!rfU({&WD?;hQkE|F#TQ`@?SItL=fkam7TX&XM33dB5oErLvrvJT@4V^^`#s zvpjv`kR{Q?tKc2{K;LETB7UkoL7Qg?dyXgr;TeZ#t+_AH_gbRU>PaW+K^V^8$+jk1 z^z6g*@*fN;_`5;t|7q}gWSq}+9@gP9FCzXyj!zuGULfN?VY}O1#wlB>R&J2>F4iki zz6ddghx<1;I6(C^c6wz-8l^vGQ1P?e=N89lbsButYW7SR%P%;zwlrWj+5V4N)10`r zvfUEp$+8jgE}MSNX|cqI8@{`|udiLDw@c^H3%?&v8BZA0l&|NntwcW;w6jfC@GphH zZo=QX#x?fs&C&NWPU3(!n!=n_rbfJri=1-^e8L?Em#Gunw^ZxSViU_t* zsOuuwqb1xTuHYAQUyDUQ?n5WuUF4Y`gzg_%<&xJZ!B&br*76>ezWyNDUNq>?3iH0I zHd`H+t24Fj4_|YMEElZ5fvKZxl8})pgzrLN79sk*ShFjPj^c~Kft%D?S4@YClTCf~ zP@!r|ga1J@mjSy8KkReB1^bmO7ZHbC1a1++&mq2#B3z~DTZ1?0+VNG?_jaGtV@j))Pez|9FpfEW~FFrZBhxXfkt>qCuHkm&W zKhAQIv2YytSIh6v?nvKT5#^oM`FyZooKkl4N{=6Jl;FCHz1r7B4UXwf9;%mm^iIZr zwiB4;u&qRCe_%I_|LDh?d5zIqp|?jIT&enbT8ccfax)s{$YB3fI#D~%WQVNEOw+az z+D^tT;+WfIISpYq;m7wKEZ5Txeg8jFtj_(-EE7>~m|^qYXn?Mtv{B#2G$&sI3qtr7 zM7?sT8>5jvSp4u;U>zuzDdKIVs_m&R$Fsf;C;o3QHPUBQ4?FpQ&uP=^W*>56u4mj4 z{2}bJt2_dKyE><#?Qzb^gtet8hMMy9HZ)z?JF-0eFdX=Aeszw%sQude?5% zug^QmTx(caR}ep8^YA%@8Q7P4^tB^$755zy8Z*d=NyW@0Q&;(GGMDewsD5GY^2?-Szlq@h;PIB z!Txc*djs`t{*hAWIhHGIy0W|x-(O&!^JNS>v()zA#%os1eg@dn<-8((xq2F1dg})Y zKlt8UsP40OE_K-%LdD;IrI|jfnWC-dR5|+sGt{{Zz7Db86#R-1ZR{;8JlE;>Gr+Fc z|4`QDf3xkZ^5S&p3TZm}{^$Mf;p}#L+QcgJS=+ zF+D;d+@>hK@s^CUt>QV8r?`!CXbvgrZ3%%POt9sgjtsslR~#{|SbaN`?l z-u)@A$j1pvF&|06J8 zUZ=I2IO}Z8SJ&A({QaM`(&xLTI`crskCh}+b*A1<;mtqVt|2dx$8PhSAovp@eAM1~ z#dDYBpBCwd!as5NJFjOm;~2EOT|FAqFNSJtckEXbkDmP`%2*4o4K z3C=npKjt~C>vyq#@bIemfVjaU{13j)A?;<~xn|rK7=hid|2L2fI!n!R2mZl<8+4-4 zLfvcC`OH^&;IWt6*blFQXHy7YtZsgUETKE_;rgm`2>Z|ceD{~v`3?LwTRip_oPXGn zcfYGG+3wi7T5qQtNu45Zk1g8mcan8b#C_SyMSc!}eX{f%5U(yRWUz0g-sS*a>e)XP zrZZb^nRk@Lv7gl3_XKW)I42No zU5jC!oP_g<-4;dUN^eqGM2cHsr%h-zqdp-ht%)@~jW$ek~vz9i!uOa}ZUI~9&fV8sQLXJZYZLH5bv-IoJ z;mBf7b}}8eri9w&GVg5?e%uk0zl};9a_Dg+5cX(0`Q8KcHdySiebp>YbDpg|;}}+Z zdt+*n@Z)}*_xDkM#`^gb`y_By2{y;NoFwPnhuWNpe7-!98gqGELvqQqa z{=2~c9oM;D!mrrCzhmA;UH2HDeE;qHe*f`%eg75xfb{_~fF7VPi2Kj)a~yZWdYC?E zy2*4qbaNzi;4aSVZt45+~o!)U{mfti*X=O$ax{BSSIWn?qhn0=~qm!BRt0R z6q9`SU7Rn&IV1QQaNa 1999-2008 + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +/* three seperate function for speed when decompressing the bitmaps + when modifing one function make the change in the others + jay.sorg@gmail.com */ + +/* indent is confused by this file */ +/* *INDENT-OFF* */ + + +#include +#include "rle.h" + +/* Specific rename for RDPY integration */ +#define unimpl(str, code) + +//#define RD_BOOL int +//#define False 0 +//#define True 1 +/* end specific rename */ + +#define CVAL(p) (*(p++)) +//#ifdef NEED_ALIGN +//#ifdef L_ENDIAN +#define CVAL2(p, v) { v = (*(p++)); v |= (*(p++)) << 8; } +//#else +//#define CVAL2(p, v) { v = (*(p++)) << 8; v |= (*(p++)); } +//#endif /* L_ENDIAN */ +//#else +//#define CVAL2(p, v) { v = (*((uint16*)p)); p += 2; } +//#endif /* NEED_ALIGN */ + +#define UNROLL8(exp) { exp exp exp exp exp exp exp exp } + +#define REPEAT(statement) \ +{ \ + while((count & ~0x7) && ((x+8) < width)) \ + UNROLL8( statement; count--; x++; ); \ + \ + while((count > 0) && (x < width)) \ + { \ + statement; \ + count--; \ + x++; \ + } \ +} + +#define MASK_UPDATE() \ +{ \ + mixmask <<= 1; \ + if (mixmask == 0) \ + { \ + mask = fom_mask ? fom_mask : CVAL(input); \ + mixmask = 1; \ + } \ +} + +/* 1 byte bitmap decompress */ +RD_BOOL +bitmap_decompress1(uint8 * output, int width, int height, uint8 * input, int size) +{ + uint8 *end = input + size; + uint8 *prevline = NULL, *line = NULL; + int opcode, count, offset, isfillormix, x = width; + int lastopcode = -1, insertmix = False, bicolour = False; + uint8 code; + uint8 colour1 = 0, colour2 = 0; + uint8 mixmask, mask = 0; + uint8 mix = 0xff; + int fom_mask = 0; + + while (input < end) + { + fom_mask = 0; + code = CVAL(input); + opcode = code >> 4; + /* Handle different opcode forms */ + switch (opcode) + { + case 0xc: + case 0xd: + case 0xe: + opcode -= 6; + count = code & 0xf; + offset = 16; + break; + case 0xf: + opcode = code & 0xf; + if (opcode < 9) + { + count = CVAL(input); + count |= CVAL(input) << 8; + } + else + { + count = (opcode < 0xb) ? 8 : 1; + } + offset = 0; + break; + default: + opcode >>= 1; + count = code & 0x1f; + offset = 32; + break; + } + /* Handle strange cases for counts */ + if (offset != 0) + { + isfillormix = ((opcode == 2) || (opcode == 7)); + if (count == 0) + { + if (isfillormix) + count = CVAL(input) + 1; + else + count = CVAL(input) + offset; + } + else if (isfillormix) + { + count <<= 3; + } + } + /* Read preliminary data */ + switch (opcode) + { + case 0: /* Fill */ + if ((lastopcode == opcode) && !((x == width) && (prevline == NULL))) + insertmix = True; + break; + case 8: /* Bicolour */ + colour1 = CVAL(input); + case 3: /* Colour */ + colour2 = CVAL(input); + break; + case 6: /* SetMix/Mix */ + case 7: /* SetMix/FillOrMix */ + mix = CVAL(input); + opcode -= 5; + break; + case 9: /* FillOrMix_1 */ + mask = 0x03; + opcode = 0x02; + fom_mask = 3; + break; + case 0x0a: /* FillOrMix_2 */ + mask = 0x05; + opcode = 0x02; + fom_mask = 5; + break; + } + lastopcode = opcode; + mixmask = 0; + /* Output body */ + while (count > 0) + { + if (x >= width) + { + if (height <= 0) + return False; + x = 0; + height--; + prevline = line; + line = output + height * width; + } + switch (opcode) + { + case 0: /* Fill */ + if (insertmix) + { + if (prevline == NULL) + line[x] = mix; + else + line[x] = prevline[x] ^ mix; + insertmix = False; + count--; + x++; + } + if (prevline == NULL) + { + REPEAT(line[x] = 0) + } + else + { + REPEAT(line[x] = prevline[x]) + } + break; + case 1: /* Mix */ + if (prevline == NULL) + { + REPEAT(line[x] = mix) + } + else + { + REPEAT(line[x] = prevline[x] ^ mix) + } + break; + case 2: /* Fill or Mix */ + if (prevline == NULL) + { + REPEAT + ( + MASK_UPDATE(); + if (mask & mixmask) + line[x] = mix; + else + line[x] = 0; + ) + } + else + { + REPEAT + ( + MASK_UPDATE(); + if (mask & mixmask) + line[x] = prevline[x] ^ mix; + else + line[x] = prevline[x]; + ) + } + break; + case 3: /* Colour */ + REPEAT(line[x] = colour2) + break; + case 4: /* Copy */ + REPEAT(line[x] = CVAL(input)) + break; + case 8: /* Bicolour */ + REPEAT + ( + if (bicolour) + { + line[x] = colour2; + bicolour = False; + } + else + { + line[x] = colour1; + bicolour = True; count++; + } + ) + break; + case 0xd: /* White */ + REPEAT(line[x] = 0xff) + break; + case 0xe: /* Black */ + REPEAT(line[x] = 0) + break; + default: + unimpl("bitmap opcode 0x%x\n", opcode); + return False; + } + } + } + return True; +} + +/* 2 byte bitmap decompress */ +RD_BOOL +bitmap_decompress2(uint8 * output, int width, int height, uint8 * input, int size) +{ + uint8 *end = input + size; + uint16 *prevline = NULL, *line = NULL; + int opcode, count, offset, isfillormix, x = width; + int lastopcode = -1, insertmix = False, bicolour = False; + uint8 code; + uint16 colour1 = 0, colour2 = 0; + uint8 mixmask, mask = 0; + uint16 mix = 0xffff; + int fom_mask = 0; + + while (input < end) + { + fom_mask = 0; + code = CVAL(input); + opcode = code >> 4; + /* Handle different opcode forms */ + switch (opcode) + { + case 0xc: + case 0xd: + case 0xe: + opcode -= 6; + count = code & 0xf; + offset = 16; + break; + case 0xf: + opcode = code & 0xf; + if (opcode < 9) + { + count = CVAL(input); + count |= CVAL(input) << 8; + } + else + { + count = (opcode < 0xb) ? 8 : 1; + } + offset = 0; + break; + default: + opcode >>= 1; + count = code & 0x1f; + offset = 32; + break; + } + /* Handle strange cases for counts */ + if (offset != 0) + { + isfillormix = ((opcode == 2) || (opcode == 7)); + if (count == 0) + { + if (isfillormix) + count = CVAL(input) + 1; + else + count = CVAL(input) + offset; + } + else if (isfillormix) + { + count <<= 3; + } + } + /* Read preliminary data */ + switch (opcode) + { + case 0: /* Fill */ + if ((lastopcode == opcode) && !((x == width) && (prevline == NULL))) + insertmix = True; + break; + case 8: /* Bicolour */ + CVAL2(input, colour1); + case 3: /* Colour */ + CVAL2(input, colour2); + break; + case 6: /* SetMix/Mix */ + case 7: /* SetMix/FillOrMix */ + CVAL2(input, mix); + opcode -= 5; + break; + case 9: /* FillOrMix_1 */ + mask = 0x03; + opcode = 0x02; + fom_mask = 3; + break; + case 0x0a: /* FillOrMix_2 */ + mask = 0x05; + opcode = 0x02; + fom_mask = 5; + break; + } + lastopcode = opcode; + mixmask = 0; + /* Output body */ + while (count > 0) + { + if (x >= width) + { + if (height <= 0) + return False; + x = 0; + height--; + prevline = line; + line = ((uint16 *) output) + height * width; + } + switch (opcode) + { + case 0: /* Fill */ + if (insertmix) + { + if (prevline == NULL) + line[x] = mix; + else + line[x] = prevline[x] ^ mix; + insertmix = False; + count--; + x++; + } + if (prevline == NULL) + { + REPEAT(line[x] = 0) + } + else + { + REPEAT(line[x] = prevline[x]) + } + break; + case 1: /* Mix */ + if (prevline == NULL) + { + REPEAT(line[x] = mix) + } + else + { + REPEAT(line[x] = prevline[x] ^ mix) + } + break; + case 2: /* Fill or Mix */ + if (prevline == NULL) + { + REPEAT + ( + MASK_UPDATE(); + if (mask & mixmask) + line[x] = mix; + else + line[x] = 0; + ) + } + else + { + REPEAT + ( + MASK_UPDATE(); + if (mask & mixmask) + line[x] = prevline[x] ^ mix; + else + line[x] = prevline[x]; + ) + } + break; + case 3: /* Colour */ + REPEAT(line[x] = colour2) + break; + case 4: /* Copy */ + REPEAT(CVAL2(input, line[x])) + break; + case 8: /* Bicolour */ + REPEAT + ( + if (bicolour) + { + line[x] = colour2; + bicolour = False; + } + else + { + line[x] = colour1; + bicolour = True; + count++; + } + ) + break; + case 0xd: /* White */ + REPEAT(line[x] = 0xffff) + break; + case 0xe: /* Black */ + REPEAT(line[x] = 0) + break; + default: + unimpl("bitmap opcode 0x%x\n", opcode); + return False; + } + } + } + return True; +} + +/* 3 byte bitmap decompress */ +RD_BOOL +bitmap_decompress3(uint8 * output, int width, int height, uint8 * input, int size) +{ + uint8 *end = input + size; + uint8 *prevline = NULL, *line = NULL; + int opcode, count, offset, isfillormix, x = width; + int lastopcode = -1, insertmix = False, bicolour = False; + uint8 code; + uint8 colour1[3] = {0, 0, 0}, colour2[3] = {0, 0, 0}; + uint8 mixmask, mask = 0; + uint8 mix[3] = {0xff, 0xff, 0xff}; + int fom_mask = 0; + + while (input < end) + { + fom_mask = 0; + code = CVAL(input); + opcode = code >> 4; + /* Handle different opcode forms */ + switch (opcode) + { + case 0xc: + case 0xd: + case 0xe: + opcode -= 6; + count = code & 0xf; + offset = 16; + break; + case 0xf: + opcode = code & 0xf; + if (opcode < 9) + { + count = CVAL(input); + count |= CVAL(input) << 8; + } + else + { + count = (opcode < + 0xb) ? 8 : 1; + } + offset = 0; + break; + default: + opcode >>= 1; + count = code & 0x1f; + offset = 32; + break; + } + /* Handle strange cases for counts */ + if (offset != 0) + { + isfillormix = ((opcode == 2) || (opcode == 7)); + if (count == 0) + { + if (isfillormix) + count = CVAL(input) + 1; + else + count = CVAL(input) + offset; + } + else if (isfillormix) + { + count <<= 3; + } + } + /* Read preliminary data */ + switch (opcode) + { + case 0: /* Fill */ + if ((lastopcode == opcode) && !((x == width) && (prevline == NULL))) + insertmix = True; + break; + case 8: /* Bicolour */ + colour1[0] = CVAL(input); + colour1[1] = CVAL(input); + colour1[2] = CVAL(input); + case 3: /* Colour */ + colour2[0] = CVAL(input); + colour2[1] = CVAL(input); + colour2[2] = CVAL(input); + break; + case 6: /* SetMix/Mix */ + case 7: /* SetMix/FillOrMix */ + mix[0] = CVAL(input); + mix[1] = CVAL(input); + mix[2] = CVAL(input); + opcode -= 5; + break; + case 9: /* FillOrMix_1 */ + mask = 0x03; + opcode = 0x02; + fom_mask = 3; + break; + case 0x0a: /* FillOrMix_2 */ + mask = 0x05; + opcode = 0x02; + fom_mask = 5; + break; + } + lastopcode = opcode; + mixmask = 0; + /* Output body */ + while (count > 0) + { + if (x >= width) + { + if (height <= 0) + return False; + x = 0; + height--; + prevline = line; + line = output + height * (width * 3); + } + switch (opcode) + { + case 0: /* Fill */ + if (insertmix) + { + if (prevline == NULL) + { + line[x * 3] = mix[0]; + line[x * 3 + 1] = mix[1]; + line[x * 3 + 2] = mix[2]; + } + else + { + line[x * 3] = + prevline[x * 3] ^ mix[0]; + line[x * 3 + 1] = + prevline[x * 3 + 1] ^ mix[1]; + line[x * 3 + 2] = + prevline[x * 3 + 2] ^ mix[2]; + } + insertmix = False; + count--; + x++; + } + if (prevline == NULL) + { + REPEAT + ( + line[x * 3] = 0; + line[x * 3 + 1] = 0; + line[x * 3 + 2] = 0; + ) + } + else + { + REPEAT + ( + line[x * 3] = prevline[x * 3]; + line[x * 3 + 1] = prevline[x * 3 + 1]; + line[x * 3 + 2] = prevline[x * 3 + 2]; + ) + } + break; + case 1: /* Mix */ + if (prevline == NULL) + { + REPEAT + ( + line[x * 3] = mix[0]; + line[x * 3 + 1] = mix[1]; + line[x * 3 + 2] = mix[2]; + ) + } + else + { + REPEAT + ( + line[x * 3] = + prevline[x * 3] ^ mix[0]; + line[x * 3 + 1] = + prevline[x * 3 + 1] ^ mix[1]; + line[x * 3 + 2] = + prevline[x * 3 + 2] ^ mix[2]; + ) + } + break; + case 2: /* Fill or Mix */ + if (prevline == NULL) + { + REPEAT + ( + MASK_UPDATE(); + if (mask & mixmask) + { + line[x * 3] = mix[0]; + line[x * 3 + 1] = mix[1]; + line[x * 3 + 2] = mix[2]; + } + else + { + line[x * 3] = 0; + line[x * 3 + 1] = 0; + line[x * 3 + 2] = 0; + } + ) + } + else + { + REPEAT + ( + MASK_UPDATE(); + if (mask & mixmask) + { + line[x * 3] = + prevline[x * 3] ^ mix [0]; + line[x * 3 + 1] = + prevline[x * 3 + 1] ^ mix [1]; + line[x * 3 + 2] = + prevline[x * 3 + 2] ^ mix [2]; + } + else + { + line[x * 3] = + prevline[x * 3]; + line[x * 3 + 1] = + prevline[x * 3 + 1]; + line[x * 3 + 2] = + prevline[x * 3 + 2]; + } + ) + } + break; + case 3: /* Colour */ + REPEAT + ( + line[x * 3] = colour2 [0]; + line[x * 3 + 1] = colour2 [1]; + line[x * 3 + 2] = colour2 [2]; + ) + break; + case 4: /* Copy */ + REPEAT + ( + line[x * 3] = CVAL(input); + line[x * 3 + 1] = CVAL(input); + line[x * 3 + 2] = CVAL(input); + ) + break; + case 8: /* Bicolour */ + REPEAT + ( + if (bicolour) + { + line[x * 3] = colour2[0]; + line[x * 3 + 1] = colour2[1]; + line[x * 3 + 2] = colour2[2]; + bicolour = False; + } + else + { + line[x * 3] = colour1[0]; + line[x * 3 + 1] = colour1[1]; + line[x * 3 + 2] = colour1[2]; + bicolour = True; + count++; + } + ) + break; + case 0xd: /* White */ + REPEAT + ( + line[x * 3] = 0xff; + line[x * 3 + 1] = 0xff; + line[x * 3 + 2] = 0xff; + ) + break; + case 0xe: /* Black */ + REPEAT + ( + line[x * 3] = 0; + line[x * 3 + 1] = 0; + line[x * 3 + 2] = 0; + ) + break; + default: + unimpl("bitmap opcode 0x%x\n", opcode); + return False; + } + } + } + return True; +} + +/* decompress a colour plane */ +static int +process_plane(uint8 * in, int width, int height, uint8 * out, int size) +{ + int indexw; + int indexh; + int code; + int collen; + int replen; + int color; + int x; + int revcode; + uint8 * last_line; + uint8 * this_line; + uint8 * org_in; + uint8 * org_out; + + org_in = in; + org_out = out; + last_line = 0; + indexh = 0; + while (indexh < height) + { + out = (org_out + width * height * 4) - ((indexh + 1) * width * 4); + color = 0; + this_line = out; + indexw = 0; + if (last_line == 0) + { + while (indexw < width) + { + code = CVAL(in); + replen = code & 0xf; + collen = (code >> 4) & 0xf; + revcode = (replen << 4) | collen; + if ((revcode <= 47) && (revcode >= 16)) + { + replen = revcode; + collen = 0; + } + while (collen > 0) + { + color = CVAL(in); + *out = color; + out += 4; + indexw++; + collen--; + } + while (replen > 0) + { + *out = color; + out += 4; + indexw++; + replen--; + } + } + } + else + { + while (indexw < width) + { + code = CVAL(in); + replen = code & 0xf; + collen = (code >> 4) & 0xf; + revcode = (replen << 4) | collen; + if ((revcode <= 47) && (revcode >= 16)) + { + replen = revcode; + collen = 0; + } + while (collen > 0) + { + x = CVAL(in); + if (x & 1) + { + x = x >> 1; + x = x + 1; + color = -x; + } + else + { + x = x >> 1; + color = x; + } + x = last_line[indexw * 4] + color; + *out = x; + out += 4; + indexw++; + collen--; + } + while (replen > 0) + { + x = last_line[indexw * 4] + color; + *out = x; + out += 4; + indexw++; + replen--; + } + } + } + indexh++; + last_line = this_line; + } + return (int) (in - org_in); +} + +/* 4 byte bitmap decompress */ +RD_BOOL +bitmap_decompress4(uint8 * output, int width, int height, uint8 * input, int size) +{ + int code; + int bytes_pro; + int total_pro; + + code = CVAL(input); + if (code != 0x10) + { + return False; + } + total_pro = 1; + bytes_pro = process_plane(input, width, height, output + 3, size - total_pro); + total_pro += bytes_pro; + input += bytes_pro; + bytes_pro = process_plane(input, width, height, output + 2, size - total_pro); + total_pro += bytes_pro; + input += bytes_pro; + bytes_pro = process_plane(input, width, height, output + 1, size - total_pro); + total_pro += bytes_pro; + input += bytes_pro; + bytes_pro = process_plane(input, width, height, output + 0, size - total_pro); + total_pro += bytes_pro; + return size == total_pro; +} + +int +bitmap_decompress_15(uint8 * output, int output_width, int output_height, int input_width, int input_height, uint8* input, int size) { + uint8 * temp = (uint8*)malloc(input_width * input_height * 2); + RD_BOOL rv = bitmap_decompress2(temp, input_width, input_height, input, size); + + // convert to rgba + for (int y = 0; y < output_height; y++) { + for (int x = 0; x < output_width; x++) { + uint16 a = ((uint16*)temp)[y * input_width + x]; + uint8 r = (a & 0x7c00) >> 10; + uint8 g = (a & 0x03e0) >> 5; + uint8 b = (a & 0x001f); + r = r * 255 / 31; + g = g * 255 / 31; + b = b * 255 / 31; + ((uint32*)output)[y * output_width + x] = 0xff << 24 | b << 16 | g << 8 | r; + } + } + + free(temp); + return rv; +} + +int +bitmap_decompress_16(uint8 * output, int output_width, int output_height, int input_width, int input_height, uint8* input, int size) { + uint8 * temp = (uint8*)malloc(input_width * input_height * 2); + RD_BOOL rv = bitmap_decompress2(temp, input_width, input_height, input, size); + + // convert to rgba + for (int y = 0; y < output_height; y++) { + for (int x = 0; x < output_width; x++) { + uint16 a = ((uint16*)temp)[y * input_width + x]; + uint8 r = (a & 0xf800) >> 11; + uint8 g = (a & 0x07e0) >> 5; + uint8 b = (a & 0x001f); + r = r * 255 / 31; + g = g * 255 / 63; + b = b * 255 / 31; + ((uint32*)output)[y * output_width + x] = 0xff << 24 | b << 16 | g << 8 | r; + } + } + free(temp); + return rv; +} + +int +bitmap_decompress_24(uint8 * output, int output_width, int output_height, int input_width, int input_height, uint8* input, int size) { + uint8 * temp = (uint8*)malloc(input_width * input_height * 3); + RD_BOOL rv = bitmap_decompress3(temp, input_width, input_height, input, size); + + // convert to rgba + for (int y = 0; y < output_height; y++) { + for (int x = 0; x < output_width; x++) { + uint8 r = temp[(y * input_width + x) * 3]; + uint8 g = temp[(y * input_width + x) * 3 + 1]; + uint8 b = temp[(y * input_width + x) * 3 + 2]; + ((uint32*)output)[y * output_width + x] = 0xff << 24 | b << 16 | g << 8 | r; + } + } + free(temp); + + return rv; +} + +int +bitmap_decompress_32(uint8 * output, int output_width, int output_height, int input_width, int input_height, uint8* input, int size) { + uint8 * temp = (uint8*)malloc(input_width * input_height * 4); + RD_BOOL rv = bitmap_decompress4(temp, input_width, input_height, input, size); + + // convert to rgba + for (int y = 0; y < output_height; y++) { + for (int x = 0; x < output_width; x++) { + uint8 r = temp[(y * input_width + x) * 4]; + uint8 g = temp[(y * input_width + x) * 4 + 1]; + uint8 b = temp[(y * input_width + x) * 4 + 2]; + uint8 a = temp[(y * input_width + x) * 4 + 3]; + ((uint32*)output)[y * output_width + x] = 0xff << 24 | r << 16 | g << 8 | b; + } + } + free(temp); + + return rv; +} diff --git a/client/tp-player/rle.h b/client/tp-player/rle.h new file mode 100644 index 0000000..3257d8f --- /dev/null +++ b/client/tp-player/rle.h @@ -0,0 +1,31 @@ +#ifndef RLE_H +#define RLE_H + +#define RD_BOOL int +#define False 0 +#define True 1 + +#define uint8 unsigned char +#define uint16 unsigned short +#define uint32 unsigned int + +#ifdef __cplusplus +extern "C" { +#endif + +RD_BOOL bitmap_decompress1(uint8 * output, int width, int height, uint8 * input, int size); +RD_BOOL bitmap_decompress2(uint8 * output, int width, int height, uint8 * input, int size); +RD_BOOL bitmap_decompress3(uint8 * output, int width, int height, uint8 * input, int size); +RD_BOOL bitmap_decompress4(uint8 * output, int width, int height, uint8 * input, int size); + +//int bitmap_decompress_15(uint8 * output, int output_width, int output_height, int input_width, int input_height, uint8* input, int size); +//int bitmap_decompress_16(uint8 * output, int output_width, int output_height, int input_width, int input_height, uint8* input, int size); +//int bitmap_decompress_24(uint8 * output, int output_width, int output_height, int input_width, int input_height, uint8* input, int size); +//int bitmap_decompress_32(uint8 * output, int output_width, int output_height, int input_width, int input_height, uint8* input, int size); + + +#ifdef __cplusplus +} +#endif + +#endif // RLE_H diff --git a/client/tp-player/thr_play.cpp b/client/tp-player/thr_play.cpp new file mode 100644 index 0000000..6f5b64f --- /dev/null +++ b/client/tp-player/thr_play.cpp @@ -0,0 +1,87 @@ +#include +#include + +#include "thr_play.h" +#include "record_format.h" + +static QString REPLAY_PATH = "E:\\work\\tp4a\\teleport\\server\\share\\replay\\rdp\\000000197\\"; + + +ThreadPlay::ThreadPlay() +{ + m_need_stop = false; +} + +void ThreadPlay::stop() { + m_need_stop = true; +} + +void ThreadPlay::run() { + qint64 read_len = 0; + uint32_t total_pkg = 0; + + QString hdr_filename(REPLAY_PATH); + hdr_filename += "tp-rdp.tpr"; + + QFile f_hdr(hdr_filename); + if(!f_hdr.open(QFile::ReadOnly)) { + qDebug() << "Can not open " << hdr_filename << " for read."; + return; + } + else { + update_data* dat = new update_data; + dat->data_type(TYPE_HEADER_INFO); + dat->alloc_data(sizeof(TS_RECORD_HEADER)); + + read_len = f_hdr.read((char*)(dat->data_buf()), dat->data_len()); + if(read_len != sizeof(TS_RECORD_HEADER)) { + delete dat; + qDebug() << "invaid .tpr file."; + return; + } + + TS_RECORD_HEADER* hdr = (TS_RECORD_HEADER*)dat->data_buf(); + total_pkg = hdr->info.packages; + + emit signal_update_data(dat); + } + + + + QString dat_filename(REPLAY_PATH); + dat_filename += "tp-rdp.dat"; + + QFile f_dat(dat_filename); + if(!f_dat.open(QFile::ReadOnly)) { + qDebug() << "Can not open " << dat_filename << " for read."; + return; + } + + for(uint32_t i = 0; i < total_pkg; ++i) { + if(m_need_stop) { + qDebug() << "stop, user cancel."; + break; + } + + TS_RECORD_PKG pkg; + read_len = f_dat.read((char*)(&pkg), sizeof(pkg)); + if(read_len != sizeof(TS_RECORD_PKG)) { + qDebug() << "invaid .dat file."; + return; + } + + update_data* dat = new update_data; + dat->data_type(TYPE_DATA); + dat->alloc_data(sizeof(TS_RECORD_PKG) + pkg.size); + memcpy(dat->data_buf(), &pkg, sizeof(TS_RECORD_PKG)); + read_len = f_dat.read((char*)(dat->data_buf()+sizeof(TS_RECORD_PKG)), pkg.size); + if(read_len != pkg.size) { + delete dat; + qDebug() << "invaid .dat file."; + return; + } + + emit signal_update_data(dat); + msleep(5); + } +} diff --git a/client/tp-player/thr_play.h b/client/tp-player/thr_play.h new file mode 100644 index 0000000..3c3bb2d --- /dev/null +++ b/client/tp-player/thr_play.h @@ -0,0 +1,25 @@ +#ifndef THR_PLAY_H +#define THR_PLAY_H + +#include +#include "update_data.h" + + +class ThreadPlay : public QThread +{ + Q_OBJECT +public: + ThreadPlay(); + + virtual void run(); + void stop(); + + +signals: + void signal_update_data(update_data*); + +private: + bool m_need_stop; +}; + +#endif // THR_PLAY_H diff --git a/client/tp-player/tp-player.pro b/client/tp-player/tp-player.pro new file mode 100644 index 0000000..cb73260 --- /dev/null +++ b/client/tp-player/tp-player.pro @@ -0,0 +1,26 @@ +TEMPLATE = app +TARGET = tp-player + +QT += core gui widgets + +HEADERS += \ + mainwindow.h \ + thr_play.h \ + update_data.h \ + record_format.h \ + rle.h + +SOURCES += main.cpp \ + mainwindow.cpp \ + thr_play.cpp \ + update_data.cpp \ + rle.c + +RESOURCES += \ + tp-player.qrc + +RC_FILE += \ + tp-player.rc + +FORMS += \ + mainwindow.ui diff --git a/client/tp-player/tp-player.qrc b/client/tp-player/tp-player.qrc new file mode 100644 index 0000000..7b8956f --- /dev/null +++ b/client/tp-player/tp-player.qrc @@ -0,0 +1,7 @@ + + + res/logo.png + res/bg.png + res/cursor.png + + diff --git a/client/tp-player/tp-player.rc b/client/tp-player/tp-player.rc new file mode 100644 index 0000000..df678b3 --- /dev/null +++ b/client/tp-player/tp-player.rc @@ -0,0 +1,2 @@ +IDI_ICON1 ICON DISCARDABLE "res\\tp-player.ico" + diff --git a/client/tp-player/update_data.cpp b/client/tp-player/update_data.cpp new file mode 100644 index 0000000..d84f364 --- /dev/null +++ b/client/tp-player/update_data.cpp @@ -0,0 +1,30 @@ +#include "update_data.h" + +update_data::update_data(QObject *parent) : QObject(parent) +{ + m_data_type = 0xff; + m_data_buf = nullptr; + m_data_len = 0; +} + +update_data::~update_data() { + if(m_data_buf) + delete m_data_buf; +} + +void update_data::alloc_data(uint32_t len) { + if(m_data_buf) + delete m_data_buf; + + m_data_buf = new uint8_t[len]; + memset(m_data_buf, 0, len); + m_data_len = len; +} + +void update_data::attach_data(const uint8_t* dat, uint32_t len) { + if(m_data_buf) + delete m_data_buf; + m_data_buf = new uint8_t[len]; + memcpy(m_data_buf, dat, len); + m_data_len = len; +} diff --git a/client/tp-player/update_data.h b/client/tp-player/update_data.h new file mode 100644 index 0000000..505c040 --- /dev/null +++ b/client/tp-player/update_data.h @@ -0,0 +1,33 @@ +#ifndef UPDATE_DATA_H +#define UPDATE_DATA_H + +#include + +class update_data : public QObject +{ + Q_OBJECT +public: + explicit update_data(QObject *parent = nullptr); + virtual ~update_data(); + + void alloc_data(uint32_t len); + void attach_data(const uint8_t* dat, uint32_t len); + + void data_type(int dt) {m_data_type = dt;} + int data_type() const {return m_data_type;} + + uint8_t* data_buf() {return m_data_buf;} + uint32_t data_len() const {return m_data_len;} + +signals: + +public slots: + + +private: + int m_data_type; + uint8_t* m_data_buf; + uint32_t m_data_len; +}; + +#endif // UPDATE_DATA_H diff --git a/resource/icon-tp-player.psd b/resource/icon-tp-player.psd new file mode 100644 index 0000000000000000000000000000000000000000..3ae900860f106fbbee070c6c3eaed47f69d23f8a GIT binary patch literal 58282 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 Bj4J>D literal 0 HcmV?d00001