Java互換ライブラリ(5)
yaneSDK3rdの転送ルーチンを実装している部分は、大きく分けて2種類のクラスに分けられると思います。
- ピクセルフォーマットクラス
- 転送用functorクラス
ピクセルフォーマットクラスは、15×15×10もの転送ルーチンを(15+15)×10の転送ルーチンにするためのロジックです。
それに転送用functorクラスを組み合わせることにより、15×15×10もの転送ルーチンを、15+15+10個のクラスを作るだけで解決することが可能となります。
今から実際にそれらを作っていこうと思います。
まず、ピクセルフォーマットクラスです。
このクラスは1つのピクセルを表現するクラスです。
これは非常に簡単なクラスで、RGB565のピクセルフォーマットに対して最低限必要なメソッドだけを実装したクラスは、以下のようになります。
class PixelTypeRGB565{ public: byte getR() const{ return (_rgb & 0xf800) >> 8; } byte getG() const{ return (_rgb & 0x07e0) >> 3; } byte getB() const{ return (_rgb & 0x001f) << 3; } void setRGB( byte r , byte g , byte b ){ _rgb = ((uint16)(r & 0xf8) << 8) | ((uint16)(g & 0xfc) << 3) | (b >> 3); } template< class X > PixelTypeRGB565& operator=( const X& src ){ setRGB( src.getR() , src.getG() , src.getB() ); return (*this); } private: uint16 _rgb; };
ここでミソになるのはtemplateを使用したoperator=です。
通常であれば、RGB888→RGB565の転送や、RGB332→RGB565の転送は、色変換をしながら別のルーチンで書く必要があります。
しかし、それぞれのピクセルフォーマットクラスに対して、getR(),getG(),getB()及びsetRGB()というメソッドを確実に用意しておけば、
PixelTypeRGB888 rgb888; PixelTypeRGB565 rgb565; // 灰色をセット rgb888.setRGB( 0x80 , 0x80 , 0x80 ); // フォーマットの違うピクセルの転送 rgb565 = rgb888; // rgb565.setRGB( rgb888.getR() , rgb888.getG() , rgb888.getB() ); // と書くのと同じ
こんな感じで転送することが可能になります。
こうすることによって、全てのピクセルフォーマットの組み合わせの変換作業をする必要が無くなり、15×15の部分を15+15にすることが出来るようになります。
速度が気になる場合は、よく使用するメソッドだけは別で定義すればいいでしょう。
// RGB565専用のoperator PixelTypeRGB565& operator=( const PixelTypeRGB565& src ){ _rgb = src._rgb; return (*this); }