//------------------------------------------------------------------------ void platform_specific::display_pmap(HDC dc, const rendering_buffer* rbuf, int draw_x, int draw_y, int draw_width, int draw_height) { if(m_sys_format == m_format) { if (m_bimage == 0) { m_bimage = dib.create_image(rbuf, m_bpp); } dib.put_image(dc, m_bimage, draw_x, draw_y, draw_width, draw_height); return; } // Optimization hint: make pmap_tmp as a private class member and reused it when possible. pixel_map pmap_tmp(rbuf->width(), rbuf->height(), m_sys_format, 256, m_flip_y); rendering_buffer* rbuf2 = &pmap_tmp.rbuf(); switch(m_format) { case pix_format_rgb565: color_conv(rbuf2, rbuf, color_conv_rgb565_to_rgb555()); break; case pix_format_rgb24: color_conv(rbuf2, rbuf, color_conv_rgb24_to_bgr24()); break; case pix_format_abgr32: color_conv(rbuf2, rbuf, color_conv_abgr32_to_bgra32()); break; case pix_format_argb32: color_conv(rbuf2, rbuf, color_conv_argb32_to_bgra32()); break; case pix_format_rgba32: color_conv(rbuf2, rbuf, color_conv_rgba32_to_bgra32()); break; case pix_format_gray8: case end_of_pix_formats: case pix_format_undefined: ; } // This will ultimately call back to us, going to the top if branch since // the pix_format is compatible. pmap_tmp.draw(dc, draw_x, draw_y, draw_width, draw_height); }
//------------------------------------------------------------------------ bool platform_specific::save_pmap(const char* fn, unsigned idx, const rendering_buffer* src) { if(m_sys_format == m_format) { return m_pmap_img[idx].save_as_qt(fn); } else { pixel_map pmap_tmp; pmap_tmp.create(m_pmap_img[idx].width(), m_pmap_img[idx].height(), org_e(m_sys_bpp)); rendering_buffer rbuf_tmp; rbuf_tmp.attach(pmap_tmp.buf(), pmap_tmp.width(), pmap_tmp.height(), m_flip_y ? -pmap_tmp.row_bytes() : pmap_tmp.row_bytes()); switch(m_format) { case pix_format_gray8: return false; case pix_format_rgb565: color_conv(&rbuf_tmp, src, color_conv_rgb565_to_rgb555()); break; case pix_format_rgb24: color_conv(&rbuf_tmp, src, color_conv_rgb24_to_bgr24()); break; case pix_format_abgr32: color_conv(&rbuf_tmp, src, color_conv_abgr32_to_bgra32()); break; case pix_format_argb32: color_conv(&rbuf_tmp, src, color_conv_argb32_to_bgra32()); break; case pix_format_rgba32: color_conv(&rbuf_tmp, src, color_conv_rgba32_to_bgra32()); break; } return pmap_tmp.save_as_qt(fn); } return true; }
//------------------------------------------------------------------------ void platform_specific::display_pmap(WindowRef window, const rendering_buffer* src) { if(m_sys_format == m_format) { m_pmap_window.draw(window); } else { pixel_map pmap_tmp; pmap_tmp.create(m_pmap_window.width(), m_pmap_window.height(), org_e(m_sys_bpp)); rendering_buffer rbuf_tmp; rbuf_tmp.attach(pmap_tmp.buf(), pmap_tmp.width(), pmap_tmp.height(), m_flip_y ? -pmap_tmp.row_bytes() : pmap_tmp.row_bytes()); switch(m_format) { case pix_format_gray8: return; case pix_format_rgb565: color_conv(&rbuf_tmp, src, color_conv_rgb565_to_rgb555()); break; case pix_format_bgr24: color_conv(&rbuf_tmp, src, color_conv_bgr24_to_rgb24()); break; case pix_format_abgr32: color_conv(&rbuf_tmp, src, color_conv_abgr32_to_argb32()); break; case pix_format_bgra32: color_conv(&rbuf_tmp, src, color_conv_bgra32_to_argb32()); break; case pix_format_rgba32: color_conv(&rbuf_tmp, src, color_conv_rgba32_to_argb32()); break; } pmap_tmp.draw(window); } }
Py::Object RendererAgg::tostring_rgb(const Py::Tuple& args) { //"Return the rendered buffer as an RGB string"; _VERBOSE("RendererAgg::tostring_rgb"); args.verify_length(0); int row_len = width*3; unsigned char* buf_tmp = new unsigned char[row_len * height]; if (buf_tmp ==NULL) { //todo: also handle allocation throw throw Py::MemoryError("RendererAgg::tostring_rgb could not allocate memory"); } agg::rendering_buffer renderingBufferTmp; renderingBufferTmp.attach(buf_tmp, width, height, row_len); color_conv(&renderingBufferTmp, renderingBuffer, agg::color_conv_rgba32_to_rgb24()); //todo: how to do this with native CXX PyObject* o = Py_BuildValue("s#", buf_tmp, row_len * height); delete [] buf_tmp; return Py::asObject(o); }
Py::Object Image::buffer_argb32(const Py::Tuple& args) { //"Return the image object as argb32"; _VERBOSE("RendererAgg::buffer_argb32"); args.verify_length(0); int row_len = colsOut * 4; unsigned char* buf_tmp = new unsigned char[row_len * rowsOut]; if (buf_tmp ==NULL) throw Py::MemoryError("RendererAgg::buffer_argb32 could not allocate memory"); agg::rendering_buffer rtmp; rtmp.attach(buf_tmp, colsOut, rowsOut, row_len); color_conv(&rtmp, rbufOut, agg::color_conv_rgba32_to_argb32()); //todo: how to do this with native CXX //PyObject* o = Py_BuildValue("s#", buf_tmp, row_len * rowsOut); PyObject* o = Py_BuildValue("lls#", rowsOut, colsOut, buf_tmp, row_len * rowsOut); delete [] buf_tmp; return Py::asObject(o); }
Py::Object RendererAgg::tostring_rgb(const Py::Tuple& args) { //"Return the rendered buffer as an RGB string"; _VERBOSE("RendererAgg::tostring_rgb"); args.verify_length(0); int row_len = width*3; unsigned char buf_tmp[row_len * height]; agg::rendering_buffer renderingBufferTmp; renderingBufferTmp.attach(buf_tmp, width, height, row_len); color_conv(&renderingBufferTmp, renderingBuffer, agg::color_conv_rgba32_to_rgb24()); //todo: how to do this with native CXX return Py::asObject(Py_BuildValue("s#", buf_tmp, row_len * height)); //len = row_len * height //std::string s(buf_tmp); //return Py::String(buf_tmp, row_len * height); }
//------------------------------------------------------------------------ void pixel_map::draw(int x, int y, double scale) { DEBUG_MTH("pixel_map::draw"); if(m_buf == 0) return; // m_specific->display_pmap(&m_rbuf_window); if (m_sys_format == m_format) { glDrawPixels(width(), height(), m_gl_format, m_gl_pixel_type, m_buf); } else { switch(m_format) { case pix_format_abgr32: color_conv(&m_rbuf_window2, &m_rbuf_window, color_conv_abgr32_to_bgra32()); break; case pix_format_argb32: color_conv(&m_rbuf_window2, &m_rbuf_window, color_conv_argb32_to_bgra32()); break; case pix_format_rgb555: color_conv(&m_rbuf_window2, &m_rbuf_window, color_conv_rgb555_to_rgb565()); break; // case pix_format_rgb565: // case pix_format_rgb24: // case pix_format_bgr24: // case pix_format_rgba32: // case pix_format_bgra32: // case pix_format_gray8: case end_of_pix_formats: case pix_format_undefined: ; } glDrawPixels(width(), height(), m_gl_format, m_gl_pixel_type, m_buf2); } }
//------------------------------------------------------------------------ bool platform_specific::load_pmap(const char* fn, unsigned idx, rendering_buffer* dst) { pixel_map pmap_tmp; if(!pmap_tmp.load_from_bmp(fn)) return false; rendering_buffer rbuf_tmp; rbuf_tmp.attach(pmap_tmp.buf(), pmap_tmp.width(), pmap_tmp.height(), m_flip_y ? pmap_tmp.stride() : -pmap_tmp.stride()); m_pmap_img[idx].create(pmap_tmp.width(), pmap_tmp.height(), org_e(m_bpp), 0); dst->attach(m_pmap_img[idx].buf(), m_pmap_img[idx].width(), m_pmap_img[idx].height(), m_flip_y ? m_pmap_img[idx].stride() : -m_pmap_img[idx].stride()); switch(m_format) { case pix_format_gray8: switch(pmap_tmp.bpp()) { //case 16: color_conv(dst, &rbuf_tmp, color_conv_rgb555_to_gray8()); break; case 24: color_conv(dst, &rbuf_tmp, color_conv_bgr24_to_gray8()); break; //case 32: color_conv(dst, &rbuf_tmp, color_conv_bgra32_to_gray8()); break; } break; case pix_format_gray16: switch(pmap_tmp.bpp()) { //case 16: color_conv(dst, &rbuf_tmp, color_conv_rgb555_to_gray16()); break; case 24: color_conv(dst, &rbuf_tmp, color_conv_bgr24_to_gray16()); break; //case 32: color_conv(dst, &rbuf_tmp, color_conv_bgra32_to_gray16()); break; } break; case pix_format_rgb555: switch(pmap_tmp.bpp()) { case 16: color_conv(dst, &rbuf_tmp, color_conv_rgb555_to_rgb555()); break; case 24: color_conv(dst, &rbuf_tmp, color_conv_bgr24_to_rgb555()); break; case 32: color_conv(dst, &rbuf_tmp, color_conv_bgra32_to_rgb555()); break; } break; case pix_format_rgb565: switch(pmap_tmp.bpp()) { case 16: color_conv(dst, &rbuf_tmp, color_conv_rgb555_to_rgb565()); break; case 24: color_conv(dst, &rbuf_tmp, color_conv_bgr24_to_rgb565()); break; case 32: color_conv(dst, &rbuf_tmp, color_conv_bgra32_to_rgb565()); break; } break; case pix_format_rgb24: switch(pmap_tmp.bpp()) { case 16: color_conv(dst, &rbuf_tmp, color_conv_rgb555_to_rgb24()); break; case 24: color_conv(dst, &rbuf_tmp, color_conv_bgr24_to_rgb24()); break; case 32: color_conv(dst, &rbuf_tmp, color_conv_bgra32_to_rgb24()); break; } break; case pix_format_bgr24: switch(pmap_tmp.bpp()) { case 16: color_conv(dst, &rbuf_tmp, color_conv_rgb555_to_bgr24()); break; case 24: color_conv(dst, &rbuf_tmp, color_conv_bgr24_to_bgr24()); break; case 32: color_conv(dst, &rbuf_tmp, color_conv_bgra32_to_bgr24()); break; } break; case pix_format_rgb48: switch(pmap_tmp.bpp()) { //case 16: color_conv(dst, &rbuf_tmp, color_conv_rgb555_to_rgb48()); break; case 24: color_conv(dst, &rbuf_tmp, color_conv_bgr24_to_rgb48()); break; //case 32: color_conv(dst, &rbuf_tmp, color_conv_bgra32_to_rgb48()); break; } break; case pix_format_bgr48: switch(pmap_tmp.bpp()) { //case 16: color_conv(dst, &rbuf_tmp, color_conv_rgb555_to_bgr48()); break; case 24: color_conv(dst, &rbuf_tmp, color_conv_bgr24_to_bgr48()); break; //case 32: color_conv(dst, &rbuf_tmp, color_conv_bgra32_to_bgr48()); break; } break; case pix_format_abgr32: switch(pmap_tmp.bpp()) { case 16: color_conv(dst, &rbuf_tmp, color_conv_rgb555_to_abgr32()); break; case 24: color_conv(dst, &rbuf_tmp, color_conv_bgr24_to_abgr32()); break; case 32: color_conv(dst, &rbuf_tmp, color_conv_bgra32_to_abgr32()); break; } break; case pix_format_argb32: switch(pmap_tmp.bpp()) { case 16: color_conv(dst, &rbuf_tmp, color_conv_rgb555_to_argb32()); break; case 24: color_conv(dst, &rbuf_tmp, color_conv_bgr24_to_argb32()); break; case 32: color_conv(dst, &rbuf_tmp, color_conv_bgra32_to_argb32()); break; } break; case pix_format_bgra32: switch(pmap_tmp.bpp()) { case 16: color_conv(dst, &rbuf_tmp, color_conv_rgb555_to_bgra32()); break; case 24: color_conv(dst, &rbuf_tmp, color_conv_bgr24_to_bgra32()); break; case 32: color_conv(dst, &rbuf_tmp, color_conv_bgra32_to_bgra32()); break; } break; case pix_format_rgba32: switch(pmap_tmp.bpp()) { case 16: color_conv(dst, &rbuf_tmp, color_conv_rgb555_to_rgba32()); break; case 24: color_conv(dst, &rbuf_tmp, color_conv_bgr24_to_rgba32()); break; case 32: color_conv(dst, &rbuf_tmp, color_conv_bgra32_to_rgba32()); break; } break; case pix_format_abgr64: switch(pmap_tmp.bpp()) { //case 16: color_conv(dst, &rbuf_tmp, color_conv_rgb555_to_abgr64()); break; case 24: color_conv(dst, &rbuf_tmp, color_conv_bgr24_to_abgr64()); break; //case 32: color_conv(dst, &rbuf_tmp, color_conv_bgra32_to_abgr64()); break; } break; case pix_format_argb64: switch(pmap_tmp.bpp()) { //case 16: color_conv(dst, &rbuf_tmp, color_conv_rgb555_to_argb64()); break; case 24: color_conv(dst, &rbuf_tmp, color_conv_bgr24_to_argb64()); break; //case 32: color_conv(dst, &rbuf_tmp, color_conv_bgra32_to_argb64()); break; } break; case pix_format_bgra64: switch(pmap_tmp.bpp()) { //case 16: color_conv(dst, &rbuf_tmp, color_conv_rgb555_to_bgra64()); break; case 24: color_conv(dst, &rbuf_tmp, color_conv_bgr24_to_bgra64()); break; //case 32: color_conv(dst, &rbuf_tmp, color_conv_bgra32_to_bgra64()); break; } break; case pix_format_rgba64: switch(pmap_tmp.bpp()) { //case 16: color_conv(dst, &rbuf_tmp, color_conv_rgb555_to_rgba64()); break; case 24: color_conv(dst, &rbuf_tmp, color_conv_bgr24_to_rgba64()); break; //case 32: color_conv(dst, &rbuf_tmp, color_conv_bgra32_to_rgba64()); break; } break; } return true; }
//------------------------------------------------------------------------ static void convert_pmap(rendering_buffer* dst, const rendering_buffer* src, pix_format_e format) { switch(format) { case pix_format_gray8: break; case pix_format_gray16: color_conv(dst, src, color_conv_gray16_to_gray8()); break; case pix_format_rgb565: color_conv(dst, src, color_conv_rgb565_to_rgb555()); break; case pix_format_rgbAAA: color_conv(dst, src, color_conv_rgbAAA_to_bgr24()); break; case pix_format_bgrAAA: color_conv(dst, src, color_conv_bgrAAA_to_bgr24()); break; case pix_format_rgbBBA: color_conv(dst, src, color_conv_rgbBBA_to_bgr24()); break; case pix_format_bgrABB: color_conv(dst, src, color_conv_bgrABB_to_bgr24()); break; case pix_format_rgb24: color_conv(dst, src, color_conv_rgb24_to_bgr24()); break; case pix_format_rgb48: color_conv(dst, src, color_conv_rgb48_to_bgr24()); break; case pix_format_bgr48: color_conv(dst, src, color_conv_bgr48_to_bgr24()); break; case pix_format_abgr32: color_conv(dst, src, color_conv_abgr32_to_bgra32()); break; case pix_format_argb32: color_conv(dst, src, color_conv_argb32_to_bgra32()); break; case pix_format_rgba32: color_conv(dst, src, color_conv_rgba32_to_bgra32()); break; case pix_format_bgra64: color_conv(dst, src, color_conv_bgra64_to_bgra32()); break; case pix_format_abgr64: color_conv(dst, src, color_conv_abgr64_to_bgra32()); break; case pix_format_argb64: color_conv(dst, src, color_conv_argb64_to_bgra32()); break; case pix_format_rgba64: color_conv(dst, src, color_conv_rgba64_to_bgra32()); break; } }
void window::put_image(const agg::rendering_buffer* src,agg::pix_format_e format) { if(ximg == 0) return; if(format == env.sys_format) { //ximg->data = (char*)src->buf(); //ximg->width = src->width(), //ximg->height = src->height(), //ximg->bytes_per_line = (src->stride()); Display* pd = env; Drawable dw = hwnd; GC pgc = gc; XPutImage(pd, dw, pgc, ximg, 0, 0, 0, 0, ximg->width, ximg->height); return; } int row_len = src->width() * env.sys_bpp / 8; unsigned char* buf_tmp = new unsigned char[row_len * src->height()]; agg::rendering_buffer rbuf_tmp; rbuf_tmp.attach(buf_tmp, src->width(), src->height(), row_len); switch(env.sys_format) { default: break; case agg::pix_format_rgb555: switch(format) { default: break; case agg::pix_format_rgb555: color_conv(&rbuf_tmp, src, agg::color_conv_rgb555_to_rgb555()); break; case agg::pix_format_rgb565: color_conv(&rbuf_tmp, src, agg::color_conv_rgb565_to_rgb555()); break; case agg::pix_format_rgb24: color_conv(&rbuf_tmp, src, agg::color_conv_rgb24_to_rgb555()); break; case agg::pix_format_bgr24: color_conv(&rbuf_tmp, src, agg::color_conv_bgr24_to_rgb555()); break; case agg::pix_format_rgba32: color_conv(&rbuf_tmp, src, agg::color_conv_rgba32_to_rgb555()); break; case agg::pix_format_argb32: color_conv(&rbuf_tmp, src, agg::color_conv_argb32_to_rgb555()); break; case agg::pix_format_bgra32: color_conv(&rbuf_tmp, src, agg::color_conv_bgra32_to_rgb555()); break; case agg::pix_format_abgr32: color_conv(&rbuf_tmp, src, agg::color_conv_abgr32_to_rgb555()); break; } break; case agg::pix_format_rgb565: switch(format) { default: break; case agg::pix_format_rgb555: color_conv(&rbuf_tmp, src, agg::color_conv_rgb555_to_rgb565()); break; case agg::pix_format_rgb565: color_conv(&rbuf_tmp, src, agg::color_conv_rgb565_to_rgb565()); break; case agg::pix_format_rgb24: color_conv(&rbuf_tmp, src, agg::color_conv_rgb24_to_rgb565()); break; case agg::pix_format_bgr24: color_conv(&rbuf_tmp, src, agg::color_conv_bgr24_to_rgb565()); break; case agg::pix_format_rgba32: color_conv(&rbuf_tmp, src, agg::color_conv_rgba32_to_rgb565()); break; case agg::pix_format_argb32: color_conv(&rbuf_tmp, src, agg::color_conv_argb32_to_rgb565()); break; case agg::pix_format_bgra32: color_conv(&rbuf_tmp, src, agg::color_conv_bgra32_to_rgb565()); break; case agg::pix_format_abgr32: color_conv(&rbuf_tmp, src, agg::color_conv_abgr32_to_rgb565()); break; } break; case agg::pix_format_rgba32: switch(format) { default: break; case agg::pix_format_rgb555: color_conv(&rbuf_tmp, src, agg::color_conv_rgb555_to_rgba32()); break; case agg::pix_format_rgb565: color_conv(&rbuf_tmp, src, agg::color_conv_rgb565_to_rgba32()); break; case agg::pix_format_rgb24: color_conv(&rbuf_tmp, src, agg::color_conv_rgb24_to_rgba32()); break; case agg::pix_format_bgr24: color_conv(&rbuf_tmp, src, agg::color_conv_bgr24_to_rgba32()); break; case agg::pix_format_rgba32: color_conv(&rbuf_tmp, src, agg::color_conv_rgba32_to_rgba32()); break; case agg::pix_format_argb32: color_conv(&rbuf_tmp, src, agg::color_conv_argb32_to_rgba32()); break; case agg::pix_format_bgra32: color_conv(&rbuf_tmp, src, agg::color_conv_bgra32_to_rgba32()); break; case agg::pix_format_abgr32: color_conv(&rbuf_tmp, src, agg::color_conv_abgr32_to_rgba32()); break; } break; case agg::pix_format_abgr32: switch(format) { default: break; case agg::pix_format_rgb555: color_conv(&rbuf_tmp, src, agg::color_conv_rgb555_to_abgr32()); break; case agg::pix_format_rgb565: color_conv(&rbuf_tmp, src, agg::color_conv_rgb565_to_abgr32()); break; case agg::pix_format_rgb24: color_conv(&rbuf_tmp, src, agg::color_conv_rgb24_to_abgr32()); break; case agg::pix_format_bgr24: color_conv(&rbuf_tmp, src, agg::color_conv_bgr24_to_abgr32()); break; case agg::pix_format_abgr32: color_conv(&rbuf_tmp, src, agg::color_conv_abgr32_to_abgr32()); break; case agg::pix_format_rgba32: color_conv(&rbuf_tmp, src, agg::color_conv_rgba32_to_abgr32()); break; case agg::pix_format_argb32: color_conv(&rbuf_tmp, src, agg::color_conv_argb32_to_abgr32()); break; case agg::pix_format_bgra32: color_conv(&rbuf_tmp, src, agg::color_conv_bgra32_to_abgr32()); break; } break; case agg::pix_format_argb32: switch(format) { default: break; case agg::pix_format_rgb555: color_conv(&rbuf_tmp, src, agg::color_conv_rgb555_to_argb32()); break; case agg::pix_format_rgb565: color_conv(&rbuf_tmp, src, agg::color_conv_rgb565_to_argb32()); break; case agg::pix_format_rgb24: color_conv(&rbuf_tmp, src, agg::color_conv_rgb24_to_argb32()); break; case agg::pix_format_bgr24: color_conv(&rbuf_tmp, src, agg::color_conv_bgr24_to_argb32()); break; case agg::pix_format_rgba32: color_conv(&rbuf_tmp, src, agg::color_conv_rgba32_to_argb32()); break; case agg::pix_format_argb32: color_conv(&rbuf_tmp, src, agg::color_conv_argb32_to_argb32()); break; case agg::pix_format_abgr32: color_conv(&rbuf_tmp, src, agg::color_conv_abgr32_to_argb32()); break; case agg::pix_format_bgra32: color_conv(&rbuf_tmp, src, agg::color_conv_bgra32_to_argb32()); break; } break; case agg::pix_format_bgra32: switch(format) { default: break; case agg::pix_format_rgb555: color_conv(&rbuf_tmp, src, agg::color_conv_rgb555_to_bgra32()); break; case agg::pix_format_rgb565: color_conv(&rbuf_tmp, src, agg::color_conv_rgb565_to_bgra32()); break; case agg::pix_format_rgb24: color_conv(&rbuf_tmp, src, agg::color_conv_rgb24_to_bgra32()); break; case agg::pix_format_bgr24: color_conv(&rbuf_tmp, src, agg::color_conv_bgr24_to_bgra32()); break; case agg::pix_format_rgba32: color_conv(&rbuf_tmp, src, agg::color_conv_rgba32_to_bgra32()); break; case agg::pix_format_argb32: color_conv(&rbuf_tmp, src, agg::color_conv_argb32_to_bgra32()); break; case agg::pix_format_abgr32: color_conv(&rbuf_tmp, src, agg::color_conv_abgr32_to_bgra32()); break; case agg::pix_format_bgra32: color_conv(&rbuf_tmp, src, agg::color_conv_bgra32_to_bgra32()); break; } break; } ximg->data = (char*)buf_tmp; ximg->width = src->width(), ximg->height = src->height(), XPutImage(env, hwnd, gc, ximg, 0, 0, 0, 0, src->width(), src->height()); delete [] buf_tmp; }
//------------------------------------------------------------------------ bool platform_specific::load_img(const char* file, unsigned idx, rendering_buffer* rbuf) { if ( m_img_bitmaps[idx] != 0 ) { IP96->p96FreeBitMap(m_img_bitmaps[idx]); m_img_bitmaps[idx] = 0; } bool result = false; Object* picture = IDataTypes->NewDTObject(const_cast<STRPTR>(file), DTA_GroupID, GID_PICTURE, PDTA_DestMode, PMODE_V43, PDTA_Remap, FALSE, TAG_END); if ( picture != 0 ) { gpLayout layout; layout.MethodID = DTM_PROCLAYOUT; layout.gpl_GInfo = 0; layout.gpl_Initial = 1; ULONG loaded = IDataTypes->DoDTMethodA(picture, 0, 0, reinterpret_cast<Msg>(&layout)); if ( loaded != 0 ) { BitMap* src_bitmap = 0; IDataTypes->GetDTAttrs(picture, PDTA_ClassBitMap, &src_bitmap, TAG_END); bool supported = false; RGBFTYPE ftype = static_cast<RGBFTYPE>(IP96->p96GetBitMapAttr( src_bitmap, P96BMA_RGBFORMAT)); switch ( ftype ) { case RGBFB_R8G8B8: supported = true; break; default: m_support.message("File uses unsupported graphics mode."); break; } if ( supported ) { uint16 width = IP96->p96GetBitMapAttr(src_bitmap, P96BMA_WIDTH); uint16 height = IP96->p96GetBitMapAttr(src_bitmap, P96BMA_HEIGHT); m_img_bitmaps[idx] = IP96->p96AllocBitMap(width, height, m_bpp, BMF_USERPRIVATE, 0, m_ftype); if ( m_img_bitmaps[idx] != 0 ) { int8u* buf = reinterpret_cast<int8u*>( IP96->p96GetBitMapAttr(m_img_bitmaps[idx], P96BMA_MEMORY)); int bpr = IP96->p96GetBitMapAttr(m_img_bitmaps[idx], P96BMA_BYTESPERROW); int stride = (m_flip_y) ? -bpr : bpr; rbuf->attach(buf, width, height, stride); // P96 sets the alpha to zero so it can't be used to // color convert true color modes. if ( m_bpp == 32 ) { RenderInfo ri; int32 lock = IP96->p96LockBitMap(src_bitmap, reinterpret_cast<uint8*>(&ri), sizeof(RenderInfo)); rendering_buffer rbuf_src; rbuf_src.attach( reinterpret_cast<int8u*>(ri.Memory), width, height, (m_flip_y) ? -ri.BytesPerRow : ri.BytesPerRow); switch ( m_format ) { case pix_format_bgra32: color_conv(rbuf, &rbuf_src, color_conv_rgb24_to_bgra32()); break; case pix_format_abgr32: color_conv(rbuf, &rbuf_src, color_conv_rgb24_to_abgr32()); break; case pix_format_argb32: color_conv(rbuf, &rbuf_src, color_conv_rgb24_to_argb32()); break; case pix_format_rgba32: color_conv(rbuf, &rbuf_src, color_conv_rgb24_to_rgba32()); break; } IP96->p96UnlockBitMap(src_bitmap, lock); } else { IGraphics->BltBitMap(src_bitmap, 0, 0, m_img_bitmaps[idx], 0, 0, width, height, ABC|ABNC, 0xFF, 0); } result = true; } } } } IGraphics->WaitBlit(); IDataTypes->DisposeDTObject(picture); return result; }
void platform_specific::display_pmap(Window dc, const rendering_buffer* rbuf) { DEBUG_MTH("platform_specific::display_map"); if (m_format == m_sys_format) { if (m_ximage == 0) { m_ximage = x11.create_image(rbuf); m_ximage->byte_order = m_byte_order; } x11.put_image(dc, m_ximage); return; } // Optimization hint: make pmap_tmp as a private class member and reused it when possible. pixel_map pmap_tmp(rbuf->width(), rbuf->height(), m_sys_format, 256, m_flip_y); rendering_buffer* rbuf2 = &pmap_tmp.rbuf(); switch(m_sys_format) { case pix_format_rgb555: switch(m_format) { case pix_format_rgb555: color_conv(rbuf2, rbuf, color_conv_rgb555_to_rgb555()); break; case pix_format_rgb565: color_conv(rbuf2, rbuf, color_conv_rgb565_to_rgb555()); break; case pix_format_rgb24: color_conv(rbuf2, rbuf, color_conv_rgb24_to_rgb555()); break; case pix_format_bgr24: color_conv(rbuf2, rbuf, color_conv_bgr24_to_rgb555()); break; case pix_format_rgba32: color_conv(rbuf2, rbuf, color_conv_rgba32_to_rgb555()); break; case pix_format_argb32: color_conv(rbuf2, rbuf, color_conv_argb32_to_rgb555()); break; case pix_format_bgra32: color_conv(rbuf2, rbuf, color_conv_bgra32_to_rgb555()); break; case pix_format_abgr32: color_conv(rbuf2, rbuf, color_conv_abgr32_to_rgb555()); break; UNHANDLED_PIX_FORMATS; } break; case pix_format_rgb565: switch(m_format) { case pix_format_rgb555: color_conv(rbuf2, rbuf, color_conv_rgb555_to_rgb565()); break; case pix_format_rgb565: color_conv(rbuf2, rbuf, color_conv_rgb565_to_rgb565()); break; case pix_format_rgb24: color_conv(rbuf2, rbuf, color_conv_rgb24_to_rgb565()); break; case pix_format_bgr24: color_conv(rbuf2, rbuf, color_conv_bgr24_to_rgb565()); break; case pix_format_rgba32: color_conv(rbuf2, rbuf, color_conv_rgba32_to_rgb565()); break; case pix_format_argb32: color_conv(rbuf2, rbuf, color_conv_argb32_to_rgb565()); break; case pix_format_bgra32: color_conv(rbuf2, rbuf, color_conv_bgra32_to_rgb565()); break; case pix_format_abgr32: color_conv(rbuf2, rbuf, color_conv_abgr32_to_rgb565()); break; UNHANDLED_PIX_FORMATS; } break; case pix_format_rgba32: switch(m_format) { case pix_format_rgb555: color_conv(rbuf2, rbuf, color_conv_rgb555_to_rgba32()); break; case pix_format_rgb565: color_conv(rbuf2, rbuf, color_conv_rgb565_to_rgba32()); break; case pix_format_rgb24: color_conv(rbuf2, rbuf, color_conv_rgb24_to_rgba32()); break; case pix_format_bgr24: color_conv(rbuf2, rbuf, color_conv_bgr24_to_rgba32()); break; case pix_format_rgba32: color_conv(rbuf2, rbuf, color_conv_rgba32_to_rgba32()); break; case pix_format_argb32: color_conv(rbuf2, rbuf, color_conv_argb32_to_rgba32()); break; case pix_format_bgra32: color_conv(rbuf2, rbuf, color_conv_bgra32_to_rgba32()); break; case pix_format_abgr32: color_conv(rbuf2, rbuf, color_conv_abgr32_to_rgba32()); break; UNHANDLED_PIX_FORMATS; } break; case pix_format_abgr32: switch(m_format) { case pix_format_rgb555: color_conv(rbuf2, rbuf, color_conv_rgb555_to_abgr32()); break; case pix_format_rgb565: color_conv(rbuf2, rbuf, color_conv_rgb565_to_abgr32()); break; case pix_format_rgb24: color_conv(rbuf2, rbuf, color_conv_rgb24_to_abgr32()); break; case pix_format_bgr24: color_conv(rbuf2, rbuf, color_conv_bgr24_to_abgr32()); break; case pix_format_abgr32: color_conv(rbuf2, rbuf, color_conv_abgr32_to_abgr32()); break; case pix_format_rgba32: color_conv(rbuf2, rbuf, color_conv_rgba32_to_abgr32()); break; case pix_format_argb32: color_conv(rbuf2, rbuf, color_conv_argb32_to_abgr32()); break; case pix_format_bgra32: color_conv(rbuf2, rbuf, color_conv_bgra32_to_abgr32()); break; UNHANDLED_PIX_FORMATS; } break; case pix_format_argb32: switch(m_format) { case pix_format_rgb555: color_conv(rbuf2, rbuf, color_conv_rgb555_to_argb32()); break; case pix_format_rgb565: color_conv(rbuf2, rbuf, color_conv_rgb565_to_argb32()); break; case pix_format_rgb24: color_conv(rbuf2, rbuf, color_conv_rgb24_to_argb32()); break; case pix_format_bgr24: color_conv(rbuf2, rbuf, color_conv_bgr24_to_argb32()); break; case pix_format_rgba32: color_conv(rbuf2, rbuf, color_conv_rgba32_to_argb32()); break; case pix_format_argb32: color_conv(rbuf2, rbuf, color_conv_argb32_to_argb32()); break; case pix_format_abgr32: color_conv(rbuf2, rbuf, color_conv_abgr32_to_argb32()); break; case pix_format_bgra32: color_conv(rbuf2, rbuf, color_conv_bgra32_to_argb32()); break; UNHANDLED_PIX_FORMATS; } break; case pix_format_bgra32: switch(m_format) { case pix_format_rgb555: color_conv(rbuf2, rbuf, color_conv_rgb555_to_bgra32()); break; case pix_format_rgb565: color_conv(rbuf2, rbuf, color_conv_rgb565_to_bgra32()); break; case pix_format_rgb24: color_conv(rbuf2, rbuf, color_conv_rgb24_to_bgra32()); break; case pix_format_bgr24: color_conv(rbuf2, rbuf, color_conv_bgr24_to_bgra32()); break; case pix_format_rgba32: color_conv(rbuf2, rbuf, color_conv_rgba32_to_bgra32()); break; case pix_format_argb32: color_conv(rbuf2, rbuf, color_conv_argb32_to_bgra32()); break; case pix_format_abgr32: color_conv(rbuf2, rbuf, color_conv_abgr32_to_bgra32()); break; case pix_format_bgra32: color_conv(rbuf2, rbuf, color_conv_bgra32_to_bgra32()); break; UNHANDLED_PIX_FORMATS; } break; UNHANDLED_PIX_FORMATS; } pmap_tmp.draw(dc); }
//------------------------------------------------------------------------ bool platform_support::load_img(unsigned idx, const char* file) { if (idx < max_images) { char path[B_PATH_NAME_LENGTH]; sprintf(path, "%s/%s%s", m_specific->fAppPath, file, img_ext()); BBitmap* transBitmap = BTranslationUtils::GetBitmap(path); if (transBitmap && transBitmap->IsValid()) { if(transBitmap->ColorSpace() != B_RGB32 && transBitmap->ColorSpace() != B_RGBA32) { // ups we got a smart ass Translator making our live harder delete transBitmap; return false; } color_space format = B_RGB24; switch (m_format) { case pix_format_gray8: format = B_GRAY8; break; case pix_format_rgb555: format = B_RGB15; break; case pix_format_rgb565: format = B_RGB16; break; case pix_format_rgb24: format = B_RGB24_BIG; break; case pix_format_bgr24: format = B_RGB24; break; case pix_format_abgr32: case pix_format_argb32: case pix_format_bgra32: format = B_RGB32; break; case pix_format_rgba32: format = B_RGB32_BIG; break; } BBitmap* bitmap = new (nothrow) BBitmap(transBitmap->Bounds(), 0, format); if (!bitmap || !bitmap->IsValid()) { fprintf(stderr, "failed to allocate temporary bitmap!\n"); delete transBitmap; delete bitmap; return false; } delete m_specific->fImages[idx]; rendering_buffer rbuf_tmp; attach_buffer_to_BBitmap(rbuf_tmp, transBitmap, m_flip_y); m_specific->fImages[idx] = bitmap; attach_buffer_to_BBitmap(m_rbuf_img[idx], bitmap, m_flip_y); rendering_buffer* dst = &m_rbuf_img[idx]; switch(m_format) { case pix_format_gray8: return false; // color_conv(dst, &rbuf_tmp, color_conv_bgra32_to_gray8()); break; break; case pix_format_rgb555: color_conv(dst, &rbuf_tmp, color_conv_bgra32_to_rgb555()); break; break; case pix_format_rgb565: color_conv(dst, &rbuf_tmp, color_conv_bgra32_to_rgb565()); break; break; case pix_format_rgb24: color_conv(dst, &rbuf_tmp, color_conv_bgra32_to_rgb24()); break; break; case pix_format_bgr24: color_conv(dst, &rbuf_tmp, color_conv_bgra32_to_bgr24()); break; break; case pix_format_abgr32: color_conv(dst, &rbuf_tmp, color_conv_bgra32_to_abgr32()); break; break; case pix_format_argb32: color_conv(dst, &rbuf_tmp, color_conv_bgra32_to_argb32()); break; break; case pix_format_bgra32: color_conv(dst, &rbuf_tmp, color_conv_bgra32_to_bgra32()); break; break; case pix_format_rgba32: color_conv(dst, &rbuf_tmp, color_conv_bgra32_to_rgba32()); break; break; } delete transBitmap; return true; } else { fprintf(stderr, "failed to load bitmap: '%s'\n", full_file_name(file)); } } return false; }