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