<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Word 14 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
{font-family:\5B8B\4F53;
panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
{font-family:\5B8B\4F53;
panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
{font-family:"\@\5B8B\4F53";
panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
font-family:"Calibri","sans-serif";}
a:link, span.MsoHyperlink
{mso-style-priority:99;
color:blue;
text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
{mso-style-priority:99;
color:purple;
text-decoration:underline;}
span.EmailStyle17
{mso-style-type:personal-compose;
font-family:"Calibri","sans-serif";
color:windowtext;}
.MsoChpDefault
{mso-style-type:export-only;
font-family:"Calibri","sans-serif";}
/* Page Definitions */
@page WordSection1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;}
div.WordSection1
{page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="ZH-CN" link="blue" vlink="purple" style="text-justify-trim:punctuation">
<div class="WordSection1">
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">Hi, it’s the a patch for MD5. Limited to size, the thirdparty is attached.<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">Subject: [PATCH] Add glretrace option '--snapshot-format=MD5' that allow write image MD5 to a text format file.<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">Collecting MD5 is obtained based on raw buffer. Rendering results are reproducd accurately. Creating .txt in place of PNG Format, that would save more disk space
and run faster.<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">Reference command: glretrace --snapshot-format=MD5 -s /tmp/MD5.log smokinguns.trace.<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">---<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">CMakeLists.txt | 5 +<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">image/CMakeLists.txt | 3 +<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">image/image.hpp | 6 +<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">image/image_md5.cpp | 88 +++<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">retrace/retrace_main.cpp | 25 +-<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">thirdparty/md5/CMakeLists.txt | 7 +<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">thirdparty/md5/index.html | 242 +++++++++<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">thirdparty/md5/main.c | 275 ++++++++++<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">thirdparty/md5/md5.c | 255 +++++++++<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">thirdparty/md5/md5.h | 52 ++<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">thirdparty/md5/md5.sln | 21 +<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">thirdparty/md5/md5.vcproj | 130 +++++<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">thirdparty/md5/rfc1321.html | 1093 ++++++++++++++++++++++++++++++++++++++<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">thirdparty/md5/rfc1321.txt | 1179 +++++++++++++++++++++++++++++++++++++++++<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">14 files changed, 3373 insertions(+), 8 deletions(-)<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">create mode 100644 image/image_md5.cpp<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">create mode 100644 thirdparty/md5/CMakeLists.txt<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">create mode 100644 thirdparty/md5/index.html<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">create mode 100644 thirdparty/md5/main.c<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">create mode 100644 thirdparty/md5/md5.c<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">create mode 100644 thirdparty/md5/md5.h<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">create mode 100644 thirdparty/md5/md5.sln<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">create mode 100644 thirdparty/md5/md5.vcproj<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">create mode 100644 thirdparty/md5/rfc1321.html<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">create mode 100644 thirdparty/md5/rfc1321.txt<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">diff --git a/CMakeLists.txt b/CMakeLists.txt<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">index 0775119..5af487d 100644<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">--- a/CMakeLists.txt<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+++ b/CMakeLists.txt<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">@@ -290,6 +290,11 @@ endif ()<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"># also avoids missing/inconsistent declarations in system headers.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">include_directories (BEFORE ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/khronos)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+# md5 implementation be added to the thirdparty tree<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+set (MD5_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/md5)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+set (MD5_LIBRARIES md5_bundled)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+add_subdirectory (thirdparty/md5)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">##############################################################################<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"># Common libraries / utilities<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">diff --git a/image/CMakeLists.txt b/image/CMakeLists.txt<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">index 51d7ed8..ea08074 100644<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">--- a/image/CMakeLists.txt<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+++ b/image/CMakeLists.txt<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">@@ -1,5 +1,6 @@<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">include_directories (<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> ${PNG_INCLUDE_DIR}<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+ ${MD5_INCLUDE_DIR}<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">add_library (image STATIC<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">@@ -7,8 +8,10 @@ add_library (image STATIC<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> image_png.cpp<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> image_pnm.cpp<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> image_raw.cpp<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+ image_md5.cpp<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">target_link_libraries (image<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> ${PNG_LIBRARIES}<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+ ${MD5_LIBRARIES}<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">diff --git a/image/image.hpp b/image/image.hpp<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">index 7e13dd6..5398c9f 100644<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">--- a/image/image.hpp<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+++ b/image/image.hpp<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">@@ -94,6 +94,12 @@ public:<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> return true;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> }<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+ void<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+ writeMD5(std::ostream &os) const;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+ bool<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+ writeMD5(const char *filename) const;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> bool<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> writePNG(std::ostream &os) const;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">diff --git a/retrace/retrace_main.cpp b/retrace/retrace_main.cpp<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">index bff8983..f81fefa 100644<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">--- a/retrace/retrace_main.cpp<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+++ b/retrace/retrace_main.cpp<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">@@ -50,7 +50,8 @@ static bool loopOnFinish = false;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">static const char *snapshotPrefix = NULL;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">static enum {<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> PNM_FMT,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">- RAW_RGB<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+ RAW_RGB,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+ RAW_MD5<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">} snapshotFormat = PNM_FMT;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">static trace::CallSet snapshotFrequency;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">@@ -126,12 +127,18 @@ takeSnapshot(unsigned call_no) {<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> else<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> src->writePNM(std::cout, comment);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> } else {<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">- os::String filename = os::String::format("%s%010u.png",<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">- snapshotPrefix,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">- useCallNos ? call_no : snapshot_no);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">- if (src->writePNG(filename) && retrace::verbosity >= 0) {<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">- std::cout << "Wrote " << filename << "\n";<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">- }<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+ if (snapshotFormat == RAW_MD5) {<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+ os::String filename = snapshotPrefix;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+ src->writeMD5(filename);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+ }<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+ else<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+ { os::String filename = os::String::format("%s%010u.png",<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+ snapshotPrefix,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+ useCallNos ? call_no : snapshot_no);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+ if (src->writePNG(filename) && retrace::verbosity >= 0) {<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+ std::cout << "Wrote " << filename << "\n";<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+ }<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+ }<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> }<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> }<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">@@ -701,7 +708,9 @@ int main(int argc, char **argv)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> case SNAPSHOT_FORMAT_OPT:<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> if (strcmp(optarg, "RGB") == 0)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> snapshotFormat = RAW_RGB;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">- else<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+ else if (strcmp(optarg, "MD5") == 0)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+ snapshotFormat = RAW_MD5;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">+ else<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> snapshotFormat = PNM_FMT;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> break;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> case 'S':<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">diff --git a/image/image_md5.cpp b/image/image_md5.cpp<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">new file mode 100644<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">index 0000000..8dc777a<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">--- /dev/null<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+++ b/image/image_md5.cpp<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">@@ -0,0 +1,88 @@<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+/**************************************************************************<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+ *<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+ * Copyright (C) 2013 Intel Corporation. All rights reversed.<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+ * Author: Meng Mengmeng <mengmeng.meng@intel.com><o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+ * All Rights Reserved.<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+ *<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+ * Permission is hereby granted, free of charge, to any person obtaining a copy<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+ * of this software and associated documentation files (the "Software"), to deal<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+ * in the Software without restriction, including without limitation the rights<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+ * copies of the Software, and to permit persons to whom the Software is<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+ * furnished to do so, subject to the following conditions:<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+ *<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+ * The above copyright notice and this permission notice shall be included in<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+ * all copies or substantial portions of the Software.<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+ *<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+ * THE SOFTWARE.<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+ *<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+ **************************************************************************/<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+#include <fstream><o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+#include <stdlib.h><o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+#include <stdio.h><o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+#include <assert.h><o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+#include <stdint.h><o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+#include <string.h><o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+#include "image.hpp"<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+extern "C"<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+{<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+ #include "md5.h"<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+}<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+using namespace std;<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+namespace image {<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+bool<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+Image::writeMD5(const char *filename) const {<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+ std::ofstream os(filename, std::ofstream::app);<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+ if (!os) {<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+ return false;<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+ }<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+ writeMD5(os);<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+ return true;<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+ }<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+void<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+Image::writeMD5(std::ostream &os) const {<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+
<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+ const unsigned char * image_start_buff;<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+ const unsigned char * image_end_buff;<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+ const char *hexfmt = "%02X";<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+ unsigned char signature[16];<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+ char buf[3]={'\0'},csig[33]={'\0'};
<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+ struct MD5Context md5c;<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+ image_start_buff = start();<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+ image_end_buff = end();<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+ unsigned long lenth = image_start_buff - image_end_buff ;<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+
<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+ unsigned char * buffer=(unsigned char *)malloc(lenth * sizeof(char));<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+ for(int i=0;i<height;i+=1){
<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+ memcpy(buffer+ (-stride())*i,(unsigned char *)(image_start_buff+stride()*i),-stride());<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+ }<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+ MD5Init(&md5c);<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+ MD5Update(&md5c, buffer ,lenth);<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+ MD5Final(signature,&md5c);<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+ for(int i = 0; i < sizeof signature; i++){<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+ sprintf(buf, hexfmt, signature[i]);<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+ strcat(csig,buf);
<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+ }<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+ free(buffer);<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+
<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+ os.write((const char *)csig, strlen(csig));<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+ os.write("\n", strlen("\n"));<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+}<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+} /* namespace image */<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;text-autospace:none"><span lang="EN-US">+<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
</div>
</body>
</html>