/********* BitMap::Clear() *************************************/ VOID MNAME_BM(Clear)(OOP_Class *cl, OOP_Object *o, struct pHidd_BitMap_Clear *msg) { IPTR width, height; struct bitmap_data *data = OOP_INST_DATA(cl, o); struct Box box = {0, 0, 0, 0}; /* Get width & height from bitmap superclass */ OOP_GetAttr(o, aHidd_BitMap_Width, &width); OOP_GetAttr(o, aHidd_BitMap_Height, &height); box.x2 = width - 1; box.y2 = height - 1; memset(data->VideoData, GC_BG(msg->gc), width*height); #ifdef OnBitmap ObtainSemaphore(&XSD(cl)->HW_acc); vgaRefreshArea(data, 1, &box); draw_mouse(XSD(cl)); ReleaseSemaphore(&XSD(cl)->HW_acc); #endif /* OnBitmap */ return; }
VOID MNAME_BM(PutImageLUT)(OOP_Class *cl, OOP_Object *o, struct pHidd_BitMap_PutImageLUT *msg) { struct bitmap_data *data = OOP_INST_DATA(cl, o); struct Box box = {0, 0, 0, 0}; EnterFunc(bug("VGAGfx.BitMap::PutImageLUT(pa=%p, x=%d, y=%d, w=%d, h=%d)\n", msg->pixels, msg->x, msg->y, msg->width, msg->height)); HIDD_BM_CopyMemBox8(o, msg->pixels, 0, 0, data->VideoData, msg->x, msg->y, msg->width, msg->height, msg->modulo, data->width); if (data->disp) { box.x1 = msg->x; box.y1 = msg->y; box.x2 = box.x1 + msg->width - 1; box.y2 = box.y1 + msg->height - 1; ObtainSemaphore(&XSD(cl)->HW_acc); vgaRefreshArea(data, 1, &box); if ( ( (XSD(cl)->mouseX + XSD(cl)->mouseW - 1 >= box.x1) && (XSD(cl)->mouseX <= box.x2) ) || ( (XSD(cl)->mouseY + XSD(cl)->mouseH - 1 >= box.y1) && (XSD(cl)->mouseY <= box.y2) ) ) draw_mouse(XSD(cl)); ReleaseSemaphore(&XSD(cl)->HW_acc); } ReturnVoid("VGAGfx.BitMap::PutImageLUT"); }
/*** BitMap::BlitColorExpansion() **********************************************/ VOID MNAME_BM(BlitColorExpansion)(OOP_Class *cl, OOP_Object *o, struct pHidd_BitMap_BlitColorExpansion *msg) { ULONG cemd; struct bitmap_data *data = OOP_INST_DATA(cl, o); struct Box box; HIDDT_Pixel fg, bg; LONG x, y; EnterFunc(bug("VGAGfx.BitMap::BlitColorExpansion(%p, %d, %d, %d, %d, %d, %d)\n" , msg->srcBitMap, msg->srcX, msg->srcY, msg->destX, msg->destY, msg->width, msg->height)); fg = GC_FG(msg->gc); bg = GC_BG(msg->gc); cemd = GC_COLEXP(msg->gc); if (cemd & vHidd_GC_ColExp_Opaque) { for (y = 0; y < msg->height; y ++) { for (x = 0; x < msg->width; x ++) { ULONG is_set; is_set = HIDD_BM_GetPixel(msg->srcBitMap, x + msg->srcX, y + msg->srcY); *(data->VideoData + x + msg->destX + ((y + msg->destY) * data->width)) = is_set ? fg : bg; } /* for (each x) */ } /* for (each y) */ } else { for (y = 0; y < msg->height; y ++) { for (x = 0; x < msg->width; x ++) { ULONG is_set; is_set = HIDD_BM_GetPixel(msg->srcBitMap, x + msg->srcX, y + msg->srcY); if (is_set) *(data->VideoData + x + msg->destX + ((y + msg->destY) * data->width)) = fg; } /* for (each x) */ } /* for (each y) */ } if (data->disp) { box.x1 = msg->destX; box.y1 = msg->destY; box.x2 = box.x1 + msg->width - 1; box.y2 = box.y1 + msg->height - 1; ObtainSemaphore(&XSD(cl)->HW_acc); vgaRefreshArea(data, 1, &box); if ( ( (XSD(cl)->mouseX + XSD(cl)->mouseW - 1 >= box.x1) && (XSD(cl)->mouseX <= box.x2) ) || ( (XSD(cl)->mouseY + XSD(cl)->mouseH - 1 >= box.y1) && (XSD(cl)->mouseY <= box.y2) ) ) draw_mouse(XSD(cl)); ReleaseSemaphore(&XSD(cl)->HW_acc); } ReturnVoid("VGAGfx.BitMap::BlitColorExpansion"); }
VOID MNAME_BM(FillRect)(OOP_Class *cl, OOP_Object *o, struct pHidd_BitMap_DrawRect *msg) { struct bitmap_data *data =OOP_INST_DATA(cl, o); struct Box box = {0, 0, 0, 0}; HIDDT_Pixel fg = GC_FG(msg->gc); HIDDT_DrawMode mode = GC_DRMD(msg->gc); EnterFunc(bug("VGAGfx.BitMap::FillRect(%d,%d,%d,%d)\n", msg->minX, msg->minY, msg->maxX, msg->maxY)); switch(mode) { case vHidd_GC_DrawMode_Copy: HIDD_BM_FillMemRect8(o, data->VideoData, msg->minX, msg->minY, msg->maxX, msg->maxY, data->width, fg); break; case vHidd_GC_DrawMode_Invert: HIDD_BM_InvertMemRect(o, data->VideoData, msg->minX, msg->minY, msg->maxX, msg->maxY, data->width); break; default: OOP_DoSuperMethod(cl, o, (OOP_Msg)msg); break; } /* switch(mode) */ if (data->disp) { box.x1 = msg->minX; box.y1 = msg->minY; box.x2 = msg->maxX; box.y2 = msg->maxY; ObtainSemaphore(&XSD(cl)->HW_acc); vgaRefreshArea(data, 1, &box); if ( ( (XSD(cl)->mouseX + XSD(cl)->mouseW - 1 >= box.x1) && (XSD(cl)->mouseX <= box.x2) ) || ( (XSD(cl)->mouseY + XSD(cl)->mouseH - 1 >= box.y1) && (XSD(cl)->mouseY <= box.y2) ) ) draw_mouse(XSD(cl)); ReleaseSemaphore(&XSD(cl)->HW_acc); } ReturnVoid("VGAGfx.BitMap::FillRect"); }
VOID MNAME_BM(PutImage)(OOP_Class *cl, OOP_Object *o, struct pHidd_BitMap_PutImage *msg) { struct bitmap_data *data = OOP_INST_DATA(cl, o); struct Box box = {0, 0, 0, 0}; BOOL done_by_superclass = FALSE; int i; EnterFunc(bug("VGAGfx.BitMap::PutImage(pa=%p, x=%d, y=%d, w=%d, h=%d)\n", msg->pixels, msg->x, msg->y, msg->width, msg->height)); switch(msg->pixFmt) { case vHidd_StdPixFmt_Native: HIDD_BM_CopyMemBox8(o, msg->pixels, 0, 0, data->VideoData, msg->x, msg->y, msg->width, msg->height, msg->modulo, data->width); break; case vHidd_StdPixFmt_Native32: HIDD_BM_PutMem32Image8(o, msg->pixels, data->VideoData, msg->x, msg->y, msg->width, msg->height, msg->modulo, data->width); break; default: OOP_DoSuperMethod(cl, o, (OOP_Msg)msg); done_by_superclass = TRUE; break; } if (data->disp && !done_by_superclass) { box.x1 = msg->x; box.y1 = msg->y; box.x2 = box.x1 + msg->width - 1; box.y2 = box.y1 + msg->height - 1; ObtainSemaphore(&XSD(cl)->HW_acc); vgaRefreshArea(data, 1, &box); if ( ( (XSD(cl)->mouseX + XSD(cl)->mouseW - 1 >= box.x1) && (XSD(cl)->mouseX <= box.x2) ) || ( (XSD(cl)->mouseY + XSD(cl)->mouseH - 1 >= box.y1) && (XSD(cl)->mouseY <= box.y2) ) ) draw_mouse(XSD(cl)); ReleaseSemaphore(&XSD(cl)->HW_acc); } ReturnVoid("VGAGfx.BitMap::PutImage"); }
OOP_Object *PCVGAOnBM__Root__New(OOP_Class *cl, OOP_Object *o, struct pRoot_New *msg) { EnterFunc(bug("VGAGfx.BitMap::New()\n")); o = (OOP_Object *)OOP_DoSuperMethod(cl, o, (OOP_Msg) msg); if (o) { struct bitmap_data *data; OOP_Object *pf; IPTR width, height, depth; data = OOP_INST_DATA(cl, o); /* clear all data */ memset(data, 0, sizeof(struct bitmap_data)); /* Get attr values */ OOP_GetAttr(o, aHidd_BitMap_Width, &width); OOP_GetAttr(o, aHidd_BitMap_Height, &height); OOP_GetAttr(o, aHidd_BitMap_PixFmt, &pf); OOP_GetAttr(pf, aHidd_PixFmt_Depth, &depth); ASSERT (width != 0 && height != 0 && depth != 0); /* We must only create depths that are supported by the friend drawable Currently we only support the default depth */ data->width = width; data->height = height; data->bpp = depth; data->Regs = AllocVec(sizeof(struct vgaHWRec),MEMF_PUBLIC|MEMF_CLEAR); data->disp = -1; width=(width+15) & ~15; /* Here there is brand new method of getting pixelclock data. It was introduced here to make the code more portable. Besides it may now be used as a base for creating other low level video drivers */ if (data->Regs) { data->VideoData = AllocVec(width*height,MEMF_PUBLIC|MEMF_CLEAR); if (data->VideoData) { struct vgaModeDesc mode; HIDDT_ModeID modeid; OOP_Object *sync; OOP_Object *pf; ULONG pixelc; /* We should be able to get modeID from the bitmap */ OOP_GetAttr(o, aHidd_BitMap_ModeID, &modeid); if (modeid != vHidd_ModeID_Invalid) { struct Box box = {0, 0, width-1, height-1}; /* Get Sync and PixelFormat properties */ HIDD_Gfx_GetMode(XSD(cl)->vgahidd, modeid, &sync, &pf); mode.Width = width; mode.Height = height; mode.Depth = depth; OOP_GetAttr(sync, aHidd_Sync_PixelClock, &pixelc); mode.clock = (pixelc > 26000000) ? 1 : 0; mode.Flags = 0; mode.HSkew = 0; OOP_GetAttr(sync, aHidd_Sync_HDisp, &mode.HDisplay); OOP_GetAttr(sync, aHidd_Sync_VDisp, &mode.VDisplay); OOP_GetAttr(sync, aHidd_Sync_HSyncStart, &mode.HSyncStart); OOP_GetAttr(sync, aHidd_Sync_VSyncStart, &mode.VSyncStart); OOP_GetAttr(sync, aHidd_Sync_HSyncEnd, &mode.HSyncEnd); OOP_GetAttr(sync, aHidd_Sync_VSyncEnd, &mode.VSyncEnd); OOP_GetAttr(sync, aHidd_Sync_HTotal, &mode.HTotal); OOP_GetAttr(sync, aHidd_Sync_VTotal, &mode.VTotal); ObtainSemaphore(&XSD(cl)->HW_acc); /* Now, when the best display mode is chosen, we can build it */ vgaInitMode(&mode, data->Regs); vgaLoadPalette(data->Regs,(unsigned char *)NULL); /* Because of not defined BitMap_Show method show bitmap immediately */ vgaRestore(data->Regs, FALSE); vgaRefreshArea(data, 1, &box); ReleaseSemaphore(&XSD(cl)->HW_acc); XSD(cl)->visible = data; /* Set created object as visible */ ReturnPtr("VGAGfx.BitMap::New()", OOP_Object *, o); } } /* if got data->VideoData */ FreeVec(data->Regs); } /* if got data->Regs */ { OOP_MethodID disp_mid = OOP_GetMethodID(IID_Root, moRoot_Dispose); OOP_CoerceMethod(cl, o, (OOP_Msg) &disp_mid); } o = NULL; } /* if created object */