In a large pan over medium heat, melt the butter and add the vegetable oil.
Add the chopped onion and sauté until golden brown.
Stir in the garlic and ginger, cooking for another minute.
Add chicken pieces and cook until they start to brown.
Stir in cardamom, cumin, coriander, garam masala, cayenne pepper, and salt, mixing well to coat the chicken.
Pour in the tomato puree, reduce heat to low, and let simmer for 20 minutes.
Add the heavy cream, stir well, and cook for an additional 10 minutes until the sauce thickens.
Taste and adjust seasoning if necessary.
Garnish with cilantro if desired, and serve hot with rice.