static pdf_gstate * begin_softmask ( fz_context * ctx , pdf_run_processor * pr , softmask_save * save ) {
 pdf_gstate * gstate = pr -> gstate + pr -> gtop ;
 pdf_xobject * softmask = gstate -> softmask ;
 fz_rect mask_bbox ;
 fz_matrix tos_save [ 2 ] , save_ctm ;
 fz_matrix mask_matrix ;
 fz_colorspace * mask_colorspace ;
 save -> softmask = softmask ;
 if ( softmask == NULL ) return gstate ;
 save -> page_resources = gstate -> softmask_resources ;
 save -> ctm = gstate -> softmask_ctm ;
 save_ctm = gstate -> ctm ;
 pdf_xobject_bbox ( ctx , softmask , & mask_bbox ) ;
 pdf_xobject_matrix ( ctx , softmask , & mask_matrix ) ;
 pdf_tos_save ( ctx , & pr -> tos , tos_save ) ;
 if ( gstate -> luminosity ) mask_bbox = fz_infinite_rect ;
 else {
 fz_transform_rect ( & mask_bbox , & mask_matrix ) ;
 fz_transform_rect ( & mask_bbox , & gstate -> softmask_ctm ) ;
 }
 gstate -> softmask = NULL ;
 gstate -> softmask_resources = NULL ;
 gstate -> ctm = gstate -> softmask_ctm ;
 mask_colorspace = pdf_xobject_colorspace ( ctx , softmask ) ;
 if ( gstate -> luminosity && ! mask_colorspace ) mask_colorspace = fz_keep_colorspace ( ctx , fz_device_gray ( ctx ) ) ;
 fz_try ( ctx ) {
 fz_begin_mask ( ctx , pr -> dev , & mask_bbox , gstate -> luminosity , mask_colorspace , gstate -> softmask_bc , & gstate -> fill . color_params ) ;
 pdf_run_xobject ( ctx , pr , softmask , save -> page_resources , & fz_identity , 1 ) ;
 }
 fz_always ( ctx ) fz_drop_colorspace ( ctx , mask_colorspace ) ;
 fz_catch ( ctx ) {
 fz_rethrow_if ( ctx , FZ_ERROR_TRYLATER ) ;
 }
 fz_end_mask ( ctx , pr -> dev ) ;
 pdf_tos_restore ( ctx , & pr -> tos , tos_save ) ;
 gstate = pr -> gstate + pr -> gtop ;
 gstate -> ctm = save_ctm ;
 return gstate ;
 }
static pdf_gstate * begin_softmask ( fz_context * ctx , pdf_run_processor * pr , softmask_save * save ) {
 pdf_gstate * gstate = pr -> gstate + pr -> gtop ;
 pdf_xobject * softmask = gstate -> softmask ;
 fz_rect mask_bbox ;
 fz_matrix tos_save [ 2 ] , save_ctm ;
 fz_matrix mask_matrix ;
 fz_colorspace * mask_colorspace ;
 save -> softmask = softmask ;
 if ( softmask == NULL ) return gstate ;
 save -> page_resources = gstate -> softmask_resources ;
 save -> ctm = gstate -> softmask_ctm ;
 save_ctm = gstate -> ctm ;
 pdf_xobject_bbox ( ctx , softmask , & mask_bbox ) ;
 pdf_xobject_matrix ( ctx , softmask , & mask_matrix ) ;
 pdf_tos_save ( ctx , & pr -> tos , tos_save ) ;
 if ( gstate -> luminosity ) mask_bbox = fz_infinite_rect ;
 else {
 fz_transform_rect ( & mask_bbox , & mask_matrix ) ;
 fz_transform_rect ( & mask_bbox , & gstate -> softmask_ctm ) ;
 }
 gstate -> softmask = NULL ;
 gstate -> softmask_resources = NULL ;
 gstate -> ctm = gstate -> softmask_ctm ;
 mask_colorspace = pdf_xobject_colorspace ( ctx , softmask ) ;
 if ( gstate -> luminosity && ! mask_colorspace ) mask_colorspace = fz_keep_colorspace ( ctx , fz_device_gray ( ctx ) ) ;
 fz_try ( ctx ) {
 fz_begin_mask ( ctx , pr -> dev , & mask_bbox , gstate -> luminosity , mask_colorspace , gstate -> softmask_bc , & gstate -> fill . color_params ) ;
 pdf_run_xobject ( ctx , pr , softmask , save -> page_resources , & fz_identity , 1 ) ;
 }
 fz_always ( ctx ) fz_drop_colorspace ( ctx , mask_colorspace ) ;
 fz_catch ( ctx ) {
 fz_rethrow_if ( ctx , FZ_ERROR_TRYLATER ) ;
 }
 fz_end_mask ( ctx , pr -> dev ) ;
 pdf_tos_restore ( ctx , & pr -> tos , tos_save ) ;
 gstate = pr -> gstate + pr -> gtop ;
 gstate -> ctm = save_ctm ;
 return gstate ;
 }