Example #1
0
bool SpriteLoaderPNG::LoadSprite(SpriteLoader::Sprite *sprite, uint8 file_slot, size_t file_pos, SpriteType sprite_type)
{
	const char *filename = FioGetFilename(file_slot);
	if (!LoadPNG(sprite, filename, (uint32)file_pos, false)) return false;
	if (!LoadPNG(sprite, filename, (uint32)file_pos, true)) return false;
	return true;
}
Example #2
0
/*!
 * \brief
 * Load image file (8-bit BMP or PNG)
 *
 * \param filename
 * File name with the image
 *
 * \returns
 * Handler to the loaded image or NULL if error
 *
 * \see
 * TLN_DeleteBitmap()
 */
TLN_Bitmap TLN_LoadBitmap (char *filename)
{
    TLN_Bitmap bitmap;

    if (!CheckFile (filename))
    {
        TLN_SetLastError (TLN_ERR_FILE_NOT_FOUND);
        return NULL;
    }

    /* try png, else bmp*/
    bitmap = LoadPNG (filename);
    if (bitmap == NULL)
        bitmap = LoadBMP (filename);

    /* bitmap loaded */
    if (bitmap)
    {
        /* accept only 8 bpp */
        int bpp = TLN_GetBitmapDepth (bitmap);
        if (bpp == 8)
            TLN_SetLastError (TLN_ERR_OK);
        else
        {
            TLN_DeleteBitmap (bitmap);
            bitmap = NULL;
        }
    }

    if (!bitmap)
        TLN_SetLastError (TLN_ERR_WRONG_FORMAT);

    return bitmap;
}
Example #3
0
 	TTexture * LoadTexture(const std::string & parImg)
 	{
 		TImgType::Type typeImg = GetImgType(parImg);

 		TTexture * texture = NULL;
	    switch (typeImg)
	    {
	    	case TImgType::PNG:
                texture = LoadPNG(parImg.c_str());
	    	    break;
	    	case TImgType::JPG:
	    	    texture = LoadJPG(parImg.c_str());

	    	    break;
	    	case TImgType::BMP:
	    	    texture = LoadBMP(parImg.c_str());

	    	    break;
	    	case TImgType::TGA:
	    	    texture = NULL;
	    	    break;
    	    default:
    	        ASSERT_FAIL_MSG("Unhandled type "<<parImg);
	    };
	    return texture;
	}
BOOL ReadImage(CImage* pcImage, char* szFilename, EImageType eType)
{
	if (eType == IT_Unknown)
	{
		eType = GuessImageType(szFilename);
	}

	//Oi! Check to make sure none of the below expect an initialised image.
	switch (eType)
	{
		case IT_BMP:
		case IT_EMF:
		case IT_GIF:
		case IT_ICO:
		case IT_JPG:
		case IT_WMF:
			// uses OLE and IPicture to load these image formats.
			return (LoadPictureIPicture(pcImage, szFilename));
		case IT_TGA:
			return (LoadTGA(pcImage, szFilename)); // uses NeHe TGA routines.
		case IT_PNG:
			return (LoadPNG(pcImage, szFilename));
		case IT_RAD:
			return (LoadRAD(pcImage, szFilename)); // uses a text-format RAW descriptor (RAD) file to load a raw file.
		case IT_RAW:
			return (LoadRAW(pcImage, szFilename)); // special case assuming an initialised image.
	}
	return FALSE;
}
Example #5
0
void
UnitSymbol::Load(ResourceId id)
{
#ifdef USE_MEMORY_CANVAS
  assert(IsScreenInitialized());
  assert(buffer.data == nullptr);

  ResourceLoader::Data data = ResourceLoader::Load(id);
  assert(!data.IsNull());

  const UncompressedImage uncompressed = LoadPNG(data.data, data.size);
  assert(uncompressed.GetFormat() == UncompressedImage::Format::GRAY);

  const size_t size = uncompressed.GetPitch() * uncompressed.GetHeight();
  buffer.data = new Luminosity8[size];
  memcpy(buffer.data, uncompressed.GetData(), size);

  buffer.pitch = uncompressed.GetPitch();
  buffer.width = uncompressed.GetWidth();
  buffer.height = uncompressed.GetHeight();
#else
  bitmap.Load(id, Bitmap::Type::MONO);
  size = bitmap.GetSize();
#endif
}
Example #6
0
void convertAndSaveFont()
{
	int fontCharCount = 32 * 3;

	LoadPNG((globalWorkingDirPrefix + "gamefont.png").c_str());
	FILE *out = fopen((globalOutputDirPrefix + "gamefont.bin").c_str(),"wb");
	for (int i = 0; i < fontCharCount; ++i)
	{
		int xi = i % 32;
		int yi = i / 32;
		
		for (int y = 0; y < 8; ++y)
		{
			unsigned char c = 0;
			for (int x = 0; x < 8; ++x)
			{
				int pix = pictureS[(x+xi*8)+(y+yi*8)*pictureWidth];
				if ((pix & 255) > 100)
					c |= 1 << (7-x);
			}
			fwrite(&c,1,1,out);
		}
	}
	fclose(out);
}
Example #7
0
int LoadTexturePNG(char * filename, int index)
{
    
    texture_pointer2 = texture_pointer + index * 1024 * 1024; // 4 MB reserved for PNG index

    // here you can add more textures using 'texture_pointer'. It is returned aligned to 16 bytes
   
	LoadPNG(&Png_datas[index], filename);
    free(Png_datas[index].png_in);

    Png_offset[index] = 0;
       
    if(Png_datas[index].bmp_out) {

        memcpy(texture_pointer2, Png_datas[index].bmp_out, Png_datas[index].wpitch * Png_datas[index].height);
        
        free(Png_datas[index].bmp_out);

        Png_datas[index].bmp_out= texture_pointer2;

        Png_offset[index] = tiny3d_TextureOffset(Png_datas[index].bmp_out);      // get the offset (RSX use offset instead address)

     return 0;
     }

    return -1;
}
Example #8
0
void *ReplaceImageItem(void *pItem, int Type, const char *pImgName, const char *pImgFile, CMapItemImage *pNewImgItem)
{
	if(Type != MAPITEMTYPE_IMAGE)
		return pItem;

	CMapItemImage *pImgItem = (CMapItemImage *)pItem;
	char *pName = (char *)g_DataReader.GetData(pImgItem->m_ImageName);

	if(str_comp(pImgName, pName) != 0)
		return pItem;

	dbg_msg("map_replace_image", "found image '%s'", pImgName);

	CImageInfo ImgInfo;
	if(!LoadPNG(&ImgInfo, pImgFile))
		return 0;

	*pNewImgItem = *pImgItem;

	pNewImgItem->m_Width  = ImgInfo.m_Width;
	pNewImgItem->m_Height = ImgInfo.m_Height;
	int PixelSize = ImgInfo.m_Format == CImageInfo::FORMAT_RGB ? 3 : 4;

	g_NewNameID = pImgItem->m_ImageName;
	IStorage::StripPathAndExtension(pImgFile, g_aNewName, sizeof(g_aNewName));
	g_NewDataID = pImgItem->m_ImageData;
	g_pNewData = ImgInfo.m_pData;
	g_NewDataSize = ImgInfo.m_Width * ImgInfo.m_Height * PixelSize;

	return (void *)pNewImgItem;
}
Example #9
0
 /**
  * ファイルロード[拡張子自動判別]
  * @param filepath  ファイルフルパス 
  * @retval true 成功
  * @retval false 失敗
  */
 bool Load(const char* filename)
 {
     bool result = false;
     m_image.Clear();
     std::string path(filename);
     std::string::size_type pos = path.rfind('.');
     if (pos != std::string::npos)
     {
         const std::string ext = make_lowercase(path.substr(pos+1));
         if (ext == "png")
         {
             result = LoadPNG(path);
         }
         else if (ext == "jpg" || ext == "jpeg")
         {
             result = LoadJPG(path);
         }
         else if (ext == "tga")
         {
             result = LoadTGA(path);
         }
         else if (ext == "hdr")
         {
             result = LoadHDR(path);
         }
         else if (ext == "exr" || ext == "EXR")
         {
             result = LoadEXR(path);
         }
     }
     return result;
 }
Example #10
0
//
// Load a new image from an image file (PPM, JPEG
// and PNG formats are supported).
// Returns NULL on failure.
//
STImage::STImage(const std::string& filename)
    : mWidth(-1)
    , mHeight(-1)
    , mPixels(NULL)
{

    // Determine the right routine based on the file's extension.
    // The format-specific subroutines are each implemented in
    // a different file.
    std::string ext = STGetExtension( filename );
    if (ext.compare("PPM") == 0) {
        LoadPPM(filename);
    }
    else if (ext.compare("PNG") == 0) {
        LoadPNG(filename);
    }
    else if (ext.compare("JPG") == 0 || ext.compare("JPEG") == 0) {
        LoadJPG(filename);
    }
    else {
        fprintf(stderr,
                "STImage::STImage() - Unknown image file type \"%s\".\n",
                filename.c_str());
        throw new std::runtime_error("Error creating STImage");
    } 
}
Example #11
0
bool CGLImageData::LoadTexture(const char *filename)
{
	if (!LoadBMP(filename))
		if(!LoadPNG(filename))
		{
			sLog(DEFAULT_LOG_NAME, LOG_WARNING_EV, "Can't load image->");
			return false;
		}
		else
		{
			if (!MakeTexture())
			{
				sLog(DEFAULT_LOG_NAME, LOG_WARNING_EV, "Can't load texture in video adapter.");
				return false;
			}
		}
	else
	{
		if(!MakeRGBA())
		{
			sLog(DEFAULT_LOG_NAME, LOG_WARNING_EV, "Can't load texture.");
			return false;
		}
		if (!MakeTexture())
		{
			sLog(DEFAULT_LOG_NAME, LOG_WARNING_EV, "Can't load texture in video memory.");
			return false;
		}
	}
	{
		delete [] data;
		data = NULL;
	}
	return true;
}
Example #12
0
bool Texture::Load(const char *filename) {
	// hook for generated textures
	if (!memcmp(filename, "gen:", 4)) {
		// TODO
		// return false;
		tex_ = (LPVOID)generateTexture(filename);
		if (tex_) {
			this->filename_ = filename;
		}
		return true;
	}

	filename_ = filename;
	// Currently contains many Rollerball-specific workarounds.
	// They shouldn't really hurt anything else very much though.
	int len = strlen(filename);
	char fn[256];
	strcpy(fn, filename);
	bool zim = false;
	if (!strcmp("dds", &filename[len-3])) {
		strcpy(&fn[len-3], "zim");
		zim = true;
	}
	if (!strcmp("6TX", &filename[len-3]) || !strcmp("6tx", &filename[len-3])) {
		ILOG("Detected 6TX %s", filename);
		strcpy(&fn[len-3], "zim");
		zim = true;
	}
	for (int i = 0; i < (int)strlen(fn); i++) {
		if (fn[i] == '\\') fn[i] = '/';
	}

	if (fn[0] == 'm') fn[0] = 'M';
	const char *name = fn;
	if (zim && 0 == memcmp(name, "Media/textures/", strlen("Media/textures"))) name += strlen("Media/textures/");
	len = strlen(name);
	#if !defined(USING_GLES2)
	if (!strcmp("png", &name[len-3]) ||
			!strcmp("PNG", &name[len-3])) {
		if (!LoadPNG(fn)) {
			LoadXOR();
			return false;
		} else {
			return true;
		}
	} else
	#endif
	if (!strcmp("zim", &name[len-3])) {
		if (!LoadZIM(name)) {
			LoadXOR();
			return false;
		} else {
			return true;
		}
	}
	LoadXOR();
	return false;
}
Example #13
0
UncompressedImage
LoadPNG(Path path)
{
  FileMapping map(path);
  if (map.error())
    return UncompressedImage();

  return LoadPNG(map.data(), map.size());
}
Example #14
0
Bitmap::Bitmap(ConstBuffer<void> _buffer)
  :
#ifdef ENABLE_OPENGL
#ifdef ANDROID
  id(0),
#endif
  texture(nullptr), interpolation(false)
#else
  buffer(WritableImageBuffer<BitmapPixelTraits>::Empty())
#endif
{
  Load(_buffer);
}

bool
Bitmap::Load(ConstBuffer<void> buffer, Type type)
{
  const UncompressedImage uncompressed = LoadPNG(buffer.data, buffer.size);
  return Load(uncompressed, type);
}

static UncompressedImage
DecompressImageFile(Path path)
{
#ifdef USE_LIBTIFF
  if (path.MatchesExtension(_T(".tif")) || path.MatchesExtension(_T(".tiff")))
    return LoadTiff(path);
#endif

  if (path.MatchesExtension(_T(".png")))
    return LoadPNG(path);

  return LoadJPEGFile(path);
}

bool
Bitmap::LoadFile(Path path)
{
  const UncompressedImage uncompressed = DecompressImageFile(path);
  return uncompressed.IsVisible() && Load(uncompressed);
}
Example #15
0
void Load_PNG()
{

    // datas for PNG from memory

    png1.png_in   = (void *) picture_png_bin;
    png1.png_size = sizeof  (picture_png_bin);

    // load PNG from memory

    LoadPNG(&png1, NULL);

}
Example #16
0
BitmapPNG* LoadPNG(char const *pFilename)
{
	int length;
	uchar* data = gEngfuncs.COM_LoadFile((char*)pFilename, 5, &length);
	if( !data ) { return NULL; }

	MemoryInputStream stream(data,length);
	
	BitmapPNG* pRet = LoadPNG(stream);

	gEngfuncs.COM_FreeFile(data);
	
	return pRet;		
}
Example #17
0
Bitmap::Bitmap(std::string& filepath)
{
    _bitmapData = NULL;
    
    setTransparency(true);
    
    if(LoadPNG(filepath))
    {
        _loaded = true;
    }
    else
    {
        printf("Error: failed to load bitmap at path %s", filepath.c_str());
    }
}
Example #18
0
void CPicture::Load( const char* extension, CDataStream& dataStream )
{	
	if ( strcmp( extension, "dds" ) == 0 )
	{
		LoadDDS( dataStream );
	}
	if ( strcmp( extension, "png" ) == 0 )
	{
		LoadPNG( dataStream );
	}
	else
	{
//		WbLog( "Default",  "Unsupported texture format : %s\n", extension );
	}
}
Example #19
0
/*!
 * \brief
 * Load image file (8-bit BMP or PNG)
 * 
 * \param filename
 * File name with the image
 * 
 * \returns
 * Handler to the loaded image or NULL if error
 * 
 * \see
 * TLN_DeleteBitmap()
 */
TLN_Bitmap TLN_LoadBitmap (char *filename)
{
	char* ext;

	ext = strchr(filename, '.');
	if (ext)
	{
		if (!strcmp (ext, ".png"))
			return LoadPNG (filename);
		if (!strcmp (ext, ".bmp"))
			return LoadBMP (filename);
	}

	return NULL;
}
Example #20
0
hdTexture* hdTextureManager::FindTexture(const char* name, texturetype_t type)
{
    hdTexture	*tex;
    unsigned char	*data;
    unsigned short	width, height;
    unsigned short	bytes;

    if (name == NULL) return NULL;
    if (strlen(name) == 0) return NULL;

    for (int i = 0; i < m_textures->GetItemCount(); i++)
    {
        if (strncmp(m_textures->GetItems()[i]->name, name, kMaxTexturePathSize) == 0)
        {
            return (hdTexture*)m_textures->GetItems()[i];
        }
    }

    hdPrintf("[hdTextureManager] Looking for texture file: %s\n", name);

    if (std::string(name).find(std::string(".tga")) != std::string::npos)
    {

        LoadTGA( name, &data, &width, &height, &bytes );
        if ( data ) {
            tex = this->LoadTexture( name, data, width, height, type, bytes );

            free( data );
            return tex;
        }
    }

    if (std::string(name).find(std::string(".png")) != std::string::npos)
    {
        LoadPNG( name, &data, &width, &height, &bytes );
        if ( data ) {
            tex = this->LoadTexture( name, data, width, height, type, bytes );
#if TARGET_OS_IPHONE == 1 || TARGET_IPHONE_SIMULATOR == 1
            tex->isPremultipliedAlpha = true;
#endif
            free( data );
            return tex;
        }
    }

    hdPrintf("[hdTextureManager] ERROR: could not find texture file: %s\n", name);
    return m_nullTexture;
}
Example #21
0
TTexturePtr LoadFromMemory(TFilePtr& aFile, const char* aLogdata)
{
   LOG_PARAMS(aLogdata);
   if (!ValidateFileHeader(aFile)) {
      LOG_ERROR("Could not load image %s: Invalid file header", aLogdata);
      return TTexturePtr();
   }
   png_structp pngPtr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
   if (pngPtr == nullptr) {
      LOG_ERROR("Could not initialize png read struct for %s", aLogdata);
      return TTexturePtr();
   }
   TTexturePtr result = LoadPNG(aFile, aLogdata, pngPtr);
   png_destroy_read_struct(&pngPtr, nullptr, nullptr);
   return result;
}
Example #22
0
/*****************************************************************************
 * CreateFilter: allocates logo video filter
 *****************************************************************************/
static int CreateFilter( vlc_object_t *p_this )
{
    filter_t *p_filter = (filter_t *)p_this;
    filter_sys_t *p_sys;
    vlc_value_t val;

    /* Allocate structure */
    p_sys = p_filter->p_sys = malloc( sizeof( filter_sys_t ) );
    if( p_sys == NULL )
    {
        msg_Err( p_filter, "out of memory" );
        return VLC_ENOMEM;
    }

    var_Create( p_this, "logo-position", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );
    var_Get( p_this, "logo-position", &val );
    p_sys->pos = val.i_int;
    var_Create( p_this, "logo-x", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );
    var_Get( p_this, "logo-x", &val );
    p_sys->posx = val.i_int;
    var_Create( p_this, "logo-y", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );
    var_Get( p_this, "logo-y", &val );
    p_sys->posy = val.i_int;

    p_sys->b_absolute = VLC_TRUE;
    if( p_sys->posx < 0 || p_sys->posy < 0 )
    {
        p_sys->b_absolute = VLC_FALSE;
        p_sys->posx = 0; p_sys->posy = 0;
    }

    p_sys->p_pic = LoadPNG( p_this );
    if( !p_sys->p_pic )
    {
        free( p_sys );
        return VLC_EGENERIC;
    }

    p_sys->i_width = p_sys->p_pic->p[Y_PLANE].i_visible_pitch;
    p_sys->i_height = p_sys->p_pic->p[Y_PLANE].i_visible_lines;
    p_sys->i_last_date = 0;

    /* Misc init */
    p_filter->pf_sub_filter = Filter;

    return VLC_SUCCESS;
}
Example #23
0
int CNkImage::Load(char* lpszFileName,int width,int height)
{
	SAFE_RELEASE(m_pdds);
	SAFE_DELETE(m_pdds);
	if(m_szFileName != lpszFileName)
		strcpy(m_szFileName,lpszFileName);
	LoadPNG(lpszFileName);
	if(width > 0)
		m_width = width;
	else
		m_width = m_bmpWidth;
	if(height > 0)
		m_height = height;
	else
		m_height = m_bmpHeight;
	return 1;
}
Example #24
0
static void Load() {
  twister = LoadILBMCustom("twister.ilbm", BM_DISPLAYABLE);
  texture = LoadPNG("twister-texture.png", PM_RGB12, MEMF_PUBLIC);
  gradient = LoadPalette("twister-gradient.ilbm");

  {
    BitmapT *_left = LoadILBMCustom("twister-left.ilbm", 0);
    BitmapT *_right = LoadILBMCustom("twister-right.ilbm", 0);

    left[0] = NewSpriteFromBitmap(256, _left, 0, 0);
    left[1] = NewSpriteFromBitmap(256, _left, 16, 0);
    right[0] = NewSpriteFromBitmap(256, _right, 0, 0);
    right[1] = NewSpriteFromBitmap(256, _right, 16, 0);

    DeleteBitmap(_right);
    DeleteBitmap(_left);
  }
}
Example #25
0
UncompressedImage
LoadPNG(const void *data, size_t size)
{
  png_structp png_ptr =
    png_create_read_struct(PNG_LIBPNG_VER_STRING, nullptr, nullptr, nullptr);
  if (png_ptr == nullptr)
    return UncompressedImage::Invalid();

  png_infop info_ptr = png_create_info_struct(png_ptr);
  if (info_ptr == nullptr) {
    png_destroy_read_struct(&png_ptr, nullptr, nullptr);
    return UncompressedImage::Invalid();
  }

  UncompressedImage result = LoadPNG(png_ptr, info_ptr, data, size);
  png_destroy_read_struct(&png_ptr, &info_ptr, nullptr);

  return result;
}
Example #26
0
/*****************************************************************************
 * Create: allocates logo video thread output method
 *****************************************************************************/
static int Create( vlc_object_t *p_this )
{
    vout_thread_t *p_vout = (vout_thread_t *)p_this;
    vout_sys_t *p_sys;
    vlc_value_t val;

    /* Allocate structure */
    p_sys = p_vout->p_sys = malloc( sizeof( vout_sys_t ) );
    if( p_sys == NULL )
    {
        msg_Err( p_vout, "out of memory" );
        return VLC_ENOMEM;
    }

    p_vout->pf_init = Init;
    p_vout->pf_end = End;
    p_vout->pf_manage = NULL;
    p_vout->pf_render = Render;
    p_vout->pf_display = NULL;
    p_vout->pf_control = Control;

    var_Create( p_this, "logo-position", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );
    var_Get( p_this, "logo-position", &val );
    p_sys->pos = val.i_int;
    var_Create( p_this, "logo-x", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );
    var_Get( p_this, "logo-x", &val );
    p_sys->posx = val.i_int;
    var_Create( p_this, "logo-y", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );
    var_Get( p_this, "logo-y", &val );
    p_sys->posy = val.i_int;

    p_sys->p_pic = LoadPNG( p_this );
    if( !p_sys->p_pic )
    {
        free( p_sys );
        return VLC_EGENERIC;
    }

    p_sys->i_width = p_sys->p_pic->p[Y_PLANE].i_visible_pitch;
    p_sys->i_height = p_sys->p_pic->p[Y_PLANE].i_visible_lines;

    return VLC_SUCCESS;
}
Example #27
0
// simple uncompressed RGBA loaders
int CGraphics_OpenGL::LoadTexture(const char *pFilename, int StorageType, int StoreFormat, int Flags)
{
	int l = str_length(pFilename);
	int ID;
	CImageInfo Img;
	
	if(l < 3)
		return -1;
	if(LoadPNG(&Img, pFilename, StorageType))
	{
		if (StoreFormat == CImageInfo::FORMAT_AUTO)
			StoreFormat = Img.m_Format;

		ID = LoadTextureRaw(Img.m_Width, Img.m_Height, Img.m_Format, Img.m_pData, StoreFormat, Flags);
		mem_free(Img.m_pData);
		return ID;
	}
	
	return m_InvalidTexture;
}
	Texture LoadTexture( string name )
	{
		Log("Want to load an image file");
		string ext = split(name, ".", "")[1];
		boost::to_upper(ext);
		Log("Loading an image file of type " + ext);
		if (ext == "BMP")
		{
			return LoadBMP(name);
		}
		else if (ext == "JPEG" || ext == "JPG")
		{
			return LoadJPEG(name);
		}
		else if (ext == "PNG")
		{
			Log("About to load a png");
			return LoadPNG(name);
		}
	}
Example #29
0
void loadBlockTexture()
{
	pic_data PNGData;

	if (LoadPNG("Texture\\BlockTexture.png",&PNGData))
	{
		TextureList.resize(TextureList.size() + 1);

		glGenTextures(1, &TextureList[TextureList.size()-1]);

		glBindTexture(GL_TEXTURE_2D, TextureList[TextureList.size() - 1]);

		glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, PNGData.width, PNGData.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, PNGData.rgba);

		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

		free(PNGData.rgba);
	}
}
Example #30
0
void
UnitSymbol::Load(unsigned id)
{
  assert(IsScreenInitialized());
  assert(buffer.data == nullptr);

  ResourceLoader::Data data = ResourceLoader::Load(id);
  assert(data.first != nullptr);

  const UncompressedImage uncompressed = LoadPNG(data.first, data.second);
  assert(uncompressed.GetFormat() == UncompressedImage::Format::GRAY);

  const size_t size = uncompressed.GetPitch() * uncompressed.GetHeight();
  buffer.data = new Luminosity8[size];
  memcpy(buffer.data, uncompressed.GetData(), size);

  buffer.pitch = uncompressed.GetPitch();
  buffer.width = uncompressed.GetWidth();
  buffer.height = uncompressed.GetHeight();
}