xref: /haiku/src/servers/app/drawing/PatternHandler.h (revision f6e4cbb95290a74b33d012600438b84742b0e572)
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  */
82cfe93e7SStephan Aßmus #ifndef PATTERNHANDLER_H
92cfe93e7SStephan Aßmus #define PATTERNHANDLER_H
102cfe93e7SStephan Aßmus 
11*f6e4cbb9SAxel Dörfler 
1207949718SStephan Aßmus #include <stdio.h>
132cfe93e7SStephan Aßmus #include <string.h>
14*f6e4cbb9SAxel Dörfler 
152cfe93e7SStephan Aßmus #include <GraphicsDefs.h>
162cfe93e7SStephan Aßmus 
17*f6e4cbb9SAxel Dörfler class BPoint;
18*f6e4cbb9SAxel Dörfler 
19*f6e4cbb9SAxel Dörfler 
202cfe93e7SStephan Aßmus class Pattern {
212cfe93e7SStephan Aßmus  public:
222cfe93e7SStephan Aßmus 
232cfe93e7SStephan Aßmus 								Pattern(void) {}
242cfe93e7SStephan Aßmus 
252cfe93e7SStephan Aßmus 								Pattern(const uint64& p)
262cfe93e7SStephan Aßmus 									{ fPattern.type64 = p; }
272cfe93e7SStephan Aßmus 
282cfe93e7SStephan Aßmus 								Pattern(const int8* p)
292cfe93e7SStephan Aßmus 									{ fPattern.type64 = *((const uint64*)p); }
302cfe93e7SStephan Aßmus 
312cfe93e7SStephan Aßmus 								Pattern(const Pattern& src)
322cfe93e7SStephan Aßmus 									{ fPattern.type64 = src.fPattern.type64; }
332cfe93e7SStephan Aßmus 
342cfe93e7SStephan Aßmus 								Pattern(const pattern& src)
352cfe93e7SStephan Aßmus 									{ fPattern.type64 = *(uint64*)src.data; }
362cfe93e7SStephan Aßmus 
372cfe93e7SStephan Aßmus 	inline	const int8*			GetInt8(void) const
382cfe93e7SStephan Aßmus 									{ return fPattern.type8; }
392cfe93e7SStephan Aßmus 
402cfe93e7SStephan Aßmus 	inline	uint64				GetInt64(void) const
412cfe93e7SStephan Aßmus 									{ return fPattern.type64; }
422cfe93e7SStephan Aßmus 
432cfe93e7SStephan Aßmus 	inline	void				Set(const int8* p)
442cfe93e7SStephan Aßmus 									{ fPattern.type64 = *((const uint64*)p); }
452cfe93e7SStephan Aßmus 
462cfe93e7SStephan Aßmus 	inline	void				Set(const uint64& p)
472cfe93e7SStephan Aßmus 									{ fPattern.type64 = p; }
482cfe93e7SStephan Aßmus 
492cfe93e7SStephan Aßmus 			Pattern&			operator=(const Pattern& from)
502cfe93e7SStephan Aßmus 									{ fPattern.type64 = from.fPattern.type64; return *this; }
512cfe93e7SStephan Aßmus 
522cfe93e7SStephan Aßmus 			Pattern&			operator=(const int64 &from)
532cfe93e7SStephan Aßmus 									{ fPattern.type64 = from; return *this; }
542cfe93e7SStephan Aßmus 
552cfe93e7SStephan Aßmus 			Pattern&			operator=(const pattern &from)
562cfe93e7SStephan Aßmus 									{ memcpy(&fPattern.type64, &from, sizeof(pattern)); return *this; }
572cfe93e7SStephan Aßmus 
582cfe93e7SStephan Aßmus 			bool				operator==(const Pattern& other) const
592cfe93e7SStephan Aßmus 									{ return fPattern.type64 == other.fPattern.type64; }
602cfe93e7SStephan Aßmus 
612cfe93e7SStephan Aßmus 			bool				operator==(const pattern& other) const
622cfe93e7SStephan Aßmus 									{ return fPattern.type64 == *(uint64*)other.data; }
632cfe93e7SStephan Aßmus 
642cfe93e7SStephan Aßmus  private:
652cfe93e7SStephan Aßmus 
662cfe93e7SStephan Aßmus 	typedef union
672cfe93e7SStephan Aßmus 	{
682cfe93e7SStephan Aßmus 		uint64	type64;
692cfe93e7SStephan Aßmus 		int8	type8[8];
702cfe93e7SStephan Aßmus 	} pattern_union;
712cfe93e7SStephan Aßmus 
722cfe93e7SStephan Aßmus 			pattern_union		fPattern;
732cfe93e7SStephan Aßmus };
742cfe93e7SStephan Aßmus 
752cfe93e7SStephan Aßmus extern const Pattern kSolidHigh;
762cfe93e7SStephan Aßmus extern const Pattern kSolidLow;
772cfe93e7SStephan Aßmus extern const Pattern kMixedColors;
782cfe93e7SStephan Aßmus 
792cfe93e7SStephan Aßmus /*!
802cfe93e7SStephan Aßmus 	\brief Class for easy calculation and use of patterns
812cfe93e7SStephan Aßmus 
822cfe93e7SStephan Aßmus 	PatternHandlers are designed specifically for DisplayDriver subclasses.
832cfe93e7SStephan Aßmus 	Pattern support can be easily added by setting the pattern to use via
842cfe93e7SStephan Aßmus 	SetTarget, and then merely retrieving the value for the coordinates
852cfe93e7SStephan Aßmus 	specified.
862cfe93e7SStephan Aßmus */
872cfe93e7SStephan Aßmus class PatternHandler {
882cfe93e7SStephan Aßmus  public:
892cfe93e7SStephan Aßmus 								PatternHandler(void);
902cfe93e7SStephan Aßmus 								PatternHandler(const int8* p);
912cfe93e7SStephan Aßmus 								PatternHandler(const uint64& p);
922cfe93e7SStephan Aßmus 								PatternHandler(const Pattern& p);
932cfe93e7SStephan Aßmus 								PatternHandler(const PatternHandler& other);
942cfe93e7SStephan Aßmus 	virtual						~PatternHandler(void);
952cfe93e7SStephan Aßmus 
962cfe93e7SStephan Aßmus 			void				SetPattern(const int8* p);
972cfe93e7SStephan Aßmus 			void				SetPattern(const uint64& p);
982cfe93e7SStephan Aßmus 			void				SetPattern(const Pattern& p);
992cfe93e7SStephan Aßmus 			void				SetPattern(const pattern& p);
1002cfe93e7SStephan Aßmus 
101f7e1df75SStephan Aßmus 			void				SetColors(const rgb_color& high,
102f7e1df75SStephan Aßmus 									const rgb_color& low);
1032cfe93e7SStephan Aßmus 			void				SetHighColor(const rgb_color& color);
1042cfe93e7SStephan Aßmus 			void				SetLowColor(const rgb_color& color);
1052cfe93e7SStephan Aßmus 
106f7e1df75SStephan Aßmus 			rgb_color			HighColor() const
1072cfe93e7SStephan Aßmus 									{ return fHighColor; }
108f7e1df75SStephan Aßmus 			rgb_color			LowColor() const
1092cfe93e7SStephan Aßmus 									{ return fLowColor; }
1102cfe93e7SStephan Aßmus 
111f7e1df75SStephan Aßmus 			rgb_color			ColorAt(const BPoint& pt) const;
112f7e1df75SStephan Aßmus 			rgb_color			ColorAt(float x, float y) const;
113f7e1df75SStephan Aßmus 	inline	rgb_color			ColorAt(int x, int y) const;
1142cfe93e7SStephan Aßmus 
1152cfe93e7SStephan Aßmus 			bool				IsHighColor(const BPoint& pt) const;
1162cfe93e7SStephan Aßmus 	inline	bool				IsHighColor(int x, int y) const;
1172cfe93e7SStephan Aßmus 	inline	bool				IsSolidHigh() const
1182cfe93e7SStephan Aßmus 									{ return fPattern == B_SOLID_HIGH; }
1192cfe93e7SStephan Aßmus 	inline	bool				IsSolidLow() const
1202cfe93e7SStephan Aßmus 									{ return fPattern == B_SOLID_LOW; }
1212cfe93e7SStephan Aßmus 	inline	bool				IsSolid() const
1222cfe93e7SStephan Aßmus 									{ return IsSolidHigh() || IsSolidLow(); }
1232cfe93e7SStephan Aßmus 
1242cfe93e7SStephan Aßmus 			const pattern*		GetR5Pattern(void) const
1252cfe93e7SStephan Aßmus 									{ return (const pattern*)fPattern.GetInt8(); }
1262cfe93e7SStephan Aßmus 			const Pattern&		GetPattern(void) const
1272cfe93e7SStephan Aßmus 									{ return fPattern; }
12807949718SStephan Aßmus 
12907949718SStephan Aßmus 			void				SetOffsets(int32 x, int32 y);
13007949718SStephan Aßmus 
1318f4f70a5SStephan Aßmus 			void				MakeOpCopyColorCache();
1328f4f70a5SStephan Aßmus 	inline	const rgb_color*	OpCopyColorCache() const
1338f4f70a5SStephan Aßmus 									{ return fOpCopyColorCache; }
1348f4f70a5SStephan Aßmus 
1352cfe93e7SStephan Aßmus  private:
1362cfe93e7SStephan Aßmus 			Pattern				fPattern;
137f7e1df75SStephan Aßmus 			rgb_color			fHighColor;
138f7e1df75SStephan Aßmus 			rgb_color			fLowColor;
13907949718SStephan Aßmus 
14007949718SStephan Aßmus 			uint16				fXOffset;
14107949718SStephan Aßmus 			uint16				fYOffset;
1428f4f70a5SStephan Aßmus 
1438f4f70a5SStephan Aßmus 			rgb_color			fOpCopyColorCache[256];
1448f4f70a5SStephan Aßmus 			uint64				fColorsWhenCached;
1452cfe93e7SStephan Aßmus };
1462cfe93e7SStephan Aßmus 
1472cfe93e7SStephan Aßmus /*!
1482cfe93e7SStephan Aßmus 	\brief Obtains the color in the pattern at the specified coordinates
1492cfe93e7SStephan Aßmus 	\param x X coordinate to get the color for
1502cfe93e7SStephan Aßmus 	\param y Y coordinate to get the color for
1512cfe93e7SStephan Aßmus 	\return Color for the coordinates
1522cfe93e7SStephan Aßmus */
153f7e1df75SStephan Aßmus inline rgb_color
1542cfe93e7SStephan Aßmus PatternHandler::ColorAt(int x, int y) const
1552cfe93e7SStephan Aßmus {
1562cfe93e7SStephan Aßmus 	return IsHighColor(x, y) ? fHighColor : fLowColor;
1572cfe93e7SStephan Aßmus }
1582cfe93e7SStephan Aßmus 
1592cfe93e7SStephan Aßmus /*!
1602cfe93e7SStephan Aßmus 	\brief Obtains the value of the pattern at the specified coordinates
1612cfe93e7SStephan Aßmus 	\param pt Coordinates to get the value for
1622cfe93e7SStephan Aßmus 	\return Value for the coordinates - true if high, false if low.
1632cfe93e7SStephan Aßmus */
16407949718SStephan Aßmus 
1652cfe93e7SStephan Aßmus inline bool
1662cfe93e7SStephan Aßmus PatternHandler::IsHighColor(int x, int y) const
1672cfe93e7SStephan Aßmus {
16807949718SStephan Aßmus 	x -= fXOffset;
16907949718SStephan Aßmus 	y -= fYOffset;
1702cfe93e7SStephan Aßmus 	const int8* ptr = fPattern.GetInt8();
17107949718SStephan Aßmus 	int32 value = ptr[y & 7] & (1 << (7 - (x & 7)) );
1722cfe93e7SStephan Aßmus 
17307949718SStephan Aßmus 	return value != 0;
1742cfe93e7SStephan Aßmus }
1752cfe93e7SStephan Aßmus 
1762cfe93e7SStephan Aßmus #endif
177