Additional safety around wks bitmaps

Invalid files can create large problems for unloaded PNG data

Fixes https://gitlab.com/kicad/code/kicad/issues/13801
This commit is contained in:
Seth Hillbrand 2023-02-07 12:07:42 +01:00
parent 37b9b3f3cc
commit 823607796b
6 changed files with 38 additions and 5 deletions

View File

@ -240,7 +240,18 @@ void DRAWING_SHEET_PARSER::Parse( DS_DATA_MODEL* aLayout )
case T_bitmap:
item = new DS_DATA_ITEM_BITMAP( NULL );
parseBitmap( (DS_DATA_ITEM_BITMAP*) item );
aLayout->Append( item );
// Drop invalid bitmaps
if( static_cast<DS_DATA_ITEM_BITMAP*>( item )->m_ImageBitmap->GetOriginalImageData() )
{
aLayout->Append( item );
}
else
{
delete static_cast<DS_DATA_ITEM_BITMAP*>( item )->m_ImageBitmap;
delete item;
}
break;
case T_tbtext:

View File

@ -739,6 +739,9 @@ void DS_DATA_ITEM_BITMAP::SyncDrawItems( DS_DRAW_ITEM_LIST* aCollector, KIGFX::V
m_ImageBitmap->SetPixelSizeIu( pix_size_iu );
}
if( !m_ImageBitmap->GetOriginalImageData() )
return;
m_drawItems.clear();
for( int j = 0; j < m_RepeatCount; j++ )

View File

@ -397,6 +397,10 @@ void DS_DATA_MODEL_IO::format( DS_DATA_ITEM_POLYGONS* aItem, int aNestLevel ) co
void DS_DATA_MODEL_IO::format( DS_DATA_ITEM_BITMAP* aItem, int aNestLevel ) const
{
// Don't save empty images
if( !aItem->m_ImageBitmap->GetOriginalImageData() )
return;
m_out->Print( aNestLevel, "(bitmap" );
m_out->Print( 0, " (name %s)", m_out->Quotew( aItem->m_Name ).c_str() );
formatCoordinate( "pos", aItem->m_Pos );

View File

@ -435,11 +435,14 @@ void DS_DRAW_ITEM_BITMAP::PrintWsItem( const RENDER_SETTINGS* aSettings, const V
const BOX2I DS_DRAW_ITEM_BITMAP::GetBoundingBox() const
{
const DS_DATA_ITEM_BITMAP* bitmap = static_cast<const DS_DATA_ITEM_BITMAP*>( m_peer );
VECTOR2I bm_size = bitmap->m_ImageBitmap->GetSize();
BOX2I bbox;
bbox.SetSize( bm_size );
bbox.SetOrigin( m_pos.x - bm_size.x / 2, m_pos.y - bm_size.y / 2 );
if( bitmap && bitmap->m_ImageBitmap )
{
VECTOR2I bm_size = bitmap->m_ImageBitmap->GetSize();
bbox.SetSize( bm_size );
bbox.SetOrigin( m_pos.x - bm_size.x / 2, m_pos.y - bm_size.y / 2 );
}
return bbox;
}

View File

@ -282,6 +282,13 @@ void KIGFX::DS_PAINTER::draw( const DS_DRAW_ITEM_BITMAP* aItem, int aLayer ) con
VECTOR2D position = aItem->GetPosition();
m_gal->Translate( position );
// If we've failed to read the bitmap data, don't try to draw it
if( !( bitmap && bitmap->m_ImageBitmap
&& bitmap->m_ImageBitmap->GetImageData() ) )
{
return;
}
// When the image scale factor is not 1.0, we need to modify the actual scale
// as the image scale factor is similar to a local zoom
double img_scale = bitmap->m_ImageBitmap->GetScale();

View File

@ -159,7 +159,12 @@ GLuint GL_BITMAP_CACHE::cacheBitmap( const BITMAP_BASE* aBitmap )
{
CACHED_BITMAP bmp;
const wxImage& imgData = *aBitmap->GetOriginalImageData();
const wxImage* imgPtr = aBitmap->GetOriginalImageData();
if( !imgPtr )
return std::numeric_limits< GLuint >::max();
const wxImage& imgData = *imgPtr;
bmp.w = imgData.GetSize().x;
bmp.h = imgData.GetSize().y;