Subversion Repositories Games.Carmageddon

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. #include "pmdsptch.h"
  2.  
  3. #include "CORE/FW/devsetup.h"
  4. #include "CORE/FW/scratch.h"
  5. #include "CORE/PIXELMAP/fontptrs.h"
  6. #include "CORE/PIXELMAP/gencopy.h"
  7. #include "CORE/PIXELMAP/pmmem.h"
  8. #include "CORE/STD/brstdlib.h"
  9. #include "harness/hooks.h"
  10. #include "harness/trace.h"
  11. #include <stdarg.h>
  12. #include <stdlib.h>
  13. #include <string.h>
  14.  
  15. // IDA: br_pixelmap* __cdecl BrPixelmapAllocateSub(br_pixelmap *src, br_int_32 x, br_int_32 y, br_int_32 w, br_int_32 h)
  16. br_pixelmap* BrPixelmapAllocateSub(br_pixelmap* src, br_int_32 x, br_int_32 y, br_int_32 w, br_int_32 h) {
  17.     br_pixelmap* new;
  18.     br_rectangle r;
  19.     LOG_TRACE("(%p, %d, %d, %d, %d)", src, x, y, w, h);
  20.  
  21.     r.h = h;
  22.     r.w = w;
  23.     r.x = x;
  24.     r.y = y;
  25.     CheckDispatch((br_device_pixelmap*)src);
  26.     if (((br_device_pixelmap*)src)->dispatch->_allocateSub((br_device_pixelmap*)src, (br_device_pixelmap**)&new, &r) != 0) {
  27.         return NULL;
  28.     }
  29.     return new;
  30. }
  31.  
  32. // IDA: void __cdecl BrPixelmapFree(br_pixelmap *src)
  33. void BrPixelmapFree(br_pixelmap* src) {
  34.     LOG_TRACE10("(%p)", src);
  35.  
  36.     CheckDispatch((br_device_pixelmap*)src);
  37.     if (BrDevLastBeginQuery() == src) {
  38.         BrDevLastBeginSet(NULL);
  39.     }
  40.     ((br_device_pixelmap*)src)->dispatch->_free((br_object*)src);
  41. }
  42.  
  43. // IDA: br_pixelmap* __cdecl BrPixelmapResize(br_pixelmap *src, br_int_32 width, br_int_32 height)
  44. br_pixelmap* BrPixelmapResize(br_pixelmap* src, br_int_32 width, br_int_32 height) {
  45.     LOG_TRACE("(%p, %d, %d)", src, width, height);
  46.     NOT_IMPLEMENTED();
  47. }
  48.  
  49. // IDA: br_pixelmap* __cdecl BrPixelmapMatch(br_pixelmap *src, br_uint_8 match_type)
  50. br_pixelmap* BrPixelmapMatch(br_pixelmap* src, br_uint_8 match_type) {
  51.     br_pixelmap* new;
  52.     br_token_value tv[3];
  53.     new = NULL;
  54.     LOG_TRACE("(%p, %d)", src, match_type);
  55.  
  56.     CheckDispatch((br_device_pixelmap*)src);
  57.  
  58.     switch (match_type) {
  59.     case 0u:
  60.         tv[1].t = BRT_OFFSCREEN;
  61.         break;
  62.     case 1u:
  63.         tv[2].t = BRT_VECTOR2_INTEGER;
  64.         tv[1].t = BRT_DEPTH;
  65.         tv[1].v.u32 = 76;
  66.         break;
  67.     default:
  68.         LOG_PANIC("Case %d not implemented", match_type);
  69.     }
  70.  
  71.     //((br_device_pixelmap*)src)->dispatch->_match((br_device_pixelmap*)src, (br_device_pixelmap**)&new, &tv[0]);
  72.     if (_M_br_device_pixelmap_mem_match((br_device_pixelmap*)src, (br_device_pixelmap**)&new, &tv[0]) != 0) {
  73.         LOG_WARN("_M_br_device_pixelmap_mem_match returned error");
  74.         return NULL;
  75.     }
  76.     return new;
  77. }
  78.  
  79. // IDA: br_pixelmap* __cdecl BrPixelmapMatchSized(br_pixelmap *src, br_uint_8 match_type, br_int_32 width, br_int_32 height)
  80. br_pixelmap* BrPixelmapMatchSized(br_pixelmap* src, br_uint_8 match_type, br_int_32 width, br_int_32 height) {
  81.     //br_pixelmap* new; // Pierre-Marie Baty -- unused variable
  82.     //br_token_value tv[5]; // Pierre-Marie Baty -- unused variable
  83.     LOG_TRACE("(%p, %d, %d, %d)", src, match_type, width, height);
  84.     NOT_IMPLEMENTED();
  85. }
  86.  
  87. // IDA: br_pixelmap* __cdecl BrPixelmapMatchTyped(br_pixelmap *src, br_uint_8 match_type, br_uint_8 pixelmap_type)
  88. br_pixelmap* BrPixelmapMatchTyped(br_pixelmap* src, br_uint_8 match_type, br_uint_8 pixelmap_type) {
  89.     //br_pixelmap* new; // Pierre-Marie Baty -- unused variable
  90.     //br_token_value tv[4]; // Pierre-Marie Baty -- unused variable
  91.     LOG_TRACE("(%p, %d, %d)", src, match_type, pixelmap_type);
  92.     NOT_IMPLEMENTED();
  93. }
  94.  
  95. // IDA: br_pixelmap* __cdecl BrPixelmapMatchTypedSized(br_pixelmap *src, br_uint_8 match_type, br_uint_8 pixelmap_type, br_int_32 width, br_int_32 height)
  96. br_pixelmap* BrPixelmapMatchTypedSized(br_pixelmap* src, br_uint_8 match_type, br_uint_8 pixelmap_type, br_int_32 width, br_int_32 height) {
  97.     //br_pixelmap* new; // Pierre-Marie Baty -- unused variable
  98.     //br_token_value tv[6]; // Pierre-Marie Baty -- unused variable
  99.     LOG_TRACE("(%p, %d, %d, %d, %d)", src, match_type, pixelmap_type, width, height);
  100.     NOT_IMPLEMENTED();
  101. }
  102.  
  103. // IDA: br_pixelmap* __cdecl BrPixelmapClone(br_pixelmap *src)
  104. br_pixelmap* BrPixelmapClone(br_pixelmap* src) {
  105.     //br_pixelmap* new; // Pierre-Marie Baty -- unused variable
  106.     //br_token_value tv[2]; // Pierre-Marie Baty -- unused variable
  107.     LOG_TRACE("(%p)", src);
  108.     NOT_IMPLEMENTED();
  109. }
  110.  
  111. // IDA: void __cdecl BrPixelmapFill(br_pixelmap *dst, br_uint_32 colour)
  112. void BrPixelmapFill(br_pixelmap* dst, br_uint_32 colour) {
  113.     LOG_TRACE("(%p, %d)", dst, colour);
  114.     //br_uint_32 y; // Pierre-Marie Baty -- unused variable
  115.     //char* d; // Pierre-Marie Baty -- unused variable
  116.  
  117.     CheckDispatch((br_device_pixelmap*)dst);
  118.     (*(br_device_pixelmap_dispatch**)dst)->_fill((br_device_pixelmap*)dst, colour);
  119. }
  120.  
  121. // IDA: void __cdecl BrPixelmapRectangle(br_pixelmap *dst, br_int_32 x, br_int_32 y, br_int_32 w, br_int_32 h, br_uint_32 colour)
  122. void BrPixelmapRectangle(br_pixelmap* dst, br_int_32 x, br_int_32 y, br_int_32 w, br_int_32 h, br_uint_32 colour) {
  123.     //br_rectangle r; // Pierre-Marie Baty -- unused variable
  124.     LOG_TRACE("(%p, %d, %d, %d, %d, %d)", dst, x, y, w, h, colour);
  125.     NOT_IMPLEMENTED();
  126. }
  127.  
  128. // IDA: void __cdecl BrPixelmapRectangle2(br_pixelmap *dst, br_int_32 x, br_int_32 y, br_int_32 w, br_int_32 h, br_uint_32 colour_tl, br_uint_32 colour_br)
  129. void BrPixelmapRectangle2(br_pixelmap* dst, br_int_32 x, br_int_32 y, br_int_32 w, br_int_32 h, br_uint_32 colour_tl, br_uint_32 colour_br) {
  130.     //br_rectangle r; // Pierre-Marie Baty -- unused variable
  131.     LOG_TRACE("(%p, %d, %d, %d, %d, %d, %d)", dst, x, y, w, h, colour_tl, colour_br);
  132.     NOT_IMPLEMENTED();
  133. }
  134.  
  135. // IDA: br_error __usercall DispatchCopy@<EAX>(br_device_pixelmap *self@<EAX>, br_device_pixelmap *src@<EDX>)
  136. br_error DispatchCopy(br_device_pixelmap* self, br_device_pixelmap* src) {
  137.     LOG_TRACE("(%p, %p)", self, src);
  138.     NOT_IMPLEMENTED();
  139. }
  140.  
  141. // IDA: br_error __usercall DispatchRectangleCopy@<EAX>(br_device_pixelmap *self@<EAX>, br_point *p@<EDX>, br_device_pixelmap *src@<EBX>, br_rectangle *r@<ECX>)
  142. br_error DispatchRectangleCopy(br_device_pixelmap* self, br_point* p, br_device_pixelmap* src, br_rectangle* r) {
  143.     LOG_TRACE("(%p, %p, %p, %p)", self, p, src, r);
  144.  
  145.     CheckDispatch(self);
  146.     CheckDispatch(src);
  147.     if ((*(br_device_pixelmap_dispatch**)self)->_device((br_object*)self) == (*(br_device_pixelmap_dispatch**)src)->_device((br_object*)src)) {
  148.         return (*(br_device_pixelmap_dispatch**)self)->_rectangleCopy(self, p, src, r);
  149.     }
  150.     if ((src->pm_flags & BR_PMF_NO_ACCESS) == 0) {
  151.         return (*(br_device_pixelmap_dispatch**)self)->_rectangleCopyTo(self, p, src, r);
  152.     }
  153.     if ((self->pm_flags & BR_PMF_NO_ACCESS) == 0) {
  154.         return (*(br_device_pixelmap_dispatch**)self)->_rectangleCopyFrom(src, p, self, r);
  155.     }
  156.     return GeneralRectangleCopy(self, p, src, r);
  157. }
  158.  
  159. // IDA: br_error __usercall DispatchRectangleStretchCopy@<EAX>(br_device_pixelmap *self@<EAX>, br_rectangle *r@<EDX>, br_device_pixelmap *src@<EBX>, br_rectangle *s@<ECX>)
  160. br_error DispatchRectangleStretchCopy(br_device_pixelmap* self, br_rectangle* r, br_device_pixelmap* src, br_rectangle* s) {
  161.     LOG_TRACE("(%p, %p, %p, %p)", self, r, src, s);
  162.     NOT_IMPLEMENTED();
  163. }
  164.  
  165. // IDA: void __cdecl BrPixelmapRectangleCopy(br_pixelmap *dst, br_int_32 dx, br_int_32 dy, br_pixelmap *src, br_int_32 sx, br_int_32 sy, br_int_32 w, br_int_32 h)
  166. void BrPixelmapRectangleCopy(br_pixelmap* dst, br_int_32 dx, br_int_32 dy, br_pixelmap* src, br_int_32 sx, br_int_32 sy, br_int_32 w, br_int_32 h) {
  167.     br_rectangle r;
  168.     br_point p;
  169.  
  170.     r.x = sx;
  171.     r.y = sy;
  172.     r.w = w;
  173.     r.h = h;
  174.     p.x = dx;
  175.     p.y = dy;
  176.     DispatchRectangleCopy((br_device_pixelmap*)dst, &p, (br_device_pixelmap*)src, &r);
  177. }
  178.  
  179. // IDA: void __cdecl BrPixelmapRectangleStretchCopy(br_pixelmap *dst, br_int_32 dx, br_int_32 dy, br_int_32 dw, br_int_32 dh, br_pixelmap *src, br_int_32 sx, br_int_32 sy, br_int_32 sw, br_int_32 sh)
  180. void BrPixelmapRectangleStretchCopy(br_pixelmap* dst, br_int_32 dx, br_int_32 dy, br_int_32 dw, br_int_32 dh, br_pixelmap* src, br_int_32 sx, br_int_32 sy, br_int_32 sw, br_int_32 sh) {
  181.     //br_rectangle s; // Pierre-Marie Baty -- unused variable
  182.     //br_rectangle d; // Pierre-Marie Baty -- unused variable
  183.     LOG_TRACE("(%p, %d, %d, %d, %d, %p, %d, %d, %d, %d)", dst, dx, dy, dw, dh, src, sx, sy, sw, sh);
  184.     NOT_IMPLEMENTED();
  185. }
  186.  
  187. // IDA: void __cdecl BrPixelmapRectangleFill(br_pixelmap *dst, br_int_32 x, br_int_32 y, br_int_32 w, br_int_32 h, br_uint_32 colour)
  188. void BrPixelmapRectangleFill(br_pixelmap* dst, br_int_32 x, br_int_32 y, br_int_32 w, br_int_32 h, br_uint_32 colour) {
  189.     //br_rectangle r; // Pierre-Marie Baty -- unused variable
  190.     LOG_TRACE("(%p, %d, %d, %d, %d, %d)", dst, x, y, w, h, colour);
  191.     br_uint_8* dst_pix = (br_uint_8*)dst->pixels;
  192.  
  193.     x += dst->origin_x;
  194.     y += dst->origin_y;
  195.     for (int i = 0; i < w; i++) {
  196.         if (x + i < 0 || x + i >= dst->width) {
  197.             continue;
  198.         }
  199.         for (int j = 0; j < h; j++) {
  200.             if (y + j < 0 || y + j >= dst->height) {
  201.                 continue;
  202.             }
  203.             dst_pix[(y + j) * dst->row_bytes + (x + i)] = colour;
  204.         }
  205.     }
  206. }
  207.  
  208. // IDA: void __cdecl BrPixelmapDirtyRectangleCopy(br_pixelmap *dst, br_pixelmap *src, br_int_32 x, br_int_32 y, br_int_32 w, br_int_32 h)
  209. void BrPixelmapDirtyRectangleCopy(br_pixelmap* dst, br_pixelmap* src, br_int_32 x, br_int_32 y, br_int_32 w, br_int_32 h) {
  210.     //br_rectangle r; // Pierre-Marie Baty -- unused variable
  211.     //br_point p; // Pierre-Marie Baty -- unused variable
  212.     LOG_TRACE("(%p, %p, %d, %d, %d, %d)", dst, src, x, y, w, h);
  213.     NOT_IMPLEMENTED();
  214. }
  215.  
  216. // IDA: void __cdecl BrPixelmapDirtyRectangleClear(br_pixelmap *dst, br_int_32 x, br_int_32 y, br_int_32 w, br_int_32 h, br_uint_32 colour)
  217. void BrPixelmapDirtyRectangleClear(br_pixelmap* dst, br_int_32 x, br_int_32 y, br_int_32 w, br_int_32 h, br_uint_32 colour) {
  218.     //br_rectangle r; // Pierre-Marie Baty -- unused variable
  219.     LOG_TRACE("(%p, %d, %d, %d, %d, %d)", dst, x, y, w, h, colour);
  220.     NOT_IMPLEMENTED();
  221. }
  222.  
  223. // IDA: void __cdecl BrPixelmapDirtyRectangleDoubleBuffer(br_pixelmap *dst, br_pixelmap *src, br_int_32 x, br_int_32 y, br_int_32 w, br_int_32 h)
  224. void BrPixelmapDirtyRectangleDoubleBuffer(br_pixelmap* dst, br_pixelmap* src, br_int_32 x, br_int_32 y, br_int_32 w, br_int_32 h) {
  225.     //br_rectangle r; // Pierre-Marie Baty -- unused variable
  226.     LOG_TRACE("(%p, %p, %d, %d, %d, %d)", dst, src, x, y, w, h);
  227.     NOT_IMPLEMENTED();
  228. }
  229.  
  230. // IDA: void __cdecl BrPixelmapPixelSet(br_pixelmap *dst, br_int_32 x, br_int_32 y, br_uint_32 colour)
  231. void BrPixelmapPixelSet(br_pixelmap* dst, br_int_32 x, br_int_32 y, br_uint_32 colour) {
  232.     br_point p;
  233.     // LOG_TRACE("(%p, %d, %d, %d)", dst, x, y, colour);
  234.  
  235.     CheckDispatch((br_device_pixelmap*)dst);
  236.     p.x = x;
  237.     p.y = y;
  238.     (*(br_device_pixelmap_dispatch**)dst)->_pixelSet((br_device_pixelmap*)dst, &p, colour);
  239. }
  240.  
  241. // IDA: br_uint_32 __cdecl BrPixelmapPixelGet(br_pixelmap *dst, br_int_32 x, br_int_32 y)
  242. br_uint_32 BrPixelmapPixelGet(br_pixelmap* dst, br_int_32 x, br_int_32 y) {
  243.     //br_point p; // Pierre-Marie Baty -- unused variable
  244.     //br_uint_32 colour; // Pierre-Marie Baty -- unused variable
  245.     LOG_TRACE("(%p, %d, %d)", dst, x, y);
  246.     NOT_IMPLEMENTED();
  247. }
  248.  
  249. // IDA: void __cdecl BrPixelmapCopy(br_pixelmap *dst, br_pixelmap *src)
  250. void BrPixelmapCopy(br_pixelmap* dst, br_pixelmap* src) {
  251.     //br_rectangle s; // Pierre-Marie Baty -- unused variable
  252.     //br_rectangle d; // Pierre-Marie Baty -- unused variable
  253.     LOG_TRACE("(%p, %p)", dst, src);
  254.  
  255.     STUB_ONCE();  // stub because this implementation is improperly (=coordinates can lie outside pixelmap + pixel format size can be > 1 bytes)
  256.  
  257.     for (int y = 0; y < src->height; y++) {
  258.         for (int x = 0; x < src->width; x++) {
  259.             ((br_uint_8*)dst->pixels)[y * dst->row_bytes + x] = ((br_uint_8*)src->pixels)[y * src->row_bytes + x];
  260.         }
  261.     }
  262. }
  263.  
  264. // IDA: void __cdecl BrPixelmapLine(br_pixelmap *dst, br_int_32 x1, br_int_32 y1, br_int_32 x2, br_int_32 y2, br_uint_32 colour)
  265. void BrPixelmapLine(br_pixelmap* dst, br_int_32 x1, br_int_32 y1, br_int_32 x2, br_int_32 y2, br_uint_32 colour) {
  266.     // br_point s;
  267.     // br_point e;
  268.     LOG_TRACE("(%p, %d, %d, %d, %d, %d)", dst, x1, y1, x2, y2, colour);
  269.  
  270.     STUB_ONCE();  // stub because this implementation is improperly (=coordinates can lie outside pixelmap + pixel format size can be > 1 bytes)
  271.  
  272.     // Thanks Errol!
  273.     br_int_16 dx, dy, inx, iny, e;
  274.     dx = x2 - x1;
  275.     dy = y2 - y1;
  276.     inx = dx > 0 ? 1 : -1;
  277.     iny = dy > 0 ? 1 : -1;
  278.     dx = abs(dx);
  279.     dy = abs(dy);
  280.     if (dx >= dy) {
  281.         dy <<= 1;
  282.         e = dy - dx;
  283.         dx <<= 1;
  284.         while (x1 != x2) {
  285.             BrPixelmapPixelSet(dst, x1, y1, colour);
  286.             if (e >= 0) {
  287.                 y1 += iny;
  288.                 e -= dx;
  289.             }
  290.             e += dy;
  291.             x1 += inx;
  292.         }
  293.     } else {
  294.         dx <<= 1;
  295.         e = dx - dy;
  296.         dy <<= 1;
  297.         while (y1 != y2) {
  298.             BrPixelmapPixelSet(dst, x1, y1, colour);
  299.             if (e >= 0) {
  300.                 x1 += inx;
  301.                 e -= dy;
  302.             }
  303.             e += dx;
  304.             y1 += iny;
  305.         }
  306.     }
  307.     BrPixelmapPixelSet(dst, x1, y1, colour);
  308. }
  309.  
  310. // IDA: void __cdecl BrPixelmapDoubleBuffer(br_pixelmap *dst, br_pixelmap *src)
  311. void BrPixelmapDoubleBuffer(br_pixelmap* dst, br_pixelmap* src) {
  312.     Harness_Hook_BrPixelmapDoubleBuffer(dst, src);
  313. }
  314.  
  315. // IDA: void __cdecl BrPixelmapText(br_pixelmap *dst, br_int_32 x, br_int_32 y, br_uint_32 colour, br_font *font, char *text)
  316. void BrPixelmapText(br_pixelmap* dst, br_int_32 x, br_int_32 y, br_uint_32 colour, br_font* font, char* text) {
  317.     br_point p;
  318.     LOG_TRACE("(%p, %d, %d, %d, %p, \"%s\")", dst, x, y, colour, font, text);
  319.  
  320.     CheckDispatch((br_device_pixelmap*)dst);
  321.     if (font == NULL) {
  322.         font = BrFontFixed3x5;
  323.     }
  324.     p.x = x;
  325.     p.y = y;
  326.     if (((br_device_pixelmap *) dst)->dispatch->_text == NULL) { // Pierre-Marie Baty -- consistency check
  327.        LOG_PANIC("about to dereference NULL _text() function pointer!");
  328.     }
  329.     ((br_device_pixelmap*)dst)->dispatch->_text((br_device_pixelmap*)dst, &p, font, text, colour);
  330. }
  331.  
  332. // IDA: void __cdecl BrPixelmapTextF(br_pixelmap *dst, br_int_32 x, br_int_32 y, br_uint_32 colour, br_font *font, char *fmt, ...)
  333. void BrPixelmapTextF(br_pixelmap* dst, br_int_32 x, br_int_32 y, br_uint_32 colour, br_font* font, char* fmt, ...) {
  334.     char* ss;
  335.     br_point p;
  336.     va_list args;
  337.     LOG_TRACE("(%p, %d, %d, %d, %p, \"%s\")", dst, x, y, colour, font, fmt);
  338.  
  339.     CheckDispatch((br_device_pixelmap*)dst);
  340.     ss = BrScratchString();
  341.     if (font == NULL) {
  342.         font = BrFontFixed3x5;
  343.     }
  344.     va_start(args, fmt);
  345.     BrVSprintfN(ss, BrScratchStringSize(), fmt, args);
  346.     va_end(args);
  347.     p.x = x;
  348.     p.y = y;
  349.     if (((br_device_pixelmap *) dst)->dispatch->_text == NULL) { // Pierre-Marie Baty -- consistency check
  350.        LOG_PANIC("about to dereference NULL _text() function pointer!");
  351.     }
  352.     (*(br_device_pixelmap_dispatch**)dst)->_text((br_device_pixelmap*)dst, &p, font, ss, colour);
  353. }
  354.  
  355. // IDA: br_uint_16 __cdecl BrPixelmapTextWidth(br_pixelmap *dst, br_font *font, char *text)
  356. br_uint_16 BrPixelmapTextWidth(br_pixelmap* dst, br_font* font, char* text) {
  357.     int i;
  358.     int j;
  359.     int w;
  360.     LOG_TRACE("(%p, %p, \"%s\")", dst, font, text);
  361.  
  362.     if (!text) {
  363.         return (font->glyph_x);
  364.     }
  365.     if (BrStrLen(text) == 0) {
  366.         return 0;
  367.     }
  368.  
  369.     if (font->flags & BR_FONTF_PROPORTIONAL) {
  370.         for (i = 0, w = 0, j = BrStrLen(text); i < j; i++, text++)
  371.             w += font->width[*(br_uint_8*)text] + 1;
  372.         w -= 1;
  373.         return w;
  374.     } else
  375.         return (br_uint_16) ((font->glyph_x + 1) * BrStrLen(text) - 1); // Pierre-Marie Baty -- added type cast
  376. }
  377.  
  378. // IDA: br_uint_16 __cdecl BrPixelmapTextHeight(br_pixelmap *dst, br_font *font)
  379. br_uint_16 BrPixelmapTextHeight(br_pixelmap* dst, br_font* font) {
  380.     LOG_TRACE("(%p, %p)", dst, font);
  381.     NOT_IMPLEMENTED();
  382. }
  383.  
  384. // IDA: void __cdecl BrPixelmapCopyBits(br_pixelmap *dst, br_int_32 x, br_int_32 y, br_uint_8 *src, br_int_32 s_stride, br_int_32 start_bit, br_int_32 end_bit, br_int_32 nrows, br_uint_32 colour)
  385. void BrPixelmapCopyBits(br_pixelmap* dst, br_int_32 x, br_int_32 y, br_uint_8* src, br_int_32 s_stride, br_int_32 start_bit, br_int_32 end_bit, br_int_32 nrows, br_uint_32 colour) {
  386.     //br_point p; // Pierre-Marie Baty -- unused variable
  387.     //br_rectangle r; // Pierre-Marie Baty -- unused variable
  388.     LOG_TRACE("(%p, %d, %d, %p, %d, %d, %d, %d, %d)", dst, x, y, src, s_stride, start_bit, end_bit, nrows, colour);
  389.     NOT_IMPLEMENTED();
  390. }
  391.  
  392. // IDA: br_uint_16 __cdecl BrPixelmapFileSize(br_pixelmap *pm)
  393. br_uint_16 BrPixelmapFileSize(br_pixelmap* pm) {
  394.     LOG_TRACE("(%p)", pm);
  395.     NOT_IMPLEMENTED();
  396. }
  397.  
  398. // IDA: br_uint_16 __cdecl BrPixelmapPixelSize(br_pixelmap *pm)
  399. br_uint_16 BrPixelmapPixelSize(br_pixelmap* pm) {
  400.     LOG_TRACE("(%p)", pm);
  401.     NOT_IMPLEMENTED();
  402. }
  403.  
  404. // IDA: br_uint_16 __cdecl BrPixelmapChannels(br_pixelmap *pm)
  405. br_uint_16 BrPixelmapChannels(br_pixelmap* pm) {
  406.     LOG_TRACE("(%p)", pm);
  407.     NOT_IMPLEMENTED();
  408. }
  409.  
  410. // IDA: void __cdecl BrPixelmapPaletteSet(br_pixelmap *pm, br_pixelmap *pal)
  411. void BrPixelmapPaletteSet(br_pixelmap* pm, br_pixelmap* pal) {
  412.     LOG_TRACE("(%p, %p)", pm, pal);
  413.     NOT_IMPLEMENTED();
  414. }
  415.  
  416. // IDA: void __cdecl BrPixelmapPaletteEntrySet(br_pixelmap *pm, br_int_32 index, br_colour colour)
  417. void BrPixelmapPaletteEntrySet(br_pixelmap* pm, br_int_32 index, br_colour colour) {
  418.     //br_device_clut* clut; // Pierre-Marie Baty -- unused variable
  419.     LOG_TRACE("(%p, %d, %d)", pm, index, colour);
  420.     NOT_IMPLEMENTED();
  421. }
  422.  
  423. // IDA: void __cdecl BrPixelmapPaletteEntrySetMany(br_pixelmap *pm, br_int_32 index, br_int_32 ncolours, br_colour *colours)
  424. void BrPixelmapPaletteEntrySetMany(br_pixelmap* pm, br_int_32 index, br_int_32 ncolours, br_colour* colours) {
  425.     //br_device_clut* clut; // Pierre-Marie Baty -- unused variable
  426.     LOG_TRACE("(%p, %d, %d, %p)", pm, index, ncolours, colours);
  427.     NOT_IMPLEMENTED();
  428. }
  429.  
  430. // IDA: br_pixelmap* __cdecl BrPixelmapDirectLock(br_pixelmap *src, br_boolean block)
  431. br_pixelmap* BrPixelmapDirectLock(br_pixelmap* src, br_boolean block) {
  432.     LOG_TRACE("(%p, %d)", src, block);
  433.  
  434.     CheckDispatch((br_device_pixelmap*)src);
  435.     if (((br_device_pixelmap*)(src))->dispatch->_directLock((br_device_pixelmap*)src, block) == 0) {
  436.         return src;
  437.     } else {
  438.         return NULL;
  439.     }
  440. }
  441.  
  442. // IDA: br_pixelmap* __cdecl BrPixelmapDirectUnlock(br_pixelmap *src)
  443. br_pixelmap* BrPixelmapDirectUnlock(br_pixelmap* src) {
  444.     LOG_TRACE("(%p)", src);
  445.  
  446.     CheckDispatch((br_device_pixelmap*)src);
  447.     if (((br_device_pixelmap*)(src))->dispatch->_directUnlock((br_device_pixelmap*)src) == 0) {
  448.         return src;
  449.     } else {
  450.         return NULL;
  451.     }
  452. }
  453.