static void putpixel__nocheck(ALLEGRO_BITMAP *bmp, int x, int y, int color) { unsigned long addr = (unsigned long) bmp->line[y] + x * bmp->surf->format->BytesPerPixel; switch(bmp->surf->format->BytesPerPixel) { case 1: bmp_write8(addr, color); break; case 2: bmp_write16(addr, color); break; case 3: bmp_write24(addr, color); break; case 4: bmp_write32(addr, color); break; } }
/* * Mode-X masked line stretcher. */ static void stretch_masked_linex(uintptr_t dptr, unsigned char *sptr) { int plane; int dw = _al_stretch.linesize; int first_xc = _al_stretch.xcstart; ASSERT(dptr); ASSERT(sptr); for (plane = 0; plane < 4; plane++) { int xc = first_xc; unsigned char *s = sptr; uintptr_t d = dptr / 4; uintptr_t dend = (dptr + dw) / 4; outportw(0x3C4, (0x100 << (dptr & 3)) | 2); for (; d < dend; d++, s += 4 * _al_stretch.sxinc) { unsigned long color = *s; if (color != 0) bmp_write8(d, color); if (xc <= 0) s++, xc += _al_stretch.xcinc; else xc -= _al_stretch.xcdec; if (xc <= 0) s++, xc += _al_stretch.xcinc; else xc -= _al_stretch.xcdec; if (xc <= 0) s++, xc += _al_stretch.xcinc; else xc -= _al_stretch.xcdec; if (xc <= 0) s++, xc += _al_stretch.xcinc; else xc -= _al_stretch.xcdec; } /* Move to the beginning of next plane. */ if (first_xc <= 0) { sptr++; first_xc += _al_stretch.xcinc; } else first_xc -= _al_stretch.xcdec; dptr++; sptr += _al_stretch.sxinc; dw--; } }
void convert_image_to_allegro_templ(const Image* image, BITMAP* bmp, int _x, int _y, const Palette* palette) { const LockImageBits<ImageTraits> bits(image); typename LockImageBits<ImageTraits>::const_iterator src_it = bits.begin(); #ifdef _DEBUG typename LockImageBits<ImageTraits>::const_iterator src_end = bits.end(); #endif int depth = bitmap_color_depth(bmp); int x, y, w = image->width(), h = image->height(); unsigned long bmp_address; bmp_select(bmp); switch (depth) { case 8: #if defined GFX_MODEX && !defined ALLEGRO_UNIX && !defined ALLEGRO_MACOSX if (is_planar_bitmap (bmp)) { for (y=0; y<h; ++y) { bmp_address = (unsigned long)bmp->line[_y]; for (x=0; x<w; ++x) { ASSERT(src_it != src_end); outportw(0x3C4, (0x100<<((_x+x)&3))|2); bmp_write8(bmp_address+((_x+x)>>2), (convert_color_to_allegro<ImageTraits, 8>(*src_it, palette))); ++src_it; address++; } _y++; } } else { #endif for (y=0; y<h; ++y) { bmp_address = bmp_write_line(bmp, _y)+_x; for (x=0; x<w; ++x) { ASSERT(src_it != src_end); bmp_write8(bmp_address, (convert_color_to_allegro<ImageTraits, 8>(*src_it, palette))); ++bmp_address; ++src_it; } _y++; } #if defined GFX_MODEX && !defined ALLEGRO_UNIX && !defined ALLEGRO_MACOSX } #endif break; case 15: _x <<= 1; for (y=0; y<h; y++) { bmp_address = bmp_write_line(bmp, _y)+_x; for (x=0; x<w; ++x) { ASSERT(src_it != src_end); bmp_write15(bmp_address, (convert_color_to_allegro<ImageTraits, 15>(*src_it, palette))); bmp_address += 2; ++src_it; } _y++; } break; case 16: _x <<= 1; for (y=0; y<h; ++y) { bmp_address = bmp_write_line(bmp, _y)+_x; for (x=0; x<w; ++x) { ASSERT(src_it != src_end); bmp_write16(bmp_address, (convert_color_to_allegro<ImageTraits, 16>(*src_it, palette))); bmp_address += 2; ++src_it; } _y++; } break; case 24: _x *= 3; for (y=0; y<h; ++y) { bmp_address = bmp_write_line(bmp, _y)+_x; for (x=0; x<w; ++x) { ASSERT(src_it != src_end); bmp_write24(bmp_address, (convert_color_to_allegro<ImageTraits, 24>(*src_it, palette))); bmp_address += 3; ++src_it; } _y++; } break; case 32: _x <<= 2; for (y=0; y<h; ++y) { bmp_address = bmp_write_line(bmp, _y)+_x; for (x=0; x<w; ++x) { ASSERT(src_it != src_end); bmp_write32(bmp_address, (convert_color_to_allegro<ImageTraits, 32>(*src_it, palette))); bmp_address += 4; ++src_it; } _y++; } break; }
/* * call-seq: * bmp_write8(addr, c) -> nil * */ VALUE a4r_API_bmp_write8(VALUE self, VALUE addr, VALUE c) { bmp_write8(NUM2ULONG(addr), *((uint8_t*)StringValuePtr(c))); return Qnil; }