static inline void do_drawhline(ggi_visual *vis, int x, int y, int w) { int i, w32; uint32_t *fb32; uint16_t *fb16; uint32_t val = LIBGGI_GC_FGCOLOR(vis) | (LIBGGI_GC_FGCOLOR(vis) << 16); PREPARE_FB(vis); fb16 = (uint16_t*)((uint8_t*)LIBGGI_CURWRITE(vis) + y*LIBGGI_FB_W_STRIDE(vis) + x*2); if (x%2) { *(fb16++) = val; w--; } w32 = w/2; fb32 = (uint32_t*) fb16; for (i = 0; i < w32; i++) { *(fb32++) = val; } if (w%2) { fb16 = (uint16_t *) fb32; *fb16 = val; } }
static inline void do_drawhline(struct ggi_visual *vis, int x, int y, int w) { uint8_t *fb; uint8_t fg; fb = (uint8_t *) LIBGGI_CURWRITE(vis)+y*LIBGGI_FB_W_STRIDE(vis)+(x/2); fg = (uint8_t) LIBGGI_GC_FGCOLOR(vis) | (LIBGGI_GC_FGCOLOR(vis)<<4); PREPARE_FB(vis); /* x is odd. Read-modify-write right pixel. */ if (x & 0x01) { *fb = (*fb & 0x0f) | (fg & 0xf0); fb++; w--; } memset(fb, fg, (size_t)(w/2)); /* Dangling right pixel. */ if (w & 0x01) { fb += w/2; *fb = (*fb & 0xf0) | (fg & 0x0f); } }
int GGI_vgagl_fillscreen(ggi_visual *vis) { if (LIBGGICLIP_FULLSCREEN(vis)) { gl_clearscreen(LIBGGI_GC_FGCOLOR(vis)); } else { gl_fillbox(LIBGGI_GC(vis)->cliptl.x, LIBGGI_GC(vis)->cliptl.y, LIBGGI_GC(vis)->clipbr.x - LIBGGI_GC(vis)->cliptl.x, LIBGGI_GC(vis)->clipbr.y - LIBGGI_GC(vis)->cliptl.y, LIBGGI_GC_FGCOLOR(vis)); } return 0; }
int GGI_tele_puts(struct ggi_visual *vis, int x, int y, const char * s) { ggi_tele_priv *priv = TELE_PRIV(vis); TeleCmdPutStrData *p; TeleEvent ev; int err = 0; unsigned int i = 0; T_Long * data; p = tclient_new_event(priv->client, &ev, TELE_CMD_PUTSTR, sizeof(TeleCmdPutStrData)-4, (signed)((strlen(s) + 1) * sizeof(T_Long))); p->x = (T_Long)(x); p->y = (T_Long)(y); p->length = (T_Long)strlen(s); p->fg = (T_Long)(LIBGGI_GC_FGCOLOR(vis)); p->bg = (T_Long)(LIBGGI_GC_BGCOLOR(vis)); data = (T_Long *)(p->text); for (i = 0 ; i <= strlen(s); ++i) { /* Copy the trailing \0! */ data[i] = (T_Long)(s[i]); } err = tclient_write(priv->client, &ev); if (err == TELE_ERROR_SHUTDOWN) { TELE_HANDLE_SHUTDOWN; } /* if */ return err; } /* GGI_tele_puts */
int GGI_tele_drawbox(ggi_visual *vis, int x, int y, int w, int h) { ggi_tele_priv *priv = TELE_PRIV(vis); TeleCmdDrawBoxData *p; TeleEvent ev; int err; LIBGGICLIP_XYWH(vis, x, y, w, h); p = tclient_new_event(priv->client, &ev, TELE_CMD_DRAWBOX, sizeof(TeleCmdDrawBoxData), 0); p->x = x; p->y = y; p->width = w; p->height = h; p->pixel = LIBGGI_GC_FGCOLOR(vis); err = tclient_write(priv->client, &ev); if (err == TELE_ERROR_SHUTDOWN) { TELE_HANDLE_SHUTDOWN; } /* if */ return err; } /* GGI_tele_drawbox */
int GGI_lin32_drawpixel_nc(ggi_visual *vis,int x,int y) { *((uint32_t *) ((uint8_t *)LIBGGI_CURWRITE(vis) + y*LIBGGI_FB_W_STRIDE(vis)+x*sizeof(uint32_t))) = LIBGGI_GC_FGCOLOR(vis); return 0; }
int GGI_t16_drawpixel(struct ggi_visual *vis, int x, int y) { CHECKXY(vis, x, y); *PIXEL_WADDR(vis, x, y) = LIBGGI_GC_FGCOLOR(vis); return 0; }
int GGI_t32_drawpixel_nca(ggi_visual *vis, int x, int y) { PREPARE_FB(vis); *PIXEL_WADDR(vis, x, y) = LIBGGI_GC_FGCOLOR(vis); return 0; }
int GGI_svga_drawhline_nc(ggi_visual *vis, int x, int y, int w) { vga_setcolor(LIBGGI_GC_FGCOLOR(vis)); y += vis->w_frame_num * LIBGGI_VIRTY(vis); vga_drawline(x,y,x+w-1,y); return 0; }
int GGI_vgagl_drawpixel(struct ggi_visual *vis, int x, int y) { CHECKXY(vis, x, y); gl_setpixel(x, y, LIBGGI_GC_FGCOLOR(vis)); return 0; }
int GGIdrawpixel_nc(struct ggi_visual *vis,int x,int y) { /* Supports only 8, 16, 32 bit modes -- impossible to pixel nonaligned */ memcpy(BANKFB + ((y * LIBGGI_FB_W_STRIDE(vis) + x) << LOGBYTPP), &LIBGGI_GC_FGCOLOR(vis), (1 << LOGBYTPP)); return 0; }
int GGI_lin1r_drawpixel_nc(struct ggi_visual *vis, int x, int y) { if (LIBGGI_GC_FGCOLOR(vis) & 1) { *PIXEL_WADDR(vis,x,y) |= (0x01 << (x & 7)); } else { *PIXEL_WADDR(vis,x,y) &= ~(0x01 << (x & 7)); } return 0; }
int GGI_lin32_drawpixela(struct ggi_visual *vis,int x,int y) { CHECKXY(vis,x,y); PREPARE_FB(vis); *((uint32_t *) ((uint8_t *)LIBGGI_CURWRITE(vis) + y*LIBGGI_FB_W_STRIDE(vis)+x*sizeof(uint32_t))) = LIBGGI_GC_FGCOLOR(vis); return 0; }
int GGIdrawpixel(struct ggi_visual *vis,int x,int y) { /* This already clips right */ CHECKXY(vis,x,y); /* Supports only 8, 16, 32 bit modes -- impossible to pixel nonaligned */ memcpy(BANKFB + ((y * LIBGGI_FB_W_STRIDE(vis) + x) << LOGBYTPP), &LIBGGI_GC_FGCOLOR(vis), (1 << LOGBYTPP)); return 0; }
void GGI_kgi_mach64_gcchanged(struct ggi_visual *vis, int mask) { if(mask & GGI_GCCHANGED_FG){ MACH64_CHECK(vis, 2); MACH64_WRITE(vis, MACH64_DP_FRGD_CLR); MACH64_WRITE(vis, LIBGGI_GC_FGCOLOR(vis)); } if(mask & GGI_GCCHANGED_BG){ MACH64_CHECK(vis, 2); MACH64_WRITE(vis, MACH64_DP_BKGD_CLR); MACH64_WRITE(vis, LIBGGI_GC_BGCOLOR(vis)); } }
int GGI_lin16_drawbox(struct ggi_visual *vis, int x, int y, int origw, int h) { uint32_t *buf32; uint16_t *buf16; uint32_t val; int linediff, oddx; LIBGGICLIP_XYWH(vis, x, y, origw, h); PREPARE_FB(vis); val = LIBGGI_GC_FGCOLOR(vis) | (LIBGGI_GC_FGCOLOR(vis) << 16); buf16 = (uint16_t*)((uint8_t*)LIBGGI_CURWRITE(vis) + y*LIBGGI_FB_W_STRIDE(vis) + x*2); linediff = LIBGGI_FB_W_STRIDE(vis) - origw*2; if (x%2) oddx = 1; else oddx = 0; while (h--) { int w = origw; if (oddx) { *(buf16++) = val; w--; } buf32 = (uint32_t*) buf16; while (w > 1) { *(buf32++) = val; w -= 2; } buf16 = (uint16_t*) buf32; if (w) { *(buf16++) = val; } buf16 = (uint16_t*) ((uint8_t*)buf16 + linediff); } return 0; }
int GGI_kgi_radeon_drawline_2d(ggi_visual *vis, int x1, int y1, int x2, int y2) { struct { cce_type3_header_t h; cce_gui_control_t gc; cce_scissor_t tl; cce_scissor_t br; uint32_t bp; cce_polyline_t pl; } packet; memset(&packet, 0, sizeof(packet)); packet.h.it_opcode = CCE_IT_OPCODE_POLYLINE; packet.h.count = sizeof(packet) / 4 - 2; packet.h.type = 0x3; packet.gc.dst_clipping = 1; packet.gc.brush_type = 14; packet.gc.dst_type = RADEON_CONTEXT(vis)->dst_type; packet.gc.src_type = 3; packet.gc.win31_rop = ROP3_PATCOPY; packet.gc.dst_type = RADEON_CONTEXT(vis)->dst_type; packet.tl.x = LIBGGI_GC(vis)->cliptl.x; packet.tl.y = LIBGGI_GC(vis)->cliptl.y; packet.br.x = LIBGGI_GC(vis)->clipbr.x; packet.br.y = LIBGGI_GC(vis)->clipbr.y; packet.bp = LIBGGI_GC_FGCOLOR(vis); packet.pl.x0 = x1; packet.pl.y0 = y1; packet.pl.x1 = x2; packet.pl.y1 = y2; RADEON_WRITEPACKET(vis, packet); if (!(LIBGGI_FLAGS(vis) & GGIFLAG_ASYNC)) RADEON_FLUSH(vis); return 0; }
int GGI_tele_drawline(struct ggi_visual *vis, int x,int y, int xe,int ye) { ggi_tele_priv *priv = TELE_PRIV(vis); TeleCmdDrawLineData *p; TeleEvent ev; int err; p = tclient_new_event(priv->client, &ev, TELE_CMD_DRAWLINE, sizeof(TeleCmdDrawLineData), 0); p->x = x; p->y = y; p->xe = xe; p->ye = ye; p->pixel = LIBGGI_GC_FGCOLOR(vis); err = tclient_write(priv->client, &ev); if (err == TELE_ERROR_SHUTDOWN) { TELE_HANDLE_SHUTDOWN; } /* if */ return err; } /* GGI_tele_drawline */
int GGI_t32_drawpixel_nc(struct ggi_visual *vis, int x, int y) { *PIXEL_WADDR(vis, x, y) = LIBGGI_GC_FGCOLOR(vis); return 0; }
int GGI_stubs_drawpixel_nc(struct ggi_visual *vis, int x, int y) { return _ggiPutPixelNC(vis, x, y, LIBGGI_GC_FGCOLOR(vis)); }
int GGI_tele_drawpixel_nc(ggi_visual *vis, int x, int y) { return GGI_tele_putpixel_nc(vis, x, y, LIBGGI_GC_FGCOLOR(vis)); } /* GGI_tele_drawpixel_nc */
int GGI_tele_drawpixel(ggi_visual *vis, int x, int y) { CHECKXY(vis, x, y); return GGI_tele_putpixel_nc(vis, x, y, LIBGGI_GC_FGCOLOR(vis)); } /* GGI_tele_drawpixel */
int GGI_vgagl_drawpixel_nc(struct ggi_visual *vis, int x, int y) { gl_setpixel(x, y, LIBGGI_GC_FGCOLOR(vis)); return 0; }
int GGI_stubs_drawpixel(ggi_visual *vis, int x, int y) { return LIBGGIPutPixel(vis, x, y, LIBGGI_GC_FGCOLOR(vis)); }
int GGI_lin8_putc(struct ggi_visual *vis, int x, int y, char c) { #define char_width 8 #define char_height 8 int offset, x_run, y_run; uint8_t *bitmap; bitmap = (uint8_t *)(font) + ( c * char_height ); x_run = char_width; y_run = char_height; offset = 0; { int delta; delta = LIBGGI_GC(vis)->cliptl.x - x; if ( delta > 0 ) { if ( delta >= x_run ) { return 0; } else { x_run -= delta; offset += delta; x += delta; } } delta = ( x + x_run ) - LIBGGI_GC(vis)->clipbr.x; if ( delta > 0 ) { if ( delta >= x_run ) { return 0; } else { x_run -= delta; } } delta = LIBGGI_GC(vis)->cliptl.y - y; if ( delta > 0 ) { if ( delta >= y_run ) { return 0; } else { y_run -= delta; bitmap += delta; y += delta; } } delta = ( y + y_run ) - LIBGGI_GC(vis)->clipbr.y; if ( delta > 0 ) { if ( delta >= y_run ) { return 0; } else { y_run -= delta; } } } { int y_iter; register uint8_t *fb; int add_stride; PREPARE_FB(vis); add_stride = LIBGGI_FB_W_STRIDE(vis); fb = (uint8_t *)LIBGGI_CURWRITE(vis) + ( y * add_stride ) + x; add_stride -= x_run; y_run += y; x_run += x; for ( y_iter = y ; y_iter < y_run ; y_iter++, bitmap++, fb += add_stride ) { register int x_iter; register uint8_t row; row = *bitmap << offset; for ( x_iter = x ; x_iter < x_run ; x_iter++, row <<= 1, fb++ ) { *fb = ( row & 128 ) ? (uint8_t)LIBGGI_GC_FGCOLOR(vis) : (uint8_t)LIBGGI_GC_BGCOLOR(vis); } } } return 0; #undef char_width #undef char_height }