X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?p=xscreensaver;a=blobdiff_plain;f=hacks%2Fanalogtv.c;h=fd7f504c68d705614c57552405044932694b7b6b;hp=e3af6f2be287c7419b06f3b10a79d274466e4c7e;hb=refs%2Fheads%2Fmaster;hpb=78add6e627ee5f10e1fa6f3852602ea5066eee5a diff --git a/hacks/analogtv.c b/hacks/analogtv.c index e3af6f2b..fd7f504c 100644 --- a/hacks/analogtv.c +++ b/hacks/analogtv.c @@ -568,6 +568,9 @@ analogtv_allocate(Display *dpy, Window window) "background", "Background"); it->gc = XCreateGC(it->dpy, it->window, GCBackground, &gcv); +# ifdef HAVE_JWXYZ + jwxyz_XSetAntiAliasing (it->dpy, it->gc, False); +# endif XSetWindowBackground(it->dpy, it->window, gcv.background); XClearWindow(dpy,window); @@ -1983,10 +1986,16 @@ analogtv_input_allocate() This takes a screen image and encodes it as a video camera would, including all the bandlimiting and YIQ modulation. This isn't especially tuned for speed. + + xoff, yoff: top left corner of rendered image, in window pixels. + w, h: scaled size of rendered image, in window pixels. + mask: BlackPixel means don't render (it's not full alpha) */ int -analogtv_load_ximage(analogtv *it, analogtv_input *input, XImage *pic_im) +analogtv_load_ximage(analogtv *it, analogtv_input *input, + XImage *pic_im, XImage *mask_im, + int xoff, int yoff, int target_w, int target_h) { int i,x,y; int img_w,img_h; @@ -1995,14 +2004,24 @@ analogtv_load_ximage(analogtv *it, analogtv_input *input, XImage *pic_im) int fqx[4],fqy[4]; XColor col1[ANALOGTV_PIC_LEN]; XColor col2[ANALOGTV_PIC_LEN]; + char mask[ANALOGTV_PIC_LEN]; int multiq[ANALOGTV_PIC_LEN+4]; + unsigned long black = 0; /* not BlackPixelOfScreen (it->xgwa.screen); */ + + int x_length=ANALOGTV_PIC_LEN; int y_overscan=5; /* overscan this much top and bottom */ int y_scanlength=ANALOGTV_VISLINES+2*y_overscan; - img_w=pic_im->width; - img_h=pic_im->height; + if (target_w > 0) x_length = x_length * target_w / it->xgwa.width; + if (target_h > 0) y_scanlength = y_scanlength * target_h / it->xgwa.height; + + img_w = pic_im->width; + img_h = pic_im->height; - for (i=0; ixgwa.width; + yoff = ANALOGTV_VISLINES * yoff / it->xgwa.height; + + for (i=0; idpy, it->colormap, col1, ANALOGTV_PIC_LEN); - XQueryColors(it->dpy, it->colormap, col2, ANALOGTV_PIC_LEN); - + XQueryColors(it->dpy, it->colormap, col1, x_length); + XQueryColors(it->dpy, it->colormap, col2, x_length); for (i=0; i<7; i++) fyx[i]=fyy[i]=0; for (i=0; i<4; i++) fix[i]=fiy[i]=fqx[i]=fqy[i]=0.0; - for (x=0; x>14) + ANALOGTV_BLACK_LEVEL; if (composite>125) composite=125; if (composite<0) composite=0; - input->signal[y-y_overscan+ANALOGTV_TOP][x+ANALOGTV_PIC_START] = composite; + + input->signal[y-y_overscan+ANALOGTV_TOP+yoff][x+ANALOGTV_PIC_START+xoff] = composite; } } @@ -2243,6 +2269,9 @@ analogtv_make_font(Display *dpy, Window window, analogtv_font *f, gcv.background=0; gcv.font=font->fid; gc=XCreateGC(dpy, text_pm, GCFont|GCBackground|GCForeground, &gcv); +# ifdef HAVE_JWXYZ + jwxyz_XSetAntiAliasing (dpy, gc, False); +# endif XSetForeground(dpy, gc, 0); XFillRectangle(dpy, text_pm, gc, 0, 0, 256*f->char_w, f->char_h); @@ -2400,115 +2429,3 @@ analogtv_draw_string_centered(analogtv_input *input, analogtv_font *f, analogtv_draw_string(input, f, s, x, y, ntsc); } - - -static const char hextonib[128] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0, - 0, 10,11,12,13,14,15,0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 10,11,12,13,14,15,0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; - -/* - Much of this function was adapted from logo.c - */ -void -analogtv_draw_xpm(analogtv *tv, analogtv_input *input, - const char * const *xpm, int left, int top) -{ - int xpmw,xpmh; - int x,y,tvx,tvy,i; - int rawy,rawi,rawq; - int ncolors, nbytes; - char dummyc; - struct { - int r; int g; int b; - } cmap[256]; - - - if (4 != sscanf ((const char *) *xpm, - "%d %d %d %d %c", - &xpmw, &xpmh, &ncolors, &nbytes, &dummyc)) - abort(); - if (ncolors < 1 || ncolors > 255) - abort(); - if (nbytes != 1) /* a serious limitation */ - abort(); - xpm++; - - for (i = 0; i < ncolors; i++) { - const char *line = *xpm; - int colori = ((unsigned char)*line++)&0xff; - while (*line) - { - int r, g, b; - char which; - while (*line == ' ' || *line == '\t') - line++; - which = *line++; - if (which != 'c' && which != 'm') - abort(); - while (*line == ' ' || *line == '\t') - line++; - if (!strncasecmp(line, "None", 4)) - { - r = g = b = -1; - line += 4; - } - else - { - if (*line == '#') - line++; - r = (hextonib[(int) line[0]] << 4) | hextonib[(int) line[1]]; - line += 2; - g = (hextonib[(int) line[0]] << 4) | hextonib[(int) line[1]]; - line += 2; - b = (hextonib[(int) line[0]] << 4) | hextonib[(int) line[1]]; - line += 2; - } - - if (which == 'c') - { - cmap[colori].r = r; - cmap[colori].g = g; - cmap[colori].b = b; - } - } - - xpm++; - } - - for (y=0; y=ANALOGTV_BOT) continue; - - for (x=0; xANALOGTV_PIC_END) continue; - - rawy=( 5*cmap[cbyte].r + 11*cmap[cbyte].g + 2*cmap[cbyte].b) / 64; - rawi=(10*cmap[cbyte].r - 4*cmap[cbyte].g - 5*cmap[cbyte].b) / 64; - rawq=( 3*cmap[cbyte].r - 8*cmap[cbyte].g + 5*cmap[cbyte].b) / 64; - - ntsc[0]=rawy+rawq; - ntsc[1]=rawy-rawi; - ntsc[2]=rawy-rawq; - ntsc[3]=rawy+rawi; - - for (i=0; i<4; i++) { - if (ntsc[i]>ANALOGTV_WHITE_LEVEL) ntsc[i]=ANALOGTV_WHITE_LEVEL; - if (ntsc[i]signal[tvy][tvx+0]= ntsc[(tvx+0)&3]; - input->signal[tvy][tvx+1]= ntsc[(tvx+1)&3]; - input->signal[tvy][tvx+2]= ntsc[(tvx+2)&3]; - input->signal[tvy][tvx+3]= ntsc[(tvx+3)&3]; - } - } -}