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

Side by Side Diff: third_party/WebKit/Source/platform/graphics/ImageBuffer.cpp

Issue 1609343004: Add display list fallback reason histograms for 2D canvas (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: git cl web Created 4 years, 10 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 /* 1 /*
2 * Copyright (c) 2008, Google Inc. All rights reserved. 2 * Copyright (c) 2008, Google Inc. All rights reserved.
3 * Copyright (C) 2009 Dirk Schulze <krit@webkit.org> 3 * Copyright (C) 2009 Dirk Schulze <krit@webkit.org>
4 * Copyright (C) 2010 Torch Mobile (Beijing) Co. Ltd. All rights reserved. 4 * Copyright (C) 2010 Torch Mobile (Beijing) Co. Ltd. All rights reserved.
5 * 5 *
6 * Redistribution and use in source and binary forms, with or without 6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions are 7 * modification, are permitted provided that the following conditions are
8 * met: 8 * met:
9 * 9 *
10 * * Redistributions of source code must retain the above copyright 10 * * Redistributions of source code must retain the above copyright
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
89 ImageBuffer::~ImageBuffer() 89 ImageBuffer::~ImageBuffer()
90 { 90 {
91 ImageBuffer::s_globalGPUMemoryUsage -= m_gpuMemoryUsage; 91 ImageBuffer::s_globalGPUMemoryUsage -= m_gpuMemoryUsage;
92 } 92 }
93 93
94 SkCanvas* ImageBuffer::canvas() const 94 SkCanvas* ImageBuffer::canvas() const
95 { 95 {
96 return m_surface->canvas(); 96 return m_surface->canvas();
97 } 97 }
98 98
99 void ImageBuffer::disableDeferral() const 99 void ImageBuffer::disableDeferral(DisableDeferralReason reason) const
100 { 100 {
101 return m_surface->disableDeferral(); 101 return m_surface->disableDeferral(reason);
102 } 102 }
103 103
104 bool ImageBuffer::writePixels(const SkImageInfo& info, const void* pixels, size_ t rowBytes, int x, int y) 104 bool ImageBuffer::writePixels(const SkImageInfo& info, const void* pixels, size_ t rowBytes, int x, int y)
105 { 105 {
106 return m_surface->writePixels(info, pixels, rowBytes, x, y); 106 return m_surface->writePixels(info, pixels, rowBytes, x, y);
107 } 107 }
108 108
109 bool ImageBuffer::isSurfaceValid() const 109 bool ImageBuffer::isSurfaceValid() const
110 { 110 {
111 return m_surface->isValid(); 111 return m_surface->isValid();
(...skipping 26 matching lines...) Expand all
138 if (m_client) 138 if (m_client)
139 m_client->notifySurfaceInvalid(); 139 m_client->notifySurfaceInvalid();
140 } 140 }
141 141
142 void ImageBuffer::resetCanvas(SkCanvas* canvas) const 142 void ImageBuffer::resetCanvas(SkCanvas* canvas) const
143 { 143 {
144 if (m_client) 144 if (m_client)
145 m_client->restoreCanvasMatrixClipStack(canvas); 145 m_client->restoreCanvasMatrixClipStack(canvas);
146 } 146 }
147 147
148 PassRefPtr<SkImage> ImageBuffer::newSkImageSnapshot(AccelerationHint hint) const 148 PassRefPtr<SkImage> ImageBuffer::newSkImageSnapshot(AccelerationHint hint, Snaps hotReason reason) const
149 { 149 {
150 if (m_snapshotState == InitialSnapshotState) 150 if (m_snapshotState == InitialSnapshotState)
151 m_snapshotState = DidAcquireSnapshot; 151 m_snapshotState = DidAcquireSnapshot;
152 152
153 if (!isSurfaceValid()) 153 if (!isSurfaceValid())
154 return nullptr; 154 return nullptr;
155 return m_surface->newImageSnapshot(hint); 155 return m_surface->newImageSnapshot(hint, reason);
156 } 156 }
157 157
158 PassRefPtr<Image> ImageBuffer::newImageSnapshot(AccelerationHint hint) const 158 PassRefPtr<Image> ImageBuffer::newImageSnapshot(AccelerationHint hint, SnapshotR eason reason) const
159 { 159 {
160 RefPtr<SkImage> snapshot = newSkImageSnapshot(hint); 160 RefPtr<SkImage> snapshot = newSkImageSnapshot(hint, reason);
161 if (!snapshot) 161 if (!snapshot)
162 return nullptr; 162 return nullptr;
163 return StaticBitmapImage::create(snapshot); 163 return StaticBitmapImage::create(snapshot);
164 } 164 }
165 165
166 void ImageBuffer::didDraw(const FloatRect& rect) const 166 void ImageBuffer::didDraw(const FloatRect& rect) const
167 { 167 {
168 if (m_snapshotState == DidAcquireSnapshot) 168 if (m_snapshotState == DidAcquireSnapshot)
169 m_snapshotState = DrawnToAfterSnapshot; 169 m_snapshotState = DrawnToAfterSnapshot;
170 m_surface->didDraw(rect); 170 m_surface->didDraw(rect);
171 } 171 }
172 172
173 WebLayer* ImageBuffer::platformLayer() const 173 WebLayer* ImageBuffer::platformLayer() const
174 { 174 {
175 return m_surface->layer(); 175 return m_surface->layer();
176 } 176 }
177 177
178 bool ImageBuffer::copyToPlatformTexture(WebGraphicsContext3D* context, Platform3 DObject texture, GLenum internalFormat, GLenum destType, GLint level, bool premu ltiplyAlpha, bool flipY) 178 bool ImageBuffer::copyToPlatformTexture(WebGraphicsContext3D* context, Platform3 DObject texture, GLenum internalFormat, GLenum destType, GLint level, bool premu ltiplyAlpha, bool flipY)
179 { 179 {
180 if (!Extensions3DUtil::canUseCopyTextureCHROMIUM(GL_TEXTURE_2D, internalForm at, destType, level)) 180 if (!Extensions3DUtil::canUseCopyTextureCHROMIUM(GL_TEXTURE_2D, internalForm at, destType, level))
181 return false; 181 return false;
182 182
183 if (!isSurfaceValid()) 183 if (!isSurfaceValid())
184 return false; 184 return false;
185 185
186 RefPtr<const SkImage> textureImage = m_surface->newImageSnapshot(PreferAccel eration); 186 RefPtr<const SkImage> textureImage = m_surface->newImageSnapshot(PreferAccel eration, SnapshotReasonCopyToWebGLTexture);
187 if (!textureImage) 187 if (!textureImage)
188 return false; 188 return false;
189 189
190 if (!m_surface->isAccelerated()) 190 if (!m_surface->isAccelerated())
191 return false; 191 return false;
192 192
193 193
194 ASSERT(textureImage->isTextureBacked()); // isAccelerated() check above shou ld guarantee this 194 ASSERT(textureImage->isTextureBacked()); // isAccelerated() check above shou ld guarantee this
195 // Get the texture ID, flushing pending operations if needed. 195 // Get the texture ID, flushing pending operations if needed.
196 Platform3DObject textureId = textureImage->getTextureHandle(true); 196 Platform3DObject textureId = textureImage->getTextureHandle(true);
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
260 260
261 void ImageBuffer::draw(GraphicsContext& context, const FloatRect& destRect, cons t FloatRect* srcPtr, SkXfermode::Mode op) 261 void ImageBuffer::draw(GraphicsContext& context, const FloatRect& destRect, cons t FloatRect* srcPtr, SkXfermode::Mode op)
262 { 262 {
263 if (!isSurfaceValid()) 263 if (!isSurfaceValid())
264 return; 264 return;
265 265
266 FloatRect srcRect = srcPtr ? *srcPtr : FloatRect(FloatPoint(), FloatSize(siz e())); 266 FloatRect srcRect = srcPtr ? *srcPtr : FloatRect(FloatPoint(), FloatSize(siz e()));
267 m_surface->draw(context, destRect, srcRect, op); 267 m_surface->draw(context, destRect, srcRect, op);
268 } 268 }
269 269
270 void ImageBuffer::flush() 270 void ImageBuffer::flush(FlushReason reason)
271 { 271 {
272 if (m_surface->canvas()) { 272 if (m_surface->canvas()) {
273 m_surface->flush(); 273 m_surface->flush(reason);
274 } 274 }
275 } 275 }
276 276
277 void ImageBuffer::flushGpu() 277 void ImageBuffer::flushGpu(FlushReason reason)
278 { 278 {
279 if (m_surface->canvas()) { 279 if (m_surface->canvas()) {
280 m_surface->flushGpu(); 280 m_surface->flushGpu(reason);
281 } 281 }
282 } 282 }
283 283
284 bool ImageBuffer::getImageData(Multiply multiplied, const IntRect& rect, WTF::Ar rayBufferContents& contents) const 284 bool ImageBuffer::getImageData(Multiply multiplied, const IntRect& rect, WTF::Ar rayBufferContents& contents) const
285 { 285 {
286 Checked<int, RecordOverflow> dataSize = 4; 286 Checked<int, RecordOverflow> dataSize = 4;
287 dataSize *= rect.width(); 287 dataSize *= rect.width();
288 dataSize *= rect.height(); 288 dataSize *= rect.height();
289 if (dataSize.hasOverflowed()) 289 if (dataSize.hasOverflowed())
290 return false; 290 return false;
291 291
292 if (!isSurfaceValid()) { 292 if (!isSurfaceValid()) {
293 WTF::ArrayBufferContents result(rect.width() * rect.height(), 4, WTF::Ar rayBufferContents::NotShared, WTF::ArrayBufferContents::ZeroInitialize); 293 WTF::ArrayBufferContents result(rect.width() * rect.height(), 4, WTF::Ar rayBufferContents::NotShared, WTF::ArrayBufferContents::ZeroInitialize);
294 result.transfer(contents); 294 result.transfer(contents);
295 return true; 295 return true;
296 } 296 }
297 297
298 ASSERT(canvas()); 298 ASSERT(canvas());
299 RefPtr<SkImage> snapshot = m_surface->newImageSnapshot(PreferNoAcceleration) ; 299 RefPtr<SkImage> snapshot = m_surface->newImageSnapshot(PreferNoAcceleration, SnapshotReasonGetImageData);
300 if (!snapshot) 300 if (!snapshot)
301 return false; 301 return false;
302 302
303 const bool mayHaveStrayArea = 303 const bool mayHaveStrayArea =
304 m_surface->isAccelerated() // GPU readback may fail silently 304 m_surface->isAccelerated() // GPU readback may fail silently
305 || rect.x() < 0 305 || rect.x() < 0
306 || rect.y() < 0 306 || rect.y() < 0
307 || rect.maxX() > m_surface->size().width() 307 || rect.maxX() > m_surface->size().width()
308 || rect.maxY() > m_surface->size().height(); 308 || rect.maxY() > m_surface->size().height();
309 WTF::ArrayBufferContents result( 309 WTF::ArrayBufferContents result(
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
400 ASSERT(MIMETypeRegistry::isSupportedImageMIMETypeForEncoding(mimeType)); 400 ASSERT(MIMETypeRegistry::isSupportedImageMIMETypeForEncoding(mimeType));
401 401
402 Vector<unsigned char> result; 402 Vector<unsigned char> result;
403 if (!encodeImage(mimeType, quality, &result)) 403 if (!encodeImage(mimeType, quality, &result))
404 return "data:,"; 404 return "data:,";
405 405
406 return "data:" + mimeType + ";base64," + base64Encode(result); 406 return "data:" + mimeType + ";base64," + base64Encode(result);
407 } 407 }
408 408
409 } // namespace blink 409 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698