1 /* 2 * Copyright 2005-2007, Haiku. 3 * Distributed under the terms of the MIT License. 4 * 5 * Authors: 6 * Stephan Aßmus <superstippi@gmx.de> 7 */ 8 #ifndef DRAWING_SUPPORT_H 9 #define DRAWING_SUPPORT_H 10 11 12 #include <SupportDefs.h> 13 #include <string.h> 14 15 class BRect; 16 17 18 // gfxset32 19 // * numBytes is expected to be a multiple of 4 20 static inline void 21 gfxset32(uint8* dst, uint32 color, int32 numBytes) 22 { 23 uint64 s64 = ((uint64)color << 32) | color; 24 while (numBytes >= 8) { 25 *(uint64*)dst = s64; 26 numBytes -= 8; 27 dst += 8; 28 } 29 if (numBytes == 4) { 30 *(uint32*)dst = color; 31 } 32 } 33 34 union pixel32 { 35 uint32 data32; 36 uint8 data8[4]; 37 }; 38 39 // blend_line32 40 static inline void 41 blend_line32(uint8* buffer, int32 pixels, uint8 r, uint8 g, uint8 b, uint8 a) 42 { 43 pixel32 p; 44 45 r = (r * a) >> 8; 46 g = (g * a) >> 8; 47 b = (b * a) >> 8; 48 a = 255 - a; 49 50 uint8 tempBuffer[pixels * 4]; 51 52 uint8* t = tempBuffer; 53 uint8* s = buffer; 54 55 for (int32 i = 0; i < pixels; i++) { 56 p.data32 = *(uint32*)s; 57 58 t[0] = ((p.data8[0] * a) >> 8) + b; 59 t[1] = ((p.data8[1] * a) >> 8) + g; 60 t[2] = ((p.data8[2] * a) >> 8) + r; 61 62 t += 4; 63 s += 4; 64 } 65 66 memcpy(buffer, tempBuffer, pixels * 4); 67 } 68 69 void align_rect_to_pixels(BRect* rect); 70 71 #endif // DRAWING_SUPPORT_H 72