Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/themes/browser_theme_pack.h" | 5 #include "chrome/browser/themes/browser_theme_pack.h" |
| 6 | 6 |
| 7 #include <limits> | 7 #include <limits> |
| 8 | 8 |
| 9 #include "base/memory/ref_counted_memory.h" | 9 #include "base/memory/ref_counted_memory.h" |
| 10 #include "base/memory/scoped_ptr.h" | 10 #include "base/memory/scoped_ptr.h" |
| (...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 181 int prs_id = kPersistingImages[i].persistent_id; | 181 int prs_id = kPersistingImages[i].persistent_id; |
| 182 (*lookup_table)[idr] = prs_id; | 182 (*lookup_table)[idr] = prs_id; |
| 183 } | 183 } |
| 184 } | 184 } |
| 185 std::map<int,int>::iterator it = lookup_table->find(idr); | 185 std::map<int,int>::iterator it = lookup_table->find(idr); |
| 186 return (it == lookup_table->end()) ? -1 : it->second; | 186 return (it == lookup_table->end()) ? -1 : it->second; |
| 187 } | 187 } |
| 188 | 188 |
| 189 // Returns true if the scales in |input| match those in |expected|. | 189 // Returns true if the scales in |input| match those in |expected|. |
| 190 // The order must match as the index is used in determining the raw id. | 190 // The order must match as the index is used in determining the raw id. |
| 191 bool InputScalesValid(const char* input, | 191 bool InputScalesValid(const base::StringPiece& input, |
| 192 const std::vector<ui::ScaleFactor>& expected) { | 192 const std::vector<ui::ScaleFactor>& expected) { |
| 193 const float* scales = reinterpret_cast<const float*>(input); | 193 size_t scales_size = static_cast<size_t>( |
| 194 input.size() * sizeof(char) / sizeof(float)); | |
|
benrg
2012/08/09 21:45:10
Either don't multiply by sizeof(char) here or else
| |
| 195 float* scales = new float[scales_size]; | |
|
sky
2012/08/09 19:49:17
scoped_array here and 211 (200/202 leak the way yo
benrg
2012/08/09 21:45:10
I think there should be a comment explaining why t
| |
| 196 memcpy(scales, input.data(), input.size()); | |
| 194 size_t index = 0; | 197 size_t index = 0; |
| 195 for (const float* end = scales; *end != -1.0f; ++end) { | 198 for (; index < scales_size; ++index) { |
| 196 if (index >= expected.size()) | 199 if (index >= expected.size()) |
|
benrg
2012/08/09 21:45:10
It would be slightly simpler to check scales_size
| |
| 197 return false; | 200 return false; |
| 198 if (*end != ui::GetScaleFactorScale(expected[index])) | 201 if (scales[index] != ui::GetScaleFactorScale(expected[index])) |
| 199 return false; | 202 return false; |
| 200 index++; | |
| 201 } | 203 } |
| 204 delete[] scales; | |
| 202 return (index == expected.size()); | 205 return (index == expected.size()); |
| 203 } | 206 } |
| 204 | 207 |
| 205 // Returns |scale_factors| as a string to be written to disk. | 208 // Returns |scale_factors| as a string to be written to disk. |
| 206 std::string GetScaleFactorsAsString( | 209 std::string GetScaleFactorsAsString( |
| 207 const std::vector<ui::ScaleFactor>& scale_factors) { | 210 const std::vector<ui::ScaleFactor>& scale_factors) { |
| 208 size_t scales_size = scale_factors.size() + 1; | 211 float* scales = new float[scale_factors.size()]; |
| 209 float* scales = new float[scales_size]; | |
| 210 for (size_t i = 0; i < scale_factors.size(); ++i) | 212 for (size_t i = 0; i < scale_factors.size(); ++i) |
| 211 scales[i] = ui::GetScaleFactorScale(scale_factors[i]); | 213 scales[i] = ui::GetScaleFactorScale(scale_factors[i]); |
| 212 scales[scales_size - 1] = -1.0f; | |
| 213 std::string out_string = std::string( | 214 std::string out_string = std::string( |
| 214 reinterpret_cast<const char*>(scales), | 215 reinterpret_cast<const char*>(scales), |
| 215 scales_size * sizeof(float)); | 216 scale_factors.size() * sizeof(float)); |
| 216 delete[] scales; | 217 delete[] scales; |
| 217 return out_string; | 218 return out_string; |
| 218 } | 219 } |
| 219 | 220 |
| 220 struct StringToIntTable { | 221 struct StringToIntTable { |
| 221 const char* key; | 222 const char* key; |
| 222 int id; | 223 int id; |
| 223 }; | 224 }; |
| 224 | 225 |
| 225 // Strings used by themes to identify tints in the JSON. | 226 // Strings used by themes to identify tints in the JSON. |
| (...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 501 const_cast<char*>(pointer.data())); | 502 const_cast<char*>(pointer.data())); |
| 502 | 503 |
| 503 if (!pack->data_pack_->GetStringPiece(kSourceImagesID, &pointer)) | 504 if (!pack->data_pack_->GetStringPiece(kSourceImagesID, &pointer)) |
| 504 return NULL; | 505 return NULL; |
| 505 pack->source_images_ = reinterpret_cast<int*>( | 506 pack->source_images_ = reinterpret_cast<int*>( |
| 506 const_cast<char*>(pointer.data())); | 507 const_cast<char*>(pointer.data())); |
| 507 | 508 |
| 508 if (!pack->data_pack_->GetStringPiece(kScaleFactorsID, &pointer)) | 509 if (!pack->data_pack_->GetStringPiece(kScaleFactorsID, &pointer)) |
| 509 return NULL; | 510 return NULL; |
| 510 | 511 |
| 511 if (!InputScalesValid(const_cast<char*>(pointer.data()), | 512 if (!InputScalesValid(pointer, pack->scale_factors_)) { |
| 512 pack->scale_factors_)) { | |
| 513 DLOG(ERROR) << "BuildFromDataPack failure! The pack scale factors differ " | 513 DLOG(ERROR) << "BuildFromDataPack failure! The pack scale factors differ " |
| 514 << "from those supported by platform."; | 514 << "from those supported by platform."; |
| 515 } | 515 } |
| 516 | |
| 517 return pack; | 516 return pack; |
| 518 } | 517 } |
| 519 | 518 |
| 520 bool BrowserThemePack::WriteToDisk(const FilePath& path) const { | 519 bool BrowserThemePack::WriteToDisk(const FilePath& path) const { |
| 521 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); | 520 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); |
| 522 // Add resources for each of the property arrays. | 521 // Add resources for each of the property arrays. |
| 523 RawDataForWriting resources; | 522 RawDataForWriting resources; |
| 524 resources[kHeaderID] = base::StringPiece( | 523 resources[kHeaderID] = base::StringPiece( |
| 525 reinterpret_cast<const char*>(header_), sizeof(BrowserThemePackHeader)); | 524 reinterpret_cast<const char*>(header_), sizeof(BrowserThemePackHeader)); |
| 526 resources[kTintsID] = base::StringPiece( | 525 resources[kTintsID] = base::StringPiece( |
| (...skipping 705 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1232 ui::ScaleFactor scale_factor) const { | 1231 ui::ScaleFactor scale_factor) const { |
| 1233 if (prs_id < 0) | 1232 if (prs_id < 0) |
| 1234 return -1; | 1233 return -1; |
| 1235 | 1234 |
| 1236 for (size_t i = 0; i < scale_factors_.size(); ++i) { | 1235 for (size_t i = 0; i < scale_factors_.size(); ++i) { |
| 1237 if (scale_factors_[i] == scale_factor) | 1236 if (scale_factors_[i] == scale_factor) |
| 1238 return static_cast<int>(kPersistingImagesLength * i) + prs_id; | 1237 return static_cast<int>(kPersistingImagesLength * i) + prs_id; |
| 1239 } | 1238 } |
| 1240 return -1; | 1239 return -1; |
| 1241 } | 1240 } |
| OLD | NEW |