void TFB_DrawScreen_Callback (void (*callback) (void *arg), void *arg) { TFB_DrawCommand DrawCommand; DrawCommand.Type = TFB_DRAWCOMMANDTYPE_CALLBACK; DrawCommand.data.callback.callback = callback; DrawCommand.data.callback.arg = arg; TFB_EnqueueDrawCommand(&DrawCommand); }
void TFB_DrawScreen_ReinitVideo (int driver, int flags, int width, int height) { TFB_DrawCommand DrawCommand; DrawCommand.Type = TFB_DRAWCOMMANDTYPE_REINITVIDEO; DrawCommand.data.reinitvideo.driver = driver; DrawCommand.data.reinitvideo.flags = flags; DrawCommand.data.reinitvideo.width = width; DrawCommand.data.reinitvideo.height = height; TFB_EnqueueDrawCommand (&DrawCommand); }
void TFB_DrawScreen_CopyToImage (TFB_Image *img, const RECT *r, SCREEN src) { TFB_DrawCommand DC; DC.Type = TFB_DRAWCOMMANDTYPE_COPYTOIMAGE; DC.data.copytoimage.rect = *r; DC.data.copytoimage.image = img; DC.data.copytoimage.srcBuffer = src; TFB_EnqueueDrawCommand (&DC); }
void TFB_DrawScreen_DeleteImage (TFB_Image *img) { if (img) { TFB_DrawCommand DC; DC.Type = TFB_DRAWCOMMANDTYPE_DELETEIMAGE; DC.data.deleteimage.image = img; TFB_EnqueueDrawCommand (&DC); } }
void TFB_DrawScreen_SetMipmap (TFB_Image *img, TFB_Image *mmimg, int hotx, int hoty) { TFB_DrawCommand DC; DC.Type = TFB_DRAWCOMMANDTYPE_SETMIPMAP; DC.data.setmipmap.image = img; DC.data.setmipmap.mipmap = mmimg; DC.data.setmipmap.hotx = hotx; DC.data.setmipmap.hoty = hoty; TFB_EnqueueDrawCommand (&DC); }
void TFB_DrawScreen_DeleteData (void *data) // data must be a result of HXalloc() call { if (data) { TFB_DrawCommand DC; DC.Type = TFB_DRAWCOMMANDTYPE_DELETEDATA; DC.data.deletedata.data = data; TFB_EnqueueDrawCommand (&DC); } }
void TFB_DrawScreen_WaitForSignal (void) { TFB_DrawCommand DrawCommand; Semaphore s; s = GetMyThreadLocal ()->flushSem; DrawCommand.Type = TFB_DRAWCOMMANDTYPE_SENDSIGNAL; DrawCommand.data.sendsignal.sem = s; Lock_DCQ (1); TFB_BatchReset (); TFB_EnqueueDrawCommand (&DrawCommand); Unlock_DCQ(); SetSemaphore (s); }
void TFB_DrawScreen_FontChar (TFB_Char *fontChar, TFB_Image *backing, int x, int y, SCREEN dest) { TFB_DrawCommand DC; DC.Type = TFB_DRAWCOMMANDTYPE_FONTCHAR; DC.data.fontchar.fontchar = fontChar; DC.data.fontchar.backing = backing; DC.data.fontchar.x = x; DC.data.fontchar.y = y; DC.data.fontchar.destBuffer = dest; TFB_EnqueueDrawCommand (&DC); }
void TFB_DrawScreen_CopyToImage (TFB_Image *img, RECT *lpRect, SCREEN src) { TFB_DrawCommand DC; DC.Type = TFB_DRAWCOMMANDTYPE_COPYTOIMAGE; DC.data.copytoimage.x = lpRect->corner.x; DC.data.copytoimage.y = lpRect->corner.y; DC.data.copytoimage.w = lpRect->extent.width; DC.data.copytoimage.h = lpRect->extent.height; DC.data.copytoimage.image = img; DC.data.copytoimage.srcBuffer = src; TFB_EnqueueDrawCommand (&DC); }
void TFB_DrawScreen_Image (TFB_Image *img, int x, int y, int scale, TFB_ColorMap *cmap, SCREEN dest) { TFB_DrawCommand DC; DC.Type = TFB_DRAWCOMMANDTYPE_IMAGE; DC.data.image.image = img; DC.data.image.colormap = cmap; DC.data.image.x = x; DC.data.image.y = y; DC.data.image.scale = (scale == GSCALE_IDENTITY) ? 0 : scale; DC.data.image.destBuffer = dest; TFB_EnqueueDrawCommand (&DC); }
void TFB_DrawScreen_Line (int x1, int y1, int x2, int y2, Color color, DrawMode mode, SCREEN dest) { TFB_DrawCommand DC; DC.Type = TFB_DRAWCOMMANDTYPE_LINE; DC.data.line.x1 = x1; DC.data.line.y1 = y1; DC.data.line.x2 = x2; DC.data.line.y2 = y2; DC.data.line.color = color; DC.data.line.drawMode = mode; DC.data.line.destBuffer = dest; TFB_EnqueueDrawCommand (&DC); }
void TFB_DrawScreen_FilledImage (TFB_Image *img, int x, int y, int scale, int r, int g, int b, SCREEN dest) { TFB_DrawCommand DC; DC.Type = TFB_DRAWCOMMANDTYPE_FILLEDIMAGE; DC.data.filledimage.image = img; DC.data.filledimage.x = x; DC.data.filledimage.y = y; DC.data.filledimage.scale = (scale == GSCALE_IDENTITY) ? 0 : scale; DC.data.filledimage.r = r; DC.data.filledimage.g = g; DC.data.filledimage.b = b; DC.data.filledimage.destBuffer = dest; TFB_EnqueueDrawCommand (&DC); }
void TFB_DrawScreen_Line (int x1, int y1, int x2, int y2, int r, int g, int b, SCREEN dest) { TFB_DrawCommand DC; DC.Type = TFB_DRAWCOMMANDTYPE_LINE; DC.data.line.x1 = x1; DC.data.line.y1 = y1; DC.data.line.x2 = x2; DC.data.line.y2 = y2; DC.data.line.r = r; DC.data.line.g = g; DC.data.line.b = b; DC.data.line.destBuffer = dest; TFB_EnqueueDrawCommand (&DC); }
void TFB_DrawScreen_FilledImage (TFB_Image *img, int x, int y, int scale, int scaleMode, Color color, DrawMode mode, SCREEN dest) { TFB_DrawCommand DC; DC.Type = TFB_DRAWCOMMANDTYPE_FILLEDIMAGE; DC.data.filledimage.image = img; DC.data.filledimage.x = x; DC.data.filledimage.y = y; DC.data.filledimage.scale = (scale == GSCALE_IDENTITY) ? 0 : scale; DC.data.filledimage.scaleMode = scaleMode; DC.data.filledimage.color = color; DC.data.filledimage.drawMode = mode; DC.data.filledimage.destBuffer = dest; TFB_EnqueueDrawCommand (&DC); }
// JMS_GFX: This ensures the whole screen area is updated in screen transition. // Useful at least in hires when landing at planet and transitioning to planetside view. // (The planet is cut uglily in about half when using normal TFB_DrawScreen_Copy). void TFB_DrawScreen_Copy_Fs (RECT *r, SCREEN src, SCREEN dest) { RECT locRect; TFB_DrawCommand DC; locRect.corner.x = locRect.corner.y = 0; locRect.extent.width = ScreenWidth; locRect.extent.height = ScreenHeight; r = &locRect; DC.Type = TFB_DRAWCOMMANDTYPE_COPY; DC.data.copy.rect = locRect; DC.data.copy.srcBuffer = src; DC.data.copy.destBuffer = dest; TFB_EnqueueDrawCommand (&DC); }
void TFB_EnqueueDrawCommand (TFB_DrawCommand* DrawCommand) { if (TFB_DEBUG_HALT) { return; } if (DrawCommand->Type <= TFB_DRAWCOMMANDTYPE_COPYTOIMAGE && _CurFramePtr->Type == SCREEN_DRAWABLE) { static RECT scissor_rect; // Set the clipping region. // We allow drawing with no current context set, so the whole screen if ((_pCurContext && !rectsEqual (scissor_rect, _pCurContext->ClipRect)) || (!_pCurContext && scissor_rect.extent.width != 0)) { // Enqueue command to set the glScissor spec TFB_DrawCommand DC; if (_pCurContext) scissor_rect = _pCurContext->ClipRect; else scissor_rect.extent.width = 0; if (scissor_rect.extent.width) { DC.Type = TFB_DRAWCOMMANDTYPE_SCISSORENABLE; DC.data.scissor.rect = scissor_rect; } else { DC.Type = TFB_DRAWCOMMANDTYPE_SCISSORDISABLE; } TFB_EnqueueDrawCommand(&DC); } } TFB_DrawCommandQueue_Push (DrawCommand); }
void TFB_DrawScreen_Copy (const RECT *r, SCREEN src, SCREEN dest, BOOLEAN Fs) { RECT locRect; TFB_DrawCommand DC; if (!r || Fs) { locRect.corner.x = locRect.corner.y = 0; locRect.extent.width = ScreenWidth; locRect.extent.height = ScreenHeight; r = &locRect; } DC.Type = TFB_DRAWCOMMANDTYPE_COPY; DC.data.copy.rect = (Fs ? locRect : *r); DC.data.copy.srcBuffer = src; DC.data.copy.destBuffer = dest; TFB_EnqueueDrawCommand (&DC); }
void TFB_DrawScreen_Rect (RECT *rect, Color color, DrawMode mode, SCREEN dest) { RECT locRect; TFB_DrawCommand DC; if (!rect) { locRect.corner.x = locRect.corner.y = 0; locRect.extent.width = ScreenWidth; locRect.extent.height = ScreenHeight; rect = &locRect; } DC.Type = TFB_DRAWCOMMANDTYPE_RECTANGLE; DC.data.rect.rect = *rect; DC.data.rect.color = color; DC.data.rect.drawMode = mode; DC.data.rect.destBuffer = dest; TFB_EnqueueDrawCommand (&DC); }
void TFB_DrawScreen_Rect (RECT *rect, int r, int g, int b, SCREEN dest) { RECT locRect; TFB_DrawCommand DC; if (!rect) { locRect.corner.x = locRect.corner.y = 0; locRect.extent.width = SCREEN_WIDTH; locRect.extent.height = SCREEN_HEIGHT; rect = &locRect; } DC.Type = TFB_DRAWCOMMANDTYPE_RECTANGLE; DC.data.rect.rect = *rect; DC.data.rect.r = r; DC.data.rect.g = g; DC.data.rect.b = b; DC.data.rect.destBuffer = dest; TFB_EnqueueDrawCommand (&DC); }
void TFB_DrawScreen_Copy (RECT *r, SCREEN src, SCREEN dest) { RECT locRect; TFB_DrawCommand DC; if (!r) { locRect.corner.x = locRect.corner.y = 0; locRect.extent.width = SCREEN_WIDTH; locRect.extent.height = SCREEN_HEIGHT; r = &locRect; } DC.Type = TFB_DRAWCOMMANDTYPE_COPY; DC.data.copy.x = r->corner.x; DC.data.copy.y = r->corner.y; DC.data.copy.w = r->extent.width; DC.data.copy.h = r->extent.height; DC.data.copy.srcBuffer = src; DC.data.copy.destBuffer = dest; TFB_EnqueueDrawCommand (&DC); }