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

Side by Side Diff: Source/core/html/HTMLCanvasElement.cpp

Issue 14298018: This CL implements the first draft of Canvas 2D Context Attributes, aka getContext('2d', { alpha: f… (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Rebased to ToT; test cleanup 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « Source/core/core.gypi ('k') | Source/core/html/canvas/Canvas2DContextAttributes.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2004, 2006, 2007 Apple Inc. All rights reserved. 2 * Copyright (C) 2004, 2006, 2007 Apple Inc. All rights reserved.
3 * Copyright (C) 2007 Alp Toker <alp@atoker.com> 3 * Copyright (C) 2007 Alp Toker <alp@atoker.com>
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 7 * modification, are permitted provided that the following conditions
8 * are met: 8 * are met:
9 * 1. Redistributions of source code must retain the above copyright 9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer. 10 * notice, this list of conditions and the following disclaimer.
(...skipping 19 matching lines...) Expand all
30 30
31 #include <math.h> 31 #include <math.h>
32 #include <stdio.h> 32 #include <stdio.h>
33 #include "HTMLNames.h" 33 #include "HTMLNames.h"
34 #include "bindings/v8/ScriptController.h" 34 #include "bindings/v8/ScriptController.h"
35 #include "core/dom/Attribute.h" 35 #include "core/dom/Attribute.h"
36 #include "core/dom/Document.h" 36 #include "core/dom/Document.h"
37 #include "core/dom/ExceptionCode.h" 37 #include "core/dom/ExceptionCode.h"
38 #include "core/dom/WebCoreMemoryInstrumentation.h" 38 #include "core/dom/WebCoreMemoryInstrumentation.h"
39 #include "core/html/ImageData.h" 39 #include "core/html/ImageData.h"
40 #include "core/html/canvas/CanvasContextAttributes.h" 40 #include "core/html/canvas/Canvas2DContextAttributes.h"
41 #include "core/html/canvas/CanvasGradient.h" 41 #include "core/html/canvas/CanvasGradient.h"
42 #include "core/html/canvas/CanvasPattern.h" 42 #include "core/html/canvas/CanvasPattern.h"
43 #include "core/html/canvas/CanvasRenderingContext2D.h" 43 #include "core/html/canvas/CanvasRenderingContext2D.h"
44 #include "core/html/canvas/CanvasStyle.h" 44 #include "core/html/canvas/CanvasStyle.h"
45 #include "core/page/Chrome.h" 45 #include "core/page/Chrome.h"
46 #include "core/page/Frame.h" 46 #include "core/page/Frame.h"
47 #include "core/page/Page.h" 47 #include "core/page/Page.h"
48 #include "core/page/RuntimeEnabledFeatures.h"
48 #include "core/page/Settings.h" 49 #include "core/page/Settings.h"
49 #include "core/platform/MIMETypeRegistry.h" 50 #include "core/platform/MIMETypeRegistry.h"
50 #include "core/platform/graphics/GraphicsContext.h" 51 #include "core/platform/graphics/GraphicsContext.h"
51 #include "core/platform/graphics/ImageBuffer.h" 52 #include "core/platform/graphics/ImageBuffer.h"
52 #include "core/rendering/RenderHTMLCanvas.h" 53 #include "core/rendering/RenderHTMLCanvas.h"
53 54
54 #include "core/html/canvas/WebGLContextAttributes.h" 55 #include "core/html/canvas/WebGLContextAttributes.h"
55 #include "core/html/canvas/WebGLRenderingContext.h" 56 #include "core/html/canvas/WebGLRenderingContext.h"
56 57
57 #include <public/Platform.h> 58 #include <public/Platform.h>
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
157 // before creating a new 2D context. Vice versa when requesting a WebGL canv as. Requesting a 158 // before creating a new 2D context. Vice versa when requesting a WebGL canv as. Requesting a
158 // context with any other type string will destroy any existing context. 159 // context with any other type string will destroy any existing context.
159 160
160 // FIXME - The code depends on the context not going away once created, to p revent JS from 161 // FIXME - The code depends on the context not going away once created, to p revent JS from
161 // seeing a dangling pointer. So for now we will disallow the context from b eing changed 162 // seeing a dangling pointer. So for now we will disallow the context from b eing changed
162 // once it is created. 163 // once it is created.
163 if (type == "2d") { 164 if (type == "2d") {
164 if (m_context && !m_context->is2d()) 165 if (m_context && !m_context->is2d())
165 return 0; 166 return 0;
166 if (!m_context) { 167 if (!m_context) {
167 m_context = CanvasRenderingContext2D::create(this, document()->inQui rksMode()); 168 m_context = CanvasRenderingContext2D::create(this, RuntimeEnabledFea tures::experimentalCanvasFeaturesEnabled() ? static_cast<Canvas2DContextAttribut es*>(attrs) : 0, document()->inQuirksMode());
168 if (m_context) { 169 if (m_context) {
169 // Need to make sure a RenderLayer and compositing layer get cre ated for the Canvas 170 // Need to make sure a RenderLayer and compositing layer get cre ated for the Canvas
170 setNeedsStyleRecalc(SyntheticStyleChange); 171 setNeedsStyleRecalc(SyntheticStyleChange);
171 } 172 }
172 } 173 }
173 return m_context.get(); 174 return m_context.get();
174 } 175 }
175 176
176 Settings* settings = document()->settings(); 177 Settings* settings = document()->settings();
177 if (settings && settings->webGLEnabled()) { 178 if (settings && settings->webGLEnabled()) {
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
321 322
322 if (m_context) { 323 if (m_context) {
323 if (!paintsIntoCanvasBuffer() && !document()->printing()) 324 if (!paintsIntoCanvasBuffer() && !document()->printing())
324 return; 325 return;
325 m_context->paintRenderingResultsToCanvas(); 326 m_context->paintRenderingResultsToCanvas();
326 } 327 }
327 328
328 if (hasCreatedImageBuffer()) { 329 if (hasCreatedImageBuffer()) {
329 ImageBuffer* imageBuffer = buffer(); 330 ImageBuffer* imageBuffer = buffer();
330 if (imageBuffer) { 331 if (imageBuffer) {
332 CompositeOperator compositeOperator = !m_context || m_context->hasAl pha() ? CompositeSourceOver : CompositeCopy;
331 if (m_presentedImage) 333 if (m_presentedImage)
332 context->drawImage(m_presentedImage.get(), ColorSpaceDeviceRGB, pixelSnappedIntRect(r), CompositeSourceOver, DoNotRespectImageOrientation, useLo wQualityScale); 334 context->drawImage(m_presentedImage.get(), ColorSpaceDeviceRGB, pixelSnappedIntRect(r), compositeOperator, DoNotRespectImageOrientation, useLowQ ualityScale);
333 else 335 else
334 context->drawImageBuffer(imageBuffer, ColorSpaceDeviceRGB, pixel SnappedIntRect(r), CompositeSourceOver, BlendModeNormal, useLowQualityScale); 336 context->drawImageBuffer(imageBuffer, ColorSpaceDeviceRGB, pixel SnappedIntRect(r), compositeOperator, BlendModeNormal, useLowQualityScale);
335 } 337 }
336 } 338 }
337 339
338 if (is3D()) 340 if (is3D())
339 static_cast<WebGLRenderingContext*>(m_context.get())->markLayerComposite d(); 341 static_cast<WebGLRenderingContext*>(m_context.get())->markLayerComposite d();
340 } 342 }
341 343
342 bool HTMLCanvasElement::is3D() const 344 bool HTMLCanvasElement::is3D() const
343 { 345 {
344 return m_context && m_context->is3d(); 346 return m_context && m_context->is3d();
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after
492 return; 494 return;
493 495
494 if (deviceSize.width() > MaxSkiaDim || deviceSize.height() > MaxSkiaDim) 496 if (deviceSize.width() > MaxSkiaDim || deviceSize.height() > MaxSkiaDim)
495 return; 497 return;
496 498
497 IntSize bufferSize(deviceSize.width(), deviceSize.height()); 499 IntSize bufferSize(deviceSize.width(), deviceSize.height());
498 if (!bufferSize.width() || !bufferSize.height()) 500 if (!bufferSize.width() || !bufferSize.height())
499 return; 501 return;
500 502
501 RenderingMode renderingMode = shouldAccelerate(bufferSize) ? Accelerated : U nacceleratedNonPlatformBuffer; 503 RenderingMode renderingMode = shouldAccelerate(bufferSize) ? Accelerated : U nacceleratedNonPlatformBuffer;
502 504 OpacityMode opacityMode = !m_context || m_context->hasAlpha() ? NonOpaque : Opaque;
503 m_imageBuffer = ImageBuffer::create(size(), m_deviceScaleFactor, ColorSpaceD eviceRGB, renderingMode); 505 m_imageBuffer = ImageBuffer::create(size(), m_deviceScaleFactor, ColorSpaceD eviceRGB, renderingMode, opacityMode);
504 if (!m_imageBuffer) 506 if (!m_imageBuffer)
505 return; 507 return;
506 m_imageBuffer->context()->setShadowsIgnoreTransforms(true); 508 m_imageBuffer->context()->setShadowsIgnoreTransforms(true);
507 m_imageBuffer->context()->setImageInterpolationQuality(DefaultInterpolationQ uality); 509 m_imageBuffer->context()->setImageInterpolationQuality(DefaultInterpolationQ uality);
508 if (document()->settings() && !document()->settings()->antialiased2dCanvasEn abled()) 510 if (document()->settings() && !document()->settings()->antialiased2dCanvasEn abled())
509 m_imageBuffer->context()->setShouldAntialias(false); 511 m_imageBuffer->context()->setShouldAntialias(false);
510 m_imageBuffer->context()->setStrokeThickness(1); 512 m_imageBuffer->context()->setStrokeThickness(1);
511 m_contextStateSaver = adoptPtr(new GraphicsContextStateSaver(*m_imageBuffer- >context())); 513 m_contextStateSaver = adoptPtr(new GraphicsContextStateSaver(*m_imageBuffer- >context()));
512 514
513 if (m_context && m_context->is2d()) { 515 if (m_context && m_context->is2d()) {
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
585 HTMLElement::reportMemoryUsage(memoryObjectInfo); 587 HTMLElement::reportMemoryUsage(memoryObjectInfo);
586 info.addMember(m_observers, "observers"); 588 info.addMember(m_observers, "observers");
587 info.addMember(m_context, "context"); 589 info.addMember(m_context, "context");
588 info.addMember(m_imageBuffer, "imageBuffer"); 590 info.addMember(m_imageBuffer, "imageBuffer");
589 info.addMember(m_contextStateSaver, "contextStateSaver"); 591 info.addMember(m_contextStateSaver, "contextStateSaver");
590 info.addMember(m_presentedImage, "presentedImage"); 592 info.addMember(m_presentedImage, "presentedImage");
591 info.addMember(m_copiedImage, "copiedImage"); 593 info.addMember(m_copiedImage, "copiedImage");
592 } 594 }
593 595
594 } 596 }
OLDNEW
« no previous file with comments | « Source/core/core.gypi ('k') | Source/core/html/canvas/Canvas2DContextAttributes.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698