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);
}