diff --git a/src/gui/Src/Gui/CPUDisassembly.cpp b/src/gui/Src/Gui/CPUDisassembly.cpp index 48d0687d..907cf892 100644 --- a/src/gui/Src/Gui/CPUDisassembly.cpp +++ b/src/gui/Src/Gui/CPUDisassembly.cpp @@ -1405,9 +1405,17 @@ void CPUDisassembly::copySelectionSlot(bool copyBytes) QString selectionString = ""; QString selectionHtmlString = ""; QTextStream stream(&selectionString); - QTextStream htmlStream(&selectionHtmlString); - pushSelectionInto(copyBytes, stream, &htmlStream); - Bridge::CopyToClipboard(selectionString, selectionHtmlString); + if(getSelectionEnd() - getSelectionStart() < 2048) + { + QTextStream htmlStream(&selectionHtmlString); + pushSelectionInto(copyBytes, stream, &htmlStream); + Bridge::CopyToClipboard(selectionString, selectionHtmlString); + } + else + { + pushSelectionInto(copyBytes, stream, nullptr); + Bridge::CopyToClipboard(selectionString); + } } void CPUDisassembly::copySelectionToFileSlot(bool copyBytes) @@ -1449,7 +1457,7 @@ void CPUDisassembly::pushSelectionInto(bool copyBytes, QTextStream & stream, QTe QString bytes; QString bytesHtml; if(copyBytes) - RichTextPainter::htmlRichText(getRichBytes(inst, false), bytesHtml, bytes); + RichTextPainter::htmlRichText(getRichBytes(inst, false), &bytesHtml, bytes); QString disassembly; QString htmlDisassembly; if(htmlStream) @@ -1459,7 +1467,7 @@ void CPUDisassembly::pushSelectionInto(bool copyBytes, QTextStream & stream, QTe ZydisTokenizer::TokenToRichText(inst.tokens, richText, &mHighlightToken); else ZydisTokenizer::TokenToRichText(inst.tokens, richText, 0); - RichTextPainter::htmlRichText(richText, htmlDisassembly, disassembly); + RichTextPainter::htmlRichText(richText, &htmlDisassembly, disassembly); } else { @@ -1616,25 +1624,46 @@ void CPUDisassembly::copyHeaderVaSlot() void CPUDisassembly::copyDisassemblySlot() { - QString clipboardHtml = QString("
").arg(font().family()).arg(getRowHeight()); QString clipboard = ""; - prepareDataRange(getSelectionStart(), getSelectionEnd(), [&](int i, const Instruction_t & inst) + if(getSelectionEnd() - getSelectionStart() < 2048) { - if(i) + QString clipboardHtml = QString("
").arg(font().family()).arg(getRowHeight()); + prepareDataRange(getSelectionStart(), getSelectionEnd(), [&](int i, const Instruction_t & inst) { - clipboard += "\r\n"; - clipboardHtml += "
"; - } - RichTextPainter::List richText; - if(mHighlightToken.text.length()) - ZydisTokenizer::TokenToRichText(inst.tokens, richText, &mHighlightToken); - else - ZydisTokenizer::TokenToRichText(inst.tokens, richText, 0); - RichTextPainter::htmlRichText(richText, clipboardHtml, clipboard); - return true; - }); - clipboardHtml += QString("
"); - Bridge::CopyToClipboard(clipboard, clipboardHtml); + if(i) + { + clipboard += "\r\n"; + clipboardHtml += "
"; + } + RichTextPainter::List richText; + if(mHighlightToken.text.length()) + ZydisTokenizer::TokenToRichText(inst.tokens, richText, &mHighlightToken); + else + ZydisTokenizer::TokenToRichText(inst.tokens, richText, 0); + RichTextPainter::htmlRichText(richText, &clipboardHtml, clipboard); + return true; + }); + clipboardHtml += QString("
"); + Bridge::CopyToClipboard(clipboard, clipboardHtml); + } + else + { + prepareDataRange(getSelectionStart(), getSelectionEnd(), [&](int i, const Instruction_t & inst) + { + if(i) + { + clipboard += "\r\n"; + } + RichTextPainter::List richText; + if(mHighlightToken.text.length()) + ZydisTokenizer::TokenToRichText(inst.tokens, richText, &mHighlightToken); + else + ZydisTokenizer::TokenToRichText(inst.tokens, richText, 0); + RichTextPainter::htmlRichText(richText, nullptr, clipboard); + return true; + }); + Bridge::CopyToClipboard(clipboard); + } } void CPUDisassembly::labelCopySlot() diff --git a/src/gui/Src/Tracer/TraceBrowser.cpp b/src/gui/Src/Tracer/TraceBrowser.cpp index 053e3339..91204a4e 100644 --- a/src/gui/Src/Tracer/TraceBrowser.cpp +++ b/src/gui/Src/Tracer/TraceBrowser.cpp @@ -1455,7 +1455,7 @@ void TraceBrowser::pushSelectionInto(bool copyBytes, QTextStream & stream, QText QString bytes; QString bytesHTML; if(copyBytes) - RichTextPainter::htmlRichText(getRichBytes(inst), bytesHTML, bytes); + RichTextPainter::htmlRichText(getRichBytes(inst), &bytesHTML, bytes); QString disassembly; QString htmlDisassembly; if(htmlStream) @@ -1465,7 +1465,7 @@ void TraceBrowser::pushSelectionInto(bool copyBytes, QTextStream & stream, QText ZydisTokenizer::TokenToRichText(inst.tokens, richText, &mHighlightToken); else ZydisTokenizer::TokenToRichText(inst.tokens, richText, 0); - RichTextPainter::htmlRichText(richText, htmlDisassembly, disassembly); + RichTextPainter::htmlRichText(richText, &htmlDisassembly, disassembly); } else { @@ -1488,7 +1488,7 @@ void TraceBrowser::pushSelectionInto(bool copyBytes, QTextStream & stream, QText ZydisTokenizer::TokenToRichText(regTokens, richText, &mHighlightToken); else ZydisTokenizer::TokenToRichText(regTokens, richText, 0); - RichTextPainter::htmlRichText(richText, registersHtml, registersText); + RichTextPainter::htmlRichText(richText, ®istersHtml, registersText); } else { @@ -1506,7 +1506,7 @@ void TraceBrowser::pushSelectionInto(bool copyBytes, QTextStream & stream, QText ZydisTokenizer::TokenToRichText(memTokens, richText, &mHighlightToken); else ZydisTokenizer::TokenToRichText(memTokens, richText, 0); - RichTextPainter::htmlRichText(richText, memoryHtml, memoryText); + RichTextPainter::htmlRichText(richText, &memoryHtml, memoryText); } else { @@ -1572,9 +1572,17 @@ void TraceBrowser::copySelectionSlot(bool copyBytes) QString selectionString = ""; QString selectionHtmlString = ""; QTextStream stream(&selectionString); - QTextStream htmlStream(&selectionHtmlString); - pushSelectionInto(copyBytes, stream, &htmlStream); - Bridge::CopyToClipboard(selectionString, selectionHtmlString); + if(getSelectionEnd() - getSelectionStart() < 2048) + { + QTextStream htmlStream(&selectionHtmlString); + pushSelectionInto(copyBytes, stream, &htmlStream); + Bridge::CopyToClipboard(selectionString, selectionHtmlString); + } + else + { + pushSelectionInto(copyBytes, stream, nullptr); + Bridge::CopyToClipboard(selectionString); + } } void TraceBrowser::copySelectionToFileSlot(bool copyBytes) @@ -1623,22 +1631,40 @@ void TraceBrowser::copyDisassemblySlot() if(mTraceFile == nullptr || mTraceFile->Progress() < 100) return; - QString clipboardHtml = QString("
").arg(font().family()).arg(getRowHeight()); QString clipboard = ""; - for(auto i = getSelectionStart(); i <= getSelectionEnd(); i++) + if(getSelectionEnd() - getSelectionStart() < 2048) { - if(i != getSelectionStart()) + QString clipboardHtml = QString("
").arg(font().family()).arg(getRowHeight()); + for(auto i = getSelectionStart(); i <= getSelectionEnd(); i++) { - clipboard += "\r\n"; - clipboardHtml += "
"; + if(i != getSelectionStart()) + { + clipboard += "\r\n"; + clipboardHtml += "
"; + } + RichTextPainter::List richText; + const Instruction_t & inst = mTraceFile->Instruction(i); + ZydisTokenizer::TokenToRichText(inst.tokens, richText, 0); + RichTextPainter::htmlRichText(richText, &clipboardHtml, clipboard); } - RichTextPainter::List richText; - const Instruction_t & inst = mTraceFile->Instruction(i); - ZydisTokenizer::TokenToRichText(inst.tokens, richText, 0); - RichTextPainter::htmlRichText(richText, clipboardHtml, clipboard); + clipboardHtml += QString("
"); + Bridge::CopyToClipboard(clipboard, clipboardHtml); + } + else + { + for(auto i = getSelectionStart(); i <= getSelectionEnd(); i++) + { + if(i != getSelectionStart()) + { + clipboard += "\r\n"; + } + RichTextPainter::List richText; + const Instruction_t & inst = mTraceFile->Instruction(i); + ZydisTokenizer::TokenToRichText(inst.tokens, richText, 0); + RichTextPainter::htmlRichText(richText, nullptr, clipboard); + } + Bridge::CopyToClipboard(clipboard); } - clipboardHtml += QString("
"); - Bridge::CopyToClipboard(clipboard, clipboardHtml); } void TraceBrowser::copyRvaSlot() diff --git a/src/gui/Src/Utils/RichTextPainter.cpp b/src/gui/Src/Utils/RichTextPainter.cpp index 335989a8..2afc9efd 100644 --- a/src/gui/Src/Utils/RichTextPainter.cpp +++ b/src/gui/Src/Utils/RichTextPainter.cpp @@ -60,43 +60,47 @@ void RichTextPainter::paintRichText(QPainter* painter, int x, int y, int w, int * @param textHtml The HTML source. Any previous content will be preserved and new content will be appended at the end. * @param textPlain The plain text. Any previous content will be preserved and new content will be appended at the end. */ -void RichTextPainter::htmlRichText(const List & richText, QString & textHtml, QString & textPlain) +void RichTextPainter::htmlRichText(const List & richText, QString* textHtml, QString & textPlain) { for(const CustomRichText_t & curRichText : richText) { if(curRichText.text == " ") //blank { - textHtml += " "; + if(textHtml) + *textHtml += " "; textPlain += " "; continue; } - switch(curRichText.flags) + if(textHtml) { - case FlagNone: //defaults - textHtml += ""; - break; - case FlagColor: //color only - textHtml += QString("").arg(curRichText.textColor.name()); - break; - case FlagBackground: //background only - if(curRichText.textBackground != Qt::transparent) // QColor::name() returns "#000000" for transparent color. That's not desired. Leave it blank. - textHtml += QString("").arg(curRichText.textBackground.name()); - else - textHtml += QString(""); - break; - case FlagAll: //color+background - if(curRichText.textBackground != Qt::transparent) // QColor::name() returns "#000000" for transparent color. That's not desired. Leave it blank. - textHtml += QString("").arg(curRichText.textColor.name(), curRichText.textBackground.name()); - else - textHtml += QString("").arg(curRichText.textColor.name()); - break; + switch(curRichText.flags) + { + case FlagNone: //defaults + *textHtml += ""; + break; + case FlagColor: //color only + *textHtml += QString("").arg(curRichText.textColor.name()); + break; + case FlagBackground: //background only + if(curRichText.textBackground != Qt::transparent) // QColor::name() returns "#000000" for transparent color. That's not desired. Leave it blank. + *textHtml += QString("").arg(curRichText.textBackground.name()); + else + *textHtml += QString(""); + break; + case FlagAll: //color+background + if(curRichText.textBackground != Qt::transparent) // QColor::name() returns "#000000" for transparent color. That's not desired. Leave it blank. + *textHtml += QString("").arg(curRichText.textColor.name(), curRichText.textBackground.name()); + else + *textHtml += QString("").arg(curRichText.textColor.name()); + break; + } + if(curRichText.underline) //Underline highlighted token + *textHtml += ""; + *textHtml += curRichText.text.toHtmlEscaped(); + if(curRichText.underline) + *textHtml += ""; + *textHtml += ""; //Close the tag } - if(curRichText.underline) //Underline highlighted token - textHtml += ""; - textHtml += curRichText.text.toHtmlEscaped(); - if(curRichText.underline) - textHtml += ""; - textHtml += ""; //Close the tag textPlain += curRichText.text; } } diff --git a/src/gui/Src/Utils/RichTextPainter.h b/src/gui/Src/Utils/RichTextPainter.h index 1904a152..9c9b8dd0 100644 --- a/src/gui/Src/Utils/RichTextPainter.h +++ b/src/gui/Src/Utils/RichTextPainter.h @@ -36,7 +36,7 @@ public: //functions static void paintRichText(QPainter* painter, int x, int y, int w, int h, int xinc, const List & richText, CachedFontMetrics* fontMetrics); - static void htmlRichText(const List & richText, QString & textHtml, QString & textPlain); + static void htmlRichText(const List & richText, QString* textHtml, QString & textPlain); }; #endif // RICHTEXTPAINTER_H