128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu/*
228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu *  Copyright (C) 2007-2009 Torch Mobile, Inc. All rights reserved.
328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu *  Copyright (C) 2010 Patrick Gansterer <paroga@paroga.com>
428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu *
528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu *  This library is free software; you can redistribute it and/or
628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu *  modify it under the terms of the GNU Library General Public
728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu *  License as published by the Free Software Foundation; either
828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu *  version 2 of the License, or (at your option) any later version.
928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu *
1028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu *  This library is distributed in the hope that it will be useful,
1128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu *  but WITHOUT ANY WARRANTY; without even the implied warranty of
1228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
1328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu *  Library General Public License for more details.
1428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu *
1528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu *  You should have received a copy of the GNU Library General Public License
1628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu *  along with this library; see the file COPYING.LIB.  If not, write to
1728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu *  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
1828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu *  Boston, MA 02110-1301, USA.
1928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu */
2028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
2128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu#ifndef SharedBitmap_h
2228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu#define SharedBitmap_h
2328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
2428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu#include "AffineTransform.h"
2528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu#include "BitmapInfo.h"
2628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu#include "ColorSpace.h"
2728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu#include "GraphicsTypes.h"
2828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu#include <wtf/PassOwnPtr.h>
2928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu#include <wtf/PassRefPtr.h>
3028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu#include <wtf/OwnArrayPtr.h>
3128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu#include <wtf/RefCounted.h>
3228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu#include <wtf/Vector.h>
3328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu#include <wingdi.h>
3428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
3528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhunamespace WebCore {
3628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
3728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhuclass FloatPoint;
3828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhuclass FloatRect;
3928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhuclass GraphicsContext;
4028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhuclass IntRect;
4128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhuclass IntSize;
4228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhuclass TransformationMatrix;
4328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
4428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhuclass SharedBitmap: public RefCounted<SharedBitmap> {
4528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhupublic:
4628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    ~SharedBitmap();
4728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    static PassRefPtr<SharedBitmap> create(const IntSize&, BitmapInfo::BitCount = BitmapInfo::BitCount32, bool initPixels = true);
4828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    static PassRefPtr<SharedBitmap> create(const Vector<unsigned>&, const IntSize&, bool hasAlpha = true);
4928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
5028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    const BitmapInfo& bitmapInfo() const { return m_bmpInfo; }
5128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    void* bytes() { return m_pixels; }
5228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    const void* bytes() const { return m_pixels; }
5328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    unsigned width() const { return m_bmpInfo.width(); }
5428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    unsigned height() const { return m_bmpInfo.height(); }
5528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    unsigned validHeight() const { return m_validHeight; }
5628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    void setValidHeight(unsigned validHeight) { m_validHeight = validHeight; }
5728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    void resetPixels(bool black = false);
5828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    void clearPixels(const IntRect& r);
5928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    bool locked() const { return m_locked; }
6028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    void lock() { m_locked = true; }
6128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    void unlock() { m_locked = false; }
6228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    bool freeMemory();
6328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    bool is16bit() const { return m_bmpInfo.is16bit(); }
6428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    bool is32bit() const { return m_bmpInfo.is32bit(); }
6528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    bool to16bit();
6628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    bool hasAlpha() const { return m_hasAlpha; }
6728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    void setHasAlpha(bool alpha) { m_hasAlpha = alpha; }
6828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    bool ensureHandle();
6928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    HBITMAP getHandle() { return m_hbitmap.get(); }
7028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    PassOwnPtr<HBITMAP> createHandle(void** pixels, BitmapInfo* bmpInfo, int h = -1, bool use16bit = true) const;
7128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    bool usesTransparentColor() const { return m_usesTransparentColor; }
7228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    COLORREF transparentColor() const { return m_transparentColor; }
7328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    void setTransparentColor(COLORREF c)
7428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    {
7528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        m_usesTransparentColor = true;
7628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        m_transparentColor = c;
7728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    }
7828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    bool canUseDIBits() const { return !hasAlpha() && !usesTransparentColor(); }
7928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
8028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    PassOwnPtr<HBITMAP> clipBitmap(const IntRect& rect, bool useAlpha, BitmapInfo& bmpInfo, void*& pixels);
8128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
8228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    PassRefPtr<SharedBitmap> clipBitmap(const IntRect& rect, bool useAlpha);
8328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
8428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    void draw(GraphicsContext* ctxt, const IntRect& dstRect, const IntRect& srcRect, ColorSpace styleColorSpace, CompositeOperator compositeOp);
8528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    void drawPattern(GraphicsContext* ctxt, const FloatRect& tileRectIn, const AffineTransform& patternTransform,
8628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                    const FloatPoint& phase, ColorSpace styleColorSpace, CompositeOperator op, const FloatRect& destRect, const IntSize& origSourceSize);
8728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    void draw(HDC, const IntRect& dstRect, const IntRect& srcRect, CompositeOperator compositeOp);
8828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    void drawPattern(HDC, const AffineTransform&, const FloatRect& tileRectIn, const AffineTransform& patternTransform,
8928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                    const FloatPoint& phase, ColorSpace styleColorSpace, CompositeOperator op, const FloatRect& destRect, const IntSize& origSourceSize);
9028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
9128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    class DCProvider {
9228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    public:
9328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        virtual HDC getDC(SharedBitmap*, unsigned*);
9428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        virtual void releaseDC(SharedBitmap*, HDC, unsigned);
9528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    };
9628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
9728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    static DCProvider* s_dcProvider;
9828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
9928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    HDC getDC(unsigned* key1) { return s_dcProvider->getDC(this, key1); }
10028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    void releaseDC(HDC hdc, unsigned key1) { s_dcProvider->releaseDC(this, hdc, key1); }
10128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
10228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    class DCHolder {
10328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    public:
10428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        DCHolder(SharedBitmap* bmp = 0) { setInternal(bmp); }
10528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        ~DCHolder() { clearInternal(); }
10628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        void set(SharedBitmap* bmp = 0)
10728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        {
10828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu            clearInternal();
10928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu            setInternal(bmp);
11028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        }
11128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        HDC get() const { return m_hdc; }
11228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    private:
11328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        DCHolder& operator=(const DCHolder&);
11428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        DCHolder(const DCHolder&);
11528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        void clearInternal()
11628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        {
11728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu            if (m_hdc)
11828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu                m_bitmap->releaseDC(m_hdc, m_key);
11928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        }
12028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        void setInternal(SharedBitmap* bmp)
12128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        {
12228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu            m_bitmap = bmp;
12328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu            m_hdc = bmp ? bmp->getDC(&m_key) : 0;
12428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        }
12528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        SharedBitmap* m_bitmap;
12628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        HDC m_hdc;
12728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        unsigned m_key;
12828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    };
12928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
13028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhuprivate:
13128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    SharedBitmap(const IntSize&, BitmapInfo::BitCount, bool initPixels);
13228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    BitmapInfo m_bmpInfo;
13328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    OwnPtr<HBITMAP> m_hbitmap;
13428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    void* m_pixels;
13528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    OwnArrayPtr<unsigned> m_pixelData;
13628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    COLORREF m_transparentColor;
13728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    int m_validHeight;
13828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    bool m_locked;
13928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    bool m_usesTransparentColor;
14028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    bool m_hasAlpha;
14128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu};
14228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
14328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu} // namespace WebCore
14428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
14528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu#endif // SharedBitmap_h
146