<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>