181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch/* 281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * Copyright (C) 2011 Google Inc. All rights reserved. 381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * 481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * Redistribution and use in source and binary forms, with or without 581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * modification, are permitted provided that the following conditions 681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * are met: 781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * 881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * 1. Redistributions of source code must retain the above copyright 981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * notice, this list of conditions and the following disclaimer. 1081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * 2. Redistributions in binary form must reproduce the above copyright 1181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * notice, this list of conditions and the following disclaimer in the 1281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * documentation and/or other materials provided with the distribution. 1381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * 1481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 1581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 1681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 1781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 1881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 1981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 2081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 2181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 2381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch */ 2581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 2681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include "config.h" 2781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 2881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include "PlatformCanvas.h" 2981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 3081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include "GraphicsContext.h" 3181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 3281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#if USE(SKIA) 3381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include "NativeImageSkia.h" 3481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include "PlatformContextSkia.h" 3581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include "SkColorPriv.h" 3681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include "skia/ext/platform_canvas.h" 372daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#elif USE(CG) 3881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include <CoreGraphics/CGBitmapContext.h> 3981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#endif 4081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 4181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochnamespace WebCore { 4281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 4381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen MurdochPlatformCanvas::PlatformCanvas() 4481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{ 4581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch} 4681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 4781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen MurdochPlatformCanvas::~PlatformCanvas() 4881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{ 4981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch} 5081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 5181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid PlatformCanvas::resize(const IntSize& size) 5281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{ 5381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch m_size = size; 5481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#if USE(SKIA) 552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch m_skiaCanvas = skia::CreateBitmapCanvas(size.width(), size.height(), false); 562daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#elif USE(CG) 5781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch size_t bufferSize = size.width() * size.height() * 4; 5881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch m_pixelData = adoptArrayPtr(new uint8_t[bufferSize]); 5981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch memset(m_pixelData.get(), 0, bufferSize); 6081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#endif 6181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch} 6281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 6381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen MurdochPlatformCanvas::AutoLocker::AutoLocker(PlatformCanvas* canvas) 6481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch : m_canvas(canvas) 6581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch , m_pixels(0) 6681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{ 6781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#if USE(SKIA) 6881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (m_canvas->m_skiaCanvas) { 6981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch m_bitmap = &m_canvas->m_skiaCanvas->getDevice()->accessBitmap(false); 7081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch m_bitmap->lockPixels(); 7181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 7281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (m_bitmap->config() == SkBitmap::kARGB_8888_Config) 7381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch m_pixels = static_cast<uint8_t*>(m_bitmap->getPixels()); 7481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } else 7581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch m_bitmap = 0; 762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#elif USE(CG) 772daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (canvas->m_pixelData) 782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch m_pixels = &canvas->m_pixelData[0]; 7981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#endif 8081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch} 8181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 8281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen MurdochPlatformCanvas::AutoLocker::~AutoLocker() 8381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{ 8481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#if USE(SKIA) 8581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (m_bitmap) 8681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch m_bitmap->unlockPixels(); 8781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#endif 8881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch} 8981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 902daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben MurdochPlatformCanvas::Painter::Painter(PlatformCanvas* canvas, PlatformCanvas::Painter::TextOption option) 9181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{ 9281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#if USE(SKIA) 9381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch m_skiaContext = adoptPtr(new PlatformContextSkia(canvas->m_skiaCanvas.get())); 9481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 952daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch m_skiaContext->setDrawingToImageBuffer(option == GrayscaleText); 9681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 9781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch m_context = adoptPtr(new GraphicsContext(reinterpret_cast<PlatformGraphicsContext*>(m_skiaContext.get()))); 982daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#elif USE(CG) 9981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 10081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch m_colorSpace = CGColorSpaceCreateDeviceRGB(); 10181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch size_t rowBytes = canvas->size().width() * 4; 10281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch m_contextCG = CGBitmapContextCreate(canvas->m_pixelData.get(), 10381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch canvas->size().width(), canvas->size().height(), 8, rowBytes, 10481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch m_colorSpace.get(), 10581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Host); 10681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch CGContextTranslateCTM(m_contextCG.get(), 0, canvas->size().height()); 10781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch CGContextScaleCTM(m_contextCG.get(), 1, -1); 10881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch m_context = adoptPtr(new GraphicsContext(m_contextCG.get())); 10981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#endif 11081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch} 11181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 11281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen MurdochPlatformCanvas::Painter::~Painter() 11381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{ 11481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch} 11581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 11681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch} // namespace WebCore 117