Мне нужно написать некоторый код, который будет работать с рядом форматов пикселей (например, A8R8G8B8, R8G8B8, R5G6B6 и даже потенциально с плавающей запятой).
В идеале я бы не хотел писать каждыйфункция для каждого формата, поскольку это огромное количество практически идентичного кода.
Единственное, о чем я мог подумать, это какой-то интерфейс, позволяющий ему работать с преобразованиями в пиксельных форматах, например:
class IBitmap
{
public:
virtual unsigned getPixel(unsigned x, unsigned y)const=0;
virtual void setPixel(unsigned x, unsigned y, unsigned argb)=0;
virtual unsigned getWidth()const=0;
virtual unsigned getHeight()const=0;
};
Однако вызов виртуальной функции для каждой операции получения или установки пикселя вряд ли является быстрым, поскольку он не только требует дополнительных затрат на виртуальный вызов, но и, что гораздо важнее, предотвращает встраивание чего-то, что занимает всего несколько инструкций.
Есть ли другие варианты, которые позволили бы мне эффективно поддерживать все эти форматы?Вообще говоря, мой код, скорее всего, будет работать только с небольшой частью растрового изображения, и во многих случаях ему нужен доступ для чтения / записи (смешивание).