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
11f6e4cbb9SAxel Dörfler
1207949718SStephan Aßmus #include <stdio.h>
132cfe93e7SStephan Aßmus #include <string.h>
14f6e4cbb9SAxel Dörfler
152cfe93e7SStephan Aßmus #include <GraphicsDefs.h>
162cfe93e7SStephan Aßmus
17f6e4cbb9SAxel Dörfler class BPoint;
18f6e4cbb9SAxel Dörfler
19f6e4cbb9SAxel Dörfler
202cfe93e7SStephan Aßmus class Pattern {
212cfe93e7SStephan Aßmus public:
222cfe93e7SStephan Aßmus
Pattern()23*12349c7dSStephan Aßmus Pattern() {}
242cfe93e7SStephan Aßmus
Pattern(const uint64 & p)252cfe93e7SStephan Aßmus Pattern(const uint64& p)
262cfe93e7SStephan Aßmus { fPattern.type64 = p; }
272cfe93e7SStephan Aßmus
Pattern(const int8 * p)282cfe93e7SStephan Aßmus Pattern(const int8* p)
292cfe93e7SStephan Aßmus { fPattern.type64 = *((const uint64*)p); }
302cfe93e7SStephan Aßmus
Pattern(const Pattern & src)312cfe93e7SStephan Aßmus Pattern(const Pattern& src)
322cfe93e7SStephan Aßmus { fPattern.type64 = src.fPattern.type64; }
332cfe93e7SStephan Aßmus
Pattern(const pattern & src)342cfe93e7SStephan Aßmus Pattern(const pattern& src)
352cfe93e7SStephan Aßmus { fPattern.type64 = *(uint64*)src.data; }
362cfe93e7SStephan Aßmus
GetInt8()37*12349c7dSStephan Aßmus inline const int8* GetInt8() const
382cfe93e7SStephan Aßmus { return fPattern.type8; }
392cfe93e7SStephan Aßmus
GetInt64()40*12349c7dSStephan Aßmus inline uint64 GetInt64() const
412cfe93e7SStephan Aßmus { return fPattern.type64; }
422cfe93e7SStephan Aßmus
GetPattern()43*12349c7dSStephan Aßmus inline const ::pattern& GetPattern() const
44*12349c7dSStephan Aßmus { return *(const ::pattern*)&fPattern.type64; }
45*12349c7dSStephan Aßmus
Set(const int8 * p)462cfe93e7SStephan Aßmus inline void Set(const int8* p)
472cfe93e7SStephan Aßmus { fPattern.type64 = *((const uint64*)p); }
482cfe93e7SStephan Aßmus
Set(const uint64 & p)492cfe93e7SStephan Aßmus inline void Set(const uint64& p)
502cfe93e7SStephan Aßmus { fPattern.type64 = p; }
512cfe93e7SStephan Aßmus
522cfe93e7SStephan Aßmus Pattern& operator=(const Pattern& from)
532cfe93e7SStephan Aßmus { fPattern.type64 = from.fPattern.type64; return *this; }
542cfe93e7SStephan Aßmus
552cfe93e7SStephan Aßmus Pattern& operator=(const int64 &from)
562cfe93e7SStephan Aßmus { fPattern.type64 = from; return *this; }
572cfe93e7SStephan Aßmus
582cfe93e7SStephan Aßmus Pattern& operator=(const pattern &from)
592cfe93e7SStephan Aßmus { memcpy(&fPattern.type64, &from, sizeof(pattern)); return *this; }
602cfe93e7SStephan Aßmus
612cfe93e7SStephan Aßmus bool operator==(const Pattern& other) const
622cfe93e7SStephan Aßmus { return fPattern.type64 == other.fPattern.type64; }
632cfe93e7SStephan Aßmus
642cfe93e7SStephan Aßmus bool operator==(const pattern& other) const
652cfe93e7SStephan Aßmus { return fPattern.type64 == *(uint64*)other.data; }
662cfe93e7SStephan Aßmus
672cfe93e7SStephan Aßmus private:
682cfe93e7SStephan Aßmus
692cfe93e7SStephan Aßmus typedef union
702cfe93e7SStephan Aßmus {
712cfe93e7SStephan Aßmus uint64 type64;
722cfe93e7SStephan Aßmus int8 type8[8];
732cfe93e7SStephan Aßmus } pattern_union;
742cfe93e7SStephan Aßmus
752cfe93e7SStephan Aßmus pattern_union fPattern;
762cfe93e7SStephan Aßmus };
772cfe93e7SStephan Aßmus
782cfe93e7SStephan Aßmus extern const Pattern kSolidHigh;
792cfe93e7SStephan Aßmus extern const Pattern kSolidLow;
802cfe93e7SStephan Aßmus extern const Pattern kMixedColors;
812cfe93e7SStephan Aßmus
822cfe93e7SStephan Aßmus /*!
832cfe93e7SStephan Aßmus \brief Class for easy calculation and use of patterns
842cfe93e7SStephan Aßmus
852cfe93e7SStephan Aßmus PatternHandlers are designed specifically for DisplayDriver subclasses.
862cfe93e7SStephan Aßmus Pattern support can be easily added by setting the pattern to use via
872cfe93e7SStephan Aßmus SetTarget, and then merely retrieving the value for the coordinates
882cfe93e7SStephan Aßmus specified.
892cfe93e7SStephan Aßmus */
902cfe93e7SStephan Aßmus class PatternHandler {
912cfe93e7SStephan Aßmus public:
922cfe93e7SStephan Aßmus PatternHandler(void);
932cfe93e7SStephan Aßmus PatternHandler(const int8* p);
942cfe93e7SStephan Aßmus PatternHandler(const uint64& p);
952cfe93e7SStephan Aßmus PatternHandler(const Pattern& p);
962cfe93e7SStephan Aßmus PatternHandler(const PatternHandler& other);
972cfe93e7SStephan Aßmus virtual ~PatternHandler(void);
982cfe93e7SStephan Aßmus
992cfe93e7SStephan Aßmus void SetPattern(const int8* p);
1002cfe93e7SStephan Aßmus void SetPattern(const uint64& p);
1012cfe93e7SStephan Aßmus void SetPattern(const Pattern& p);
1022cfe93e7SStephan Aßmus void SetPattern(const pattern& p);
1032cfe93e7SStephan Aßmus
104f7e1df75SStephan Aßmus void SetColors(const rgb_color& high,
105f7e1df75SStephan Aßmus const rgb_color& low);
1062cfe93e7SStephan Aßmus void SetHighColor(const rgb_color& color);
1072cfe93e7SStephan Aßmus void SetLowColor(const rgb_color& color);
1082cfe93e7SStephan Aßmus
HighColor()109f7e1df75SStephan Aßmus rgb_color HighColor() const
1102cfe93e7SStephan Aßmus { return fHighColor; }
LowColor()111f7e1df75SStephan Aßmus rgb_color LowColor() const
1122cfe93e7SStephan Aßmus { return fLowColor; }
1132cfe93e7SStephan Aßmus
114f7e1df75SStephan Aßmus rgb_color ColorAt(const BPoint& pt) const;
115f7e1df75SStephan Aßmus rgb_color ColorAt(float x, float y) const;
116f7e1df75SStephan Aßmus inline rgb_color ColorAt(int x, int y) const;
1172cfe93e7SStephan Aßmus
1182cfe93e7SStephan Aßmus bool IsHighColor(const BPoint& pt) const;
1192cfe93e7SStephan Aßmus inline bool IsHighColor(int x, int y) const;
IsSolidHigh()1202cfe93e7SStephan Aßmus inline bool IsSolidHigh() const
1212cfe93e7SStephan Aßmus { return fPattern == B_SOLID_HIGH; }
IsSolidLow()1222cfe93e7SStephan Aßmus inline bool IsSolidLow() const
1232cfe93e7SStephan Aßmus { return fPattern == B_SOLID_LOW; }
IsSolid()1242cfe93e7SStephan Aßmus inline bool IsSolid() const
1252cfe93e7SStephan Aßmus { return IsSolidHigh() || IsSolidLow(); }
1262cfe93e7SStephan Aßmus
GetR5Pattern(void)1272cfe93e7SStephan Aßmus const pattern* GetR5Pattern(void) const
1282cfe93e7SStephan Aßmus { return (const pattern*)fPattern.GetInt8(); }
GetPattern(void)1292cfe93e7SStephan Aßmus const Pattern& GetPattern(void) const
1302cfe93e7SStephan Aßmus { return fPattern; }
13107949718SStephan Aßmus
13207949718SStephan Aßmus void SetOffsets(int32 x, int32 y);
13307949718SStephan Aßmus
1342cfe93e7SStephan Aßmus private:
1352cfe93e7SStephan Aßmus Pattern fPattern;
136f7e1df75SStephan Aßmus rgb_color fHighColor;
137f7e1df75SStephan Aßmus rgb_color fLowColor;
13807949718SStephan Aßmus
13907949718SStephan Aßmus uint16 fXOffset;
14007949718SStephan Aßmus uint16 fYOffset;
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 */
149f7e1df75SStephan Aßmus inline rgb_color
ColorAt(int x,int y)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
IsHighColor(int x,int y)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