more rendering corrections
[AROS.git] / workbench / hidds / hidd.nouveau / nouveaubitmapclass.c
blobd63e3c63f0191bc48006ccd94d4e30c2684a5d9a
1 /*
2 Copyright (C) 2010, The AROS Development Team. All rights reserved.
3 $Id$
4 */
6 #include "nouveau_intern.h"
8 #include <aros/debug.h>
9 #include <proto/oop.h>
11 #undef HiddBitMapAttrBase
12 #undef HiddPixFmtAttrBase
13 #define HiddBitMapAttrBase (SD(cl)->bitMapAttrBase)
14 #define HiddPixFmtAttrBase (SD(cl)->pixFmtAttrBase)
16 /* HACK HACK HACK */
17 extern struct nouveau_bo * hackfbo;
18 extern struct nouveau_device * hackdev;
20 /* HACK HACK HACK */
22 /* PUBLIC METHODS */
23 OOP_Object * METHOD(NouveauBitMap, Root, New)
25 o = (OOP_Object *)OOP_DoSuperMethod(cl, o, (OOP_Msg)msg);
27 if (o)
29 IPTR width, height, depth;
30 OOP_Object * pf;
31 struct HIDDNouveauBitMapData * bmdata = OOP_INST_DATA(cl, o);
33 OOP_GetAttr(o, aHidd_BitMap_Width, &width);
34 OOP_GetAttr(o, aHidd_BitMap_Height, &height);
35 OOP_GetAttr(o, aHidd_BitMap_PixFmt, (APTR)&pf);
36 OOP_GetAttr(pf, aHidd_PixFmt_Depth, &depth);
37 bmdata->bo = hackfbo; /* assuming fbo is already mapped */
38 bmdata->width = width;
39 bmdata->height = height;
40 bmdata->depth = depth;
41 if (depth <= 8)
42 bmdata->bytesperpixel = 1;
43 else if (depth <= 16)
44 bmdata->bytesperpixel = 2;
45 else
46 bmdata->bytesperpixel = 4;
47 bmdata->pitch = (bmdata->width * bmdata->bytesperpixel + 63) & ~63;
50 return o;
53 VOID METHOD(NouveauBitMap, Hidd_BitMap, PutPixel)
55 /* FIXME: take format (byte/word/long) into account */
56 struct HIDDNouveauBitMapData * bmdata = OOP_INST_DATA(cl, o);
57 IPTR addr = (msg->x * bmdata->bytesperpixel) + (bmdata->pitch * msg->y);
58 addr += (IPTR)bmdata->bo->map;
60 writel(msg->pixel, (APTR)addr);
63 HIDDT_Pixel METHOD(NouveauBitMap, Hidd_BitMap, GetPixel)
65 /* FIXME: take format (byte/word/long) into account */
66 struct HIDDNouveauBitMapData * bmdata = OOP_INST_DATA(cl, o);
67 IPTR addr = (msg->x * bmdata->bytesperpixel) + (bmdata->pitch * msg->y);
68 addr += (IPTR)bmdata->bo->map;
70 return readl((APTR)addr);
73 OOP_Object * METHOD(NouveauOffBitMap, Root, New)
75 o = (OOP_Object *)OOP_DoSuperMethod(cl, o, (OOP_Msg)msg);
77 if (o)
79 IPTR width, height, depth;
80 OOP_Object * pf;
81 struct HIDDNouveauBitMapData * bmdata = OOP_INST_DATA(cl, o);
83 OOP_GetAttr(o, aHidd_BitMap_Width, &width);
84 OOP_GetAttr(o, aHidd_BitMap_Height, &height);
85 OOP_GetAttr(o, aHidd_BitMap_PixFmt, (APTR)&pf);
86 OOP_GetAttr(pf, aHidd_PixFmt_Depth, &depth);
87 bmdata->width = width;
88 bmdata->height = height;
89 bmdata->depth = depth;
90 if (depth <= 8)
91 bmdata->bytesperpixel = 1;
92 else if (depth <= 16)
93 bmdata->bytesperpixel = 2;
94 else
95 bmdata->bytesperpixel = 4;
96 bmdata->pitch = (bmdata->width * bmdata->bytesperpixel + 63) & ~63;
98 /* Creation of buffer object */
99 /* FIXME: nouveau_device should not be global */
100 /* FIXME: check result of call */
101 /* FIXME: take pitch/bpp when calculating size */
102 nouveau_bo_new(hackdev, NOUVEAU_BO_VRAM | NOUVEAU_BO_MAP, 0,
103 width * height * 4,
104 &bmdata->bo);
106 /* FIXME: if (!bmdata->bo) */
107 nouveau_bo_map(bmdata->bo, NOUVEAU_BO_RDWR);
110 return o;
113 VOID NouveauOffBitMap__Root__Dispose(OOP_Class *cl, OOP_Object *o, OOP_Msg msg)
115 struct HIDDNouveauBitMapData * bmdata = OOP_INST_DATA(cl, o);
117 if (bmdata->bo)
119 nouveau_bo_unmap(bmdata->bo);
120 nouveau_bo_ref(NULL, &bmdata->bo); /* Release reference */