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

Side by Side Diff: chrome/browser/android/thumbnail/thumbnail_store.cc

Issue 470233003: Restrict ETC1 power-of-two rounding to old IMG drivers. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Pass capabilities by value Created 6 years, 4 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 unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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/android/thumbnail/thumbnail_store.h" 5 #include "chrome/browser/android/thumbnail/thumbnail_store.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <cmath> 8 #include <cmath>
9 9
10 #include "base/big_endian.h" 10 #include "base/big_endian.h"
(...skipping 20 matching lines...) Expand all
31 const float kApproximationScaleFactor = 4.f; 31 const float kApproximationScaleFactor = 4.f;
32 const base::TimeDelta kCaptureMinRequestTimeMs( 32 const base::TimeDelta kCaptureMinRequestTimeMs(
33 base::TimeDelta::FromMilliseconds(1000)); 33 base::TimeDelta::FromMilliseconds(1000));
34 34
35 const int kCompressedKey = 0xABABABAB; 35 const int kCompressedKey = 0xABABABAB;
36 const int kCurrentExtraVersion = 1; 36 const int kCurrentExtraVersion = 1;
37 37
38 // Indicates whether we prefer to have more free CPU memory over GPU memory. 38 // Indicates whether we prefer to have more free CPU memory over GPU memory.
39 const bool kPreferCPUMemory = true; 39 const bool kPreferCPUMemory = true;
40 40
41 // TODO(): ETC1 texture sizes should be multiples of four, but some drivers only
42 // allow power-of-two ETC1 textures. Find better work around.
43 size_t NextPowerOfTwo(size_t x) { 41 size_t NextPowerOfTwo(size_t x) {
44 --x; 42 --x;
45 x |= x >> 1; 43 x |= x >> 1;
46 x |= x >> 2; 44 x |= x >> 2;
47 x |= x >> 4; 45 x |= x >> 4;
48 x |= x >> 8; 46 x |= x >> 8;
49 x |= x >> 16; 47 x |= x >> 16;
50 return x + 1; 48 return x + 1;
51 } 49 }
52 50
53 gfx::Size GetEncodedSize(const gfx::Size& bitmap_size) { 51 size_t RoundUpMod4(size_t x) {
52 return (x + 3) & ~3;
53 }
54
55 gfx::Size GetEncodedSize(const gfx::Size& bitmap_size, bool supports_npot) {
54 DCHECK(!bitmap_size.IsEmpty()); 56 DCHECK(!bitmap_size.IsEmpty());
55 return gfx::Size(NextPowerOfTwo(bitmap_size.width()), 57 if (!supports_npot)
56 NextPowerOfTwo(bitmap_size.height())); 58 return gfx::Size(NextPowerOfTwo(bitmap_size.width()),
59 NextPowerOfTwo(bitmap_size.height()));
60 else
61 return gfx::Size(RoundUpMod4(bitmap_size.width()),
62 RoundUpMod4(bitmap_size.height()));
57 } 63 }
58 64
59 template<typename T> 65 template<typename T>
60 bool ReadBigEndianFromFile(base::File& file, T* out) { 66 bool ReadBigEndianFromFile(base::File& file, T* out) {
61 char buffer[sizeof(T)]; 67 char buffer[sizeof(T)];
62 if (file.ReadAtCurrentPos(buffer, sizeof(T)) != sizeof(T)) 68 if (file.ReadAtCurrentPos(buffer, sizeof(T)) != sizeof(T))
63 return false; 69 return false;
64 base::ReadBigEndian(buffer, out); 70 base::ReadBigEndian(buffer, out);
65 return true; 71 return true;
66 } 72 }
(...skipping 291 matching lines...) Expand 10 before | Expand all | Expand 10 after
358 364
359 compression_tasks_count_++; 365 compression_tasks_count_++;
360 366
361 base::Callback<void(skia::RefPtr<SkPixelRef>, const gfx::Size&)> 367 base::Callback<void(skia::RefPtr<SkPixelRef>, const gfx::Size&)>
362 post_compression_task = base::Bind(&ThumbnailStore::PostCompressionTask, 368 post_compression_task = base::Bind(&ThumbnailStore::PostCompressionTask,
363 weak_factory_.GetWeakPtr(), 369 weak_factory_.GetWeakPtr(),
364 tab_id, 370 tab_id,
365 time_stamp, 371 time_stamp,
366 scale); 372 scale);
367 373
368 base::WorkerPool::PostTask( 374 gfx::Size raw_data_size(bitmap.width(), bitmap.height());
369 FROM_HERE, 375 gfx::Size encoded_size = GetEncodedSize(
370 base::Bind( 376 raw_data_size, ui_resource_provider_->SupportsETC1NonPowerOfTwo());
371 &ThumbnailStore::CompressionTask, bitmap, post_compression_task), 377
372 true); 378 base::WorkerPool::PostTask(FROM_HERE,
379 base::Bind(&ThumbnailStore::CompressionTask,
380 bitmap,
381 encoded_size,
382 post_compression_task),
383 true);
373 } 384 }
374 385
375 void ThumbnailStore::ReadNextThumbnail() { 386 void ThumbnailStore::ReadNextThumbnail() {
376 if (read_queue_.empty() || read_in_progress_) 387 if (read_queue_.empty() || read_in_progress_)
377 return; 388 return;
378 389
379 TabId tab_id = read_queue_.front(); 390 TabId tab_id = read_queue_.front();
380 read_in_progress_ = true; 391 read_in_progress_ = true;
381 392
382 base::FilePath file_path = GetFilePath(tab_id); 393 base::FilePath file_path = GetFilePath(tab_id);
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after
532 content::BrowserThread::PostTask( 543 content::BrowserThread::PostTask(
533 content::BrowserThread::UI, FROM_HERE, post_write_task); 544 content::BrowserThread::UI, FROM_HERE, post_write_task);
534 } 545 }
535 546
536 void ThumbnailStore::PostWriteTask() { 547 void ThumbnailStore::PostWriteTask() {
537 write_tasks_count_--; 548 write_tasks_count_--;
538 } 549 }
539 550
540 void ThumbnailStore::CompressionTask( 551 void ThumbnailStore::CompressionTask(
541 SkBitmap raw_data, 552 SkBitmap raw_data,
553 gfx::Size encoded_size,
542 const base::Callback<void(skia::RefPtr<SkPixelRef>, const gfx::Size&)>& 554 const base::Callback<void(skia::RefPtr<SkPixelRef>, const gfx::Size&)>&
543 post_compression_task) { 555 post_compression_task) {
544 skia::RefPtr<SkPixelRef> compressed_data; 556 skia::RefPtr<SkPixelRef> compressed_data;
545 gfx::Size content_size; 557 gfx::Size content_size;
546 558
547 if (!raw_data.empty()) { 559 if (!raw_data.empty()) {
548 SkAutoLockPixels raw_data_lock(raw_data); 560 SkAutoLockPixels raw_data_lock(raw_data);
549 gfx::Size raw_data_size(raw_data.width(), raw_data.height()); 561 gfx::Size raw_data_size(raw_data.width(), raw_data.height());
550 size_t pixel_size = 4; // Pixel size is 4 bytes for kARGB_8888_Config. 562 size_t pixel_size = 4; // Pixel size is 4 bytes for kARGB_8888_Config.
551 size_t stride = pixel_size * raw_data_size.width(); 563 size_t stride = pixel_size * raw_data_size.width();
552 564
553 gfx::Size encoded_size = GetEncodedSize(raw_data_size);
554 size_t encoded_bytes = 565 size_t encoded_bytes =
555 etc1_get_encoded_data_size(encoded_size.width(), encoded_size.height()); 566 etc1_get_encoded_data_size(encoded_size.width(), encoded_size.height());
556 SkImageInfo info = {encoded_size.width(), 567 SkImageInfo info = {encoded_size.width(),
557 encoded_size.height(), 568 encoded_size.height(),
558 kUnknown_SkColorType, 569 kUnknown_SkColorType,
559 kUnpremul_SkAlphaType}; 570 kUnpremul_SkAlphaType};
560 skia::RefPtr<SkData> etc1_pixel_data = skia::AdoptRef( 571 skia::RefPtr<SkData> etc1_pixel_data = skia::AdoptRef(
561 SkData::NewFromMalloc(new uint8_t[encoded_bytes], encoded_bytes)); 572 SkData::NewFromMalloc(new uint8_t[encoded_bytes], encoded_bytes));
562 skia::RefPtr<SkMallocPixelRef> etc1_pixel_ref = skia::AdoptRef( 573 skia::RefPtr<SkMallocPixelRef> etc1_pixel_ref = skia::AdoptRef(
563 SkMallocPixelRef::NewWithData(info, 0, NULL, etc1_pixel_data.get())); 574 SkMallocPixelRef::NewWithData(info, 0, NULL, etc1_pixel_data.get()));
(...skipping 266 matching lines...) Expand 10 before | Expand all | Expand 10 after
830 dst_bitmap.eraseColor(0); 841 dst_bitmap.eraseColor(0);
831 SkAutoLockPixels dst_bitmap_lock(dst_bitmap); 842 SkAutoLockPixels dst_bitmap_lock(dst_bitmap);
832 843
833 SkCanvas canvas(dst_bitmap); 844 SkCanvas canvas(dst_bitmap);
834 canvas.scale(new_scale, new_scale); 845 canvas.scale(new_scale, new_scale);
835 canvas.drawBitmap(bitmap, 0, 0, NULL); 846 canvas.drawBitmap(bitmap, 0, 0, NULL);
836 dst_bitmap.setImmutable(); 847 dst_bitmap.setImmutable();
837 848
838 return std::make_pair(dst_bitmap, new_scale * scale); 849 return std::make_pair(dst_bitmap, new_scale * scale);
839 } 850 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698