2 Copyright © 1995-2011, The AROS Development Team. All rights reserved.
8 #include <aros/debug.h>
10 #include "graphics_intern.h"
11 #include "gfxfuncsupport.h"
13 struct bitmap_render_data
15 struct render_special_info rsi
;
18 OOP_Object
*srcbm_obj
;
22 static ULONG
bitmap_render(APTR bitmap_rd
, LONG srcx
, LONG srcy
,
23 OOP_Object
*dstbm_obj
, OOP_Object
*dst_gc
,
24 LONG x1
, LONG y1
, LONG x2
, LONG y2
, struct GfxBase
*GfxBase
);
26 /*****************************************************************************
29 #include <proto/graphics.h>
31 AROS_LH9 (void, BltBitMapRastPort
,
34 AROS_LHA(struct BitMap
*, srcBitMap
, A0
),
35 AROS_LHA(LONG
, xSrc
, D0
),
36 AROS_LHA(LONG
, ySrc
, D1
),
37 AROS_LHA(struct RastPort
*, destRP
, A1
),
38 AROS_LHA(LONG
, xDest
, D2
),
39 AROS_LHA(LONG
, yDest
, D3
),
40 AROS_LHA(LONG
, xSize
, D4
),
41 AROS_LHA(LONG
, ySize
, D5
),
42 AROS_LHA(ULONG
, minterm
, D6
),
45 struct GfxBase
*, GfxBase
, 101, Graphics
)
48 Moves part of a bitmap around or into another bitmap.
51 srcBitMap - Copy from this bitmap.
52 xSrc, ySrc - This is the upper left corner of the area to copy.
53 destRP - Destination RastPort.
54 xDest, yDest - Upper left corner where to place the copy
55 xSize, ySize - The size of the area to copy
56 minterm - How to copy. See BltBitMap() for an explanation.
62 If special hardware is available, this function will use it.
79 *****************************************************************************/
83 struct bitmap_render_data brd
;
85 HIDDT_DrawMode old_drmd
;
89 struct TagItem gc_tags
[] =
91 { aHidd_GC_DrawMode
, 0UL },
95 EnterFunc(bug("BltBitMapRastPort(%d %d %d, %d, %d, %d)\n"
96 , xSrc
, ySrc
, xDest
, yDest
, xSize
, ySize
));
98 if (!OBTAIN_DRIVERDATA(destRP
, GfxBase
))
106 brd
.minterm
= minterm
;
107 brd
.srcbm_obj
= OBTAIN_HIDD_BM(srcBitMap
);
108 if (NULL
== brd
.srcbm_obj
)
110 RELEASE_DRIVERDATA(destRP
, GfxBase
);
114 brd
.srcbm
= srcBitMap
;
116 gc
= GetDriverData(destRP
)->dd_GC
;
117 OOP_GetAttr(gc
, aHidd_GC_DrawMode
, &old_drmd
);
119 gc_tags
[0].ti_Data
= MINTERM_TO_GCDRMD(minterm
);
120 OOP_SetAttrs(gc
, gc_tags
);
124 rr
.MaxX
= xDest
+ xSize
- 1;
125 rr
.MaxY
= yDest
+ ySize
- 1;
130 do_render_func(destRP
, &src
, &rr
, bitmap_render
, &brd
, TRUE
, TRUE
, GfxBase
);
132 RELEASE_HIDD_BM(brd
.srcbm_obj
, srcBitMap
);
134 gc_tags
[0].ti_Data
= old_drmd
;
135 OOP_SetAttrs(gc
, gc_tags
);
137 RELEASE_DRIVERDATA(destRP
, GfxBase
);
139 ReturnVoid("BltBitMapRastPort");
143 } /* BltBitMapRastPort */
145 /****************************************************************************************/
147 static ULONG
bitmap_render(APTR bitmap_rd
, LONG srcx
, LONG srcy
,
148 OOP_Object
*dstbm_obj
, OOP_Object
*dst_gc
,
149 LONG x1
, LONG y1
, LONG x2
, LONG y2
, struct GfxBase
*GfxBase
)
151 struct bitmap_render_data
*brd
;
153 struct monitor_driverdata
*driver
;
154 OOP_Object
*gfxhidd
, *dest_gfxhidd
;
157 height
= y2
- y1
+ 1;
159 brd
= (struct bitmap_render_data
*)bitmap_rd
;
161 // D(bug("bitmap_render(%p, %d, %d, %p, %p, %d, %d, %d, %d, %p)\n"
162 // , bitmap_rd, srcx, srcy, dstbm_obj, dst_gc, x1, y1, x2, y2, GfxBase));
165 * Select the appropriate driver.
166 * Selection rules are described in BltBitMap() code. This is the same, except destination
167 * is represented by object, not by struct BitMap.
169 driver
= GET_BM_DRIVERDATA(brd
->srcbm
);
170 gfxhidd
= driver
->gfxhidd
;
171 OOP_GetAttr(dstbm_obj
, aHidd_BitMap_GfxHidd
, (IPTR
*)&dest_gfxhidd
);
173 if (driver
== (struct monitor_driverdata
*)CDD(GfxBase
))
175 gfxhidd
= dest_gfxhidd
;
177 else if (OOP_OCLASS(dest_gfxhidd
) == CDD(GfxBase
)->fakegfxclass
)
179 gfxhidd
= dest_gfxhidd
;
182 /* Get some info on the colormaps. We have to make sure
183 that we have the appropriate mapping tables set.
186 if (!int_bltbitmap(brd
->srcbm
192 , x2
- x1
+ 1, y2
- y1
+ 1
200 return width
* height
;
203 /****************************************************************************************/