Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1108)

Unified Diff: ui/gfx/icon_util.cc

Issue 14839008: Move .ico hashing to icon_util (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: forward declare md5 stuff Created 7 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« ui/gfx/icon_util.h ('K') | « ui/gfx/icon_util.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/gfx/icon_util.cc
diff --git a/ui/gfx/icon_util.cc b/ui/gfx/icon_util.cc
index 37ab0d59f53b16e2a702038c541697817ce1ff00..8f7f1ea0c05b3d9dcf244606725d93af167d2e92 100644
--- a/ui/gfx/icon_util.cc
+++ b/ui/gfx/icon_util.cc
@@ -6,6 +6,7 @@
#include "base/file_util.h"
#include "base/logging.h"
+#include "base/md5.h"
#include "base/memory/scoped_ptr.h"
#include "base/win/resource_util.h"
#include "base/win/scoped_gdi_object.h"
@@ -20,6 +21,9 @@
namespace {
+const base::FilePath::CharType kIconChecksumFileExt[] =
+ FILE_PATH_LITERAL(".ico.md5");
+
struct ScopedICONINFO : ICONINFO {
ScopedICONINFO() {
hbmColor = NULL;
@@ -707,3 +711,60 @@ void IconUtil::ComputeBitmapSizeComponents(const SkBitmap& bitmap,
size_t masks_size = *xor_mask_size + and_mask_size;
*bytes_in_resource = masks_size + sizeof(BITMAPINFOHEADER);
}
+
+void IconUtil::GetImageCheckSum(const gfx::ImageFamily& image,
+ base::MD5Digest* digest) {
+ DCHECK(digest);
+ base::MD5Context md5_context;
+ base::MD5Init(&md5_context);
+
+ for (gfx::ImageFamily::const_iterator it = image.begin(); it != image.end();
+ ++it) {
+ SkBitmap bitmap = it->AsBitmap();
+
+ SkAutoLockPixels image_lock(bitmap);
+ base::StringPiece image_data(
+ reinterpret_cast<const char*>(bitmap.getPixels()), bitmap.getSize());
+ base::MD5Update(&md5_context, image_data);
+ }
+
+ base::MD5Final(digest, &md5_context);
+}
+
+bool IconUtil::SaveIconWithCheckSum(const base::FilePath& icon_file,
+ const gfx::ImageFamily& image) {
+ if (!CreateIconFileFromImageFamily(image, icon_file))
+ return false;
+
+ base::MD5Digest digest;
+ GetImageCheckSum(image, &digest);
+
+ base::FilePath cheksum_file(icon_file.ReplaceExtension(kIconChecksumFileExt));
Alexei Svitkine (slow) 2013/05/09 15:34:57 Nit: cheksum -> checksum
+ return file_util::WriteFile(cheksum_file,
+ reinterpret_cast<const char*>(&digest),
+ sizeof(digest)) == sizeof(digest);
+}
+
+bool IconUtil::ShouldUpdateIcon(const base::FilePath& icon_file,
+ const gfx::ImageFamily& image) {
Alexei Svitkine (slow) 2013/05/09 15:34:57 Nit: Align.
+ base::FilePath checksum_file(
+ icon_file.ReplaceExtension(kIconChecksumFileExt));
+
+ // Returns true if icon_file or checksum file is missing.
+ if (!file_util::PathExists(icon_file) ||
+ !file_util::PathExists(checksum_file))
+ return true;
+
+ base::MD5Digest persisted_image_checksum;
+ if (sizeof(persisted_image_checksum) != file_util::ReadFile(checksum_file,
+ reinterpret_cast<char*>(&persisted_image_checksum),
+ sizeof(persisted_image_checksum)))
+ return true;
+
+ base::MD5Digest downloaded_image_checksum;
+ GetImageCheckSum(image, &downloaded_image_checksum);
+
+ // Update icon if checksums are not equal.
+ return memcmp(&persisted_image_checksum, &downloaded_image_checksum,
+ sizeof(base::MD5Digest)) != 0;
+}
« ui/gfx/icon_util.h ('K') | « ui/gfx/icon_util.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698