master chld/haikuprg / decor / MacDecorator / includes / PatternHandler.h
  1/*
  2 * Copyright (c) 2001-2007, Haiku, Inc.
  3 * Distributed under the terms of the MIT license.
  4 *
  5 * Author:	DarkWyrm <bpmagic@columbus.rr.com>
  6 *			Stephan Aßmus <superstippi@gmx.de>
  7 */
  8#ifndef PATTERNHANDLER_H
  9#define PATTERNHANDLER_H
 10
 11
 12#include <stdio.h>
 13#include <string.h>
 14
 15#include <GraphicsDefs.h>
 16
 17class BPoint;
 18
 19
 20class Pattern {
 21 public:
 22
 23								Pattern() {} 
 24
 25								Pattern(const uint64& p)
 26									{ fPattern.type64 = p; }
 27
 28								Pattern(const int8* p)
 29									{ fPattern.type64 = *((const uint64*)p); }
 30	
 31								Pattern(const Pattern& src)
 32									{ fPattern.type64 = src.fPattern.type64; }
 33
 34								Pattern(const pattern& src)
 35									{ fPattern.type64 = *(uint64*)src.data; }
 36
 37	inline	const int8*			GetInt8() const
 38									{ return fPattern.type8; }
 39
 40	inline	uint64				GetInt64() const
 41									{ return fPattern.type64; }
 42
 43	inline	const ::pattern&	GetPattern() const
 44									{ return *(const ::pattern*)&fPattern.type64; }
 45
 46	inline	void				Set(const int8* p)
 47									{ fPattern.type64 = *((const uint64*)p); }
 48
 49	inline	void				Set(const uint64& p)
 50									{ fPattern.type64 = p; }
 51
 52			Pattern&			operator=(const Pattern& from)
 53									{ fPattern.type64 = from.fPattern.type64; return *this; }
 54
 55			Pattern&			operator=(const int64 &from)
 56									{ fPattern.type64 = from; return *this; }
 57
 58			Pattern&			operator=(const pattern &from)
 59									{ memcpy(&fPattern.type64, &from, sizeof(pattern)); return *this; }
 60
 61			bool				operator==(const Pattern& other) const
 62									{ return fPattern.type64 == other.fPattern.type64; }
 63
 64			bool				operator==(const pattern& other) const
 65									{ return fPattern.type64 == *(uint64*)other.data; }
 66
 67 private:
 68
 69	typedef union
 70	{
 71		uint64	type64;
 72		int8	type8[8];
 73	} pattern_union;
 74
 75			pattern_union		fPattern;
 76};
 77
 78extern const Pattern kSolidHigh;
 79extern const Pattern kSolidLow;
 80extern const Pattern kMixedColors;
 81
 82/*!
 83	\brief Class for easy calculation and use of patterns
 84	
 85	PatternHandlers are designed specifically for DisplayDriver subclasses. 
 86	Pattern support can be easily added by setting the pattern to use via 
 87	SetTarget, and then merely retrieving the value for the coordinates 
 88	specified. 
 89*/
 90class PatternHandler {
 91 public:
 92								PatternHandler(void);
 93								PatternHandler(const int8* p);
 94								PatternHandler(const uint64& p);
 95								PatternHandler(const Pattern& p);
 96								PatternHandler(const PatternHandler& other);
 97	virtual						~PatternHandler(void);
 98
 99			void				SetPattern(const int8* p);
100			void				SetPattern(const uint64& p);
101			void				SetPattern(const Pattern& p);
102			void				SetPattern(const pattern& p);
103
104			void				SetColors(const rgb_color& high,
105									const rgb_color& low);
106			void				SetHighColor(const rgb_color& color);
107			void				SetLowColor(const rgb_color& color);
108
109			rgb_color			HighColor() const
110									{ return fHighColor; }
111			rgb_color			LowColor() const
112									{ return fLowColor; }
113
114			rgb_color			ColorAt(const BPoint& pt) const;
115			rgb_color			ColorAt(float x, float y) const;
116	inline	rgb_color			ColorAt(int x, int y) const;
117
118			bool				IsHighColor(const BPoint& pt) const;
119	inline	bool				IsHighColor(int x, int y) const;
120	inline	bool				IsSolidHigh() const
121									{ return fPattern == B_SOLID_HIGH; }
122	inline	bool				IsSolidLow() const
123									{ return fPattern == B_SOLID_LOW; }
124	inline	bool				IsSolid() const
125									{ return IsSolidHigh() || IsSolidLow(); }
126
127			const pattern*		GetR5Pattern(void) const
128									{ return (const pattern*)fPattern.GetInt8(); }
129			const Pattern&		GetPattern(void) const
130									{ return fPattern; }
131
132			void				SetOffsets(int32 x, int32 y);
133
134			void				MakeOpCopyColorCache();
135	inline	const rgb_color*	OpCopyColorCache() const
136									{ return fOpCopyColorCache; }
137
138 private:
139			Pattern				fPattern;
140			rgb_color			fHighColor;
141			rgb_color			fLowColor;
142
143			uint16				fXOffset;
144			uint16				fYOffset;
145
146			rgb_color			fOpCopyColorCache[256];
147			uint64				fColorsWhenCached;
148};
149
150/*!
151	\brief Obtains the color in the pattern at the specified coordinates
152	\param x X coordinate to get the color for
153	\param y Y coordinate to get the color for
154	\return Color for the coordinates
155*/
156inline rgb_color
157PatternHandler::ColorAt(int x, int y) const
158{
159	return IsHighColor(x, y) ? fHighColor : fLowColor;
160}
161
162/*!
163	\brief Obtains the value of the pattern at the specified coordinates
164	\param pt Coordinates to get the value for
165	\return Value for the coordinates - true if high, false if low.
166*/
167
168inline bool
169PatternHandler::IsHighColor(int x, int y) const
170{
171	x -= fXOffset;
172	y -= fYOffset;
173	const int8* ptr = fPattern.GetInt8();
174	int32 value = ptr[y & 7] & (1 << (7 - (x & 7)) );
175	
176	return value != 0;
177}
178
179#endif