wip prep commit in lieu of gfx subsystem update changes.
[AROS.git] / rom / hidds / graphics / gfx_bitmapmemblit.c
blob05d475f589c9f80bd9fd0ae781848939bb055b37
1 /*
2 Copyright © 1995-2017, The AROS Development Team. All rights reserved.
3 $Id$
4 */
6 #include <string.h>
8 #include <hidd/gfx.h>
10 #include "gfx_intern.h"
11 #include "gfx_debug.h"
13 /****************************************************************************************/
15 VOID BM__Hidd_BitMap__FillMemRect8(OOP_Class *cl, OOP_Object *o, struct pHidd_BitMap_FillMemRect8 *msg)
17 UBYTE *start;
18 LONG phase, width, height, w, p;
19 ULONG fill32;
20 ULONG start_add;
22 start = msg->dstBuf + msg->minY * msg->dstMod + msg->minX;
23 width = msg->maxX - msg->minX + 1;
24 height = msg->maxY - msg->minY + 1;
25 start_add = msg->dstMod - width;
27 if ((phase = (IPTR)start & 3L))
29 phase = 4 - phase;
30 if (phase > width) phase = width;
31 width -= phase;
34 fill32 = msg->fill;
35 fill32 |= (fill32 << 8);
36 fill32 |= (fill32 << 16);
38 while(height--)
40 w = width;
41 p = phase;
43 while(p--)
45 *start++ = (UBYTE)fill32;
47 while(w >= 4)
49 *((ULONG *)start) = fill32;
50 w -= 4; start += 4;
52 while(w--)
54 *start++ = (UBYTE)fill32;
56 start += start_add;
61 /****************************************************************************************/
63 VOID BM__Hidd_BitMap__FillMemRect16(OOP_Class *cl, OOP_Object *o, struct pHidd_BitMap_FillMemRect16 *msg)
65 UBYTE *start;
66 LONG phase, width, height, w, p;
67 ULONG fill32;
68 ULONG start_add;
70 start = msg->dstBuf + msg->minY * msg->dstMod + msg->minX * 2;
71 width = msg->maxX - msg->minX + 1;
72 height = msg->maxY - msg->minY + 1;
73 start_add = msg->dstMod - width * 2;
75 if ((phase = (IPTR)start & 1L))
77 phase = 2 - phase;
78 if (phase > width) phase = width;
79 width -= phase;
82 fill32 = msg->fill;
83 fill32 |= (fill32 << 16);
85 while(height--)
87 w = width;
88 p = phase;
90 while(p--)
92 *((UWORD *)start) = (UWORD)fill32;
93 start += 2;
95 while(w >= 2)
97 *((ULONG *)start) = fill32;
98 w -= 2; start += 4;
100 while(w--)
102 *((UWORD *)start) = (UWORD)fill32;
103 start += 2;
105 start += start_add;
110 /****************************************************************************************/
112 VOID BM__Hidd_BitMap__FillMemRect24(OOP_Class *cl, OOP_Object *o, struct pHidd_BitMap_FillMemRect24 *msg)
114 UBYTE *start;
115 LONG width, height, w;
116 UBYTE fill1, fill2, fill3;
117 ULONG start_add;
119 start = msg->dstBuf + msg->minY * msg->dstMod + msg->minX * 3;
120 width = msg->maxX - msg->minX + 1;
121 height = msg->maxY - msg->minY + 1;
122 start_add = msg->dstMod - width * 3;
124 #if AROS_BIG_ENDIAN
125 fill1 = (msg->fill >> 16) & 0xFF;
126 fill2 = (msg->fill >> 8) & 0xFF;
127 fill3 = msg->fill & 0xFF;
128 #else
129 fill1 = msg->fill & 0xFF;
130 fill2 = (msg->fill >> 8) & 0xFF;
131 fill3 = (msg->fill >> 16) & 0xFF;
132 #endif
134 while(height--)
136 w = width;
138 while(w--)
140 *start++ = fill1;
141 *start++ = fill2;
142 *start++ = fill3;
145 start += start_add;
149 /****************************************************************************************/
151 VOID BM__Hidd_BitMap__FillMemRect32(OOP_Class *cl, OOP_Object *o, struct pHidd_BitMap_FillMemRect32 *msg)
153 UBYTE *start;
154 LONG width, height, w;
155 ULONG fill32;
156 ULONG start_add;
158 start = msg->dstBuf + msg->minY * msg->dstMod + msg->minX * 4;
159 width = msg->maxX - msg->minX + 1;
160 height = msg->maxY - msg->minY + 1;
161 start_add = msg->dstMod - width * 4;
163 fill32 = msg->fill;
165 while(height--)
167 w = width;
169 while(w--)
171 *((ULONG *)start) = fill32;
172 start += 4;
175 start += start_add;
179 /****************************************************************************************/
181 VOID BM__Hidd_BitMap__InvertMemRect(OOP_Class *cl, OOP_Object *o, struct pHidd_BitMap_InvertMemRect *msg)
183 UBYTE *start;
184 LONG phase, width, height, w, p;
185 ULONG start_add;
187 start = msg->dstBuf + msg->minY * msg->dstMod + msg->minX;
188 width = msg->maxX - msg->minX + 1;
189 height = msg->maxY - msg->minY + 1;
190 start_add = msg->dstMod - width;
192 if ((phase = (IPTR)start & 3L))
194 phase = 4 - phase;
195 if (phase > width) phase = width;
196 width -= phase;
199 while(height--)
201 UBYTE bg;
202 ULONG bg32;
204 w = width;
205 p = phase;
207 while(p--)
209 bg = *start;
210 *start++ = ~bg;
212 while(w >= 4)
214 bg32 = *(ULONG *)start;
215 *((ULONG *)start) = ~bg32;
216 w -= 4; start += 4;
218 while(w--)
220 bg = *start;
221 *start++ = ~bg;
223 start += start_add;
228 /****************************************************************************************/
230 VOID BM__Hidd_BitMap__CopyMemBox8(OOP_Class *cl, OOP_Object *o, struct pHidd_BitMap_CopyMemBox8 *msg)
232 UBYTE *src_start, *dst_start;
233 LONG phase, width, height, w, p;
234 ULONG src_start_add, dst_start_add;
235 BOOL descending;
237 width = msg->width;
238 height = msg->height;
240 src_start = msg->src + msg->srcY * msg->srcMod + msg->srcX;
241 src_start_add = msg->srcMod - width;
243 dst_start = msg->dst + msg->dstY * msg->dstMod + msg->dstX;
244 dst_start_add = msg->dstMod - width;
246 if ((IPTR)src_start > (IPTR)dst_start)
248 if ((phase = (IPTR)src_start & 3L))
250 phase = 4 - phase;
251 if (phase > width) phase = width;
252 width -= phase;
254 descending = FALSE;
256 else
258 src_start += (height - 1) * msg->srcMod + width;
259 dst_start += (height - 1) * msg->dstMod + width;
261 phase = ((IPTR)src_start & 3L);
262 if (phase > width) phase = width;
263 width -= phase;
265 descending = TRUE;
268 /* NOTE: This can write LONGs to odd addresses, which might not work
269 on some CPUs (MC68000) */
271 if (!descending)
273 while(height--)
275 w = width;
276 p = phase;
278 while(p--)
280 *dst_start++ = *src_start++;
282 while(w >= 4)
284 *((ULONG *)dst_start) = *((ULONG *)src_start);
285 w -= 4; dst_start += 4; src_start += 4;
287 while(w--)
289 *dst_start++ = *src_start++;
291 src_start += src_start_add;
292 dst_start += dst_start_add;
295 else
297 while(height--)
299 w = width;
300 p = phase;
302 while(p--)
304 *--dst_start = *--src_start;
306 while(w >= 4)
308 dst_start -= 4; src_start -= 4;
309 *(ULONG *)dst_start = *(ULONG *)src_start;
310 w -= 4;
312 while(w--)
314 *--dst_start = *--src_start;
316 src_start -= src_start_add;
317 dst_start -= dst_start_add;
323 /****************************************************************************************/
325 VOID BM__Hidd_BitMap__CopyMemBox16(OOP_Class *cl, OOP_Object *o, struct pHidd_BitMap_CopyMemBox16 *msg)
327 UBYTE *src_start, *dst_start;
328 LONG phase, width, height, w, p;
329 ULONG src_start_add, dst_start_add;
330 BOOL descending;
332 width = msg->width;
333 height = msg->height;
335 src_start = msg->src + msg->srcY * msg->srcMod + msg->srcX * 2;
336 src_start_add = msg->srcMod - width * 2;
338 dst_start = msg->dst + msg->dstY * msg->dstMod + msg->dstX * 2;
339 dst_start_add = msg->dstMod - width * 2;
341 if ((IPTR)src_start > (IPTR)dst_start)
343 if ((phase = (IPTR)src_start & 1L))
345 phase = 2 - phase;
346 if (phase > width) phase = width;
347 width -= phase;
349 descending = FALSE;
351 else
353 src_start += (height - 1) * msg->srcMod + width * 2;
354 dst_start += (height - 1) * msg->dstMod + width * 2;
356 phase = ((IPTR)src_start & 1L);
357 if (phase > width) phase = width;
358 width -= phase;
360 descending = TRUE;
363 if (!descending)
365 while(height--)
367 w = width;
368 p = phase;
370 while(p--)
372 *((UWORD *)dst_start) = *((UWORD *)src_start);
373 dst_start += 2; src_start += 2;
375 while(w >= 2)
377 *((ULONG *)dst_start) = *((ULONG *)src_start);
378 w -= 2; dst_start += 4; src_start += 4;
380 while(w--)
382 *((UWORD *)dst_start) = *((UWORD *)src_start);
383 dst_start += 2; src_start += 2;
385 src_start += src_start_add;
386 dst_start += dst_start_add;
389 else
391 while(height--)
393 w = width;
394 p = phase;
396 while(p--)
398 dst_start -= 2; src_start -= 2;
399 *(UWORD *)dst_start = *(UWORD *)src_start;
401 while(w >= 2)
403 dst_start -= 4; src_start -= 4;
404 *(ULONG *)dst_start = *(ULONG *)src_start;
405 w -= 2;
407 while(w--)
409 dst_start -= 2; src_start -= 2;
410 *(UWORD *)dst_start = *(UWORD *)src_start;
412 src_start -= src_start_add;
413 dst_start -= dst_start_add;
419 /****************************************************************************************/
421 VOID BM__Hidd_BitMap__CopyMemBox24(OOP_Class *cl, OOP_Object *o, struct pHidd_BitMap_CopyMemBox24 *msg)
423 UBYTE *src_start, *dst_start;
424 LONG width, height, w;
425 ULONG src_start_add, dst_start_add;
426 BOOL descending;
428 width = msg->width;
429 height = msg->height;
431 src_start = msg->src + msg->srcY * msg->srcMod + msg->srcX * 3;
432 src_start_add = msg->srcMod - width * 3;
434 dst_start = msg->dst + msg->dstY * msg->dstMod + msg->dstX * 3;
435 dst_start_add = msg->dstMod - width * 3;
437 if ((IPTR)src_start > (IPTR)dst_start)
439 descending = FALSE;
441 else
443 src_start += (height - 1) * msg->srcMod + width * 3;
444 dst_start += (height - 1) * msg->dstMod + width * 3;
446 descending = TRUE;
449 if (!descending)
451 while(height--)
453 w = width;
455 while(w--)
457 *dst_start++ = *src_start++;
458 *dst_start++ = *src_start++;
459 *dst_start++ = *src_start++;
462 src_start += src_start_add;
463 dst_start += dst_start_add;
466 else
468 while(height--)
470 w = width;
472 while(w--)
474 *--dst_start = *--src_start;
475 *--dst_start = *--src_start;
476 *--dst_start = *--src_start;
479 src_start -= src_start_add;
480 dst_start -= dst_start_add;
486 /****************************************************************************************/
488 VOID BM__Hidd_BitMap__CopyMemBox32(OOP_Class *cl, OOP_Object *o, struct pHidd_BitMap_CopyMemBox32 *msg)
490 UBYTE *src_start, *dst_start;
491 LONG width, height, w;
492 ULONG src_start_add, dst_start_add;
493 BOOL descending;
495 width = msg->width;
496 height = msg->height;
498 src_start = msg->src + msg->srcY * msg->srcMod + msg->srcX * 4;
499 src_start_add = msg->srcMod - width * 4;
501 dst_start = msg->dst + msg->dstY * msg->dstMod + msg->dstX * 4;
502 dst_start_add = msg->dstMod - width * 4;
504 if ((IPTR)src_start > (IPTR)dst_start)
506 descending = FALSE;
508 else
510 src_start += (height - 1) * msg->srcMod + width * 4;
511 dst_start += (height - 1) * msg->dstMod + width * 4;
513 descending = TRUE;
516 if (!descending)
518 while(height--)
520 w = width;
522 while(w--)
524 *((ULONG *)dst_start) = *((ULONG *)src_start);
525 dst_start += 4; src_start += 4;
528 src_start += src_start_add;
529 dst_start += dst_start_add;
532 else
534 while(height--)
536 w = width;
538 while(w--)
540 dst_start -= 4; src_start -= 4;
541 *(ULONG *)dst_start = *(ULONG *)src_start;
544 src_start -= src_start_add;
545 dst_start -= dst_start_add;
551 /****************************************************************************************/
553 VOID BM__Hidd_BitMap__CopyLUTMemBox16(OOP_Class *cl, OOP_Object *o, struct pHidd_BitMap_CopyLUTMemBox16 *msg)
555 HIDDT_Pixel *pixlut = msg->pixlut->pixels;
556 UBYTE *src_start, *dst_start;
557 LONG width, height, w;
558 ULONG src_start_add, dst_start_add;
560 if (!pixlut) return;
562 width = msg->width;
563 height = msg->height;
565 src_start = msg->src + msg->srcY * msg->srcMod + msg->srcX;
566 src_start_add = msg->srcMod - width;
568 dst_start = msg->dst + msg->dstY * msg->dstMod + msg->dstX * 2;
569 dst_start_add = msg->dstMod - width * 2;
571 while(height--)
573 w = width;
575 while(w--)
577 *(UWORD *)dst_start = (UWORD)(pixlut[*src_start++]);
578 dst_start += 2;
580 src_start += src_start_add;
581 dst_start += dst_start_add;
585 /****************************************************************************************/
587 VOID BM__Hidd_BitMap__CopyLUTMemBox24(OOP_Class *cl, OOP_Object *o, struct pHidd_BitMap_CopyLUTMemBox24 *msg)
589 HIDDT_Pixel *pixlut = msg->pixlut->pixels;
590 UBYTE *src_start, *dst_start;
591 LONG width, height, w;
592 ULONG src_start_add, dst_start_add;
594 if (!pixlut) return;
596 width = msg->width;
597 height = msg->height;
599 src_start = msg->src + msg->srcY * msg->srcMod + msg->srcX;
600 src_start_add = msg->srcMod - width;
602 dst_start = msg->dst + msg->dstY * msg->dstMod + msg->dstX * 3;
603 dst_start_add = msg->dstMod - width * 3;
605 while(height--)
607 w = width;
609 while(w--)
611 HIDDT_Pixel pix = pixlut[*src_start++];
613 #if AROS_BIG_ENDIAN
614 *dst_start++ = (pix >> 16) & 0xFF;
615 *dst_start++ = (pix >> 8) & 0xFF;
616 *dst_start++ = pix & 0xFF;
617 #else
618 *dst_start++ = pix & 0xFF;
619 *dst_start++ = (pix >> 8) & 0xFF;
620 *dst_start++ = (pix >> 16) & 0xFF;
621 #endif
623 src_start += src_start_add;
624 dst_start += dst_start_add;
628 /****************************************************************************************/
630 VOID BM__Hidd_BitMap__CopyLUTMemBox32(OOP_Class *cl, OOP_Object *o, struct pHidd_BitMap_CopyLUTMemBox32 *msg)
632 HIDDT_Pixel *pixlut = msg->pixlut->pixels;
633 UBYTE *src_start, *dst_start;
634 LONG width, height, w;
635 ULONG src_start_add, dst_start_add;
637 if (!pixlut) return;
639 width = msg->width;
640 height = msg->height;
642 src_start = msg->src + msg->srcY * msg->srcMod + msg->srcX;
643 src_start_add = msg->srcMod - width;
645 dst_start = msg->dst + msg->dstY * msg->dstMod + msg->dstX * 4;
646 dst_start_add = msg->dstMod - width * 4;
648 while(height--)
650 w = width;
652 while(w--)
654 *((ULONG *)dst_start) = (ULONG)(pixlut[*src_start++]);
655 dst_start += 4;
657 src_start += src_start_add;
658 dst_start += dst_start_add;
662 /****************************************************************************************/
664 VOID BM__Hidd_BitMap__PutMem32Image8(OOP_Class *cl, OOP_Object *o, struct pHidd_BitMap_PutMem32Image8 *msg)
666 UBYTE *src_start, *dst_start;
667 LONG width, height, w;
668 ULONG src_start_add, dst_start_add;
670 width = msg->width;
671 height = msg->height;
673 src_start = msg->src;
674 src_start_add = msg->srcMod - width * 4;
676 dst_start = msg->dst + msg->dstY * msg->dstMod + msg->dstX;
677 dst_start_add = msg->dstMod - width;
679 while(height--)
681 w = width;
683 while(w--)
685 *dst_start++ = (UBYTE)(*(ULONG *)src_start);
686 src_start += 4;
688 src_start += src_start_add;
689 dst_start += dst_start_add;
693 /****************************************************************************************/
695 VOID BM__Hidd_BitMap__PutMem32Image16(OOP_Class *cl, OOP_Object *o, struct pHidd_BitMap_PutMem32Image16 *msg)
697 UBYTE *src_start, *dst_start;
698 LONG width, height, w;
699 ULONG src_start_add, dst_start_add;
701 width = msg->width;
702 height = msg->height;
704 src_start = msg->src;
705 src_start_add = msg->srcMod - width * 4;
707 dst_start = msg->dst + msg->dstY * msg->dstMod + msg->dstX * 2;
708 dst_start_add = msg->dstMod - width * 2;
710 while(height--)
712 w = width;
714 while(w--)
716 *(UWORD *)dst_start = (UWORD)(*(ULONG *)src_start);
717 dst_start += 2; src_start += 4;
719 src_start += src_start_add;
720 dst_start += dst_start_add;
724 /****************************************************************************************/
726 VOID BM__Hidd_BitMap__PutMem32Image24(OOP_Class *cl, OOP_Object *o, struct pHidd_BitMap_PutMem32Image24 *msg)
728 UBYTE *src_start, *dst_start;
729 LONG width, height, w;
730 ULONG src_start_add, dst_start_add;
732 width = msg->width;
733 height = msg->height;
735 src_start = msg->src;
736 src_start_add = msg->srcMod - width * 4;
738 dst_start = msg->dst + msg->dstY * msg->dstMod + msg->dstX * 3;
739 dst_start_add = msg->dstMod - width * 3;
741 while(height--)
743 w = width;
745 while(w--)
747 ULONG pix = *(ULONG *)src_start;
749 src_start += 4;
751 #if AROS_BIG_ENDIAN
752 *dst_start++ = (pix >> 16) & 0xFF;
753 *dst_start++ = (pix >> 8) & 0xFF;
754 *dst_start++ = pix & 0xFF;
755 #else
756 *dst_start++ = pix & 0xFF;
757 *dst_start++ = (pix >> 8) & 0xFF;
758 *dst_start++ = (pix >> 16) & 0xFF;
759 #endif
762 src_start += src_start_add;
763 dst_start += dst_start_add;
767 /****************************************************************************************/
769 VOID BM__Hidd_BitMap__GetMem32Image8(OOP_Class *cl, OOP_Object *o, struct pHidd_BitMap_GetMem32Image8 *msg)
771 UBYTE *src_start, *dst_start;
772 LONG width, height, w;
773 ULONG src_start_add, dst_start_add;
775 width = msg->width;
776 height = msg->height;
778 src_start = msg->src + msg->srcY * msg->srcMod + msg->srcX;
779 src_start_add = msg->srcMod - width;
781 dst_start = msg->dst;
782 dst_start_add = msg->dstMod - width * 4;
784 while(height--)
786 w = width;
788 while(w--)
790 *(ULONG *)dst_start = (ULONG)(*src_start++);
791 dst_start += 4;
793 src_start += src_start_add;
794 dst_start += dst_start_add;
798 /****************************************************************************************/
800 VOID BM__Hidd_BitMap__GetMem32Image16(OOP_Class *cl, OOP_Object *o, struct pHidd_BitMap_GetMem32Image16 *msg)
802 UBYTE *src_start, *dst_start;
803 LONG width, height, w;
804 ULONG src_start_add, dst_start_add;
806 width = msg->width;
807 height = msg->height;
809 src_start = msg->src + msg->srcY * msg->srcMod + msg->srcX * 2;
810 src_start_add = msg->srcMod - width * 2;
812 dst_start = msg->dst;
813 dst_start_add = msg->dstMod - width * 4;
815 while(height--)
817 w = width;
819 while(w--)
821 *(ULONG *)dst_start = (ULONG)(*(UWORD *)src_start);
822 dst_start += 4; src_start += 2;
824 src_start += src_start_add;
825 dst_start += dst_start_add;
829 /****************************************************************************************/
831 VOID BM__Hidd_BitMap__GetMem32Image24(OOP_Class *cl, OOP_Object *o, struct pHidd_BitMap_GetMem32Image24 *msg)
833 UBYTE *src_start, *dst_start;
834 LONG width, height, w;
835 ULONG src_start_add, dst_start_add;
837 width = msg->width;
838 height = msg->height;
840 src_start = msg->src + msg->srcY * msg->srcMod + msg->srcX * 3;
841 src_start_add = msg->srcMod - width * 3;
843 dst_start = msg->dst;
844 dst_start_add = msg->dstMod - width * 4;
846 while(height--)
848 w = width;
850 while(w--)
852 UBYTE pix1 = *src_start++;
853 UBYTE pix2 = *src_start++;
854 UBYTE pix3 = *src_start++;
856 #if AROS_BIG_ENDIAN
857 *(ULONG *)dst_start = (pix1 << 16) | (pix2 << 8) | pix3;
858 #else
859 *(ULONG *)dst_start = (pix3 << 16) | (pix2 << 8) | pix1;
860 #endif
862 dst_start += 4;
864 src_start += src_start_add;
865 dst_start += dst_start_add;
869 /****************************************************************************************/
871 VOID BM__Hidd_BitMap__PutMemTemplate8(OOP_Class *cl, OOP_Object *o, struct pHidd_BitMap_PutMemTemplate8 *msg)
873 WORD x, y;
874 UBYTE *bitarray, *buf;
875 UWORD bitmask;
876 OOP_Object *gc = msg->gc;
877 ULONG fg = GC_FG(gc);
878 ULONG bg = GC_BG(gc);
879 WORD type = 0;
881 if (msg->width <= 0 || msg->height <= 0)
882 return;
884 if (GC_COLEXP(gc) == vHidd_GC_ColExp_Transparent)
886 type = 0;
888 else if (GC_DRMD(gc) == vHidd_GC_DrawMode_Invert)
890 type = 2;
892 else
894 type = 4;
897 if (msg->inverttemplate) type++;
899 bitarray = msg->masktemplate + ((msg->srcx / 16) * 2);
900 bitmask = 0x8000 >> (msg->srcx & 0xF);
902 buf = msg->dst + msg->y * msg->dstMod + msg->x;
904 for(y = 0; y < msg->height; y++)
906 ULONG mask = bitmask;
907 UWORD *array = (UWORD *)bitarray;
908 UWORD bitword = AROS_BE2WORD(*array);
909 UBYTE *xbuf = buf;
911 switch(type)
913 case 0: /* JAM1 */
914 for(x = 0; x < msg->width; x++, xbuf++)
916 if (bitword & mask) *xbuf = fg;
918 mask >>= 1;
919 if (!mask)
921 mask = 0x8000;
922 array++;
923 bitword = AROS_BE2WORD(*array);
926 } /* for(x = 0; x < msg->width; x++) */
927 break;
929 case 1: /* JAM1 | INVERSVID */
930 for(x = 0; x < msg->width; x++, xbuf++)
932 if (!(bitword & mask)) *xbuf = fg;
934 mask >>= 1;
935 if (!mask)
937 mask = 0x8000;
938 array++;
939 bitword = AROS_BE2WORD(*array);
942 } /* for(x = 0; x < msg->width; x++) */
943 break;
945 case 2: /* COMPLEMENT */
946 for(x = 0; x < msg->width; x++, xbuf++)
948 if (bitword & mask) *xbuf = ~(*xbuf);
950 mask >>= 1;
951 if (!mask)
953 mask = 0x8000;
954 array++;
955 bitword = AROS_BE2WORD(*array);
957 } /* for(x = 0; x < msg->width; x++) */
958 break;
960 case 3: /* COMPLEMENT | INVERSVID*/
961 for(x = 0; x < msg->width; x++, xbuf++)
963 if (!(bitword & mask)) *xbuf = ~(*xbuf);
965 mask >>= 1;
966 if (!mask)
968 mask = 0x8000;
969 array++;
970 bitword = AROS_BE2WORD(*array);
972 } /* for(x = 0; x < msg->width; x++) */
973 break;
975 case 4: /* JAM2 */
976 for(x = 0; x < msg->width; x++)
978 *xbuf++ = (bitword & mask) ? fg : bg;
980 mask >>= 1;
981 if (!mask)
983 mask = 0x8000;
984 array++;
985 bitword = AROS_BE2WORD(*array);
988 } /* for(x = 0; x < msg->width; x++) */
989 break;
991 case 5: /* JAM2 | INVERSVID */
992 for(x = 0; x < msg->width; x++)
994 *xbuf++ = (bitword & mask) ? bg : fg;
996 mask >>= 1;
997 if (!mask)
999 mask = 0x8000;
1000 array++;
1001 bitword = AROS_BE2WORD(*array);
1003 } /* for(x = 0; x < msg->width; x++) */
1004 break;
1006 } /* switch(type) */
1008 buf += msg->dstMod;
1009 bitarray += msg->modulo;
1011 } /* for(y = 0; y < msg->height; y++) */
1014 /****************************************************************************************/
1016 VOID BM__Hidd_BitMap__PutMemTemplate16(OOP_Class *cl, OOP_Object *o, struct pHidd_BitMap_PutMemTemplate16 *msg)
1018 WORD x, y;
1019 UBYTE *bitarray, *buf;
1020 UWORD bitmask;
1021 OOP_Object *gc = msg->gc;
1022 ULONG fg = GC_FG(gc);
1023 ULONG bg = GC_BG(gc);
1024 WORD type = 0;
1026 if (msg->width <= 0 || msg->height <= 0)
1027 return;
1029 if (GC_COLEXP(gc) == vHidd_GC_ColExp_Transparent)
1031 type = 0;
1033 else if (GC_DRMD(gc) == vHidd_GC_DrawMode_Invert)
1035 type = 2;
1037 else
1039 type = 4;
1042 if (msg->inverttemplate) type++;
1044 bitarray = msg->masktemplate + ((msg->srcx / 16) * 2);
1045 bitmask = 0x8000 >> (msg->srcx & 0xF);
1047 buf = msg->dst + msg->y * msg->dstMod + msg->x * 2;
1049 for(y = 0; y < msg->height; y++)
1051 ULONG mask = bitmask;
1052 UWORD *array = (UWORD *)bitarray;
1053 UWORD bitword = AROS_BE2WORD(*array);
1054 UWORD *xbuf = (UWORD *)buf;
1056 switch(type)
1058 case 0: /* JAM1 */
1059 for(x = 0; x < msg->width; x++, xbuf++)
1061 if (bitword & mask) *xbuf = fg;
1063 mask >>= 1;
1064 if (!mask)
1066 mask = 0x8000;
1067 array++;
1068 bitword = AROS_BE2WORD(*array);
1071 } /* for(x = 0; x < msg->width; x++) */
1072 break;
1074 case 1: /* JAM1 | INVERSVID */
1075 for(x = 0; x < msg->width; x++, xbuf++)
1077 if (!(bitword & mask)) *xbuf = fg;
1079 mask >>= 1;
1080 if (!mask)
1082 mask = 0x8000;
1083 array++;
1084 bitword = AROS_BE2WORD(*array);
1087 } /* for(x = 0; x < msg->width; x++) */
1088 break;
1090 case 2: /* COMPLEMENT */
1091 for(x = 0; x < msg->width; x++, xbuf++)
1093 if (bitword & mask) *xbuf = ~(*xbuf);
1095 mask >>= 1;
1096 if (!mask)
1098 mask = 0x8000;
1099 array++;
1100 bitword = AROS_BE2WORD(*array);
1102 } /* for(x = 0; x < msg->width; x++) */
1103 break;
1105 case 3: /* COMPLEMENT | INVERSVID*/
1106 for(x = 0; x < msg->width; x++, xbuf++)
1108 if (!(bitword & mask)) *xbuf = ~(*xbuf);
1110 mask >>= 1;
1111 if (!mask)
1113 mask = 0x8000;
1114 array++;
1115 bitword = AROS_BE2WORD(*array);
1117 } /* for(x = 0; x < msg->width; x++) */
1118 break;
1120 case 4: /* JAM2 */
1121 for(x = 0; x < msg->width; x++)
1123 *xbuf++ = (bitword & mask) ? fg : bg;
1125 mask >>= 1;
1126 if (!mask)
1128 mask = 0x8000;
1129 array++;
1130 bitword = AROS_BE2WORD(*array);
1133 } /* for(x = 0; x < msg->width; x++) */
1134 break;
1136 case 5: /* JAM2 | INVERSVID */
1137 for(x = 0; x < msg->width; x++)
1139 *xbuf++ = (bitword & mask) ? bg : fg;
1141 mask >>= 1;
1142 if (!mask)
1144 mask = 0x8000;
1145 array++;
1146 bitword = AROS_BE2WORD(*array);
1148 } /* for(x = 0; x < msg->width; x++) */
1149 break;
1151 } /* switch(type) */
1153 buf += msg->dstMod;
1154 bitarray += msg->modulo;
1156 } /* for(y = 0; y < msg->height; y++) */
1160 /****************************************************************************************/
1162 VOID BM__Hidd_BitMap__PutMemTemplate24(OOP_Class *cl, OOP_Object *o, struct pHidd_BitMap_PutMemTemplate24 *msg)
1164 WORD x, y;
1165 UBYTE *bitarray, *buf;
1166 UWORD bitmask;
1167 OOP_Object *gc = msg->gc;
1168 ULONG fg = GC_FG(gc);
1169 UBYTE fg1, fg2, fg3;
1170 ULONG bg = GC_BG(gc);
1171 UBYTE bg1, bg2, bg3;
1172 WORD type = 0;
1174 if (msg->width <= 0 || msg->height <= 0)
1175 return;
1177 #if AROS_BIG_ENDIAN
1178 fg1 = (fg >> 16) & 0xFF;
1179 fg2 = (fg >> 8) & 0xFF;
1180 fg3 = fg & 0xFF;
1182 bg1 = (bg >> 16) & 0xFF;
1183 bg2 = (bg >> 8) & 0xFF;
1184 bg3 = bg & 0xFF;
1185 #else
1186 fg1 = fg & 0xFF;
1187 fg2 = (fg >> 8) & 0xFF;
1188 fg3 = (fg >> 16) & 0xFF;
1190 bg1 = bg & 0xFF;
1191 bg2 = (bg >> 8) & 0xFF;
1192 bg3 = (bg >> 16) & 0xFF;
1193 #endif
1195 if (GC_COLEXP(gc) == vHidd_GC_ColExp_Transparent)
1197 type = 0;
1199 else if (GC_DRMD(gc) == vHidd_GC_DrawMode_Invert)
1201 type = 2;
1203 else
1205 type = 4;
1208 if (msg->inverttemplate) type++;
1210 bitarray = msg->masktemplate + ((msg->srcx / 16) * 2);
1211 bitmask = 0x8000 >> (msg->srcx & 0xF);
1213 buf = msg->dst + msg->y * msg->dstMod + msg->x * 3;
1215 for(y = 0; y < msg->height; y++)
1217 ULONG mask = bitmask;
1218 UWORD *array = (UWORD *)bitarray;
1219 UWORD bitword = AROS_BE2WORD(*array);
1220 UBYTE *xbuf = buf;
1222 switch(type)
1224 case 0: /* JAM1 */
1225 for(x = 0; x < msg->width; x++, xbuf += 3)
1227 if (bitword & mask)
1229 xbuf[0] = fg1;
1230 xbuf[1] = fg2;
1231 xbuf[2] = fg3;
1234 mask >>= 1;
1235 if (!mask)
1237 mask = 0x8000;
1238 array++;
1239 bitword = AROS_BE2WORD(*array);
1242 } /* for(x = 0; x < msg->width; x++) */
1243 break;
1245 case 1: /* JAM1 | INVERSVID */
1246 for(x = 0; x < msg->width; x++, xbuf += 3)
1248 if (!(bitword & mask))
1250 xbuf[0] = fg1;
1251 xbuf[1] = fg2;
1252 xbuf[2] = fg3;
1255 mask >>= 1;
1256 if (!mask)
1258 mask = 0x8000;
1259 array++;
1260 bitword = AROS_BE2WORD(*array);
1263 } /* for(x = 0; x < msg->width; x++) */
1264 break;
1266 case 2: /* COMPLEMENT */
1267 for(x = 0; x < msg->width; x++, xbuf += 3)
1269 if (bitword & mask)
1271 xbuf[0] = ~xbuf[0];
1272 xbuf[1] = ~xbuf[1];
1273 xbuf[2] = ~xbuf[2];
1276 mask >>= 1;
1277 if (!mask)
1279 mask = 0x8000;
1280 array++;
1281 bitword = AROS_BE2WORD(*array);
1283 } /* for(x = 0; x < msg->width; x++) */
1284 break;
1286 case 3: /* COMPLEMENT | INVERSVID*/
1287 for(x = 0; x < msg->width; x++, xbuf += 3)
1289 if (!(bitword & mask))
1291 xbuf[0] = ~xbuf[0];
1292 xbuf[1] = ~xbuf[1];
1293 xbuf[2] = ~xbuf[2];
1296 mask >>= 1;
1297 if (!mask)
1299 mask = 0x8000;
1300 array++;
1301 bitword = AROS_BE2WORD(*array);
1303 } /* for(x = 0; x < msg->width; x++) */
1304 break;
1306 case 4: /* JAM2 */
1307 for(x = 0; x < msg->width; x++)
1309 if (bitword & mask)
1311 *xbuf++ = fg1;
1312 *xbuf++ = fg2;
1313 *xbuf++ = fg3;
1315 else
1317 *xbuf++ = bg1;
1318 *xbuf++ = bg2;
1319 *xbuf++ = bg3;
1322 mask >>= 1;
1323 if (!mask)
1325 mask = 0x8000;
1326 array++;
1327 bitword = AROS_BE2WORD(*array);
1330 } /* for(x = 0; x < msg->width; x++) */
1331 break;
1333 case 5: /* JAM2 | INVERSVID */
1334 for(x = 0; x < msg->width; x++)
1336 if (bitword & mask)
1338 *xbuf++ = bg1;
1339 *xbuf++ = bg2;
1340 *xbuf++ = bg3;
1342 else
1344 *xbuf++ = fg1;
1345 *xbuf++ = fg2;
1346 *xbuf++ = fg3;
1349 mask >>= 1;
1350 if (!mask)
1352 mask = 0x8000;
1353 array++;
1354 bitword = AROS_BE2WORD(*array);
1356 } /* for(x = 0; x < msg->width; x++) */
1357 break;
1359 } /* switch(type) */
1361 buf += msg->dstMod;
1362 bitarray += msg->modulo;
1364 } /* for(y = 0; y < msg->height; y++) */
1368 /****************************************************************************************/
1370 VOID BM__Hidd_BitMap__PutMemTemplate32(OOP_Class *cl, OOP_Object *o, struct pHidd_BitMap_PutMemTemplate32 *msg)
1372 WORD x, y;
1373 UBYTE *bitarray, *buf;
1374 UWORD bitmask;
1375 OOP_Object *gc = msg->gc;
1376 ULONG fg = GC_FG(gc);
1377 ULONG bg = GC_BG(gc);
1378 WORD type = 0;
1380 if (msg->width <= 0 || msg->height <= 0)
1381 return;
1383 if (GC_COLEXP(gc) == vHidd_GC_ColExp_Transparent)
1385 type = 0;
1387 else if (GC_DRMD(gc) == vHidd_GC_DrawMode_Invert)
1389 type = 2;
1391 else
1393 type = 4;
1396 if (msg->inverttemplate) type++;
1398 bitarray = msg->masktemplate + ((msg->srcx / 16) * 2);
1399 bitmask = 0x8000 >> (msg->srcx & 0xF);
1401 buf = msg->dst + msg->y * msg->dstMod + msg->x * 4;
1403 for(y = 0; y < msg->height; y++)
1405 ULONG mask = bitmask;
1406 UWORD *array = (UWORD *)bitarray;
1407 UWORD bitword = AROS_BE2WORD(*array);
1408 ULONG *xbuf = (ULONG *)buf;
1410 switch(type)
1412 case 0: /* JAM1 */
1413 for(x = 0; x < msg->width; x++, xbuf++)
1415 if (bitword & mask) *xbuf = fg;
1417 mask >>= 1;
1418 if (!mask)
1420 mask = 0x8000;
1421 array++;
1422 bitword = AROS_BE2WORD(*array);
1425 } /* for(x = 0; x < msg->width; x++) */
1426 break;
1428 case 1: /* JAM1 | INVERSVID */
1429 for(x = 0; x < msg->width; x++, xbuf++)
1431 if (!(bitword & mask)) *xbuf = fg;
1433 mask >>= 1;
1434 if (!mask)
1436 mask = 0x8000;
1437 array++;
1438 bitword = AROS_BE2WORD(*array);
1441 } /* for(x = 0; x < msg->width; x++) */
1442 break;
1444 case 2: /* COMPLEMENT */
1445 for(x = 0; x < msg->width; x++, xbuf++)
1447 if (bitword & mask) *xbuf = ~(*xbuf);
1449 mask >>= 1;
1450 if (!mask)
1452 mask = 0x8000;
1453 array++;
1454 bitword = AROS_BE2WORD(*array);
1456 } /* for(x = 0; x < msg->width; x++) */
1457 break;
1459 case 3: /* COMPLEMENT | INVERSVID*/
1460 for(x = 0; x < msg->width; x++, xbuf++)
1462 if (!(bitword & mask)) *xbuf = ~(*xbuf);
1464 mask >>= 1;
1465 if (!mask)
1467 mask = 0x8000;
1468 array++;
1469 bitword = AROS_BE2WORD(*array);
1471 } /* for(x = 0; x < msg->width; x++) */
1472 break;
1474 case 4: /* JAM2 */
1475 for(x = 0; x < msg->width; x++)
1477 *xbuf++ = (bitword & mask) ? fg : bg;
1479 mask >>= 1;
1480 if (!mask)
1482 mask = 0x8000;
1483 array++;
1484 bitword = AROS_BE2WORD(*array);
1487 } /* for(x = 0; x < msg->width; x++) */
1488 break;
1490 case 5: /* JAM2 | INVERSVID */
1491 for(x = 0; x < msg->width; x++)
1493 *xbuf++ = (bitword & mask) ? bg : fg;
1495 mask >>= 1;
1496 if (!mask)
1498 mask = 0x8000;
1499 array++;
1500 bitword = AROS_BE2WORD(*array);
1502 } /* for(x = 0; x < msg->width; x++) */
1503 break;
1505 } /* switch(type) */
1507 buf += msg->dstMod;
1508 bitarray += msg->modulo;
1510 } /* for(y = 0; y < msg->height; y++) */
1514 /****************************************************************************************/
1516 VOID BM__Hidd_BitMap__PutMemPattern8(OOP_Class *cl, OOP_Object *o, struct pHidd_BitMap_PutMemPattern8 *msg)
1518 WORD x, y;
1519 UBYTE *patarray, *buf, *maskarray = 0;
1520 UWORD patmask, maskmask = 0;
1521 OOP_Object *gc = msg->gc;
1522 ULONG fg = GC_FG(gc);
1523 ULONG bg = GC_BG(gc);
1524 WORD type = 0;
1526 if (msg->width <= 0 || msg->height <= 0)
1527 return;
1529 if (msg->patterndepth > 1)
1531 type = 6;
1533 else
1535 if (GC_COLEXP(gc) == vHidd_GC_ColExp_Transparent)
1537 type = 0;
1539 else if (GC_DRMD(gc) == vHidd_GC_DrawMode_Invert)
1541 type = 2;
1543 else
1545 type = 4;
1548 if (msg->invertpattern) type++;
1551 patarray = msg->pattern;
1552 patmask = 0x8000 >> (msg->patternsrcx & 0xF);
1554 if ((maskarray = msg->mask))
1556 maskarray += (msg->masksrcx / 16) * 2;
1557 maskmask = 0x8000 >> (msg->masksrcx & 0xF);
1560 buf = msg->dst + msg->y * msg->dstMod + msg->x;
1562 for(y = 0; y < msg->height; y++)
1564 UWORD pmask = patmask;
1565 UWORD mmask = maskmask;
1566 UWORD *parray = ((UWORD *)patarray) + ((y + msg->patternsrcy) % msg->patternheight);
1567 UWORD patword = AROS_BE2WORD(*parray);
1568 UWORD *marray = NULL;
1569 UWORD maskword = 0;
1570 UBYTE *xbuf = (UBYTE *)buf;
1572 if (maskarray)
1574 marray = (UWORD *)maskarray;
1575 maskword = AROS_BE2WORD(*marray);
1578 switch(type)
1580 case 0: /* JAM1 */
1581 for(x = 0; x < msg->width; x++, xbuf++)
1583 if (!maskarray || (maskword & mmask))
1585 if (patword & pmask) *xbuf = fg;
1588 if (maskarray)
1590 mmask >>= 1;
1591 if (!mmask)
1593 mmask = 0x8000;
1594 marray++;
1595 maskword = AROS_BE2WORD(*marray);
1599 pmask >>= 1;
1600 if (!pmask) pmask = 0x8000;
1602 } /* for(x = 0; x < msg->width; x++) */
1603 break;
1605 case 1: /* JAM1 | INVERSVID */
1606 for(x = 0; x < msg->width; x++, xbuf++)
1608 if (!maskarray || (maskword & mmask))
1610 if (!(patword & pmask)) *xbuf = fg;
1613 if (maskarray)
1615 mmask >>= 1;
1616 if (!mmask)
1618 mmask = 0x8000;
1619 marray++;
1620 maskword = AROS_BE2WORD(*marray);
1624 pmask >>= 1;
1625 if (!pmask) pmask = 0x8000;
1626 } /* for(x = 0; x < msg->width; x++) */
1627 break;
1629 case 2: /* COMPLEMENT */
1630 for(x = 0; x < msg->width; x++, xbuf++)
1632 if (!maskarray || (maskword & mmask))
1634 if (patword & pmask) *xbuf = ~(*xbuf);
1637 if (maskarray)
1639 mmask >>= 1;
1640 if (!mmask)
1642 mmask = 0x8000;
1643 marray++;
1644 maskword = AROS_BE2WORD(*marray);
1648 pmask >>= 1;
1649 if (!pmask) pmask = 0x8000;
1651 } /* for(x = 0; x < msg->width; x++) */
1652 break;
1654 case 3: /* COMPLEMENT | INVERSVID*/
1655 for(x = 0; x < msg->width; x++, xbuf++)
1657 if (!maskarray || (maskword & mmask))
1659 if (!(patword & pmask)) *xbuf = ~(*xbuf);
1662 if (maskarray)
1664 mmask >>= 1;
1665 if (!mmask)
1667 mmask = 0x8000;
1668 marray++;
1669 maskword = AROS_BE2WORD(*marray);
1673 pmask >>= 1;
1674 if (!pmask) pmask = 0x8000;
1676 } /* for(x = 0; x < msg->width; x++) */
1677 break;
1679 case 4: /* JAM2 */
1680 for(x = 0; x < msg->width; x++)
1682 if (!maskarray || (maskword & mmask))
1684 xbuf[x] = (patword & pmask) ? fg : bg;
1687 if (maskarray)
1689 mmask >>= 1;
1690 if (!mmask)
1692 mmask = 0x8000;
1693 marray++;
1694 maskword = AROS_BE2WORD(*marray);
1698 pmask >>= 1;
1699 if (!pmask) pmask = 0x8000;
1701 } /* for(x = 0; x < msg->width; x++) */
1702 break;
1704 case 5: /* JAM2 | INVERSVID */
1705 for(x = 0; x < msg->width; x++)
1707 if (!maskarray || (maskword & mmask))
1709 xbuf[x] = (patword & pmask) ? bg : fg;
1712 if (maskarray)
1714 mmask >>= 1;
1715 if (!mmask)
1717 mmask = 0x8000;
1718 marray++;
1719 maskword = AROS_BE2WORD(*marray);
1723 pmask >>= 1;
1724 if (!pmask) pmask = 0x8000;
1726 } /* for(x = 0; x < msg->width; x++) */
1727 break;
1729 case 6: /* multi color pattern */
1730 for(x = 0; x < msg->width; x++)
1732 if (!maskarray || (maskword & mmask))
1734 WORD plane;
1735 ULONG pixel = (patword & pmask) ? 1 : 0;
1737 for(plane = 1; plane < msg->patterndepth; plane++)
1739 UWORD *_parray = parray + plane * msg->patternheight;
1740 UWORD _patword = AROS_BE2WORD(*_parray);
1742 if (_patword & pmask) pixel |= 1L << plane;
1745 if (msg->patternlut) pixel = msg->patternlut->pixels[pixel];
1747 xbuf[x] = pixel;
1750 if (maskarray)
1752 mmask >>= 1;
1753 if (!mmask)
1755 mmask = 0x8000;
1756 marray++;
1757 maskword = AROS_BE2WORD(*marray);
1761 pmask >>= 1;
1762 if (!pmask) pmask = 0x8000;
1764 } /* for(x = 0; x < msg->width; x++) */
1765 break;
1767 } /* switch(type) */
1769 buf += msg->dstMod;
1770 if (maskarray) maskarray += msg->maskmodulo;
1772 } /* for(y = 0; y < msg->height; y++) */
1776 /****************************************************************************************/
1778 VOID BM__Hidd_BitMap__PutMemPattern16(OOP_Class *cl, OOP_Object *o, struct pHidd_BitMap_PutMemPattern16 *msg)
1780 WORD x, y;
1781 UBYTE *patarray, *buf, *maskarray = 0;
1782 UWORD patmask, maskmask = 0;
1783 OOP_Object *gc = msg->gc;
1784 ULONG fg = GC_FG(gc);
1785 ULONG bg = GC_BG(gc);
1786 WORD type = 0;
1788 if (msg->width <= 0 || msg->height <= 0)
1789 return;
1791 if (msg->patterndepth > 1)
1793 type = 6;
1795 else
1797 if (GC_COLEXP(gc) == vHidd_GC_ColExp_Transparent)
1799 type = 0;
1801 else if (GC_DRMD(gc) == vHidd_GC_DrawMode_Invert)
1803 type = 2;
1805 else
1807 type = 4;
1810 if (msg->invertpattern) type++;
1813 patarray = msg->pattern;
1814 patmask = 0x8000 >> (msg->patternsrcx & 0xF);
1816 if ((maskarray = msg->mask))
1818 maskarray += (msg->masksrcx / 16) * 2;
1819 maskmask = 0x8000 >> (msg->masksrcx & 0xF);
1822 buf = msg->dst + msg->y * msg->dstMod + msg->x * 2;
1824 for(y = 0; y < msg->height; y++)
1826 UWORD pmask = patmask;
1827 UWORD mmask = maskmask;
1828 UWORD *parray = ((UWORD *)patarray) + ((y + msg->patternsrcy) % msg->patternheight);
1829 UWORD patword = AROS_BE2WORD(*parray);
1830 UWORD *marray = NULL;
1831 UWORD maskword = 0;
1832 UWORD *xbuf = (UWORD *)buf;
1834 if (maskarray)
1836 marray = (UWORD *)maskarray;
1837 maskword = AROS_BE2WORD(*marray);
1840 switch(type)
1842 case 0: /* JAM1 */
1843 for(x = 0; x < msg->width; x++, xbuf++)
1845 if (!maskarray || (maskword & mmask))
1847 if (patword & pmask) *xbuf = fg;
1850 if (maskarray)
1852 mmask >>= 1;
1853 if (!mmask)
1855 mmask = 0x8000;
1856 marray++;
1857 maskword = AROS_BE2WORD(*marray);
1861 pmask >>= 1;
1862 if (!pmask) pmask = 0x8000;
1864 } /* for(x = 0; x < msg->width; x++) */
1865 break;
1867 case 1: /* JAM1 | INVERSVID */
1868 for(x = 0; x < msg->width; x++, xbuf++)
1870 if (!maskarray || (maskword & mmask))
1872 if (!(patword & pmask)) *xbuf = fg;
1875 if (maskarray)
1877 mmask >>= 1;
1878 if (!mmask)
1880 mmask = 0x8000;
1881 marray++;
1882 maskword = AROS_BE2WORD(*marray);
1886 pmask >>= 1;
1887 if (!pmask) pmask = 0x8000;
1888 } /* for(x = 0; x < msg->width; x++) */
1889 break;
1891 case 2: /* COMPLEMENT */
1892 for(x = 0; x < msg->width; x++, xbuf++)
1894 if (!maskarray || (maskword & mmask))
1896 if (patword & pmask) *xbuf = ~(*xbuf);
1899 if (maskarray)
1901 mmask >>= 1;
1902 if (!mmask)
1904 mmask = 0x8000;
1905 marray++;
1906 maskword = AROS_BE2WORD(*marray);
1910 pmask >>= 1;
1911 if (!pmask) pmask = 0x8000;
1913 } /* for(x = 0; x < msg->width; x++) */
1914 break;
1916 case 3: /* COMPLEMENT | INVERSVID*/
1917 for(x = 0; x < msg->width; x++, xbuf++)
1919 if (!maskarray || (maskword & mmask))
1921 if (!(patword & pmask)) *xbuf = ~(*xbuf);
1924 if (maskarray)
1926 mmask >>= 1;
1927 if (!mmask)
1929 mmask = 0x8000;
1930 marray++;
1931 maskword = AROS_BE2WORD(*marray);
1935 pmask >>= 1;
1936 if (!pmask) pmask = 0x8000;
1938 } /* for(x = 0; x < msg->width; x++) */
1939 break;
1941 case 4: /* JAM2 */
1942 for(x = 0; x < msg->width; x++)
1944 if (!maskarray || (maskword & mmask))
1946 xbuf[x] = (patword & pmask) ? fg : bg;
1949 if (maskarray)
1951 mmask >>= 1;
1952 if (!mmask)
1954 mmask = 0x8000;
1955 marray++;
1956 maskword = AROS_BE2WORD(*marray);
1960 pmask >>= 1;
1961 if (!pmask) pmask = 0x8000;
1963 } /* for(x = 0; x < msg->width; x++) */
1964 break;
1966 case 5: /* JAM2 | INVERSVID */
1967 for(x = 0; x < msg->width; x++)
1969 if (!maskarray || (maskword & mmask))
1971 xbuf[x] = (patword & pmask) ? bg : fg;
1974 if (maskarray)
1976 mmask >>= 1;
1977 if (!mmask)
1979 mmask = 0x8000;
1980 marray++;
1981 maskword = AROS_BE2WORD(*marray);
1985 pmask >>= 1;
1986 if (!pmask) pmask = 0x8000;
1988 } /* for(x = 0; x < msg->width; x++) */
1989 break;
1991 case 6: /* multi color pattern */
1992 for(x = 0; x < msg->width; x++)
1994 if (!maskarray || (maskword & mmask))
1996 WORD plane;
1997 ULONG pixel = (patword & pmask) ? 1 : 0;
1999 for(plane = 1; plane < msg->patterndepth; plane++)
2001 UWORD *_parray = parray + plane * msg->patternheight;
2002 UWORD _patword = AROS_BE2WORD(*_parray);
2004 if (_patword & pmask) pixel |= 1L << plane;
2007 if (msg->patternlut) pixel = msg->patternlut->pixels[pixel];
2009 xbuf[x] = pixel;
2012 if (maskarray)
2014 mmask >>= 1;
2015 if (!mmask)
2017 mmask = 0x8000;
2018 marray++;
2019 maskword = AROS_BE2WORD(*marray);
2023 pmask >>= 1;
2024 if (!pmask) pmask = 0x8000;
2026 } /* for(x = 0; x < msg->width; x++) */
2027 break;
2029 } /* switch(type) */
2031 buf += msg->dstMod;
2032 if (maskarray) maskarray += msg->maskmodulo;
2034 } /* for(y = 0; y < msg->height; y++) */
2037 /****************************************************************************************/
2039 VOID BM__Hidd_BitMap__PutMemPattern24(OOP_Class *cl, OOP_Object *o, struct pHidd_BitMap_PutMemPattern24 *msg)
2041 WORD x, y;
2042 UBYTE *patarray, *buf, *maskarray = 0;
2043 UWORD patmask, maskmask = 0;
2044 OOP_Object *gc = msg->gc;
2045 ULONG fg = GC_FG(gc);
2046 UBYTE fg1, fg2, fg3;
2047 ULONG bg = GC_BG(gc);
2048 UBYTE bg1, bg2, bg3;
2049 WORD type = 0;
2051 if (msg->width <= 0 || msg->height <= 0)
2052 return;
2054 #if AROS_BIG_ENDIAN
2055 fg1 = (fg >> 16) & 0xFF;
2056 fg2 = (fg >> 8) & 0xFF;
2057 fg3 = fg & 0xFF;
2059 bg1 = (bg >> 16) & 0xFF;
2060 bg2 = (bg >> 8) & 0xFF;
2061 bg3 = bg & 0xFF;
2062 #else
2063 fg1 = fg & 0xFF;
2064 fg2 = (fg >> 8) & 0xFF;
2065 fg3 = (fg >> 16) & 0xFF;
2067 bg1 = bg & 0xFF;
2068 bg2 = (bg >> 8) & 0xFF;
2069 bg3 = (bg >> 16) & 0xFF;
2070 #endif
2072 if (msg->patterndepth > 1)
2074 type = 6;
2076 else
2078 if (GC_COLEXP(gc) == vHidd_GC_ColExp_Transparent)
2080 type = 0;
2082 else if (GC_DRMD(gc) == vHidd_GC_DrawMode_Invert)
2084 type = 2;
2086 else
2088 type = 4;
2091 if (msg->invertpattern) type++;
2094 patarray = msg->pattern;
2095 patmask = 0x8000 >> (msg->patternsrcx & 0xF);
2097 if ((maskarray = msg->mask))
2099 maskarray += (msg->masksrcx / 16) * 2;
2100 maskmask = 0x8000 >> (msg->masksrcx & 0xF);
2103 buf = msg->dst + msg->y * msg->dstMod + msg->x * 3;
2105 for(y = 0; y < msg->height; y++)
2107 UWORD pmask = patmask;
2108 UWORD mmask = maskmask;
2109 UWORD *parray = ((UWORD *)patarray) + ((y + msg->patternsrcy) % msg->patternheight);
2110 UWORD patword = AROS_BE2WORD(*parray);
2111 UWORD *marray = NULL;
2112 UWORD maskword = 0;
2113 UBYTE *xbuf = (UBYTE *)buf;
2115 if (maskarray)
2117 marray = (UWORD *)maskarray;
2118 maskword = AROS_BE2WORD(*marray);
2121 switch(type)
2123 case 0: /* JAM1 */
2124 for(x = 0; x < msg->width; x++, xbuf += 3)
2126 if (!maskarray || (maskword & mmask))
2128 if (patword & pmask)
2130 xbuf[0] = fg1;
2131 xbuf[1] = fg2;
2132 xbuf[2] = fg3;
2136 if (maskarray)
2138 mmask >>= 1;
2139 if (!mmask)
2141 mmask = 0x8000;
2142 marray++;
2143 maskword = AROS_BE2WORD(*marray);
2147 pmask >>= 1;
2148 if (!pmask) pmask = 0x8000;
2150 } /* for(x = 0; x < msg->width; x++) */
2151 break;
2153 case 1: /* JAM1 | INVERSVID */
2154 for(x = 0; x < msg->width; x++, xbuf += 3)
2156 if (!maskarray || (maskword & mmask))
2158 if (!(patword & pmask))
2160 xbuf[0] = fg1;
2161 xbuf[1] = fg2;
2162 xbuf[2] = fg3;
2167 if (maskarray)
2169 mmask >>= 1;
2170 if (!mmask)
2172 mmask = 0x8000;
2173 marray++;
2174 maskword = AROS_BE2WORD(*marray);
2178 pmask >>= 1;
2179 if (!pmask) pmask = 0x8000;
2180 } /* for(x = 0; x < msg->width; x++) */
2181 break;
2183 case 2: /* COMPLEMENT */
2184 for(x = 0; x < msg->width; x++, xbuf += 3)
2186 if (!maskarray || (maskword & mmask))
2188 if (patword & pmask)
2190 xbuf[0] = ~xbuf[0];
2191 xbuf[1] = ~xbuf[1];
2192 xbuf[2] = ~xbuf[2];
2196 if (maskarray)
2198 mmask >>= 1;
2199 if (!mmask)
2201 mmask = 0x8000;
2202 marray++;
2203 maskword = AROS_BE2WORD(*marray);
2207 pmask >>= 1;
2208 if (!pmask) pmask = 0x8000;
2210 } /* for(x = 0; x < msg->width; x++) */
2211 break;
2213 case 3: /* COMPLEMENT | INVERSVID*/
2214 for(x = 0; x < msg->width; x++, xbuf += 3)
2216 if (!maskarray || (maskword & mmask))
2218 if (!(patword & pmask))
2220 xbuf[0] = ~xbuf[0];
2221 xbuf[1] = ~xbuf[1];
2222 xbuf[2] = ~xbuf[2];
2226 if (maskarray)
2228 mmask >>= 1;
2229 if (!mmask)
2231 mmask = 0x8000;
2232 marray++;
2233 maskword = AROS_BE2WORD(*marray);
2237 pmask >>= 1;
2238 if (!pmask) pmask = 0x8000;
2240 } /* for(x = 0; x < msg->width; x++) */
2241 break;
2243 case 4: /* JAM2 */
2244 for(x = 0; x < msg->width; x++, xbuf += 3)
2246 if (!maskarray || (maskword & mmask))
2248 if (patword & pmask)
2250 xbuf[0] = fg1;
2251 xbuf[1] = fg2;
2252 xbuf[2] = fg3;
2254 else
2256 xbuf[0] = bg1;
2257 xbuf[1] = bg2;
2258 xbuf[2] = bg3;
2263 if (maskarray)
2265 mmask >>= 1;
2266 if (!mmask)
2268 mmask = 0x8000;
2269 marray++;
2270 maskword = AROS_BE2WORD(*marray);
2274 pmask >>= 1;
2275 if (!pmask) pmask = 0x8000;
2277 } /* for(x = 0; x < msg->width; x++) */
2278 break;
2280 case 5: /* JAM2 | INVERSVID */
2281 for(x = 0; x < msg->width; x++, xbuf += 3)
2283 if (!maskarray || (maskword & mmask))
2285 if (patword & pmask)
2287 xbuf[0] = bg1;
2288 xbuf[1] = bg2;
2289 xbuf[2] = bg3;
2291 else
2293 xbuf[0] = fg1;
2294 xbuf[1] = fg2;
2295 xbuf[2] = fg3;
2300 if (maskarray)
2302 mmask >>= 1;
2303 if (!mmask)
2305 mmask = 0x8000;
2306 marray++;
2307 maskword = AROS_BE2WORD(*marray);
2311 pmask >>= 1;
2312 if (!pmask) pmask = 0x8000;
2314 } /* for(x = 0; x < msg->width; x++) */
2315 break;
2317 case 6: /* multi color pattern */
2318 for(x = 0; x < msg->width; x++, xbuf += 3)
2320 if (!maskarray || (maskword & mmask))
2322 WORD plane;
2323 ULONG pixel = (patword & pmask) ? 1 : 0;
2325 for(plane = 1; plane < msg->patterndepth; plane++)
2327 UWORD *_parray = parray + plane * msg->patternheight;
2328 UWORD _patword = AROS_BE2WORD(*_parray);
2330 if (_patword & pmask) pixel |= 1L << plane;
2333 if (msg->patternlut) pixel = msg->patternlut->pixels[pixel];
2335 #if AROS_BIG_ENDIAN
2336 xbuf[0] = (pixel >> 16) & 0xFF;
2337 xbuf[1] = (pixel >> 8) & 0xFF;
2338 xbuf[2] = (pixel) & 0xFF;
2339 #else
2340 xbuf[0] = (pixel) & 0xFF;
2341 xbuf[1] = (pixel >> 8) & 0xFF;
2342 xbuf[2] = (pixel >> 16) & 0xFF;
2343 #endif
2346 if (maskarray)
2348 mmask >>= 1;
2349 if (!mmask)
2351 mmask = 0x8000;
2352 marray++;
2353 maskword = AROS_BE2WORD(*marray);
2357 pmask >>= 1;
2358 if (!pmask) pmask = 0x8000;
2360 } /* for(x = 0; x < msg->width; x++) */
2361 break;
2363 } /* switch(type) */
2365 buf += msg->dstMod;
2366 if (maskarray) maskarray += msg->maskmodulo;
2368 } /* for(y = 0; y < msg->height; y++) */
2372 /****************************************************************************************/
2374 VOID BM__Hidd_BitMap__PutMemPattern32(OOP_Class *cl, OOP_Object *o, struct pHidd_BitMap_PutMemPattern32 *msg)
2376 WORD x, y;
2377 UBYTE *patarray, *buf, *maskarray = 0;
2378 UWORD patmask, maskmask = 0;
2379 OOP_Object *gc = msg->gc;
2380 ULONG fg = GC_FG(gc);
2381 ULONG bg = GC_BG(gc);
2382 WORD type = 0;
2384 if (msg->width <= 0 || msg->height <= 0)
2385 return;
2387 if (msg->patterndepth > 1)
2389 type = 6;
2391 else
2393 if (GC_COLEXP(gc) == vHidd_GC_ColExp_Transparent)
2395 type = 0;
2397 else if (GC_DRMD(gc) == vHidd_GC_DrawMode_Invert)
2399 type = 2;
2401 else
2403 type = 4;
2406 if (msg->invertpattern) type++;
2409 patarray = msg->pattern;
2410 patmask = 0x8000 >> (msg->patternsrcx & 0xF);
2412 if ((maskarray = msg->mask))
2414 maskarray += (msg->masksrcx / 16) * 2;
2415 maskmask = 0x8000 >> (msg->masksrcx & 0xF);
2418 buf = msg->dst + msg->y * msg->dstMod + msg->x * 4;
2420 for(y = 0; y < msg->height; y++)
2422 UWORD pmask = patmask;
2423 UWORD mmask = maskmask;
2424 UWORD *parray = ((UWORD *)patarray) + ((y + msg->patternsrcy) % msg->patternheight);
2425 UWORD patword = AROS_BE2WORD(*parray);
2426 UWORD *marray = NULL;
2427 UWORD maskword = 0;
2428 ULONG *xbuf = (ULONG *)buf;
2430 if (maskarray)
2432 marray = (UWORD *)maskarray;
2433 maskword = AROS_BE2WORD(*marray);
2436 switch(type)
2438 case 0: /* JAM1 */
2439 for(x = 0; x < msg->width; x++, xbuf++)
2441 if (!maskarray || (maskword & mmask))
2443 if (patword & pmask) *xbuf = fg;
2446 if (maskarray)
2448 mmask >>= 1;
2449 if (!mmask)
2451 mmask = 0x8000;
2452 marray++;
2453 maskword = AROS_BE2WORD(*marray);
2457 pmask >>= 1;
2458 if (!pmask) pmask = 0x8000;
2460 } /* for(x = 0; x < msg->width; x++) */
2461 break;
2463 case 1: /* JAM1 | INVERSVID */
2464 for(x = 0; x < msg->width; x++, xbuf++)
2466 if (!maskarray || (maskword & mmask))
2468 if (!(patword & pmask)) *xbuf = fg;
2471 if (maskarray)
2473 mmask >>= 1;
2474 if (!mmask)
2476 mmask = 0x8000;
2477 marray++;
2478 maskword = AROS_BE2WORD(*marray);
2482 pmask >>= 1;
2483 if (!pmask) pmask = 0x8000;
2484 } /* for(x = 0; x < msg->width; x++) */
2485 break;
2487 case 2: /* COMPLEMENT */
2488 for(x = 0; x < msg->width; x++, xbuf++)
2490 if (!maskarray || (maskword & mmask))
2492 if (patword & pmask) *xbuf = ~(*xbuf);
2495 if (maskarray)
2497 mmask >>= 1;
2498 if (!mmask)
2500 mmask = 0x8000;
2501 marray++;
2502 maskword = AROS_BE2WORD(*marray);
2506 pmask >>= 1;
2507 if (!pmask) pmask = 0x8000;
2509 } /* for(x = 0; x < msg->width; x++) */
2510 break;
2512 case 3: /* COMPLEMENT | INVERSVID*/
2513 for(x = 0; x < msg->width; x++, xbuf++)
2515 if (!maskarray || (maskword & mmask))
2517 if (!(patword & pmask)) *xbuf = ~(*xbuf);
2520 if (maskarray)
2522 mmask >>= 1;
2523 if (!mmask)
2525 mmask = 0x8000;
2526 marray++;
2527 maskword = AROS_BE2WORD(*marray);
2531 pmask >>= 1;
2532 if (!pmask) pmask = 0x8000;
2534 } /* for(x = 0; x < msg->width; x++) */
2535 break;
2537 case 4: /* JAM2 */
2538 for(x = 0; x < msg->width; x++)
2540 if (!maskarray || (maskword & mmask))
2542 xbuf[x] = (patword & pmask) ? fg : bg;
2545 if (maskarray)
2547 mmask >>= 1;
2548 if (!mmask)
2550 mmask = 0x8000;
2551 marray++;
2552 maskword = AROS_BE2WORD(*marray);
2556 pmask >>= 1;
2557 if (!pmask) pmask = 0x8000;
2559 } /* for(x = 0; x < msg->width; x++) */
2560 break;
2562 case 5: /* JAM2 | INVERSVID */
2563 for(x = 0; x < msg->width; x++)
2565 if (!maskarray || (maskword & mmask))
2567 xbuf[x] = (patword & pmask) ? bg : fg;
2570 if (maskarray)
2572 mmask >>= 1;
2573 if (!mmask)
2575 mmask = 0x8000;
2576 marray++;
2577 maskword = AROS_BE2WORD(*marray);
2581 pmask >>= 1;
2582 if (!pmask) pmask = 0x8000;
2584 } /* for(x = 0; x < msg->width; x++) */
2585 break;
2587 case 6: /* multi color pattern */
2588 for(x = 0; x < msg->width; x++)
2590 if (!maskarray || (maskword & mmask))
2592 WORD plane;
2593 ULONG pixel = (patword & pmask) ? 1 : 0;
2595 for(plane = 1; plane < msg->patterndepth; plane++)
2597 UWORD *_parray = parray + plane * msg->patternheight;
2598 UWORD _patword = AROS_BE2WORD(*_parray);
2600 if (_patword & pmask) pixel |= 1L << plane;
2603 if (msg->patternlut) pixel = msg->patternlut->pixels[pixel];
2605 xbuf[x] = pixel;
2608 if (maskarray)
2610 mmask >>= 1;
2611 if (!mmask)
2613 mmask = 0x8000;
2614 marray++;
2615 maskword = AROS_BE2WORD(*marray);
2619 pmask >>= 1;
2620 if (!pmask) pmask = 0x8000;
2622 } /* for(x = 0; x < msg->width; x++) */
2623 break;
2625 } /* switch(type) */
2627 buf += msg->dstMod;
2628 if (maskarray) maskarray += msg->maskmodulo;
2630 } /* for(y = 0; y < msg->height; y++) */
2634 /****************************************************************************************/