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

Side by Side Diff: ui/base/clipboard/clipboard_win.cc

Issue 1432443004: Remove SkDevice and SkBaseDevice outside skia/ext/ (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: pass SkPixmap by pointer to MakeBitmapOpaque Created 5 years, 1 month 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 (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 // Many of these functions are based on those found in 5 // Many of these functions are based on those found in
6 // webkit/port/platform/PasteboardWin.cpp 6 // webkit/port/platform/PasteboardWin.cpp
7 7
8 #include "ui/base/clipboard/clipboard_win.h" 8 #include "ui/base/clipboard/clipboard_win.h"
9 9
10 #include <shellapi.h> 10 #include <shellapi.h>
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after
153 ::GlobalAlloc(GMEM_MOVEABLE, ((str.size() + 1) * sizeof(charT))); 153 ::GlobalAlloc(GMEM_MOVEABLE, ((str.size() + 1) * sizeof(charT)));
154 if (data) { 154 if (data) {
155 charT* raw_data = static_cast<charT*>(::GlobalLock(data)); 155 charT* raw_data = static_cast<charT*>(::GlobalLock(data));
156 memcpy(raw_data, str.data(), str.size() * sizeof(charT)); 156 memcpy(raw_data, str.data(), str.size() * sizeof(charT));
157 raw_data[str.size()] = '\0'; 157 raw_data[str.size()] = '\0';
158 ::GlobalUnlock(data); 158 ::GlobalUnlock(data);
159 } 159 }
160 return data; 160 return data;
161 } 161 }
162 162
163 bool BitmapHasInvalidPremultipliedColors(const SkBitmap& bitmap) { 163 bool BitmapHasInvalidPremultipliedColors(const SkPixmap& pixmap) {
164 for (int x = 0; x < bitmap.width(); ++x) { 164 for (int x = 0; x < pixmap.width(); ++x) {
165 for (int y = 0; y < bitmap.height(); ++y) { 165 for (int y = 0; y < pixmap.height(); ++y) {
166 uint32_t pixel = *bitmap.getAddr32(x, y); 166 uint32_t pixel = *pixmap.addr32(x, y);
167 if (SkColorGetR(pixel) > SkColorGetA(pixel) || 167 if (SkColorGetR(pixel) > SkColorGetA(pixel) ||
168 SkColorGetG(pixel) > SkColorGetA(pixel) || 168 SkColorGetG(pixel) > SkColorGetA(pixel) ||
169 SkColorGetB(pixel) > SkColorGetA(pixel)) 169 SkColorGetB(pixel) > SkColorGetA(pixel))
170 return true; 170 return true;
171 } 171 }
172 } 172 }
173 return false; 173 return false;
174 } 174 }
175 175
176 void MakeBitmapOpaque(const SkBitmap& bitmap) { 176 void MakeBitmapOpaque(SkPixmap* pixmap) {
177 for (int x = 0; x < bitmap.width(); ++x) { 177 for (int x = 0; x < pixmap->width(); ++x) {
178 for (int y = 0; y < bitmap.height(); ++y) { 178 for (int y = 0; y < pixmap->height(); ++y) {
179 *bitmap.getAddr32(x, y) = SkColorSetA(*bitmap.getAddr32(x, y), 0xFF); 179 *pixmap->writable_addr32(x, y) = SkColorSetA(*pixmap->addr32(x, y), 0xFF);
180 } 180 }
181 } 181 }
182 } 182 }
183 183
184 void ParseBookmarkClipboardFormat(const base::string16& bookmark, 184 void ParseBookmarkClipboardFormat(const base::string16& bookmark,
185 base::string16* title, 185 base::string16* title,
186 std::string* url) { 186 std::string* url) {
187 const base::string16 kDelim = base::ASCIIToUTF16("\r\n"); 187 const base::string16 kDelim = base::ASCIIToUTF16("\r\n");
188 188
189 const size_t title_end = bookmark.find_first_of(kDelim); 189 const size_t title_end = bookmark.find_first_of(kDelim);
(...skipping 434 matching lines...) Expand 10 before | Expand all | Expand 10 after
624 DIB_RGB_COLORS); 624 DIB_RGB_COLORS);
625 } 625 }
626 // Windows doesn't really handle alpha channels well in many situations. When 626 // Windows doesn't really handle alpha channels well in many situations. When
627 // the source image is < 32 bpp, we force the bitmap to be opaque. When the 627 // the source image is < 32 bpp, we force the bitmap to be opaque. When the
628 // source image is 32 bpp, the alpha channel might still contain garbage data. 628 // source image is 32 bpp, the alpha channel might still contain garbage data.
629 // Since Windows uses premultiplied alpha, we scan for instances where 629 // Since Windows uses premultiplied alpha, we scan for instances where
630 // (R, G, B) > A. If there are any invalid premultiplied colors in the image, 630 // (R, G, B) > A. If there are any invalid premultiplied colors in the image,
631 // we assume the alpha channel contains garbage and force the bitmap to be 631 // we assume the alpha channel contains garbage and force the bitmap to be
632 // opaque as well. Note that this heuristic will fail on a transparent bitmap 632 // opaque as well. Note that this heuristic will fail on a transparent bitmap
633 // containing only black pixels... 633 // containing only black pixels...
634 const SkBitmap& device_bitmap = 634 SkPixmap device_pixels;
635 canvas.sk_canvas()->getDevice()->accessBitmap(true); 635 skia::GetWritablePixels(canvas.sk_canvas(), &device_pixels);
636 { 636 {
637 SkAutoLockPixels lock(device_bitmap);
638 bool has_invalid_alpha_channel = bitmap->bmiHeader.biBitCount < 32 || 637 bool has_invalid_alpha_channel = bitmap->bmiHeader.biBitCount < 32 ||
639 BitmapHasInvalidPremultipliedColors(device_bitmap); 638 BitmapHasInvalidPremultipliedColors(device_pixels);
640 if (has_invalid_alpha_channel) { 639 if (has_invalid_alpha_channel) {
641 MakeBitmapOpaque(device_bitmap); 640 MakeBitmapOpaque(&device_pixels);
642 } 641 }
643 } 642 }
644 643
645 return canvas.ExtractImageRep().sk_bitmap(); 644 return canvas.ExtractImageRep().sk_bitmap();
646 } 645 }
647 646
648 void ClipboardWin::ReadCustomData(ClipboardType clipboard_type, 647 void ClipboardWin::ReadCustomData(ClipboardType clipboard_type,
649 const base::string16& type, 648 const base::string16& type,
650 base::string16* result) const { 649 base::string16* result) const {
651 DCHECK_EQ(clipboard_type, CLIPBOARD_TYPE_COPY_PASTE); 650 DCHECK_EQ(clipboard_type, CLIPBOARD_TYPE_COPY_PASTE);
(...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after
883 if (!clipboard_owner_) 882 if (!clipboard_owner_)
884 return NULL; 883 return NULL;
885 884
886 if (clipboard_owner_->hwnd() == NULL) 885 if (clipboard_owner_->hwnd() == NULL)
887 clipboard_owner_->Create(base::Bind(&ClipboardOwnerWndProc)); 886 clipboard_owner_->Create(base::Bind(&ClipboardOwnerWndProc));
888 887
889 return clipboard_owner_->hwnd(); 888 return clipboard_owner_->hwnd();
890 } 889 }
891 890
892 } // namespace ui 891 } // namespace ui
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/platform/graphics/gpu/AcceleratedImageBufferSurface.cpp ('k') | ui/gfx/canvas.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698