× [PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。 |
CoreGraphics描画の詳細。
大まかな流れは前回の記事参照。 //////////////////////////////// コンテキストを自分で作成する カレントコンテキストはもともとあるので、そこに直接描画すれば画面に表示することはできる。 しかし、自分でコンテキストを作ることももちろんできる。 ファイルSimpleCoreGraphicsView.h
ファイルCoreGraphicsView.mm
*解説 コンテキストを生成する関数は、CGBitmapContextCreate()である。 宣言は CG_EXTERN CGContextRef CGBitmapContextCreate( ファイルのコメント中で記述されている解説は Create a bitmap context. The context draws into a bitmap which is `width' pixels wide and `height' pixels high. The number of components for each pixel is specified by `space', which may also specify a destination color profile. The number of bits for each component of a pixel is specified by `bitsPerComponent'. The number of bytes per pixel is equal to `(bitsPerComponent * number of components + 7)/8'. Each row of the bitmap consists of `bytesPerRow' bytes, which must be at least `width * bytes per pixel' bytes; in addition, `bytesPerRow' must be an integer multiple of the number of bytes per pixel. `data', if non-NULL, points to a block of memory at least `bytesPerRow * height' bytes. If `data' is NULL, the data for context is allocated automatically and freed when the context is deallocated. `bitmapInfo' specifies whether the bitmap should contain an alpha channel and how it's to be generated, along with whether the components are floating-point or integer. ○だいたいまとめると、 dataの指定は任意。 指定があれば、そこにコンテキストのデータが保持される。必ずbytesPerRow * heightバイトを確保しておくこと。 NULLにしてあれば、自動でメモリ確保、破棄される。 width,heightはコンテキストのピクセルサイズ。 bitsPerComponentは、1コンポーネントを何ビットで表現するかの値、 bytesPerRowは、1行あたりのバイト数。1ピクセルあたりのバイト数×widthの値。 spaceは、ピクセルあたりのコンポーネント数を表す。また、描画先のカラープロファイルの情報も持つ。 bitmapInfoは、ビットマップがアルファを含むか否か、含むならどう生成されるのか、またコンポーネントがfloatかintかの情報を持っている。RGB,RGBA,ARGBといったことをenumで示す。
指定する時は、 kCGImageAlpha*** | kCGBitmapFloatComponents | kCGBitmapByteOrder*** のように書くのだろう。 1pixelの表現に必要なbyte数は、以下の式で表される。 (bitsPerComponent * space + 7)/8 また、bytesPerRow(1行あたりのbyte数)は以下の式で表される。 (bitsPerComponent * space + 7)/8 * width そして、dataのメモリ確保に必要なbyte数は、以下の式で表される。 (bitsPerComponent * space + 7)/8 * width * height /////////////////////// 自前コンテキストに描いたものを、カレントコンテキストに描画する 自前コンテキストをctxCanvas, カレントコンテキストをctxScreenとする。
自前コンテキストからCGImageを作り、それをカレントコンテキストに貼付ける。 //////////////////////////// 再描画命令 drawRect()は、明示的に呼ぶ必要がある。 [self setNeedsDisplay]; が再描画命令である。これを呼ぶと、drawRectが呼ばれる。 新たな図形を描画する、画面をタッチする、などのイベントのたびにこれを呼ぶか、 ゲームのように定期的に再描画させたい場合は
ということをしても良いだろう。 なお、drawRectの中でsetNeedsDisplayを呼んでも再描画はされないし、無限ループにもならない。 PR |
|
トラックバックURL
|