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