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#ifndef PlatformCanvas_h 2781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#define PlatformCanvas_h 2881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 2981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include "IntSize.h" 3081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include <stdint.h> 3181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include <wtf/Noncopyable.h> 3281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include <wtf/OwnPtr.h> 3381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 342daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if USE(CG) 3581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include <CoreGraphics/CGColorSpace.h> 3681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include <CoreGraphics/CGContext.h> 3781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include <wtf/OwnArrayPtr.h> 3881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include <wtf/RetainPtr.h> 3981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#endif 4081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 4181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#if USE(SKIA) 4281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochclass SkBitmap; 432daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochclass SkCanvas; 4481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#endif 4581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 4681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochnamespace WebCore { 4781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 4881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochclass GraphicsContext; 4981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 5081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#if USE(SKIA) 5181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochclass PlatformContextSkia; 5281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#endif 5381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 5481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch// A 2D buffer of pixels with an associated GraphicsContext. 5581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochclass PlatformCanvas { 5681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch WTF_MAKE_NONCOPYABLE(PlatformCanvas); 5781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochpublic: 5881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch PlatformCanvas(); 5981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch ~PlatformCanvas(); 6081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 6181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch // Scoped lock class to get temporary access to this canvas's pixels. 6281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch class AutoLocker { 6381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch WTF_MAKE_NONCOPYABLE(AutoLocker); 6481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch public: 6581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch explicit AutoLocker(PlatformCanvas*); 6681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch ~AutoLocker(); 6781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 6881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch const uint8_t* pixels() const { return m_pixels; } 6981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch private: 7081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch PlatformCanvas* m_canvas; 7181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#if USE(SKIA) 7281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch const SkBitmap* m_bitmap; 7381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#endif 7481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch uint8_t* m_pixels; 7581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch }; 7681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 7781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch // Scoped lock class to get temporary access to paint into this canvas. 7881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch class Painter { 7981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch WTF_MAKE_NONCOPYABLE(Painter); 8081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch public: 812daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch enum TextOption { GrayscaleText, SubpixelText }; 822daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 832daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch Painter(PlatformCanvas*, TextOption); 8481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch ~Painter(); 8581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 8681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch GraphicsContext* context() const { return m_context.get(); } 8781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch private: 8881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch OwnPtr<GraphicsContext> m_context; 8981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#if USE(SKIA) 9081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch OwnPtr<PlatformContextSkia> m_skiaContext; 912daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#elif USE(CG) 9281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch RetainPtr<CGColorSpaceRef> m_colorSpace; 9381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch RetainPtr<CGContextRef> m_contextCG; 9481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#endif 9581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch }; 9681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 9781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch void resize(const IntSize&); 9881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch IntSize size() const { return m_size; } 9981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 10081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochprivate: 10181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#if USE(SKIA) 1022daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch OwnPtr<SkCanvas> m_skiaCanvas; 1032daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#elif USE(CG) 10481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch OwnArrayPtr<uint8_t> m_pixelData; 10581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#endif 10681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch IntSize m_size; 10781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}; 10881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 10981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch} // namespace WebCore 11081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 11181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#endif 112