BitmapRef FTFont::Glyph(char32_t glyph) { if(!check_face()) { return Font::Default()->Glyph(glyph); } if (FT_Load_Char(face_.get(), glyph, FT_LOAD_NO_BITMAP) != FT_Err_Ok) { Output::Error("Couldn't load FreeType character %d", glyph); } if (FT_Render_Glyph(face_->glyph, FT_RENDER_MODE_MONO) != FT_Err_Ok) { Output::Error("Couldn't render FreeType character %d", glyph); } FT_Bitmap const& ft_bitmap = face_->glyph->bitmap; assert(face_->glyph->bitmap.pixel_mode == FT_PIXEL_MODE_MONO); size_t const pitch = std::abs(ft_bitmap.pitch); int const width = ft_bitmap.width; int const height = ft_bitmap.rows; BitmapRef bm = Bitmap::Create(nullptr, width, height, 0, DynamicFormat(8,8,0,8,0,8,0,8,0,PF::Alpha)); uint8_t* data = reinterpret_cast<uint8_t*>(bm->pixels()); int dst_pitch = bm->pitch(); for(int row = 0; row < height; ++row) { for(int col = 0; col < width; ++col) { unsigned c = ft_bitmap.buffer[pitch * row + (col/8)]; unsigned bit = 7 - (col%8); data[row * dst_pitch + col] = (c & (0x01 << bit)) ? 255 : 0; } } return bm; }
DynamicFormat SoftBitmap::ChooseFormat(const DynamicFormat& format) { uint32 amask; PF::AlphaType atype; amask = (format.a.mask == 0) ? ((~0U >> (32 - format.bits)) ^ (format.r.mask | format.g.mask | format.b.mask)) : format.a.mask; atype = (amask == 0) ? PF::ColorKey : PF::Alpha; return DynamicFormat(format.bits, format.r.mask, format.g.mask, format.b.mask, amask, atype); }
DynamicFormat PixmanBitmap::ChooseFormat(const DynamicFormat& format) { uint32 amask; amask = (format.a.mask == 0) ? ((~0U >> (32 - format.bits)) ^ (format.r.mask | format.g.mask | format.b.mask)) : format.a.mask; if (amask != 0) return DynamicFormat(format.bits, format.r.mask, format.g.mask, format.b.mask, amask, PF::Alpha); switch (format.bits) { case 16: return (format.r.shift > format.b.shift) ? DynamicFormat(16,5,10,5,5,5,0,1,15,PF::Alpha) : DynamicFormat(16,5,0,5,5,5,10,1,15,PF::Alpha); case 24: return (format.r.shift > format.b.shift) ? DynamicFormat(32,8,16,8,8,8,0,8,24,PF::Alpha) : DynamicFormat(32,8,0,8,8,8,16,8,24,PF::Alpha); default: return format_B8G8R8A8_a().format(); } }
BitmapRef ShinonomeFont::Glyph(char32_t code) { ShinonomeGlyph const* const glyph = func_(code); assert(glyph); size_t const width = glyph->is_full? FULL_WIDTH : HALF_WIDTH; BitmapRef bm = Bitmap::Create(nullptr, width, HEIGHT, 0, DynamicFormat(8,8,0,8,0,8,0,8,0,PF::Alpha)); uint8_t* data = reinterpret_cast<uint8_t*>(bm->pixels()); int pitch = bm->pitch(); for(size_t y_ = 0; y_ < HEIGHT; ++y_) for(size_t x_ = 0; x_ < width; ++x_) data[y_*pitch+x_] = (glyph->data[y_] & (0x1 << x_)) ? 255 : 0; return bm; }
SDL_FreeSurface(src); free(pixels); return dst; } //////////////////////////////////////////////////////////// void SdlBitmap::SetupFormat(SDL_PixelFormat* fmt, bool transparent) { #ifdef USE_ALPHA uint32 amask = (~0U >> (32 - fmt->BitsPerPixel)) ^ (fmt->Rmask | fmt->Gmask | fmt->Bmask); PF::AlphaType alpha = transparent ? (amask == 0 ? PF::ColorKey : PF::Alpha) : PF::NoAlpha; #else uint32 amask = 0; PF::AlphaType alpha = transparent ? PF::ColorKey : PF::NoAlpha; #endif format = DynamicFormat((int) fmt->BitsPerPixel, fmt->Rmask, fmt->Gmask, fmt->Bmask, amask, alpha); } SdlBitmap::SdlBitmap(void *pixels, int width, int height, int pitch, const DynamicFormat& format) { bitmap = SDL_CreateRGBSurfaceFrom(pixels, width, height, format.bits, pitch, format.r.mask, format.g.mask, format.b.mask, format.a.mask); if (bitmap == NULL) { Output::Error("Couldn't create %dx%d bitmap.\n%s\n", width, height, SDL_GetError()); } SetupFormat(bitmap->format, false); } //////////////////////////////////////////////////////////// SdlBitmap::SdlBitmap(int width, int height, bool transparent, int bpp) {
void PixmanBitmap::initialize_formats() { if (formats_initialized) return; add_pair(PIXMAN_a8r8g8b8, DynamicFormat(32,8,16,8,8,8,0,8,24,PF::Alpha)); add_pair(PIXMAN_x8r8g8b8, DynamicFormat(32,8,16,8,8,8,0,0,0,PF::NoAlpha)); add_pair(PIXMAN_a8b8g8r8, DynamicFormat(32,8,0,8,8,8,16,8,24,PF::Alpha)); add_pair(PIXMAN_x8b8g8r8, DynamicFormat(32,8,0,8,8,8,16,0,0,PF::NoAlpha)); add_pair(PIXMAN_b8g8r8a8, DynamicFormat(32,8,8,8,16,8,24,8,0,PF::Alpha)); add_pair(PIXMAN_b8g8r8x8, DynamicFormat(32,8,8,8,16,8,24,0,0,PF::NoAlpha)); add_pair(PIXMAN_x14r6g6b6, DynamicFormat(32,6,12,6,6,6,0,0,0,PF::NoAlpha)); add_pair(PIXMAN_x2r10g10b10, DynamicFormat(32,10,20,10,10,10,0,0,0,PF::NoAlpha)); add_pair(PIXMAN_a2r10g10b10, DynamicFormat(32,10,20,10,10,10,0,2,30,PF::Alpha)); add_pair(PIXMAN_x2b10g10r10, DynamicFormat(32,10,0,10,10,10,20,0,0,PF::NoAlpha)); add_pair(PIXMAN_a2b10g10r10, DynamicFormat(32,10,0,10,10,10,20,2,30,PF::Alpha)); add_pair(PIXMAN_r8g8b8, DynamicFormat(24,8,16,8,8,8,0,0,0,PF::NoAlpha)); add_pair(PIXMAN_b8g8r8, DynamicFormat(24,8,0,8,8,8,16,0,0,PF::NoAlpha)); add_pair(PIXMAN_r5g6b5, DynamicFormat(16,5,11,6,5,5,0,0,0,PF::NoAlpha)); add_pair(PIXMAN_b5g6r5, DynamicFormat(16,5,0,6,5,5,11,0,0,PF::NoAlpha)); add_pair(PIXMAN_a1r5g5b5, DynamicFormat(16,5,10,5,5,5,0,1,15,PF::Alpha)); add_pair(PIXMAN_x1r5g5b5, DynamicFormat(16,5,10,5,5,5,0,0,0,PF::NoAlpha)); add_pair(PIXMAN_a1b5g5r5, DynamicFormat(16,5,0,5,5,5,10,1,15,PF::Alpha)); add_pair(PIXMAN_x1b5g5r5, DynamicFormat(16,5,0,5,5,5,10,0,0,PF::NoAlpha)); add_pair(PIXMAN_a4r4g4b4, DynamicFormat(16,4,8,4,4,4,0,4,12,PF::Alpha)); add_pair(PIXMAN_x4r4g4b4, DynamicFormat(16,4,8,4,4,4,0,0,0,PF::NoAlpha)); add_pair(PIXMAN_a4b4g4r4, DynamicFormat(16,4,0,4,4,4,8,4,12,PF::Alpha)); add_pair(PIXMAN_x4b4g4r4, DynamicFormat(16,4,0,4,4,4,8,0,0,PF::NoAlpha)); add_pair(PIXMAN_g8, DynamicFormat(8,8,0,8,0,8,0,8,0,PF::Alpha)); add_pair(PIXMAN_g8, DynamicFormat(8,8,0,8,0,8,0,0,0,PF::NoAlpha)); formats_initialized = true; }