C
画像デコーダーの統合
概要
Qt Quick Ultraliteが知らないカスタムフォーマットの画像アセットのために、画像デコーダーは、これらの画像をデコードできるようにする簡単な実装APIを提供します。Qt Quick Ultraliteエンジンは、画像フォーマットに応じて適切なデコーダを自動的に選択します。
画像は、前処理やプロジェクト内での宣言なしにSDカードから読み込むことができます。アセットがFlashに保存されているかSDカードに保存されているかにかかわらず、実装するAPIは1つだけです。
カスタム画像デコーダーは、アセットがユースケースに特化したフォーマットで保存される場合に便利です。デコードは実装者の完全な制御下にあり、デバイスで利用可能なハードウェア・アクセラレーションを利用することができます。
任意の画像フォーマットを読み込むには、初期化段階で画像デコーダーの実装をアプリケーションに登録する必要があります。リソースまたはディスク(file://)からの画像が表示されるたびに、Qt Quick Ultraliteは、その画像がビルトインのアセットフォーマットを持っているかどうかをチェックします。そうでない場合、登録されているすべての画像デコーダが使用され、登録された順に画像がデコードされます。画像をデコードできると報告された最初のデコーダが使用されます。リソースにデコード可能な画像がある場合、Qul::initPlatform()を呼び出す前に、デコーダの登録を行う必要があります。
Qt Quick Ultralite 用の画像デコーダーの実装
カスタム画像デコーダは、Qul::PlatformInterface::ImageDecoder クラスを実装する必要があります。加速ハードウェア JPEG デコーダーの実装例は、imagedecoder の例にあります。
次のコードは、このクラスの実装例を示しています:
class MyDecoder : public Qul::PlatformInterface::ImageDecoder
{
public:
bool imageInformation(RequestDataCallback &callback,
int16_t *width,
int16_t *height,
Qul::PixelFormat *actualPixelFormat,
Qul::PixelFormat optimalOpaquePixelFormat,
Qul::PixelFormat optimalAlphaPixelFormat);
int decodeImage(RequestDataCallback &callback,
unsigned char *outbuffer,
uint32_t outbufferSize,
Qul::PixelFormat pixelFormat,
uint32_t requiredBytesPerLine);
}bool MyDecoder::imageInformation(RequestDataCallback &callback,
int16_t *width,
int16_t *height,
Qul::PixelFormat *actualPixelFormat,
Qul::PixelFormat optimalOpaquePixelFormat,
Qul::PixelFormat optimalAlphaPixelFormat)
{
unsigned char buffer[1024];
uint32_t offset 0; // Start from beginning of the file
callback.read(buffer, offset, 8)
// Check if this decoder is able to decode the image
if (buffer[0] != 0x89 || buffer[1] != 0x50 … ) { // PNG format header: 89 50 4E 47 0D 0A 1A 0A
return false; // Return early when the format is unknown
}
// Read more data from the image to determine the size and pixel format.
callback.read(buffer, offset, sizeof(buffer))
*width = getImageWidth(buffer);
*height = getImageHeight(buffer);
*actualPixelFormat = getOptimalImageFormat(buffer, optimalOpaquePixelFormat, optimalAlphaPixelFormat);
return true;
}int MyDecoder::decodeImage(RequestDataCallback &callback,
unsigned char *outbuffer,
uint32_t outbufferSize,
Qul::PixelFormat pixelFormat,
uint32_t requiredBytesPerLine)
{
unsigned char *allocatedBuffer = NULL;
allocatedBuffer = callback.rawData();
if (!allocatedBuffer) {
// The data is not in addressable memory and might need to be fetched
uint32_t bufferSize = callback.totalAvailableDataSize();
allocatedBuffer = (unsigned char *) Qul::Platform::qul_malloc(bufferSize);
callback.readData(allocatedBuffer, 0, bufferSize);
}
hardware_decode(allocatedBuffer, bufferSize, outbuffer, outbufferSize);
Qul::Platform::qul_free(allocatedBuffer);
return 0;
}実装された画像デコーダーをQt Quick Ultralite に知らせるには、アプリケーションに登録する必要があります。
static MyDecoder decoder;
Qul::Application::addImageDecoder(&decoder);特定の Qt ライセンスの下で利用可能です。
詳細をご覧ください。