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

Side by Side Diff: Source/core/platform/graphics/skia/ImageBufferSkia.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
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 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
63 63
64 // We pass a technically-uninitialized canvas to the platform context here since 64 // We pass a technically-uninitialized canvas to the platform context here since
65 // the canvas initialization completes in ImageBuffer::ImageBuffer. But 65 // the canvas initialization completes in ImageBuffer::ImageBuffer. But
66 // PlatformContext doesn't actually need to use the object, and this makes all 66 // PlatformContext doesn't actually need to use the object, and this makes all
67 // the ownership easier to manage. 67 // the ownership easier to manage.
68 ImageBufferData::ImageBufferData(const IntSize& size) 68 ImageBufferData::ImageBufferData(const IntSize& size)
69 : m_platformContext(0) // Canvas is set in ImageBuffer constructor. 69 : m_platformContext(0) // Canvas is set in ImageBuffer constructor.
70 { 70 {
71 } 71 }
72 72
73 static SkCanvas* createAcceleratedCanvas(const IntSize& size, ImageBufferData* d ata) 73 static SkCanvas* createAcceleratedCanvas(const IntSize& size, ImageBufferData* d ata, OpacityMode opacityMode)
74 { 74 {
75 RefPtr<GraphicsContext3D> context3D = SharedGraphicsContext3D::get(); 75 RefPtr<GraphicsContext3D> context3D = SharedGraphicsContext3D::get();
76 if (!context3D) 76 if (!context3D)
77 return 0; 77 return 0;
78 GrContext* gr = context3D->grContext(); 78 GrContext* gr = context3D->grContext();
79 if (!gr) 79 if (!gr)
80 return 0; 80 return 0;
81 gr->resetContext(); 81 gr->resetContext();
82 Canvas2DLayerBridge::OpacityMode bridgeOpacityMode = opacityMode == Opaque ? Canvas2DLayerBridge::Opaque : Canvas2DLayerBridge::NonOpaque;
82 Canvas2DLayerBridge::ThreadMode threadMode = WebKit::Platform::current()->is ThreadedCompositingEnabled() ? Canvas2DLayerBridge::Threaded : Canvas2DLayerBrid ge::SingleThread; 83 Canvas2DLayerBridge::ThreadMode threadMode = WebKit::Platform::current()->is ThreadedCompositingEnabled() ? Canvas2DLayerBridge::Threaded : Canvas2DLayerBrid ge::SingleThread;
83 SkImage::Info info; 84 SkImage::Info info;
84 info.fWidth = size.width(); 85 info.fWidth = size.width();
85 info.fHeight = size.height(); 86 info.fHeight = size.height();
86 info.fColorType = SkImage::kPMColor_ColorType; 87 info.fColorType = SkImage::kPMColor_ColorType;
87 info.fAlphaType = SkImage::kPremul_AlphaType; 88 info.fAlphaType = SkImage::kPremul_AlphaType;
88 SkAutoTUnref<SkSurface> surface(SkSurface::NewRenderTarget(context3D->grCont ext(), info)); 89 SkAutoTUnref<SkSurface> surface(SkSurface::NewRenderTarget(context3D->grCont ext(), info));
89 if (!surface.get()) 90 if (!surface.get())
90 return 0; 91 return 0;
91 SkDeferredCanvas* canvas = new SkDeferredCanvas(surface.get()); 92 SkDeferredCanvas* canvas = new SkDeferredCanvas(surface.get());
92 data->m_layerBridge = Canvas2DLayerBridge::create(context3D.release(), canva s, threadMode); 93 data->m_layerBridge = Canvas2DLayerBridge::create(context3D.release(), canva s, bridgeOpacityMode, threadMode);
93 // If canvas buffer allocation failed, debug build will have asserted 94 // If canvas buffer allocation failed, debug build will have asserted
94 // For release builds, we must verify whether the device has a render target 95 // For release builds, we must verify whether the device has a render target
95 data->m_platformContext.setAccelerated(true); 96 data->m_platformContext.setAccelerated(true);
96 return canvas; 97 return canvas;
97 } 98 }
98 99
99 static SkCanvas* createNonPlatformCanvas(const IntSize& size) 100 static SkCanvas* createNonPlatformCanvas(const IntSize& size)
100 { 101 {
101 SkAutoTUnref<SkDevice> device(new SkDevice(SkBitmap::kARGB_8888_Config, size .width(), size.height())); 102 SkAutoTUnref<SkDevice> device(new SkDevice(SkBitmap::kARGB_8888_Config, size .width(), size.height()));
102 SkPixelRef* pixelRef = device->accessBitmap(false).pixelRef(); 103 SkPixelRef* pixelRef = device->accessBitmap(false).pixelRef();
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
137 138
138 m_data.m_canvas = adoptPtr(new SkCanvas(device)); 139 m_data.m_canvas = adoptPtr(new SkCanvas(device));
139 m_data.m_platformContext.setCanvas(m_data.m_canvas.get()); 140 m_data.m_platformContext.setCanvas(m_data.m_canvas.get());
140 m_context = adoptPtr(new GraphicsContext(&m_data.m_platformContext)); 141 m_context = adoptPtr(new GraphicsContext(&m_data.m_platformContext));
141 m_context->setShouldSmoothFonts(false); 142 m_context->setShouldSmoothFonts(false);
142 m_context->scale(FloatSize(m_resolutionScale, m_resolutionScale)); 143 m_context->scale(FloatSize(m_resolutionScale, m_resolutionScale));
143 144
144 success = true; 145 success = true;
145 } 146 }
146 147
147 ImageBuffer::ImageBuffer(const IntSize& size, float resolutionScale, ColorSpace, RenderingMode renderingMode, bool& success) 148 ImageBuffer::ImageBuffer(const IntSize& size, float resolutionScale, ColorSpace, RenderingMode renderingMode, OpacityMode opacityMode, bool& success)
148 : m_data(size) 149 : m_data(size)
149 , m_size(size) 150 , m_size(size)
150 , m_logicalSize(size) 151 , m_logicalSize(size)
151 , m_resolutionScale(resolutionScale) 152 , m_resolutionScale(resolutionScale)
152 { 153 {
153 OwnPtr<SkCanvas> canvas; 154 OwnPtr<SkCanvas> canvas;
154 155
155 if (renderingMode == Accelerated) 156 if (renderingMode == Accelerated)
156 canvas = adoptPtr(createAcceleratedCanvas(size, &m_data)); 157 canvas = adoptPtr(createAcceleratedCanvas(size, &m_data, opacityMode));
157 else if (renderingMode == UnacceleratedNonPlatformBuffer) 158 else if (renderingMode == UnacceleratedNonPlatformBuffer)
158 canvas = adoptPtr(createNonPlatformCanvas(size)); 159 canvas = adoptPtr(createNonPlatformCanvas(size));
159 160
160 if (!canvas) 161 if (!canvas)
161 canvas = adoptPtr(skia::TryCreateBitmapCanvas(size.width(), size.height( ), false)); 162 canvas = adoptPtr(skia::TryCreateBitmapCanvas(size.width(), size.height( ), false));
162 163
163 if (!canvas) { 164 if (!canvas) {
164 success = false; 165 success = false;
165 return; 166 return;
166 } 167 }
167 168
168 m_data.m_canvas = canvas.release(); 169 m_data.m_canvas = canvas.release();
169 m_data.m_platformContext.setCanvas(m_data.m_canvas.get()); 170 m_data.m_platformContext.setCanvas(m_data.m_canvas.get());
170 m_context = adoptPtr(new GraphicsContext(&m_data.m_platformContext)); 171 m_context = adoptPtr(new GraphicsContext(&m_data.m_platformContext));
171 m_context->setShouldSmoothFonts(false); 172 m_context->setShouldSmoothFonts(opacityMode == Opaque);
172 m_context->scale(FloatSize(m_resolutionScale, m_resolutionScale)); 173 m_context->scale(FloatSize(m_resolutionScale, m_resolutionScale));
173 174
174 // Make the background transparent. It would be nice if this wasn't 175 // Clear the background transparent or opaque, as required. It would be nice if this wasn't
175 // required, but the canvas is currently filled with the magic transparency 176 // required, but the canvas is currently filled with the magic transparency
176 // color. Can we have another way to manage this? 177 // color. Can we have another way to manage this?
177 m_data.m_canvas->drawARGB(0, 0, 0, 0, SkXfermode::kClear_Mode); 178 if (opacityMode == Opaque)
179 m_data.m_canvas->drawARGB(255, 0, 0, 0, SkXfermode::kSrc_Mode);
180 else
181 m_data.m_canvas->drawARGB(0, 0, 0, 0, SkXfermode::kClear_Mode);
178 182
179 success = true; 183 success = true;
180 } 184 }
181 185
182 ImageBuffer::~ImageBuffer() 186 ImageBuffer::~ImageBuffer()
183 { 187 {
184 } 188 }
185 189
186 GraphicsContext* ImageBuffer::context() const 190 GraphicsContext* ImageBuffer::context() const
187 { 191 {
(...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after
438 if (!encodeImage(imageData, mimeType, quality, &encodedImage)) 442 if (!encodeImage(imageData, mimeType, quality, &encodedImage))
439 return "data:,"; 443 return "data:,";
440 444
441 Vector<char> base64Data; 445 Vector<char> base64Data;
442 base64Encode(encodedImage, base64Data); 446 base64Encode(encodedImage, base64Data);
443 447
444 return "data:" + mimeType + ";base64," + base64Data; 448 return "data:" + mimeType + ";base64," + base64Data;
445 } 449 }
446 450
447 } // namespace WebCore 451 } // namespace WebCore
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698