1 #include "gdkprivate-fb.h"
5 * Reading pixel values from a generic drawable.
9 gdk_fb_drawable_get_color (GdkDrawable *drawable,
15 GetPixelRet retval = GPR_NONE;
16 GdkDrawableFBData *private = GDK_DRAWABLE_FBDATA (drawable);
17 guchar *mem = private->mem;
18 guint rowstride = private->rowstride;
20 switch (private->depth)
24 guchar foo = mem[(x >> 3) + y * rowstride];
25 if (foo & (1 << (x % 8)))
26 *spot = GDK_GC_FBDATA (gc)->values.foreground;
30 *spot = GDK_GC_FBDATA (gc)->values.background;
35 if (mem[x + y * rowstride])
36 *spot = GDK_GC_FBDATA (gc)->values.foreground;
38 *spot = GDK_GC_FBDATA (gc)->values.background;
41 retval = GPR_AA_GRAYVAL;
42 spot->pixel = mem[x + y * rowstride] << 1;
43 spot->red = spot->green = spot->blue = spot->pixel << 8;
45 case 78: /* AA mode */
46 retval = GPR_AA_GRAYVAL;
47 spot->pixel = mem[x + y * rowstride];
48 spot->red = spot->green = spot->blue = spot->pixel << 8;
51 spot->pixel = mem[x + y * rowstride];
52 *spot = private->colormap->colors[spot->pixel];
56 guint16 val16 = *((guint16 *)&mem[x*2 + y*rowstride]);
58 spot->red = (((1<<gdk_display->modeinfo.red.length) - 1) & (val16 >> gdk_display->modeinfo.red.offset)) << (16 - gdk_display->modeinfo.red.length);
59 spot->green = (((1<<gdk_display->modeinfo.green.length) - 1) & (val16 >> gdk_display->modeinfo.green.offset)) << (16 - gdk_display->modeinfo.green.length);
60 spot->blue = (((1<<gdk_display->modeinfo.blue.length) - 1) & (val16 >> gdk_display->modeinfo.blue.offset)) << (16 - gdk_display->modeinfo.blue.length);
67 guchar *smem = &mem[x*3 + y*rowstride];
68 spot->red = smem[gdk_display->red_byte] << 8;
69 spot->green = smem[gdk_display->green_byte] << 8;
70 spot->blue = smem[gdk_display->blue_byte] << 8;
71 #if (G_BYTE_ORDER == G_BIG_ENDIAN)
72 spot->pixel = (smem[0]<<16)|(smem[1]<<8)|smem[2];
74 spot->pixel = smem[0]|(smem[1]<<8)|(smem[2]<<16);
80 guchar *smem = &mem[x*4 + y*rowstride];
81 spot->red = smem[gdk_display->red_byte] << 8;
82 spot->green = smem[gdk_display->green_byte] << 8;
83 spot->blue = smem[gdk_display->blue_byte] << 8;
84 spot->pixel = *(guint32 *)smem;
92 /*************************************
93 * gc->get_color() implementations
94 *************************************/
97 gdk_fb_get_color_1 (GdkDrawable *drawable,
103 GetPixelRet retval = GPR_NONE;
104 GdkDrawableFBData *private = GDK_DRAWABLE_FBDATA (drawable);
105 guchar *mem = private->mem;
106 guint rowstride = private->rowstride;
109 g_assert (private->depth == GDK_GC_FBDATA (gc)->depth);
111 foo = mem[(x >> 3) + y * rowstride];
112 if (foo & (1 << (x % 8)))
113 *color = GDK_GC_FBDATA (gc)->values.foreground;
116 retval = GPR_USED_BG;
118 *color = GDK_GC_FBDATA (gc)->values.background;
125 gdk_fb_get_color_8 (GdkDrawable *drawable,
131 GdkDrawableFBData *private = GDK_DRAWABLE_FBDATA (drawable);
132 guchar *mem = private->mem;
133 guint rowstride = private->rowstride;
136 g_assert (private->depth == GDK_GC_FBDATA (gc)->depth);
138 pixel = mem[x + y * rowstride];
139 *color = private->colormap->colors[pixel];
145 gdk_fb_get_color_16 (GdkDrawable *drawable,
151 GdkDrawableFBData *private = GDK_DRAWABLE_FBDATA (drawable);
152 guchar *mem = private->mem;
153 guint rowstride = private->rowstride;
156 g_assert (private->depth == GDK_GC_FBDATA (gc)->depth);
158 val16 = *((guint16 *)&mem[x*2 + y*rowstride]);
160 color->red = (((1<<gdk_display->modeinfo.red.length) - 1) & (val16 >> gdk_display->modeinfo.red.offset)) << (16 - gdk_display->modeinfo.red.length);
161 color->green = (((1<<gdk_display->modeinfo.green.length) - 1) & (val16 >> gdk_display->modeinfo.green.offset)) << (16 - gdk_display->modeinfo.green.length);
162 color->blue = (((1<<gdk_display->modeinfo.blue.length) - 1) & (val16 >> gdk_display->modeinfo.blue.offset)) << (16 - gdk_display->modeinfo.blue.length);
164 color->pixel = val16;
170 gdk_fb_get_color_24 (GdkDrawable *drawable,
176 GdkDrawableFBData *private = GDK_DRAWABLE_FBDATA (drawable);
177 guchar *mem = private->mem;
178 guint rowstride = private->rowstride;
181 g_assert (private->depth == GDK_GC_FBDATA (gc)->depth);
183 smem = &mem[x*3 + y*rowstride];
184 color->red = smem[gdk_display->red_byte] << 8;
185 color->green = smem[gdk_display->green_byte] << 8;
186 color->blue = smem[gdk_display->blue_byte] << 8;
187 #if (G_BYTE_ORDER == G_BIG_ENDIAN)
188 color->pixel = (smem[0]<<16)|(smem[1]<<8)|smem[2];
190 color->pixel = smem[0]|(smem[1]<<8)|(smem[2]<<16);
197 gdk_fb_get_color_32 (GdkDrawable *drawable,
203 GdkDrawableFBData *private = GDK_DRAWABLE_FBDATA (drawable);
204 guchar *mem = private->mem;
205 guint rowstride = private->rowstride;
208 g_assert (private->depth == GDK_GC_FBDATA (gc)->depth);
210 smem = &mem[x*4 + y*rowstride];
211 color->red = smem[gdk_display->red_byte] << 8;
212 color->green = smem[gdk_display->green_byte] << 8;
213 color->blue = smem[gdk_display->blue_byte] << 8;
214 color->pixel = *(guint32 *)smem;
219 /*************************************
220 * gc->set_pixel() implementations
221 *************************************/
224 gdk_fb_set_pixel_1(GdkDrawable *drawable,
230 GdkDrawableFBData *private = GDK_DRAWABLE_FBDATA (drawable);
231 guchar *mem = private->mem;
232 guint rowstride = private->rowstride;
235 g_assert (private->depth == GDK_GC_FBDATA (gc)->depth);
237 ptr = mem + (y*rowstride) + (x >> 3);
240 *ptr |= (1 << (x % 8));
242 *ptr &= ~(1 << (x % 8));
246 gdk_fb_set_pixel_8(GdkDrawable *drawable,
252 GdkDrawableFBData *private = GDK_DRAWABLE_FBDATA (drawable);
253 guchar *mem = private->mem;
254 guint rowstride = private->rowstride;
256 g_assert (private->depth == GDK_GC_FBDATA (gc)->depth);
258 mem[x + y*rowstride] = pixel;
262 gdk_fb_set_pixel_16(GdkDrawable *drawable,
268 GdkDrawableFBData *private = GDK_DRAWABLE_FBDATA (drawable);
269 guchar *mem = private->mem;
270 guint rowstride = private->rowstride;
273 g_assert (private->depth == GDK_GC_FBDATA (gc)->depth);
275 ptr = (guint16 *)&mem[x*2 + y*rowstride];
280 gdk_fb_set_pixel_24(GdkDrawable *drawable,
286 GdkDrawableFBData *private = GDK_DRAWABLE_FBDATA (drawable);
287 guchar *mem = private->mem;
288 guint rowstride = private->rowstride;
291 g_assert (private->depth == GDK_GC_FBDATA (gc)->depth);
293 smem = &mem[x*3 + y*rowstride];
294 smem[0] = pixel & 0xff;
295 smem[1] = (pixel >> 8) & 0xff;
296 smem[2] = (pixel >> 16) & 0xff;
300 gdk_fb_set_pixel_32(GdkDrawable *drawable,
306 GdkDrawableFBData *private = GDK_DRAWABLE_FBDATA (drawable);
307 guchar *mem = private->mem;
308 guint rowstride = private->rowstride;
311 g_assert (private->depth == GDK_GC_FBDATA (gc)->depth);
313 smem = (guint32 *)&mem[x*4 + y*rowstride];
318 /*************************************
319 * gc->fill_span() implementations
320 *************************************/
323 gdk_fb_fill_span_generic (GdkDrawable *drawable,
329 GdkColor spot = *color;
330 GdkGCFBData *gc_private;
331 GdkDrawableFBData *private;
333 int clipxoff, clipyoff; /* Amounts to add to curx & cury to get x & y in clip mask */
337 guint mask_rowstride;
338 GdkPixmap *ts = NULL;
339 GdkDrawableFBData *ts_private;
340 gboolean solid_stipple;
343 private = GDK_DRAWABLE_FBDATA (drawable);
344 gc_private = GDK_GC_FBDATA (gc);
350 right = span->x + span->width;
352 func = gc_private->values.function;
354 cmask = gc_private->values.clip_mask;
355 clipxoff = clipyoff = tsxoff = tsyoff = 0;
357 solid_stipple = FALSE;
362 GdkDrawableFBData *cmask_private;
364 cmask_private = GDK_DRAWABLE_IMPL_FBDATA (cmask);
366 clipmem = cmask_private->mem;
367 clipxoff = cmask_private->abs_x - gc_private->values.clip_x_origin - private->abs_x;
368 clipyoff = cmask_private->abs_y - gc_private->values.clip_y_origin - private->abs_y;
369 mask_rowstride = cmask_private->rowstride;
372 if (gc_private->values.fill == GDK_TILED &&
373 gc_private->values.tile)
378 GdkFBDrawingContext *dc, dc_data;
382 gdk_fb_drawing_context_init (dc, drawable, gc, FALSE, TRUE);
384 ts = gc_private->values.tile;
385 ts_private = GDK_DRAWABLE_IMPL_FBDATA (ts);
387 rely = y - private->abs_y;
388 drawh = (rely + gc_private->values.ts_y_origin) % ts_private->height;
390 drawh += GDK_DRAWABLE_FBDATA (ts)->height;
392 for (curx = left; curx < right; curx += xstep)
396 relx = curx - private->abs_x;
398 draww = (relx + gc_private->values.ts_x_origin) % ts_private->width;
400 draww += ts_private->width;
402 xstep = MIN (ts_private->width - draww, right - relx);
404 gdk_fb_draw_drawable_3 (drawable, gc, GDK_DRAWABLE_IMPL (ts),
411 gdk_fb_drawing_context_finalize (dc);
415 else if ((gc_private->values.fill == GDK_STIPPLED ||
416 gc_private->values.fill == GDK_OPAQUE_STIPPLED) &&
417 gc_private->values.stipple)
419 ts = gc_private->values.stipple;
420 tsxoff = GDK_DRAWABLE_FBDATA (ts)->abs_x - gc_private->values.ts_x_origin - private->abs_x;
421 tsyoff = GDK_DRAWABLE_FBDATA (ts)->abs_y - gc_private->values.ts_y_origin - private->abs_y;
422 solid_stipple = (gc_private->values.fill == GDK_OPAQUE_STIPPLED);
425 for (curx = left; curx < right; curx++)
427 int maskx = curx+clipxoff, masky = y + clipyoff;
432 foo = clipmem[masky*mask_rowstride + (maskx >> 3)];
434 if (!(foo & (1 << (maskx % 8))))
438 if (func == GDK_INVERT)
440 (gc_private->get_color) (drawable, gc, curx, y, &spot);
441 spot.pixel = ~spot.pixel;
442 spot.red = ~spot.red;
443 spot.green = ~spot.green;
444 spot.blue = ~spot.blue;
450 ts_private = GDK_DRAWABLE_IMPL_FBDATA (ts);
452 wid = ts_private->width;
453 hih = ts_private->height;
455 maskx = (curx+tsxoff)%wid;
456 masky = (y+tsyoff)%hih;
462 foo = ts_private->mem[(maskx >> 3) + ts_private->rowstride*masky];
463 if (foo & (1 << (maskx % 8)))
465 spot = gc_private->values.foreground;
467 else if (solid_stipple)
469 spot = gc_private->values.background;
475 (gc_private->set_pixel) (drawable, gc, curx, y, spot.pixel);
480 gdk_fb_fill_span_simple_1 (GdkDrawable *drawable,
486 GdkGCFBData *gc_private;
487 GdkDrawableFBData *private;
492 private = GDK_DRAWABLE_FBDATA (drawable);
493 gc_private = GDK_GC_FBDATA (gc);
497 g_assert (!gc_private->values.clip_mask &&
498 !gc_private->values.tile &&
499 !gc_private->values.stipple &&
500 gc_private->values.function != GDK_INVERT);
504 right = span->x + span->width;
507 rowstride = private->rowstride;
510 int fromx = MIN ((left+7)&(~7), right);
511 int begn = fromx - left, begoff = left % 8, endn;
512 guchar begmask, endmask;
513 int body_end = right & ~7;
514 int body_len = (body_end - fromx)/8;
516 begmask = ((1 << (begn + begoff)) - 1)
517 & ~((1 << (begoff)) - 1);
518 endn = right - body_end;
519 endmask = (1 << endn) - 1;
521 ptr = mem + y*rowstride + (left >> 3);
532 ptr = mem + y*rowstride + (curx >> 3);
533 memset (ptr, color->pixel?0xFF:0, body_len);
537 ptr = mem + y*rowstride + (body_end >> 3);
548 gdk_fb_fill_span_simple_8 (GdkDrawable *drawable,
553 GdkGCFBData *gc_private;
554 GdkDrawableFBData *private;
558 private = GDK_DRAWABLE_FBDATA (drawable);
559 gc_private = GDK_GC_FBDATA (gc);
563 g_assert (!gc_private->values.clip_mask &&
564 !gc_private->values.tile &&
565 !gc_private->values.stipple &&
566 gc_private->values.function != GDK_INVERT);
569 rowstride = private->rowstride;
571 ptr = mem + span->y*rowstride + span->x;
572 memset (ptr, color->pixel, span->width);
575 gdk_fb_fill_span_simple_16 (GdkDrawable *drawable,
580 GdkGCFBData *gc_private;
581 GdkDrawableFBData *private;
588 private = GDK_DRAWABLE_FBDATA (drawable);
589 gc_private = GDK_GC_FBDATA (gc);
593 g_assert (!gc_private->values.clip_mask &&
594 !gc_private->values.tile &&
595 !gc_private->values.stipple &&
596 gc_private->values.function != GDK_INVERT);
599 rowstride = private->rowstride;
602 p16 = (guint16 *)(mem + span->y * rowstride + span->x*2);
603 for (i = 0; i < n; i++)
604 *(p16++) = color->pixel;
608 gdk_fb_fill_span_simple_24 (GdkDrawable *drawable,
613 GdkGCFBData *gc_private;
614 GdkDrawableFBData *private;
618 guchar redval, greenval, blueval;
619 guchar *firstline, *ptr_end;
621 private = GDK_DRAWABLE_FBDATA (drawable);
622 gc_private = GDK_GC_FBDATA (gc);
626 g_assert (!gc_private->values.clip_mask &&
627 !gc_private->values.tile &&
628 !gc_private->values.stipple &&
629 gc_private->values.function != GDK_INVERT);
632 rowstride = private->rowstride;
634 redval = color->red>>8;
635 greenval = color->green>>8;
636 blueval = color->blue>>8;
640 firstline = ptr = mem + span->y * rowstride + span->x*3;
642 while (ptr < ptr_end)
644 ptr[gdk_display->red_byte] = redval;
645 ptr[gdk_display->green_byte] = greenval;
646 ptr[gdk_display->blue_byte] = blueval;
651 gdk_fb_fill_span_simple_32 (GdkDrawable *drawable,
656 GdkGCFBData *gc_private;
657 GdkDrawableFBData *private;
664 private = GDK_DRAWABLE_FBDATA (drawable);
665 gc_private = GDK_GC_FBDATA (gc);
669 g_assert (!gc_private->values.clip_mask &&
670 !gc_private->values.tile &&
671 !gc_private->values.stipple &&
672 gc_private->values.function != GDK_INVERT);
675 rowstride = private->rowstride;
678 p32 = (guint32 *)(mem + span->y * rowstride + span->x*4);
679 for (i = 0; i < n; i++)
680 *(p32++) = color->pixel;
684 /*************************************
685 * gc->draw_drawable() implementations
686 *************************************/
689 gdk_fb_draw_drawable_generic (GdkDrawable *drawable,
692 GdkFBDrawingContext *dc,
701 GdkDrawableFBData *private = GDK_DRAWABLE_FBDATA (drawable);
704 if (draw_direction < 0)
720 for (cur_y = start_y; cur_y != end_y; cur_y+=draw_direction)
722 for (cur_x = start_x; cur_x != end_x; cur_x+=draw_direction)
726 if (GDK_GC_FBDATA(gc)->values.clip_mask)
728 int maskx = cur_x + dc->clipxoff, masky = cur_y + dc->clipyoff;
731 foo = dc->clipmem[masky*dc->clip_rowstride + (maskx >> 3)];
733 if (!(foo & (1 << (maskx % 8))))
737 switch (gdk_fb_drawable_get_color (src, gc, cur_x + src_x_off, cur_y + src_y_off, &spot))
741 GdkColor realspot, fg;
742 guint graylevel = spot.pixel;
745 if (private->depth == 1)
747 if (spot.pixel > 192)
748 spot = GDK_GC_FBDATA (gc)->values.foreground;
750 spot = GDK_GC_FBDATA (gc)->values.background;
755 if (graylevel >= 254)
757 spot = GDK_GC_FBDATA (gc)->values.foreground;
759 else if (graylevel <= 2)
764 spot = GDK_GC_FBDATA (gc)->values.background;
768 switch ((GDK_GC_FBDATA (gc)->get_color) (drawable, gc, cur_x, cur_y, &realspot))
774 bgx = (cur_x - GDK_DRAWABLE_IMPL_FBDATA (dc->bg_relto)->abs_x) % GDK_DRAWABLE_IMPL_FBDATA (dc->bgpm)->width + private->abs_x;
775 bgy = (cur_y - GDK_DRAWABLE_IMPL_FBDATA (dc->bg_relto)->abs_y) % GDK_DRAWABLE_IMPL_FBDATA (dc->bgpm)->height + private->abs_y;
776 gdk_fb_drawable_get_color (dc->bgpm, gc, bgx, bgy, &realspot);
782 g_assert_not_reached ();
786 fg = GDK_GC_FBDATA (gc)->values.foreground;
788 /* Now figure out what 'spot' should actually look like */
793 realspot.green >>= 8;
797 tmp = (fg.red - realspot.red) * graylevel;
798 spot.red = realspot.red + ((tmp + (tmp >> 8) + 0x80) >> 8);
801 tmp = (fg.green - realspot.green) * graylevel;
802 spot.green = realspot.green + ((tmp + (tmp >> 8) + 0x80) >> 8);
805 tmp = (fg.blue - realspot.blue) * graylevel;
806 spot.blue = realspot.blue + ((tmp + (tmp >> 8) + 0x80) >> 8);
809 /* Now find the pixel for this thingie */
810 switch (private->depth)
813 if (!gdk_colormap_alloc_color (private->colormap, &spot, FALSE, TRUE))
815 g_error ("Can't allocate AA color!");
819 spot.pixel = (spot.red >> (16 - gdk_display->modeinfo.red.length)) << gdk_display->modeinfo.red.offset;
820 spot.pixel |= (spot.green >> (16 - gdk_display->modeinfo.green.length)) << gdk_display->modeinfo.green.offset;
821 spot.pixel |= (spot.blue >> (16 - gdk_display->modeinfo.blue.length)) << gdk_display->modeinfo.blue.offset;
825 spot.pixel = ((spot.red & 0xFF00) >> 8 << (gdk_display->modeinfo.red.offset))
826 | ((spot.green & 0xFF00) >> 8 << (gdk_display->modeinfo.green.offset))
827 | ((spot.blue & 0xFF00) >> 8 << (gdk_display->modeinfo.blue.offset));
841 g_assert_not_reached ();
845 (GDK_GC_FBDATA (gc)->set_pixel) (drawable, gc, cur_x, cur_y, spot.pixel);
852 gdk_fb_draw_drawable_memmove (GdkDrawable *drawable,
855 GdkFBDrawingContext *dc,
864 GdkDrawableFBData *src_private = GDK_DRAWABLE_FBDATA (src);
865 guint depth = src_private->depth;
866 guint src_rowstride = src_private->rowstride;
867 guchar *srcmem = src_private->mem;
868 int linelen = (end_x - start_x)*(depth>>3);
871 if (draw_direction < 0)
881 for(cur_y = start_y; cur_y != end_y; cur_y += draw_direction)
883 memmove (dc->mem + (cur_y * dc->rowstride) + start_x*(depth>>3),
884 srcmem + ((cur_y + src_y_off)*src_rowstride) + (start_x + src_x_off)*(depth>>3),
891 gdk_fb_draw_drawable_aa_24 (GdkDrawable *drawable,
894 GdkFBDrawingContext *dc,
903 GdkDrawableFBData *private = GDK_DRAWABLE_FBDATA (drawable);
905 GdkGCFBData *gc_private;
906 guchar *dmem = private->mem;
907 guint dst_rowstride = private->rowstride;
908 guchar *smem = GDK_DRAWABLE_FBDATA (src)->mem;
909 guint src_rowstride = GDK_DRAWABLE_FBDATA (src)->rowstride;
914 gint fg_r, fg_g, fg_b;
916 gc_private = GDK_GC_FBDATA (gc);
918 fg = GDK_GC_FBDATA (gc)->values.foreground;
920 fg_g = fg.green >> 8;
923 if (draw_direction < 0)
939 for (y = start_y; y != end_y; y+=draw_direction)
941 for (x = start_x; x != end_x; x+=draw_direction)
943 grayval = smem[x + src_x_off + (y + src_y_off) * src_rowstride];
945 if ((grayval <= 2) && (!dc->draw_bg))
948 dst = &dmem[x*3 + y*dst_rowstride];
952 dst[gdk_display->red_byte] = fg_r;
953 dst[gdk_display->green_byte] = fg_g;
954 dst[gdk_display->blue_byte] = fg_b;
956 else if (grayval <= 2)
958 dst[gdk_display->red_byte] = GDK_GC_FBDATA (gc)->values.background.red >> 8;
959 dst[gdk_display->green_byte] = GDK_GC_FBDATA (gc)->values.background.green >> 8;
960 dst[gdk_display->blue_byte] = GDK_GC_FBDATA (gc)->values.background.blue >> 8;
964 r = dst[gdk_display->red_byte];
965 tmp = (fg_r - r) * (gint)grayval;
966 r = r + ((tmp + (tmp >> 8) + 0x80) >> 8);
967 dst[gdk_display->red_byte] = r;
969 g = dst[gdk_display->green_byte];
970 tmp = (fg_g - g) * (gint)grayval;
971 g = g + ((tmp + (tmp >> 8) + 0x80) >> 8);
972 dst[gdk_display->green_byte] = g;
974 b = dst[gdk_display->blue_byte];
975 tmp = (fg_b - b) * (gint)grayval;
976 b = b + ((tmp + (tmp >> 8) + 0x80) >> 8);
977 dst[gdk_display->blue_byte] = b;
983 /*************************************
984 * gc->fill_rectangle() implementations
985 *************************************/
988 gdk_fb_fill_rectangle_generic (GdkDrawable *drawable,
993 GdkDrawableFBData *private;
997 private = GDK_DRAWABLE_FBDATA (drawable);
999 spans = g_new (GdkSpan, rect->height);
1000 for (i=0;i<rect->height;i++)
1002 spans[i].x = rect->x - private->abs_x;
1003 spans[i].y = rect->y+i - private->abs_y;
1004 spans[i].width = rect->width;
1006 gdk_fb_fill_spans (drawable, gc, spans, rect->height, TRUE);
1011 gdk_fb_fill_rectangle_simple_16 (GdkDrawable *drawable,
1016 GdkGCFBData *gc_private;
1017 GdkDrawableFBData *private;
1026 private = GDK_DRAWABLE_FBDATA (drawable);
1027 gc_private = GDK_GC_FBDATA (gc);
1029 rowstride = private->rowstride - rect->width*2;
1030 ptr = (guchar *)private->mem + rect->y * private->rowstride + rect->x*2;
1032 extra = rect->width&1;
1035 pixel = (color->pixel << 16) | color->pixel;
1037 height = rect->height;
1043 *(guint32 *)ptr = pixel;
1049 *(guint16 *)ptr = color->pixel;
1058 gdk_fb_fill_rectangle_simple_32 (GdkDrawable *drawable,
1063 GdkGCFBData *gc_private;
1064 GdkDrawableFBData *private;
1072 private = GDK_DRAWABLE_FBDATA (drawable);
1073 gc_private = GDK_GC_FBDATA (gc);
1075 rowstride = private->rowstride - rect->width*4;
1076 ptr = (guchar *)private->mem + rect->y * private->rowstride + rect->x*4;
1080 pixel = color->pixel;
1082 height = rect->height;
1088 *(guint32 *)ptr = pixel;
1098 /*************************************
1099 * GC state calculation
1100 *************************************/
1103 _gdk_fb_gc_calc_state (GdkGC *gc,
1104 GdkGCValuesMask changed)
1106 GdkGCFBData *gc_private;
1109 gc_private = GDK_GC_FBDATA (gc);
1111 gc_private->fill_span = gdk_fb_fill_span_generic;
1112 gc_private->fill_rectangle = gdk_fb_fill_rectangle_generic;
1114 for (i=0;i<GDK_NUM_FB_SRCBPP;i++)
1115 gc_private->draw_drawable[i] = gdk_fb_draw_drawable_generic;
1117 if (changed & _GDK_FB_GC_DEPTH)
1118 switch (gc_private->depth)
1121 gc_private->set_pixel = gdk_fb_set_pixel_1;
1122 gc_private->get_color = gdk_fb_get_color_1;
1125 gc_private->set_pixel = gdk_fb_set_pixel_8;
1126 gc_private->get_color = gdk_fb_get_color_8;
1129 gc_private->set_pixel = gdk_fb_set_pixel_16;
1130 gc_private->get_color = gdk_fb_get_color_16;
1133 gc_private->set_pixel = gdk_fb_set_pixel_24;
1134 gc_private->get_color = gdk_fb_get_color_24;
1137 gc_private->set_pixel = gdk_fb_set_pixel_32;
1138 gc_private->get_color = gdk_fb_get_color_32;
1141 g_assert_not_reached ();
1145 if (!gc_private->values.clip_mask)
1147 switch (gc_private->depth)
1150 gc_private->draw_drawable[GDK_FB_SRC_BPP_8] = gdk_fb_draw_drawable_memmove;
1153 gc_private->draw_drawable[GDK_FB_SRC_BPP_16] = gdk_fb_draw_drawable_memmove;
1156 gc_private->draw_drawable[GDK_FB_SRC_BPP_8_AA_GRAYVAL] = gdk_fb_draw_drawable_aa_24;
1157 gc_private->draw_drawable[GDK_FB_SRC_BPP_24] = gdk_fb_draw_drawable_memmove;
1160 gc_private->draw_drawable[GDK_FB_SRC_BPP_32] = gdk_fb_draw_drawable_memmove;
1165 if (!gc_private->values.clip_mask &&
1166 !gc_private->values.tile &&
1167 !gc_private->values.stipple &&
1168 gc_private->values.function != GDK_INVERT)
1170 switch (gc_private->depth)
1173 gc_private->fill_span = gdk_fb_fill_span_simple_1;
1176 gc_private->fill_span = gdk_fb_fill_span_simple_8;
1179 gc_private->fill_span = gdk_fb_fill_span_simple_16;
1180 gc_private->fill_rectangle = gdk_fb_fill_rectangle_simple_16;
1183 gc_private->fill_span = gdk_fb_fill_span_simple_24;
1186 gc_private->fill_span = gdk_fb_fill_span_simple_32;
1187 gc_private->fill_rectangle = gdk_fb_fill_rectangle_simple_32;
1190 g_assert_not_reached ();