//----------------------------------------------------------------------------------------------
//
//	Console.h : 描画用コンソール;テキスト/グラフィック/スプライトの共通部分
//  X-BASIC'
//
//  Created by AIG-Soft(iMac) on 2013/01/23.
//  Copyright (c) 2013年 AIG-Soft. All rights reserved.
//

#import <UIKit/UIKit.h>
#import "libs.h"

//----------------------------------------------------------------------------------------------

@interface Console : UIView
{
	CGContextRef	context;	// コンテキスト
	CGImageRef		imageRef;	// 実描画内容
	BOOL			fret;		// 直前のimageSaveまたはimageLoadの結果
	CGRect			frame0;		// 元々のサイズ
	// 画面回転時の拡大縮小処理
	int				frotate_;	// ROTATE_*
	// 高速化
	int				imageCnt;	// 先の描画処理中に次の描画命令が来ている回数
#ifdef SPDUP
	int				updateCnt;		// 更新要求回数
	NSTimer			*drawThread;	// 周期起動
#endif
	//
	BOOL			fnext;
	BOOL			fskipUpdate;	// [update/draw]を一時的に通さないようにする（初期化処理内用）
		
	// ビットマップ情報
	UByte 	*consolePixel;
	// size_tはunlong。座標は負数もあるintなので、size_t:intで比較するとint側がsize_tとみなされ正しく判定されない。故にbitmapWidth/Heightはsize_tにしてはいけない
	// グラフィック/テキスト座標では負数は許していないが、スプライトに合わせて念のため。
	int		consoleWidth;		// 1ライン分のドット数
	int		consoleHeight;
	size_t	consoleByte1Line;	// 1ライン分のバイト数
	size_t	consoleByte1Page;	// １ページ分のワークサイズ
	
	// +animation.hに必要なメンバー
	CGAffineTransform	baseAffine;				// startで設定される大本の.layerにかかっている変形情報
	CGAffineTransform	baseAffineWithTrans;	// transformを設定した時の変形情報(アニメーション時はこれが起点になる)
	// アニメーション情報(共通)
	int				fanime_;
	CFTimeInterval	duration;		// double
	float			repeatCount;
	BOOL			autoreverses;
	int				animationCurve;
	// 各種アニメーション用パラメーター
	CGFloat			transX;		// 平行移動
	CGFloat			transY;
	CGFloat			scaleX;		// x方向倍率
	CGFloat			scaleY;		// y方向倍率
	CGFloat			degree;		// 回転角
	int				axis;		// 軸	AXIS_*
	CATransform3D	matrix;		// 変形情報(総合);設定できるのは一部
}
#ifdef SPDUP
@property (nonatomic) int			updateCnt;
#endif
@property (nonatomic) NSInteger 	fimage;	// 名前を変更したときはOBSERVE_*も変更すること
@property (nonatomic) int		 	fanime;	// 名前を変更したときはOBSERVE_*も変更すること ; +animation.hに必要なメンバー
@property (nonatomic) CGContextRef	context;
@property (nonatomic) CGImageRef 	imageRef;
@property (nonatomic) int 			frotate;
@property (nonatomic) BOOL 			fret;
@property (nonatomic) int			imageCnt;
// sprite v2.0のための追加
@property (nonatomic) UByte 	*consolePixel;
@property (nonatomic) int		consoleWidth;
@property (nonatomic) int		consoleHeight;
@property (nonatomic) size_t	consoleByte1Line;
@property (nonatomic) size_t	consoleByte1Page;

//----------------------------------------------------------------------------------------------

#define	DRAW_INTERVAL	(1.0/30.0)	// 描画間隔

enum {
	ROTATE_SCALE2FIT	=0,	// いつでも回転し、幅も合わせる；設定禁止(高速描画環境ではMyCreateBitmapContextでサイズを固定しているから)
	ROTATE_RUNFIX,			// RUN以降BREAK/ENDまで画面回転を無効にする
	ROTATE_ASPECTFIT,		// いつでも回転し、縦横比を維持しながら縦を画面に収める
};

// デフォルトフォント
#define	DEFFONT	@"IPAGothic"	// 等幅=テキスト画面で全角=半角*2になるフォント

#define OBSERVE_IMAGE	@"fimage"	// 通知名(各console共通分)

enum { // drawのmode
	DRAW_NONE=0,	// 描画なし
	DRAW_NOWAIT,	// 終了待ちなし描画
	DRAW_WAIT,		// 終了待ちあり描画
};

enum { // fretの値
	FRET_NONE	=-1,	// 未確定		(BASIC_YESと同じになるので注意)
	FRET_ERROR	=NO,	// エラー
	FRET_OK		=YES,	// 正常終了
};

//-(NSUInteger)getScreenRotation;
/*
 UIDeviceOrientationUnknown				0
 UIDeviceOrientationPortrait			1
 UIDeviceOrientationPortraitUpsideDown	2
 UIDeviceOrientationLandscapeLeft		3
 UIDeviceOrientationLandscapeRight		4
 UIDeviceOrientationFaceUp				5
 UIDeviceOrientationFaceDown			6
 */
//-(DEVICE_TYPE)getDeviceType;
/*
 DEVICE_UNKNOWN		0
 DEVICE_IPAD		1
 DEVICE_IPODTOUCH	2
 DEVICE_IPHONE		3
 */

-(void)init2;
-(void)start;
-(void)start:(CGBitmapInfo)bitmapInfo;
-(void)end;
-(void)setKVO:(id)observer forKeyPath:(NSString *)forKeyPath;
-(void)setKVO:(id)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options;

#define pushContext()	UIGraphicsPushContext2(context)

-(void)setFrotate:(int)frotate;
-(CGSize)getScreenSize;
-(DEVICE_TYPE)getDeviceType;
-(NSUInteger)getScreenRotation;
-(void)setHidden2:(BOOL)hidden;
-(void)draw:(int)mode;
-(void)draw;
-(void)update;
-(void)displayMainThread;
//
-(void)alpha:(CGFloat)alpha;
-(void)border:(CGFloat)width r:(int)r g:(int)g b:(int)b alpha:(int)alpha;
-(void)backgroundColor:(int)r g:(int)g b:(int)b alpha:(int)alpha;
-(void)antiAliasing:(BOOL)falias;	// v2.1
-(void)fontSmoothing:(BOOL)fsmooth; // v2.1
-(void)wipe;

// v2.1
enum { // scrollのmode
	SCROLL_UP=0,
	SCROLL_DOWN,
	SCROLL_LEFT,
	SCROLL_RIGHT
};
-(void)txScroll:(int)mode value:(int)sc fContext:(BOOL)fContext;
-(void)grScroll:(int)mode fContext:(BOOL)fContext;

@end

//----------------------------------------------------------------------------------------------

// CGContext*()は座標がQuartz系である。
// 故に、CGBitmapContextCreateImage(context)をそのまま表示すると上下反転の鏡像で表示されてしまう。
// それを正常表示するため、consoleは表示が上下胸像になるように設定してある。
// 一方、内包するビットマップは通常座標＆アドレスマッピングとなるが、表示が反転しているため、内部処理は上下逆さまに行なっておく必要が有る。
// CGContextDrawImage()は例外的にUIImageをその方向のままビットマップに展開するため同様となる。

#if 0
// 上下反転なし
#define calcConsolePixelOffset(gx,gy)	((gx)+((gy)*consoleWidth))	// ULong単位のドット位置までのオフセット
#else
// 上下反転あり
#define calcConsolePixelOffset(gx,gy)	((gx)+((consoleHeight-1-(gy))*consoleWidth))	// ULong単位のドット位置までのオフセット
#endif

//----------------------------------------------------------------------------------------------
