xref: /haiku/src/servers/app/drawing/PatternHandler.h (revision f7e1df75609966bdfdb4ed39edf26dd145d8221f)
107949718SStephan Aßmus /*
207949718SStephan Aßmus  * Copyright (c) 2001-2007, Haiku, Inc.
307949718SStephan Aßmus  * Distributed under the terms of the MIT license.
407949718SStephan Aßmus  *
507949718SStephan Aßmus  * Author:	DarkWyrm <bpmagic@columbus.rr.com>
607949718SStephan Aßmus  *			Stephan Aßmus <superstippi@gmx.de>
707949718SStephan Aßmus  */
807949718SStephan Aßmus 
92cfe93e7SStephan Aßmus #ifndef PATTERNHANDLER_H
102cfe93e7SStephan Aßmus #define PATTERNHANDLER_H
112cfe93e7SStephan Aßmus 
1207949718SStephan Aßmus #include <stdio.h>
132cfe93e7SStephan Aßmus #include <string.h>
142cfe93e7SStephan Aßmus #include <GraphicsDefs.h>
152cfe93e7SStephan Aßmus 
162cfe93e7SStephan Aßmus class Pattern {
172cfe93e7SStephan Aßmus  public:
182cfe93e7SStephan Aßmus 
192cfe93e7SStephan Aßmus 								Pattern(void) {}
202cfe93e7SStephan Aßmus 
212cfe93e7SStephan Aßmus 								Pattern(const uint64& p)
222cfe93e7SStephan Aßmus 									{ fPattern.type64 = p; }
232cfe93e7SStephan Aßmus 
242cfe93e7SStephan Aßmus 								Pattern(const int8* p)
252cfe93e7SStephan Aßmus 									{ fPattern.type64 = *((const uint64*)p); }
262cfe93e7SStephan Aßmus 
272cfe93e7SStephan Aßmus 								Pattern(const Pattern& src)
282cfe93e7SStephan Aßmus 									{ fPattern.type64 = src.fPattern.type64; }
292cfe93e7SStephan Aßmus 
302cfe93e7SStephan Aßmus 								Pattern(const pattern& src)
312cfe93e7SStephan Aßmus 									{ fPattern.type64 = *(uint64*)src.data; }
322cfe93e7SStephan Aßmus 
332cfe93e7SStephan Aßmus 	inline	const int8*			GetInt8(void) const
342cfe93e7SStephan Aßmus 									{ return fPattern.type8; }
352cfe93e7SStephan Aßmus 
362cfe93e7SStephan Aßmus 	inline	uint64				GetInt64(void) const
372cfe93e7SStephan Aßmus 									{ return fPattern.type64; }
382cfe93e7SStephan Aßmus 
392cfe93e7SStephan Aßmus 	inline	void				Set(const int8* p)
402cfe93e7SStephan Aßmus 									{ fPattern.type64 = *((const uint64*)p); }
412cfe93e7SStephan Aßmus 
422cfe93e7SStephan Aßmus 	inline	void				Set(const uint64& p)
432cfe93e7SStephan Aßmus 									{ fPattern.type64 = p; }
442cfe93e7SStephan Aßmus 
452cfe93e7SStephan Aßmus 			Pattern&			operator=(const Pattern& from)
462cfe93e7SStephan Aßmus 									{ fPattern.type64 = from.fPattern.type64; return *this; }
472cfe93e7SStephan Aßmus 
482cfe93e7SStephan Aßmus 			Pattern&			operator=(const int64 &from)
492cfe93e7SStephan Aßmus 									{ fPattern.type64 = from; return *this; }
502cfe93e7SStephan Aßmus 
512cfe93e7SStephan Aßmus 			Pattern&			operator=(const pattern &from)
522cfe93e7SStephan Aßmus 									{ memcpy(&fPattern.type64, &from, sizeof(pattern)); return *this; }
532cfe93e7SStephan Aßmus 
542cfe93e7SStephan Aßmus 			bool				operator==(const Pattern& other) const
552cfe93e7SStephan Aßmus 									{ return fPattern.type64 == other.fPattern.type64; }
562cfe93e7SStephan Aßmus 
572cfe93e7SStephan Aßmus 			bool				operator==(const pattern& other) const
582cfe93e7SStephan Aßmus 									{ return fPattern.type64 == *(uint64*)other.data; }
592cfe93e7SStephan Aßmus 
602cfe93e7SStephan Aßmus  private:
612cfe93e7SStephan Aßmus 
622cfe93e7SStephan Aßmus 	typedef union
632cfe93e7SStephan Aßmus 	{
642cfe93e7SStephan Aßmus 		uint64	type64;
652cfe93e7SStephan Aßmus 		int8	type8[8];
662cfe93e7SStephan Aßmus 	} pattern_union;
672cfe93e7SStephan Aßmus 
682cfe93e7SStephan Aßmus 			pattern_union		fPattern;
692cfe93e7SStephan Aßmus };
702cfe93e7SStephan Aßmus 
712cfe93e7SStephan Aßmus extern const Pattern kSolidHigh;
722cfe93e7SStephan Aßmus extern const Pattern kSolidLow;
732cfe93e7SStephan Aßmus extern const Pattern kMixedColors;
742cfe93e7SStephan Aßmus 
752cfe93e7SStephan Aßmus /*!
762cfe93e7SStephan Aßmus 	\brief Class for easy calculation and use of patterns
772cfe93e7SStephan Aßmus 
782cfe93e7SStephan Aßmus 	PatternHandlers are designed specifically for DisplayDriver subclasses.
792cfe93e7SStephan Aßmus 	Pattern support can be easily added by setting the pattern to use via
802cfe93e7SStephan Aßmus 	SetTarget, and then merely retrieving the value for the coordinates
812cfe93e7SStephan Aßmus 	specified.
822cfe93e7SStephan Aßmus */
832cfe93e7SStephan Aßmus class PatternHandler {
842cfe93e7SStephan Aßmus  public:
852cfe93e7SStephan Aßmus 								PatternHandler(void);
862cfe93e7SStephan Aßmus 								PatternHandler(const int8* p);
872cfe93e7SStephan Aßmus 								PatternHandler(const uint64& p);
882cfe93e7SStephan Aßmus 								PatternHandler(const Pattern& p);
892cfe93e7SStephan Aßmus 								PatternHandler(const PatternHandler& other);
902cfe93e7SStephan Aßmus 	virtual						~PatternHandler(void);
912cfe93e7SStephan Aßmus 
922cfe93e7SStephan Aßmus 			void				SetPattern(const int8* p);
932cfe93e7SStephan Aßmus 			void				SetPattern(const uint64& p);
942cfe93e7SStephan Aßmus 			void				SetPattern(const Pattern& p);
952cfe93e7SStephan Aßmus 			void				SetPattern(const pattern& p);
962cfe93e7SStephan Aßmus 
97*f7e1df75SStephan Aßmus 			void				SetColors(const rgb_color& high,
98*f7e1df75SStephan Aßmus 									const rgb_color& low);
992cfe93e7SStephan Aßmus 			void				SetHighColor(const rgb_color& color);
1002cfe93e7SStephan Aßmus 			void				SetLowColor(const rgb_color& color);
1012cfe93e7SStephan Aßmus 
102*f7e1df75SStephan Aßmus 			rgb_color			HighColor() const
1032cfe93e7SStephan Aßmus 									{ return fHighColor; }
104*f7e1df75SStephan Aßmus 			rgb_color			LowColor() const
1052cfe93e7SStephan Aßmus 									{ return fLowColor; }
1062cfe93e7SStephan Aßmus 
107*f7e1df75SStephan Aßmus 			rgb_color			ColorAt(const BPoint& pt) const;
108*f7e1df75SStephan Aßmus 			rgb_color			ColorAt(float x, float y) const;
109*f7e1df75SStephan Aßmus 	inline	rgb_color			ColorAt(int x, int y) const;
1102cfe93e7SStephan Aßmus 
1112cfe93e7SStephan Aßmus 			bool				IsHighColor(const BPoint& pt) const;
1122cfe93e7SStephan Aßmus 	inline	bool				IsHighColor(int x, int y) const;
1132cfe93e7SStephan Aßmus 	inline	bool				IsSolidHigh() const
1142cfe93e7SStephan Aßmus 									{ return fPattern == B_SOLID_HIGH; }
1152cfe93e7SStephan Aßmus 	inline	bool				IsSolidLow() const
1162cfe93e7SStephan Aßmus 									{ return fPattern == B_SOLID_LOW; }
1172cfe93e7SStephan Aßmus 	inline	bool				IsSolid() const
1182cfe93e7SStephan Aßmus 									{ return IsSolidHigh() || IsSolidLow(); }
1192cfe93e7SStephan Aßmus 
1202cfe93e7SStephan Aßmus 			const pattern*		GetR5Pattern(void) const
1212cfe93e7SStephan Aßmus 									{ return (const pattern*)fPattern.GetInt8(); }
1222cfe93e7SStephan Aßmus 			const Pattern&		GetPattern(void) const
1232cfe93e7SStephan Aßmus 									{ return fPattern; }
12407949718SStephan Aßmus 
12507949718SStephan Aßmus 			void				SetOffsets(int32 x, int32 y);
12607949718SStephan Aßmus 
1278f4f70a5SStephan Aßmus 			void				MakeOpCopyColorCache();
1288f4f70a5SStephan Aßmus 	inline	const rgb_color*	OpCopyColorCache() const
1298f4f70a5SStephan Aßmus 									{ return fOpCopyColorCache; }
1308f4f70a5SStephan Aßmus 
1312cfe93e7SStephan Aßmus  private:
1322cfe93e7SStephan Aßmus 			Pattern				fPattern;
133*f7e1df75SStephan Aßmus 			rgb_color			fHighColor;
134*f7e1df75SStephan Aßmus 			rgb_color			fLowColor;
13507949718SStephan Aßmus 
13607949718SStephan Aßmus 			uint16				fXOffset;
13707949718SStephan Aßmus 			uint16				fYOffset;
1388f4f70a5SStephan Aßmus 
1398f4f70a5SStephan Aßmus 			rgb_color			fOpCopyColorCache[256];
1408f4f70a5SStephan Aßmus 			uint64				fColorsWhenCached;
1412cfe93e7SStephan Aßmus };
1422cfe93e7SStephan Aßmus 
1432cfe93e7SStephan Aßmus /*!
1442cfe93e7SStephan Aßmus 	\brief Obtains the color in the pattern at the specified coordinates
1452cfe93e7SStephan Aßmus 	\param x X coordinate to get the color for
1462cfe93e7SStephan Aßmus 	\param y Y coordinate to get the color for
1472cfe93e7SStephan Aßmus 	\return Color for the coordinates
1482cfe93e7SStephan Aßmus */
149*f7e1df75SStephan Aßmus inline rgb_color
1502cfe93e7SStephan Aßmus PatternHandler::ColorAt(int x, int y) const
1512cfe93e7SStephan Aßmus {
1522cfe93e7SStephan Aßmus 	return IsHighColor(x, y) ? fHighColor : fLowColor;
1532cfe93e7SStephan Aßmus }
1542cfe93e7SStephan Aßmus 
1552cfe93e7SStephan Aßmus /*!
1562cfe93e7SStephan Aßmus 	\brief Obtains the value of the pattern at the specified coordinates
1572cfe93e7SStephan Aßmus 	\param pt Coordinates to get the value for
1582cfe93e7SStephan Aßmus 	\return Value for the coordinates - true if high, false if low.
1592cfe93e7SStephan Aßmus */
16007949718SStephan Aßmus 
1612cfe93e7SStephan Aßmus inline bool
1622cfe93e7SStephan Aßmus PatternHandler::IsHighColor(int x, int y) const
1632cfe93e7SStephan Aßmus {
16407949718SStephan Aßmus 	x -= fXOffset;
16507949718SStephan Aßmus 	y -= fYOffset;
1662cfe93e7SStephan Aßmus 	const int8* ptr = fPattern.GetInt8();
16707949718SStephan Aßmus 	int32 value = ptr[y & 7] & (1 << (7 - (x & 7)) );
1682cfe93e7SStephan Aßmus 
16907949718SStephan Aßmus 	return value != 0;
1702cfe93e7SStephan Aßmus }
1712cfe93e7SStephan Aßmus 
1722cfe93e7SStephan Aßmus #endif
173