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