1 /* 2 * Copyright 2001-2008, Haiku. 3 * Distributed under the terms of the MIT License. 4 * 5 * Authors: 6 * DarkWyrm <bpmagic@columbus.rr.com> 7 * Caz <turok2@currantbun.com> 8 * Axel Dörfler, axeld@pinc-software.de 9 */ 10 11 //! Graphics functions and variables for the Interface Kit 12 13 #include <GraphicsDefs.h> 14 15 #include <AppServerLink.h> 16 #include <ServerProtocol.h> 17 18 19 // patterns 20 const pattern B_SOLID_HIGH = {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}}; 21 const pattern B_MIXED_COLORS = {{0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55}}; 22 const pattern B_SOLID_LOW = {{0, 0, 0, 0, 0, 0, 0, 0}}; 23 24 // colors 25 const rgb_color B_TRANSPARENT_COLOR = {0x77, 0x74, 0x77, 0x00}; 26 const rgb_color B_TRANSPARENT_32_BIT = {0x77, 0x74, 0x77, 0x00}; 27 const uint8 B_TRANSPARENT_8_BIT = 0xff; 28 29 const uint8 B_TRANSPARENT_MAGIC_CMAP8 = 0xff; 30 const uint16 B_TRANSPARENT_MAGIC_RGBA15 = 0x39ce; 31 const uint16 B_TRANSPARENT_MAGIC_RGBA15_BIG = 0xce39; 32 const uint32 B_TRANSPARENT_MAGIC_RGBA32 = 0x00777477; 33 const uint32 B_TRANSPARENT_MAGIC_RGBA32_BIG = 0x77747700; 34 35 // misc. 36 const struct screen_id B_MAIN_SCREEN_ID = {0}; 37 38 39 status_t 40 get_pixel_size_for(color_space space, size_t *pixelChunk, size_t *rowAlignment, 41 size_t *pixelsPerChunk) 42 { 43 status_t status = B_OK; 44 int32 bytesPerPixel = 0; 45 int32 pixPerChunk = 0; 46 switch (space) { 47 // supported 48 case B_RGB32: case B_RGBA32: 49 case B_RGB32_BIG: case B_RGBA32_BIG: 50 case B_UVL32: case B_UVLA32: 51 case B_LAB32: case B_LABA32: 52 case B_HSI32: case B_HSIA32: 53 case B_HSV32: case B_HSVA32: 54 case B_HLS32: case B_HLSA32: 55 case B_CMY32: case B_CMYA32: case B_CMYK32: 56 bytesPerPixel = 4; 57 pixPerChunk = 1; 58 break; 59 case B_RGB24: case B_RGB24_BIG: 60 case B_UVL24: case B_LAB24: case B_HSI24: 61 case B_HSV24: case B_HLS24: case B_CMY24: 62 bytesPerPixel = 3; 63 pixPerChunk = 1; 64 break; 65 case B_RGB16: case B_RGB15: case B_RGBA15: 66 case B_RGB16_BIG: case B_RGB15_BIG: case B_RGBA15_BIG: 67 bytesPerPixel = 2; 68 pixPerChunk = 1; 69 break; 70 case B_CMAP8: case B_GRAY8: 71 bytesPerPixel = 1; 72 pixPerChunk = 1; 73 break; 74 case B_GRAY1: 75 bytesPerPixel = 1; 76 pixPerChunk = 8; 77 break; 78 case B_YCbCr422: case B_YUV422: 79 bytesPerPixel = 4; 80 pixPerChunk = 2; 81 break; 82 case B_YCbCr411: case B_YUV411: 83 bytesPerPixel = 12; 84 pixPerChunk = 8; 85 break; 86 case B_YCbCr444: case B_YUV444: 87 bytesPerPixel = 3; 88 pixPerChunk = 1; 89 break; 90 // TODO: I don't know if it's correct, 91 // but beos reports B_YUV420 to be 92 // 6 bytes per pixel and 4 pixel per chunk 93 case B_YCbCr420: case B_YUV420: 94 bytesPerPixel = 3; 95 pixPerChunk = 2; 96 break; 97 case B_YUV9: 98 bytesPerPixel = 5; 99 pixPerChunk = 4; 100 break; 101 case B_YUV12: 102 bytesPerPixel = 6; 103 pixPerChunk = 4; 104 break; 105 // unsupported 106 case B_NO_COLOR_SPACE: 107 default: 108 status = B_BAD_VALUE; 109 break; 110 } 111 112 if (pixelChunk != NULL) 113 *pixelChunk = bytesPerPixel; 114 115 size_t alignment = 0; 116 if (bytesPerPixel != 0) { 117 alignment = (sizeof(int) % bytesPerPixel) * sizeof(int); 118 if (alignment < sizeof(int)) 119 alignment = sizeof(int); 120 } 121 122 if (rowAlignment!= NULL) 123 *rowAlignment = alignment; 124 125 if (pixelsPerChunk!= NULL) 126 *pixelsPerChunk = pixPerChunk; 127 128 return status; 129 } 130 131 132 static uint32 133 get_overlay_flags(color_space space) 134 { 135 BPrivate::AppServerLink link; 136 link.StartMessage(AS_GET_BITMAP_SUPPORT_FLAGS); 137 link.Attach<uint32>((uint32)space); 138 139 uint32 flags = 0; 140 int32 code; 141 if (link.FlushWithReply(code) == B_OK && code == B_OK) { 142 if (link.Read<uint32>(&flags) < B_OK) 143 flags = 0; 144 } 145 return flags; 146 } 147 148 149 bool 150 bitmaps_support_space(color_space space, uint32 *supportFlags) 151 { 152 bool result = true; 153 switch (space) { 154 // supported, also for drawing and for attaching BViews 155 case B_RGB32: case B_RGBA32: case B_RGB24: 156 case B_RGB32_BIG: case B_RGBA32_BIG: case B_RGB24_BIG: 157 case B_RGB16: case B_RGB15: case B_RGBA15: 158 case B_RGB16_BIG: case B_RGB15_BIG: case B_RGBA15_BIG: 159 case B_CMAP8: case B_GRAY8: case B_GRAY1: 160 if (supportFlags != NULL) { 161 *supportFlags = B_VIEWS_SUPPORT_DRAW_BITMAP 162 | B_BITMAPS_SUPPORT_ATTACHED_VIEWS 163 | get_overlay_flags(space); 164 } 165 break; 166 167 // supported, but cannot draw 168 case B_YCbCr422: case B_YCbCr411: case B_YCbCr444: case B_YCbCr420: 169 case B_YUV422: case B_YUV411: case B_YUV444: case B_YUV420: 170 case B_UVL24: case B_UVL32: case B_UVLA32: 171 case B_LAB24: case B_LAB32: case B_LABA32: 172 case B_HSI24: case B_HSI32: case B_HSIA32: 173 case B_HSV24: case B_HSV32: case B_HSVA32: 174 case B_HLS24: case B_HLS32: case B_HLSA32: 175 case B_CMY24: case B_CMY32: case B_CMYA32: case B_CMYK32: 176 if (supportFlags != NULL) 177 *supportFlags = get_overlay_flags(space); 178 break; 179 // unsupported 180 case B_NO_COLOR_SPACE: 181 case B_YUV9: case B_YUV12: 182 result = false; 183 break; 184 } 185 return result; 186 } 187