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:
parent
37b9b3f3cc
commit
823607796b
|
@ -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:
|
||||
|
|
|
@ -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++ )
|
||||
|
|
|
@ -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 );
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue