Fork me on GitHub

Palm Os5のスモールフォント描画

  • Jun 02, 2006

categoryプラグインは存在しません。

OS 5 は,CLIE とは違う方式で描画するため,少々難しい.以下は山田さんが提示されていたサンプルソース.

Err err;
BitmapType *bitmap;
BitmapTypeV3 *bitmap3;
WindowType *offscreen;
WindowType *current;
RectangleType rect;

current= WinGetDrawWindow();
WinPushDrawState();
WinSetCoordinateSystem( kCoordinatesDouble );

bitmap = BmpCreate( 320,32,1,(ColorTableType *)&mono_clut,&err);
bitmap3 = BmpCreateBitmapV3( bitmap, kCoordinatesStandard, BmpGetBits(bitmap), (ColorTableType *)&mono_clut);
offscreen = WinCreateBitmapWindow( (BitmapType *)bitmap3, &err);
FntSetFont( f );

WinSetDrawWindow(offscreen);
WinDrawChars( c, len, 0,0);
//WinDeleteWindow( offscreen, false);

BmpSetDensity( (BitmapType *)bitmap3 , kCoordinatesDouble);
offscreen = WinCreateBitmapWindow( (BitmapType *)bitmap3, &err);

RctSetRectangle( &rect,0,0,320,( ( FntCharHeight() + 2) / 2 + 1 ) / 2 * 2);
WinCopyRectangle( offscreen, current, &rect, x*2,y*2, winPaint);

WinDeleteWindow( offscreen, false);
BmpDelete( bitmap);
BmpDelete( (BitmapType *)bitmap3);
WinPopDrawState();
WinSetDrawWindow(current);

基本は,

  1. Bitmap を作成
  2. 1 からStandard 解像度の BitmapV3 を作成
  3. 2 から OffscreenWindow を作成
  4. 3 に通常フォントで描画
  5. 2 の解像度を Double に変更
  6. 2 から OffscreenWindow を作成
  7. 6 から画面に,WinCopyRectangle で文字画像を転送

という手順になる.

Addrex v1.4 では、以下のような手順で描画している。

WinHandle offWinH, preWinH;
UInt16 preCoord, height, width;
UInt32 depth;
BitmapType *bitmapP;
BitmapTypeV3 *bmpv3;
Err err;

WinScreenMode(winScreenModeGet, NULL, NULL, &depth, NULL);

WinPushDrawState();
// get low reso size
preCoord = WinGetCoordinateSystem();
preWinH = WinGetDrawWindow();

WinSetCoordinateSystem(kCoordinatesStandard);
width = FntCharsWidth(str, len);
height = FntCharHeight();

// create low reso window
bitmapP = BmpCreate(width, height, (UInt8)depth, NULL, &err);
bmpv3 = BmpCreateBitmapV3(bitmapP, kDensityLow, BmpGetBits(bitmapP), NULL);
offWinH = WinCreateBitmapWindow((BitmapType*)bmpv3, &err);
WinSetDrawWindow(offWinH);

// draw chars
if (width < maxWidth)
  WinDrawChars(str, len, 0, 0);
else
  WinDrawTruncChars(str, len, 0, 0, maxWidth);

// convert to high reso
WinSetCoordinateSystem(kCoordinatesDouble);
BmpSetDensity((BitmapType*)bmpv3, kDensityDouble);
WinSetDrawWindow(preWinH);
WinSetDrawMode(winPaint);
WinPaintBitmap((BitmapType*)bmpv3, x * 2, y * 2);

WinDeleteWindow(offWinH, false);
BmpDelete((BitmapType*)bmpv3);
BmpDelete(bitmapP);
WinSetCoordinateSystem(preCoord);
WinPopDrawState();

ポイントは、

  1. depth を取得して、bitmap に設定している。これをしないと黒い四角になってしまう。
  2. 先に width, height を計算しておいて、bitmap を直接描画する。
  3. trunc 系の関数も共有可能にしておく。

というところ。ただしこれだと、文字の重ね描画ができないので、その場合は山田さんのコードのように一度 Window を作成して、そこからコピーする必要がある。

commentプラグインは存在しません。

目次