Details | Last modification | View Log | RSS feed
| Rev | Author | Line No. | Line |
|---|---|---|---|
| 20 | pmbaty | 1 | #include "pmmem.h" |
| 2 | #include "CORE/FW/object.h" |
||
| 3 | #include "CORE/FW/resource.h" |
||
| 4 | #include "CORE/FW/tokenval.h" |
||
| 5 | #include "CORE/PIXELMAP/genclip.h" |
||
| 6 | #include "CORE/PIXELMAP/pmgen.h" |
||
| 7 | #include "CORE/PIXELMAP/pmmemops.h" |
||
| 8 | #include "CORE/PIXELMAP/pmsetup.h" |
||
| 9 | #include "harness/trace.h" |
||
| 10 | #include <stddef.h> |
||
| 11 | #include <stdlib.h> |
||
| 12 | #include <string.h> |
||
| 13 | |||
| 14 | br_tv_template_entry matchTemplateEntries[6] = { |
||
| 15 | { BRT_USE_T, NULL, 0, 2, 3, 0, 0 }, |
||
| 16 | { BRT_PIXEL_TYPE_U8, NULL, 4, 2, 3, 0, 0 }, |
||
| 17 | { BRT_PIXEL_BITS_I32, NULL, 8, 2, 3, 0, 0 }, |
||
| 18 | { BRT_RENDERER_O, NULL, 20, 2, 3, 0, 0 }, |
||
| 19 | { BRT_WIDTH_I32, NULL, 12, 2, 3, 0, 0 }, |
||
| 20 | { BRT_HEIGHT_I32, NULL, 16, 2, 3, 0, 0 } |
||
| 21 | }; |
||
| 22 | br_device_pixelmap_dispatch devicePixelmapDispatch = { |
||
| 23 | NULL, |
||
| 24 | NULL, |
||
| 25 | NULL, |
||
| 26 | NULL, |
||
| 27 | (void*)_M_br_device_pixelmap_mem_free, |
||
| 28 | (void*)_M_br_device_pixelmap_mem_identifier, |
||
| 29 | (void*)_M_br_device_pixelmap_mem_type, |
||
| 30 | (void*)_M_br_device_pixelmap_mem_isType, |
||
| 31 | (void*)_M_br_device_pixelmap_mem_device, |
||
| 32 | (void*)_M_br_device_pixelmap_mem_space, |
||
| 33 | (void*)_M_br_device_pixelmap_mem_queryTemplate, |
||
| 34 | (void*)_M_br_object_query, |
||
| 35 | (void*)_M_br_object_queryBuffer, |
||
| 36 | (void*)_M_br_object_queryMany, |
||
| 37 | (void*)_M_br_object_queryManySize, |
||
| 38 | (void*)_M_br_object_queryAll, |
||
| 39 | (void*)_M_br_object_queryAllSize, |
||
| 40 | (void*)_M_br_device_pixelmap_mem_validSource, |
||
| 41 | _M_br_device_pixelmap_mem_resize, |
||
| 42 | _M_br_device_pixelmap_mem_match, |
||
| 43 | _M_br_device_pixelmap_mem_allocateSub, |
||
| 44 | _M_br_device_pixelmap_mem_copyTo, |
||
| 45 | _M_br_device_pixelmap_mem_copyTo, |
||
| 46 | _M_br_device_pixelmap_mem_copyFrom, |
||
| 47 | _M_br_device_pixelmap_mem_fill, |
||
| 48 | _M_br_device_pixelmap_gen_doubleBuffer, |
||
| 49 | _M_br_device_pixelmap_gen_copyDirty, |
||
| 50 | _M_br_device_pixelmap_gen_copyToDirty, |
||
| 51 | _M_br_device_pixelmap_gen_copyFromDirty, |
||
| 52 | _M_br_device_pixelmap_gen_fillDirty, |
||
| 53 | _M_br_device_pixelmap_gen_doubleBufferDirty, |
||
| 54 | _M_br_device_pixelmap_gen_rectangle, |
||
| 55 | _M_br_device_pixelmap_gen_rectangle2, |
||
| 56 | _M_br_device_pixelmap_mem_rectangleCopyTo, |
||
| 57 | _M_br_device_pixelmap_mem_rectangleCopyTo, |
||
| 58 | _M_br_device_pixelmap_mem_rectangleCopyFrom, |
||
| 59 | _M_br_device_pixelmap_mem_rectangleStretchCopyTo, |
||
| 60 | _M_br_device_pixelmap_mem_rectangleStretchCopyTo, |
||
| 61 | _M_br_device_pixelmap_mem_rectangleStretchCopyFrom, |
||
| 62 | _M_br_device_pixelmap_mem_rectangleFill, |
||
| 63 | _M_br_device_pixelmap_mem_pixelSet, |
||
| 64 | _M_br_device_pixelmap_mem_line, |
||
| 65 | _M_br_device_pixelmap_mem_copyBits, |
||
| 66 | _M_br_device_pixelmap_gen_text, |
||
| 67 | _M_br_device_pixelmap_gen_textBounds, |
||
| 68 | _M_br_device_pixelmap_mem_rowSize, |
||
| 69 | (void*)_M_br_device_pixelmap_mem_rowSet, |
||
| 70 | (void*)_M_br_device_pixelmap_mem_rowQuery, |
||
| 71 | _M_br_device_pixelmap_mem_pixelQuery, |
||
| 72 | _M_br_device_pixelmap_mem_pixelAddressQuery, |
||
| 73 | _M_br_device_pixelmap_mem_pixelAddressSet, |
||
| 74 | _M_br_device_pixelmap_mem_originSet, |
||
| 75 | _M_br_device_pixelmap_mem_flush, |
||
| 76 | _M_br_device_pixelmap_mem_synchronise, |
||
| 77 | _M_br_device_pixelmap_mem_directLock, |
||
| 78 | _M_br_device_pixelmap_mem_directUnlock, |
||
| 79 | }; |
||
| 80 | |||
| 81 | br_tv_template_entry devicePixelmapTemplateEntries[4]; |
||
| 82 | pm_type_info pmTypeInfo[30] = { |
||
| 83 | { 1u, 1u, 32u, 1u }, |
||
| 84 | { 2u, 1u, 16u, 1u }, |
||
| 85 | { 4u, 1u, 8u, 1u }, |
||
| 86 | { 8u, 1u, 4u, 1u }, |
||
| 87 | { 16u, 2u, 2u, 2u }, |
||
| 88 | { 16u, 2u, 2u, 2u }, |
||
| 89 | { 24u, 3u, 4u, 2u }, |
||
| 90 | { 32u, 4u, 1u, 2u }, |
||
| 91 | { 32u, 4u, 1u, 10u }, |
||
| 92 | { 16u, 1u, 2u, 16u }, |
||
| 93 | { 32u, 1u, 1u, 16u }, |
||
| 94 | { 16u, 2u, 4u, 4u }, |
||
| 95 | { 32u, 4u, 4u, 4u }, |
||
| 96 | { 8u, 1u, 4u, 8u }, |
||
| 97 | { 16u, 2u, 2u, 9u }, |
||
| 98 | { 54u, 0u, 0u, 0u }, |
||
| 99 | { 4u, 0u, 5u, 3u }, |
||
| 100 | { 0u, 0u, 0u, 0u }, |
||
| 101 | { 69u, 0u, 0u, 0u }, |
||
| 102 | { 52u, 0u, 5u, 13u }, |
||
| 103 | { 0u, 0u, 0u, 0u }, |
||
| 104 | { 72u, 0u, 0u, 0u }, |
||
| 105 | { 54u, 0u, 5u, 13u }, |
||
| 106 | { 0u, 0u, 0u, 0u }, |
||
| 107 | { 75u, 0u, 0u, 0u }, |
||
| 108 | { 44u, 0u, 5u, 12u }, |
||
| 109 | { 0u, 0u, 0u, 0u }, |
||
| 110 | { 1u, 0u, 0u, 0u }, |
||
| 111 | { 0u, 0u, 0u, 0u }, |
||
| 112 | { 0u, 0u, 0u, 0u } |
||
| 113 | }; |
||
| 114 | |||
| 115 | // IDA: br_device_pixelmap* __usercall DevicePixelmapMemAllocate@<EAX>(br_uint_8 type@<EAX>, br_uint_16 w@<EDX>, br_uint_16 h@<EBX>, void *pixels@<ECX>, int flags) |
||
| 116 | br_device_pixelmap* DevicePixelmapMemAllocate(br_uint_8 type, br_uint_16 w, br_uint_16 h, void* pixels, int flags) { |
||
| 117 | br_device_pixelmap* pm; |
||
| 118 | pm_type_info* tip; |
||
| 119 | |||
| 120 | tip = &pmTypeInfo[type]; |
||
| 121 | pm = BrResAllocate(_pixelmap.res, sizeof(br_device_pixelmap), BR_MEMORY_PIXELMAP); |
||
| 122 | // pm->dispatch = &devicePixelmapDispatch; |
||
| 123 | pm->pm_identifier = NULL; |
||
| 124 | pm->pm_map = NULL; |
||
| 125 | pm->pm_flags = BR_PMF_LINEAR; |
||
| 126 | pm->pm_copy_function = BR_PMCOPY_NORMAL; |
||
| 127 | pm->pm_base_x = 0; |
||
| 128 | pm->pm_base_y = 0; |
||
| 129 | |||
| 130 | pm->pm_origin_x = 0; |
||
| 131 | pm->pm_origin_y = 0; |
||
| 132 | pm->pm_type = type; |
||
| 133 | pm->pm_width = w; |
||
| 134 | pm->pm_height = h; |
||
| 135 | // 8 bits, 1, 4 align, 1 |
||
| 136 | |||
| 137 | // v11 = (tip->align + w - 1) / tip->align * tip->align * tip->bits; |
||
| 138 | // pm->pm_row_bytes = (v11 - (__CFSHL__(v11 >> 31, 3) + 8 * (v11 >> 31))) >> 3; |
||
| 139 | // TODO: calculate this differently |
||
| 140 | pm->pm_row_bytes = w; |
||
| 141 | pm->pm_row_bytes = tip->bits * tip->align * ((w + tip->align - 1) / tip->align) / 8; |
||
| 142 | |||
| 143 | if ((8 * pm->pm_row_bytes % tip->bits) == 0) { |
||
| 144 | pm->pm_flags |= BR_PMF_ROW_WHOLEPIXELS; |
||
| 145 | } |
||
| 146 | if (!(flags & BR_PMAF_NO_PIXELS)) { |
||
| 147 | if (pixels != NULL) { |
||
| 148 | pm->pm_pixels = pixels; |
||
| 149 | } else { |
||
| 150 | pm->pm_pixels = BrResAllocate(pm, pm->pm_height * pm->pm_row_bytes, BR_MEMORY_PIXELS); |
||
| 151 | } |
||
| 152 | } |
||
| 153 | // TODO: not sure we need this |
||
| 154 | // pm->pm_pixels_qualifier = (unsigned __int16)_GetSysQual(); |
||
| 155 | if (flags & BR_PMAF_INVERTED) { |
||
| 156 | pm->pm_pixels = (char*)pm->pm_pixels + (pm->pm_height - 1) * pm->pm_row_bytes; |
||
| 157 | pm->pm_row_bytes *= -1; |
||
| 158 | } |
||
| 159 | return pm; |
||
| 160 | } |
||
| 161 | |||
| 162 | void CheckDispatch(br_device_pixelmap* pm) { |
||
| 163 | if (pm->dispatch == NULL) { |
||
| 164 | pm->dispatch = &devicePixelmapDispatch; |
||
| 165 | } |
||
| 166 | } |
||
| 167 | |||
| 168 | // IDA: br_error __cdecl _M_br_device_pixelmap_mem_allocateSub(br_device_pixelmap *self, br_device_pixelmap **newpm, br_rectangle *rect) |
||
| 169 | br_error _M_br_device_pixelmap_mem_allocateSub(br_device_pixelmap* self, br_device_pixelmap** newpm, br_rectangle* rect) { |
||
| 170 | br_device_pixelmap* pm; |
||
| 171 | br_rectangle out; |
||
| 172 | LOG_TRACE("(%p, %p, %p)", self, newpm, rect); |
||
| 173 | |||
| 174 | if (PixelmapRectangleClip(&out, rect, (br_pixelmap*)self) == BR_CLIP_REJECT) { |
||
| 175 | return 4098; |
||
| 176 | } |
||
| 177 | |||
| 178 | pm = (br_device_pixelmap*)BrResAllocate(_pixelmap.res, sizeof(br_pixelmap), BR_MEMORY_PIXELMAP); |
||
| 179 | memcpy(pm, self, sizeof(br_pixelmap)); |
||
| 180 | pm->pm_base_x += out.x; |
||
| 181 | pm->pm_base_y += out.y; |
||
| 182 | pm->pm_width = out.w; |
||
| 183 | pm->pm_height = out.h; |
||
| 184 | pm->pm_origin_x = 0; |
||
| 185 | pm->pm_origin_y = 0; |
||
| 186 | pm->pm_stored = 0; |
||
| 187 | pm->dispatch = &devicePixelmapDispatch; |
||
| 188 | if (pm->pm_width != self->pm_width) { |
||
| 189 | pm->pm_flags &= ~BR_PMF_LINEAR; |
||
| 190 | } |
||
| 191 | *newpm = pm; |
||
| 192 | return 0; |
||
| 193 | } |
||
| 194 | |||
| 195 | // IDA: void __cdecl _M_br_device_pixelmap_mem_free(br_device_pixelmap *self) |
||
| 196 | void _M_br_device_pixelmap_mem_free(br_device_pixelmap* self) { |
||
| 197 | BrResFree(self); |
||
| 198 | } |
||
| 199 | |||
| 200 | // IDA: char* __cdecl _M_br_device_pixelmap_mem_identifier(br_device_pixelmap *self) |
||
| 201 | char* _M_br_device_pixelmap_mem_identifier(br_device_pixelmap* self) { |
||
| 202 | LOG_TRACE("(%p)", self); |
||
| 203 | |||
| 204 | return self->pm_identifier; |
||
| 205 | } |
||
| 206 | |||
| 207 | // IDA: br_token __cdecl _M_br_device_pixelmap_mem_type(br_device_pixelmap *self) |
||
| 208 | br_token _M_br_device_pixelmap_mem_type(br_device_pixelmap* self) { |
||
| 209 | LOG_TRACE("(%p)", self); |
||
| 210 | |||
| 211 | return BRT_DEVICE_PIXELMAP; |
||
| 212 | } |
||
| 213 | |||
| 214 | // IDA: br_boolean __cdecl _M_br_device_pixelmap_mem_isType(br_device_pixelmap *self, br_token t) |
||
| 215 | br_boolean _M_br_device_pixelmap_mem_isType(br_device_pixelmap* self, br_token t) { |
||
| 216 | LOG_TRACE("(%p, %d)", self, t); |
||
| 217 | |||
| 218 | return t == BRT_DEVICE_PIXELMAP || t == BRT_OBJECT; |
||
| 219 | } |
||
| 220 | |||
| 221 | // IDA: br_device* __cdecl _M_br_device_pixelmap_mem_device(br_device_pixelmap *self) |
||
| 222 | br_device* _M_br_device_pixelmap_mem_device(br_device_pixelmap* self) { |
||
| 223 | LOG_TRACE("(%p)", self); |
||
| 224 | |||
| 225 | return NULL; |
||
| 226 | } |
||
| 227 | |||
| 228 | // IDA: br_int_32 __cdecl _M_br_device_pixelmap_mem_space(br_device_pixelmap *self) |
||
| 229 | br_int_32 _M_br_device_pixelmap_mem_space(br_device_pixelmap* self) { |
||
| 230 | LOG_TRACE("(%p)", self); |
||
| 231 | |||
| 232 | return BrResSizeTotal(self); |
||
| 233 | } |
||
| 234 | |||
| 235 | // IDA: br_tv_template* __cdecl _M_br_device_pixelmap_mem_queryTemplate(br_device_pixelmap *self) |
||
| 236 | br_tv_template* _M_br_device_pixelmap_mem_queryTemplate(br_device_pixelmap* self) { |
||
| 237 | LOG_TRACE("(%p)", self); |
||
| 238 | NOT_IMPLEMENTED(); |
||
| 239 | } |
||
| 240 | |||
| 241 | // IDA: br_error __cdecl _M_br_device_pixelmap_mem_validSource(br_device_pixelmap *self, br_object *h) |
||
| 242 | br_error _M_br_device_pixelmap_mem_validSource(br_device_pixelmap* self, br_object* h) { |
||
| 243 | LOG_TRACE("(%p, %p)", self, h); |
||
| 244 | |||
| 245 | return 0; |
||
| 246 | } |
||
| 247 | |||
| 248 | // IDA: br_error __cdecl _M_br_device_pixelmap_mem_resize(br_device_pixelmap *self, br_int_32 width, br_int_32 height) |
||
| 249 | br_error _M_br_device_pixelmap_mem_resize(br_device_pixelmap* self, br_int_32 width, br_int_32 height) { |
||
| 250 | //char* pixels; // Pierre-Marie Baty -- unused variable |
||
| 251 | //pm_type_info* tip; // Pierre-Marie Baty -- unused variable |
||
| 252 | //br_int_16 old_row_bytes; // Pierre-Marie Baty -- unused variable |
||
| 253 | LOG_TRACE("(%p, %d, %d)", self, width, height); |
||
| 254 | NOT_IMPLEMENTED(); |
||
| 255 | } |
||
| 256 | |||
| 257 | // IDA: br_error __cdecl _M_br_device_pixelmap_mem_match(br_device_pixelmap *self, br_device_pixelmap **newpm, br_token_value *tv) |
||
| 258 | br_error _M_br_device_pixelmap_mem_match(br_device_pixelmap* self, br_device_pixelmap** newpm, br_token_value* tv) { |
||
| 259 | match_tokens mt; |
||
| 260 | br_int_32 count; |
||
| 261 | br_device_pixelmap* pm; |
||
| 262 | br_int_32 bytes; |
||
| 263 | br_int_32 r; |
||
| 264 | LOG_TRACE("(%p, %p, %p)", self, newpm, tv); |
||
| 265 | |||
| 266 | if (!_pixelmap.pixelmap_match_template) { |
||
| 267 | _pixelmap.pixelmap_match_template = BrTVTemplateAllocate(_pixelmap.res, matchTemplateEntries, 6); |
||
| 268 | if (!_pixelmap.pixelmap_match_template) { |
||
| 269 | LOG_WARN("x"); |
||
| 270 | return 4098; |
||
| 271 | } |
||
| 272 | } |
||
| 273 | mt.pixel_type = self->pm_type; |
||
| 274 | mt.width = self->pm_width; |
||
| 275 | mt.height = self->pm_height; |
||
| 276 | |||
| 277 | // TOOD: We haven't implemented BrTokenValueSetMany - just emulate enough for now |
||
| 278 | mt.use = tv[1].t; // se BrPixelmapMatch |
||
| 279 | mt.pixel_bits = 16; |
||
| 280 | |||
| 281 | BrTokenValueSetMany(&mt, &count, 0, tv, _pixelmap.pixelmap_match_template); |
||
| 282 | // if ( (unsigned int)mt.use < 0x64 ) |
||
| 283 | // { |
||
| 284 | // if ( mt.use != 84 ) |
||
| 285 | // return 4098; |
||
| 286 | // if ( mt.pixel_bits < 0x10u ) |
||
| 287 | // { |
||
| 288 | // if ( mt.pixel_bits ) |
||
| 289 | // return 4098; |
||
| 290 | // } |
||
| 291 | // else if ( mt.pixel_bits > 0x10u ) |
||
| 292 | // { |
||
| 293 | // if ( mt.pixel_bits != 32 ) |
||
| 294 | // return 4098; |
||
| 295 | // mt.pixel_type = 12; |
||
| 296 | // goto LABEL_18; |
||
| 297 | // } |
||
| 298 | // mt.pixel_type = 11; |
||
| 299 | // goto LABEL_18; |
||
| 300 | // } |
||
| 301 | // if ( (unsigned int)mt.use > 0x66 ) |
||
| 302 | // { |
||
| 303 | // if ( (unsigned int)mt.use >= 0x116 ) |
||
| 304 | // { |
||
| 305 | // if ( (unsigned int)mt.use > 0x116 && mt.use != 379 ) |
||
| 306 | // return 4098; |
||
| 307 | // goto LABEL_18; |
||
| 308 | // } |
||
| 309 | // return 4098; |
||
| 310 | // } |
||
| 311 | |||
| 312 | if (mt.use == BRT_DEPTH) { |
||
| 313 | |||
| 314 | // TODO: hack this to make it work |
||
| 315 | mt.pixel_type = BR_PMT_DEPTH_16; |
||
| 316 | pm = DevicePixelmapMemAllocate(mt.pixel_type, mt.width, mt.height, NULL, (self->pm_row_bytes < 0) | BR_PMAF_NO_PIXELS); |
||
| 317 | r = abs(self->pm_row_bytes); |
||
| 318 | bytes = (signed int)pmTypeInfo[self->pm_type].bits >> 3; |
||
| 319 | pm->pm_row_bytes = ((signed int)pmTypeInfo[pm->pm_type].bits >> 3) * (unsigned int)((bytes + r - 1) / bytes); |
||
| 320 | pm->pm_pixels = BrResAllocate(pm, pm->pm_height * pm->pm_row_bytes, BR_MEMORY_PIXELS); |
||
| 321 | if (pm->pm_width * ((signed int)pmTypeInfo[pm->pm_type].bits >> 3) == pm->pm_row_bytes) |
||
| 322 | pm->pm_flags |= BR_PMF_LINEAR; |
||
| 323 | else { |
||
| 324 | pm->pm_flags &= 0xFDu; |
||
| 325 | } |
||
| 326 | if (self->pm_row_bytes < 0) { |
||
| 327 | pm->pm_row_bytes = -pm->pm_row_bytes; |
||
| 328 | // TODO: is this a bug in the original code? We say row_bytes is positive, but still set the pixels pointer to the bottom |
||
| 329 | // of the data |
||
| 330 | pm->pm_pixels = (char*)pm->pm_pixels + (pm->pm_height - 1) * pm->pm_row_bytes; |
||
| 331 | } |
||
| 332 | } else { |
||
| 333 | pm = DevicePixelmapMemAllocate(mt.pixel_type, mt.width, mt.height, NULL, self->pm_row_bytes < 0); |
||
| 334 | } |
||
| 335 | pm->pm_origin_x = self->pm_origin_x; |
||
| 336 | pm->pm_origin_y = self->pm_origin_y; |
||
| 337 | // self->dispatch = pm; |
||
| 338 | *newpm = pm; |
||
| 339 | return 0; |
||
| 340 | |||
| 341 | // br_pixelmap* ret = BrPixelmapAllocate(src->type, src->width, src->height, NULL, BR_PMAF_NORMAL); |
||
| 342 | |||
| 343 | // if (match_type == BR_PMMATCH_DEPTH_16) { |
||
| 344 | // ret->type = BR_PMT_DEPTH_16; |
||
| 345 | // ret->flags |= BR_PMAF_DEPTHBUFFER; |
||
| 346 | // } else { |
||
| 347 | // ret->flags |= BR_PMAF_OFFSCREEN; |
||
| 348 | // } |
||
| 349 | } |
||
| 350 | |||
| 351 | // IDA: br_error __cdecl _M_br_device_pixelmap_mem_copyTo(br_device_pixelmap *self, br_device_pixelmap *src) |
||
| 352 | br_error _M_br_device_pixelmap_mem_copyTo(br_device_pixelmap* self, br_device_pixelmap* src) { |
||
| 353 | //br_int_8 bytes; // Pierre-Marie Baty -- unused variable |
||
| 354 | LOG_TRACE("(%p, %p)", self, src); |
||
| 355 | NOT_IMPLEMENTED(); |
||
| 356 | } |
||
| 357 | |||
| 358 | // IDA: br_error __cdecl _M_br_device_pixelmap_mem_copyFrom(br_device_pixelmap *self, br_device_pixelmap *dest) |
||
| 359 | br_error _M_br_device_pixelmap_mem_copyFrom(br_device_pixelmap* self, br_device_pixelmap* dest) { |
||
| 360 | //br_int_8 bytes; // Pierre-Marie Baty -- unused variable |
||
| 361 | LOG_TRACE("(%p, %p)", self, dest); |
||
| 362 | NOT_IMPLEMENTED(); |
||
| 363 | } |
||
| 364 | |||
| 365 | // IDA: br_error __cdecl _M_br_device_pixelmap_mem_fill(br_device_pixelmap *self, br_uint_32 colour) |
||
| 366 | br_error _M_br_device_pixelmap_mem_fill(br_device_pixelmap* self, br_uint_32 colour) { |
||
| 367 | br_int_8 bytes; |
||
| 368 | LOG_TRACE("(%p, %d)", self, colour); |
||
| 369 | |||
| 370 | bytes = pmTypeInfo[self->pm_type].bits >> 3; |
||
| 371 | if ((self->pm_flags & (BR_PMF_ROW_WHOLEPIXELS | BR_PMF_LINEAR)) == (BR_PMF_ROW_WHOLEPIXELS | BR_PMF_LINEAR)) { |
||
| 372 | if (self->pm_row_bytes > 0) { |
||
| 373 | pm_mem_fill_colour((br_uint_8*)self->pm_pixels + self->pm_base_y * self->pm_row_bytes + self->pm_base_x * bytes, self->pm_pixels_qualifier, |
||
| 374 | self->pm_width * self->pm_height, bytes, colour); |
||
| 375 | } else { |
||
| 376 | pm_mem_fill_colour((br_uint_8*)self->pm_pixels + (self->pm_base_y + self->pm_height - 1) * self->pm_row_bytes + self->pm_base_x * bytes, |
||
| 377 | self->pm_pixels_qualifier, self->pm_width * self->pm_height, bytes, colour); |
||
| 378 | } |
||
| 379 | } else if ((self->pm_row_bytes & 7) == 0) { |
||
| 380 | pm_mem_fill_colour_rect((br_uint_8*)self->pm_pixels + self->pm_base_y * self->pm_row_bytes + self->pm_base_x * bytes, self->pm_pixels_qualifier, |
||
| 381 | self->pm_width, self->pm_height, self->pm_row_bytes, bytes, colour); |
||
| 382 | } else { |
||
| 383 | int i; |
||
| 384 | for (i = 0; i < self->pm_height; i++) { |
||
| 385 | pm_mem_fill_colour((br_uint_8*)self->pm_pixels + (i + self->pm_base_y) * self->pm_row_bytes + self->pm_base_x * bytes, self->pm_pixels_qualifier, |
||
| 386 | self->pm_width, bytes, colour); |
||
| 387 | } |
||
| 388 | } |
||
| 389 | return 0; |
||
| 390 | } |
||
| 391 | |||
| 392 | // IDA: br_error __cdecl _M_br_device_pixelmap_mem_doubleBuffer(br_device_pixelmap *self, br_device_pixelmap *src) |
||
| 393 | br_error _M_br_device_pixelmap_mem_doubleBuffer(br_device_pixelmap* self, br_device_pixelmap* src) { |
||
| 394 | LOG_TRACE("(%p, %p)", self, src); |
||
| 395 | NOT_IMPLEMENTED(); |
||
| 396 | } |
||
| 397 | |||
| 398 | // IDA: br_error __cdecl _M_br_device_pixelmap_mem_copyDirty(br_device_pixelmap *self, br_device_pixelmap *src, br_rectangle *dirty, br_int_32 num_rects) |
||
| 399 | br_error _M_br_device_pixelmap_mem_copyDirty(br_device_pixelmap* self, br_device_pixelmap* src, br_rectangle* dirty, br_int_32 num_rects) { |
||
| 400 | LOG_TRACE("(%p, %p, %p, %d)", self, src, dirty, num_rects); |
||
| 401 | NOT_IMPLEMENTED(); |
||
| 402 | } |
||
| 403 | |||
| 404 | // IDA: br_error __cdecl _M_br_device_pixelmap_mem_copyToDirty(br_device_pixelmap *self, br_device_pixelmap *src, br_rectangle *dirty, br_int_32 num_rects) |
||
| 405 | br_error _M_br_device_pixelmap_mem_copyToDirty(br_device_pixelmap* self, br_device_pixelmap* src, br_rectangle* dirty, br_int_32 num_rects) { |
||
| 406 | LOG_TRACE("(%p, %p, %p, %d)", self, src, dirty, num_rects); |
||
| 407 | NOT_IMPLEMENTED(); |
||
| 408 | } |
||
| 409 | |||
| 410 | // IDA: br_error __cdecl _M_br_device_pixelmap_mem_copyFromDirty(br_device_pixelmap *self, br_device_pixelmap *src, br_rectangle *dirty, br_int_32 num_rects) |
||
| 411 | br_error _M_br_device_pixelmap_mem_copyFromDirty(br_device_pixelmap* self, br_device_pixelmap* src, br_rectangle* dirty, br_int_32 num_rects) { |
||
| 412 | LOG_TRACE("(%p, %p, %p, %d)", self, src, dirty, num_rects); |
||
| 413 | NOT_IMPLEMENTED(); |
||
| 414 | } |
||
| 415 | |||
| 416 | // IDA: br_error __cdecl _M_br_device_pixelmap_mem_fillDirty(br_device_pixelmap *self, br_uint_32 colour, br_rectangle *dirty, br_int_32 num_rects) |
||
| 417 | br_error _M_br_device_pixelmap_mem_fillDirty(br_device_pixelmap* self, br_uint_32 colour, br_rectangle* dirty, br_int_32 num_rects) { |
||
| 418 | LOG_TRACE("(%p, %d, %p, %d)", self, colour, dirty, num_rects); |
||
| 419 | NOT_IMPLEMENTED(); |
||
| 420 | } |
||
| 421 | |||
| 422 | // IDA: br_error __cdecl _M_br_device_pixelmap_mem_doubleBufferDirty(br_device_pixelmap *self, br_device_pixelmap *src, br_rectangle *dirty, br_int_32 num_rects) |
||
| 423 | br_error _M_br_device_pixelmap_mem_doubleBufferDirty(br_device_pixelmap* self, br_device_pixelmap* src, br_rectangle* dirty, br_int_32 num_rects) { |
||
| 424 | LOG_TRACE("(%p, %p, %p, %d)", self, src, dirty, num_rects); |
||
| 425 | NOT_IMPLEMENTED(); |
||
| 426 | } |
||
| 427 | |||
| 428 | // IDA: br_error __cdecl _M_br_device_pixelmap_mem_rectangleCopyTo(br_device_pixelmap *self, br_point *p, br_device_pixelmap *src, br_rectangle *r) |
||
| 429 | br_error _M_br_device_pixelmap_mem_rectangleCopyTo(br_device_pixelmap* self, br_point* p, br_device_pixelmap* src, br_rectangle* r) { |
||
| 430 | int bytes; |
||
| 431 | br_rectangle ar; |
||
| 432 | br_point ap; |
||
| 433 | int i; // Added by DethRace |
||
| 434 | LOG_TRACE("(%p, %p, %p, %p)", self, p, src, r); |
||
| 435 | |||
| 436 | if (PixelmapRectangleClipTwo(&ar, &ap, r, p, (br_pixelmap*)self, (br_pixelmap*)src) == BR_CLIP_REJECT) { |
||
| 437 | return 0; |
||
| 438 | } |
||
| 439 | bytes = pmTypeInfo[self->pm_type].bits >> 3; |
||
| 440 | if (self->pm_width == ar.w) { |
||
| 441 | if (src->pm_row_bytes == self->pm_row_bytes && (self->pm_flags & (BR_PMF_ROW_WHOLEPIXELS | BR_PMF_LINEAR)) == (BR_PMF_ROW_WHOLEPIXELS | BR_PMF_LINEAR)) { |
||
| 442 | if (self->pm_row_bytes > 0) { |
||
| 443 | pm_mem_copy_colour((br_uint_8*)self->pm_pixels + (self->pm_base_y + ap.y) * self->pm_row_bytes + (self->pm_base_x + ap.x) * bytes, self->pm_pixels_qualifier, |
||
| 444 | (br_uint_8*)src->pm_pixels + (src->pm_base_y + ar.y) * src->pm_row_bytes + (src->pm_base_x + ar.x) * bytes, src->pm_pixels_qualifier, |
||
| 445 | ar.w * ar.h, bytes); |
||
| 446 | return 0; |
||
| 447 | } else { |
||
| 448 | pm_mem_copy_colour((br_uint_8*)self->pm_pixels + (self->pm_base_y + ap.y + ar.h - 1) * self->pm_row_bytes + (self->pm_base_x + ap.x) * bytes, self->pm_pixels_qualifier, |
||
| 449 | (br_uint_8*)src->pm_pixels + (src->pm_base_y + ar.y + ar.h - 1) * src->pm_row_bytes + (src->pm_base_x + ar.x) * bytes, src->pm_pixels_qualifier, |
||
| 450 | ar.w * ar.h, bytes); |
||
| 451 | return 0; |
||
| 452 | } |
||
| 453 | } |
||
| 454 | } |
||
| 455 | if (self->pm_row_bytes % 8 == 0) { |
||
| 456 | pm_mem_copy_colour_rect((br_uint_8*)self->pm_pixels + (self->pm_base_y + ap.y) * self->pm_row_bytes + (self->pm_base_x + ap.x) * bytes, self->pm_pixels_qualifier, |
||
| 457 | (br_uint_8*)src->pm_pixels + (src->pm_base_y + ar.y) * src->pm_row_bytes + (src->pm_base_x + ar.x) * bytes, src->pm_pixels_qualifier, |
||
| 458 | ar.w, ar.h, self->pm_row_bytes, src->pm_row_bytes, bytes); |
||
| 459 | return 0; |
||
| 460 | } |
||
| 461 | for (i = 0; i < ar.h; i++) { |
||
| 462 | pm_mem_copy_colour((br_uint_8*)self->pm_pixels + (self->pm_base_y + ap.y + i) * self->pm_row_bytes + (self->pm_base_x + ap.x) * bytes, self->pm_pixels_qualifier, |
||
| 463 | (br_uint_8*)src->pm_pixels + (src->pm_base_y + ar.y + i) * src->pm_row_bytes + (src->pm_base_x + ar.x) * bytes, src->pm_pixels_qualifier, |
||
| 464 | ar.w, bytes); |
||
| 465 | } |
||
| 466 | return 0; |
||
| 467 | } |
||
| 468 | |||
| 469 | // IDA: br_error __cdecl _M_br_device_pixelmap_mem_rectangleCopyFrom(br_device_pixelmap *self, br_point *p, br_device_pixelmap *dest, br_rectangle *r) |
||
| 470 | br_error _M_br_device_pixelmap_mem_rectangleCopyFrom(br_device_pixelmap* self, br_point* p, br_device_pixelmap* dest, br_rectangle* r) { |
||
| 471 | //int bytes; // Pierre-Marie Baty -- unused variable |
||
| 472 | //br_rectangle ar; // Pierre-Marie Baty -- unused variable |
||
| 473 | //br_point ap; // Pierre-Marie Baty -- unused variable |
||
| 474 | LOG_TRACE("(%p, %p, %p, %p)", self, p, dest, r); |
||
| 475 | NOT_IMPLEMENTED(); |
||
| 476 | } |
||
| 477 | |||
| 478 | // IDA: br_error __cdecl _M_br_device_pixelmap_mem_rectangleStretchCopyTo(br_device_pixelmap *self, br_rectangle *destinationRectangle, br_device_pixelmap *src, br_rectangle *sourceRectangle) |
||
| 479 | br_error _M_br_device_pixelmap_mem_rectangleStretchCopyTo(br_device_pixelmap* self, br_rectangle* destinationRectangle, br_device_pixelmap* src, br_rectangle* sourceRectangle) { |
||
| 480 | LOG_TRACE("(%p, %p, %p, %p)", self, destinationRectangle, src, sourceRectangle); |
||
| 481 | NOT_IMPLEMENTED(); |
||
| 482 | } |
||
| 483 | |||
| 484 | // IDA: br_error __cdecl _M_br_device_pixelmap_mem_rectangleStretchCopyFrom(br_device_pixelmap *self, br_rectangle *d, br_device_pixelmap *src, br_rectangle *s) |
||
| 485 | br_error _M_br_device_pixelmap_mem_rectangleStretchCopyFrom(br_device_pixelmap* self, br_rectangle* d, br_device_pixelmap* src, br_rectangle* s) { |
||
| 486 | LOG_TRACE("(%p, %p, %p, %p)", self, d, src, s); |
||
| 487 | NOT_IMPLEMENTED(); |
||
| 488 | } |
||
| 489 | |||
| 490 | // IDA: br_error __cdecl _M_br_device_pixelmap_mem_rectangleFill(br_device_pixelmap *self, br_rectangle *rect, br_uint_32 colour) |
||
| 491 | br_error _M_br_device_pixelmap_mem_rectangleFill(br_device_pixelmap* self, br_rectangle* rect, br_uint_32 colour) { |
||
| 492 | //br_rectangle arect; // Pierre-Marie Baty -- unused variable |
||
| 493 | //br_int_8 bytes; // Pierre-Marie Baty -- unused variable |
||
| 494 | LOG_TRACE("(%p, %p, %d)", self, rect, colour); |
||
| 495 | NOT_IMPLEMENTED(); |
||
| 496 | } |
||
| 497 | |||
| 498 | // IDA: br_error __cdecl _M_br_device_pixelmap_mem_pixelSet(br_device_pixelmap *self, br_point *p, br_uint_32 colour) |
||
| 499 | br_error _M_br_device_pixelmap_mem_pixelSet(br_device_pixelmap* self, br_point* p, br_uint_32 colour) { |
||
| 500 | br_point ap; |
||
| 501 | br_int_8 bytes; |
||
| 502 | LOG_TRACE("(%p, %p, %d)", self, p, colour); |
||
| 503 | |||
| 504 | if (PixelmapPointClip(&ap, p, (br_pixelmap*)self) == BR_CLIP_REJECT) { |
||
| 505 | return 0; |
||
| 506 | } |
||
| 507 | bytes = pmTypeInfo[self->pm_type].bits >> 3; |
||
| 508 | pm_mem_set_colour((br_uint_8*)self->pm_pixels + (self->pm_base_y + ap.y) * self->pm_row_bytes + (self->pm_base_x + ap.x) * bytes, self->pm_pixels_qualifier, bytes, colour); |
||
| 509 | return 0; |
||
| 510 | } |
||
| 511 | |||
| 512 | // IDA: br_error __cdecl _M_br_device_pixelmap_mem_line(br_device_pixelmap *self, br_point *s, br_point *e, br_uint_32 colour) |
||
| 513 | br_error _M_br_device_pixelmap_mem_line(br_device_pixelmap* self, br_point* s, br_point* e, br_uint_32 colour) { |
||
| 514 | //int dx; // Pierre-Marie Baty -- unused variable |
||
| 515 | //int dy; // Pierre-Marie Baty -- unused variable |
||
| 516 | //int incr1; // Pierre-Marie Baty -- unused variable |
||
| 517 | //int incr2; // Pierre-Marie Baty -- unused variable |
||
| 518 | //int D; // Pierre-Marie Baty -- unused variable |
||
| 519 | //int x; // Pierre-Marie Baty -- unused variable |
||
| 520 | //int y; // Pierre-Marie Baty -- unused variable |
||
| 521 | //int xend; // Pierre-Marie Baty -- unused variable |
||
| 522 | //int c; // Pierre-Marie Baty -- unused variable |
||
| 523 | //int pixels_left; // Pierre-Marie Baty -- unused variable |
||
| 524 | //int x1; // Pierre-Marie Baty -- unused variable |
||
| 525 | //int y1; // Pierre-Marie Baty -- unused variable |
||
| 526 | //int sign_x; // Pierre-Marie Baty -- unused variable |
||
| 527 | //int sign_y; // Pierre-Marie Baty -- unused variable |
||
| 528 | //int step; // Pierre-Marie Baty -- unused variable |
||
| 529 | //int reverse; // Pierre-Marie Baty -- unused variable |
||
| 530 | //int i; // Pierre-Marie Baty -- unused variable |
||
| 531 | //char* dest; // Pierre-Marie Baty -- unused variable |
||
| 532 | //int bytes; // Pierre-Marie Baty -- unused variable |
||
| 533 | //br_point as; // Pierre-Marie Baty -- unused variable |
||
| 534 | //br_point ae; // Pierre-Marie Baty -- unused variable |
||
| 535 | LOG_TRACE("(%p, %p, %p, %d)", self, s, e, colour); |
||
| 536 | NOT_IMPLEMENTED(); |
||
| 537 | } |
||
| 538 | |||
| 539 | |||
| 540 | // IDA: br_error __cdecl _M_br_device_pixelmap_mem_copyBits(br_device_pixelmap *self, br_point *point, br_uint_8 *src, br_uint_16 s_stride, br_rectangle *bit_rect, br_uint_32 colour) |
||
| 541 | br_error _M_br_device_pixelmap_mem_copyBits(br_device_pixelmap* self, br_point* point, br_uint_8* src, br_uint_16 s_stride, br_rectangle* bit_rect, br_uint_32 colour) { |
||
| 542 | int bytes; |
||
| 543 | int bit; |
||
| 544 | br_rectangle ar; |
||
| 545 | br_point ap; |
||
| 546 | LOG_TRACE("(%p, %p, %p, %d, %p, %d)", self, point, src, s_stride, bit_rect, colour); |
||
| 547 | |||
| 548 | if (PixelmapCopyBitsClip(&ar, &ap, bit_rect, point, (br_pixelmap*)self) == BR_CLIP_REJECT) { |
||
| 549 | return 0; |
||
| 550 | } |
||
| 551 | bytes = pmTypeInfo[self->pm_type].bits >> 3; |
||
| 552 | bit = ar.x & 0x7; |
||
| 553 | |||
| 554 | pm_mem_copy_bits((br_uint_8*)self->pm_pixels + (self->pm_base_y + ap.y) * self->pm_row_bytes + (self->pm_base_x + ap.x + (ar.x & ~0x7) - bit) * bytes, self->pm_pixels_qualifier, |
||
| 555 | self->pm_row_bytes, src + ar.y * s_stride, s_stride, bit, bit + ar.w, ar.h, bytes, colour); |
||
| 556 | return 0; |
||
| 557 | } |
||
| 558 | |||
| 559 | // IDA: br_error __cdecl _M_br_device_pixelmap_mem_pixelQuery(br_device_pixelmap *self, br_uint_32 *pcolour, br_point *p) |
||
| 560 | br_error _M_br_device_pixelmap_mem_pixelQuery(br_device_pixelmap* self, br_uint_32* pcolour, br_point* p) { |
||
| 561 | //br_point ap; // Pierre-Marie Baty -- unused variable |
||
| 562 | //br_int_8 bytes; // Pierre-Marie Baty -- unused variable |
||
| 563 | LOG_TRACE("(%p, %p, %p)", self, pcolour, p); |
||
| 564 | NOT_IMPLEMENTED(); |
||
| 565 | } |
||
| 566 | |||
| 567 | // IDA: br_error __cdecl _M_br_device_pixelmap_mem_pixelAddressQuery(br_device_pixelmap *self, void **pptr, br_uint_32 *pqual, br_point *p) |
||
| 568 | br_error _M_br_device_pixelmap_mem_pixelAddressQuery(br_device_pixelmap* self, void** pptr, br_uint_32* pqual, br_point* p) { |
||
| 569 | //br_int_8 bytes; // Pierre-Marie Baty -- unused variable |
||
| 570 | //br_point ap; // Pierre-Marie Baty -- unused variable |
||
| 571 | LOG_TRACE("(%p, %p, %p, %p)", self, pptr, pqual, p); |
||
| 572 | NOT_IMPLEMENTED(); |
||
| 573 | } |
||
| 574 | |||
| 575 | // IDA: br_error __cdecl _M_br_device_pixelmap_mem_pixelAddressSet(br_device_pixelmap *self, void *ptr, br_uint_32 *qual) |
||
| 576 | br_error _M_br_device_pixelmap_mem_pixelAddressSet(br_device_pixelmap* self, void* ptr, br_uint_32* qual) { |
||
| 577 | LOG_TRACE("(%p, %p, %p)", self, ptr, qual); |
||
| 578 | NOT_IMPLEMENTED(); |
||
| 579 | } |
||
| 580 | |||
| 581 | // IDA: br_error __cdecl _M_br_device_pixelmap_mem_originSet(br_device_pixelmap *self, br_point *p) |
||
| 582 | br_error _M_br_device_pixelmap_mem_originSet(br_device_pixelmap* self, br_point* p) { |
||
| 583 | LOG_TRACE("(%p, %p)", self, p); |
||
| 584 | NOT_IMPLEMENTED(); |
||
| 585 | } |
||
| 586 | |||
| 587 | // IDA: br_error __cdecl _M_br_device_pixelmap_mem_rowSize(br_device_pixelmap *self, br_size_t *sizep) |
||
| 588 | br_error _M_br_device_pixelmap_mem_rowSize(br_device_pixelmap* self, br_size_t* sizep) { |
||
| 589 | LOG_TRACE("(%p, %p)", self, sizep); |
||
| 590 | NOT_IMPLEMENTED(); |
||
| 591 | } |
||
| 592 | |||
| 593 | // IDA: br_error __cdecl _M_br_device_pixelmap_mem_rowQuery(br_device_pixelmap *self, void *buffer, br_size_t buffer_size, br_int_32 row) |
||
| 594 | br_error _M_br_device_pixelmap_mem_rowQuery(br_device_pixelmap* self, void* buffer, br_size_t buffer_size, br_int_32 row) { |
||
| 595 | LOG_TRACE("(%p, %p, %d, %d)", self, buffer, buffer_size, row); |
||
| 596 | NOT_IMPLEMENTED(); |
||
| 597 | } |
||
| 598 | |||
| 599 | // IDA: br_error __cdecl _M_br_device_pixelmap_mem_rowSet(br_device_pixelmap *self, void *buffer, br_size_t buffer_size, br_int_32 row) |
||
| 600 | br_error _M_br_device_pixelmap_mem_rowSet(br_device_pixelmap* self, void* buffer, br_size_t buffer_size, br_int_32 row) { |
||
| 601 | LOG_TRACE("(%p, %p, %d, %d)", self, buffer, buffer_size, row); |
||
| 602 | NOT_IMPLEMENTED(); |
||
| 603 | } |
||
| 604 | |||
| 605 | // IDA: br_error __cdecl _M_br_device_pixelmap_mem_flush(br_device_pixelmap *self) |
||
| 606 | br_error _M_br_device_pixelmap_mem_flush(br_device_pixelmap* self) { |
||
| 607 | LOG_TRACE("(%p)", self); |
||
| 608 | NOT_IMPLEMENTED(); |
||
| 609 | } |
||
| 610 | |||
| 611 | // IDA: br_error __cdecl _M_br_device_pixelmap_mem_synchronise(br_device_pixelmap *self, br_token sync_type, br_boolean block) |
||
| 612 | br_error _M_br_device_pixelmap_mem_synchronise(br_device_pixelmap* self, br_token sync_type, br_boolean block) { |
||
| 613 | LOG_TRACE("(%p, %d, %d)", self, sync_type, block); |
||
| 614 | NOT_IMPLEMENTED(); |
||
| 615 | } |
||
| 616 | |||
| 617 | // IDA: br_error __cdecl _M_br_device_pixelmap_mem_directLock(br_device_pixelmap *self, br_boolean block) |
||
| 618 | br_error _M_br_device_pixelmap_mem_directLock(br_device_pixelmap* self, br_boolean block) { |
||
| 619 | LOG_TRACE("(%p, %d)", self, block); |
||
| 620 | |||
| 621 | return 0; |
||
| 622 | } |
||
| 623 | |||
| 624 | // IDA: br_error __cdecl _M_br_device_pixelmap_mem_directUnlock(br_device_pixelmap *self) |
||
| 625 | br_error _M_br_device_pixelmap_mem_directUnlock(br_device_pixelmap* self) { |
||
| 626 | LOG_TRACE("(%p)", self); |
||
| 627 | |||
| 628 | return 0; |
||
| 629 | } |