TempleOSCD_140715.ISO

This commit is contained in:
Terry A. Davis authored and minexew committed 2018-09-08 21:46:09 +02:00
1 parent 7ef616a20e
commit 64f679eeb9
1095 files changed
+24814 -221011

No files matched your search

+55 -41
View File
@@ -1,48 +1,55 @@
#help_index "Graphics"
U0 GrInit1()
{
DefineLstLoad("ST_SPRITE_TYPES",
"End\0Color 8Bit\0Dither Color 8Bit\0"
DefineLstLoad("ST_SPRITE_ELEM_TYPES",
"End\0Color\0Dither Color\0"
"Width\0Planar Symmetry\0Transform On\0Transform Off\0Shift\0"
"Point\0PolyPoint\0Line\0PolyLine\0Rect\0Rotated Rect\0"
"Circle\0Ellipse\0Polygon\0BSpline2\0BSpline2 Closed\0BSpline3\0BSpline3 Closed\0"
"Flood Fill\0Flood Fill Not Color\0BitMap 8Bit\0Mesh\0Shiftable Mesh\0"
"Flood Fill\0Flood Fill Not Color\0BitMap\0Mesh\0Shiftable Mesh\0"
"Arrow\0Text\0Text Box\0Text Diamond\0");
DefineLstLoad("ST_SPRITE_ELEM_CODES",
"End\0Color\0Color\0"
"Width\0PlanarSymmetry\0Transform\0Transform\0Shift\0"
"Pt\0PolyPt\0Line\0PolyLine\0Rect\0Rect\0"
"Circle\0Ellipse\0Polygon\0BSpline2\0BSpline2\0BSpline3\0BSpline3\0"
"FloodFill\0FloodFill\0BitMap\0Mesh\0Mesh\0"
"Arrow\0Text\0TextBox\0TextDiamond\0");
}
GrInit1;
#help_index "Graphics/Sprite"
#define GRST_END 0
#define GRST_COLOR8 1
#define GRST_DITHER_COLOR8 2
#define GRST_WIDTH 3
#define GRST_PLANAR_SYMMETRY 4
#define GRST_TRANSFORM_ON 5
#define GRST_TRANSFORM_OFF 6
#define GRST_SHIFT 7
#define GRST_PT 8
#define GRST_POLYPT 9
#define GRST_LINE 10
#define GRST_POLYLINE 11
#define GRST_RECT 12
#define GRST_ROTATED_RECT 13
#define GRST_CIRCLE 14
#define GRST_ELLIPSE 15
#define GRST_POLYGON 16
#define GRST_BSPLINE2 17
#define GRST_BSPLINE2_CLOSED 18
#define GRST_BSPLINE3 19
#define GRST_BSPLINE3_CLOSED 20
#define GRST_FLOOD_FILL 21
#define GRST_FLOOD_FILL_NOT 22
#define GRST_BITMAP8 23
#define GRST_MESH 24
#define GRST_SHIFTABLE_MESH 25
#define GRST_ARROW 26
#define GRST_TEXT 27
#define GRST_TEXT_BOX 28
#define GRST_TEXT_DIAMOND 29
#define GRST_NUM_TYPES 30
#define SPT_END 0
#define SPT_COLOR 1
#define SPT_DITHER_COLOR 2
#define SPT_WIDTH 3
#define SPT_PLANAR_SYMMETRY 4
#define SPT_TRANSFORM_ON 5
#define SPT_TRANSFORM_OFF 6
#define SPT_SHIFT 7
#define SPT_PT 8
#define SPT_POLYPT 9
#define SPT_LINE 10
#define SPT_POLYLINE 11
#define SPT_RECT 12
#define SPT_ROTATED_RECT 13
#define SPT_CIRCLE 14
#define SPT_ELLIPSE 15
#define SPT_POLYGON 16
#define SPT_BSPLINE2 17
#define SPT_BSPLINE2_CLOSED 18
#define SPT_BSPLINE3 19
#define SPT_BSPLINE3_CLOSED 20
#define SPT_FLOOD_FILL 21
#define SPT_FLOOD_FILL_NOT 22
#define SPT_BITMAP 23
#define SPT_MESH 24
#define SPT_SHIFTABLE_MESH 25
#define SPT_ARROW 26
#define SPT_TEXT 27
#define SPT_TEXT_BOX 28
#define SPT_TEXT_DIAMOND 29
#define SPT_NUM_TYPES 30
class CMeshTri
{
@@ -50,17 +57,24 @@ class CMeshTri
I32 nums[3]; //Vertex number
};
public class CSprite
class CQueMeshTri
{
//See $LK,"Graphics/Sprite",A="HI:Graphics/Sprite"$
CQueMeshTri *next,*last;
U0 start;
I32 color;
I32 nums[3];
};
public class CSprite
{//See $LK,"Graphics/Sprite",A="HI:Graphics/Sprite"$
//See $LK,"::/Adam/Gr/GrSpritePlot.CPP",A="FL:::/Adam/Gr/GrSpritePlot.CPP,1"$ for how CSprite are stored.
CSprite *next,*last;
U0 start;
U8 type;
union {
U8 color8;
U16 dither_color8;
U8 color;
U16 dither_color;
I32 x1;
I32 num;
I32 width;
@@ -92,8 +106,10 @@ public class CSprite
extern I64 GrBlot3(CDC *dc,I64 x1,I64 y1,I64 z1,CDC *img);
extern U8 *GrBitMap4ToBitMap8(U8 *dst,U8 *src,I64 src_size,I64 bkcolor);
extern U8 *SpriteQue2Sprite(CSprite *root,I64 *_size=NULL);
#include "GrGlbls"
#include "GrTextBase"
#include "GrAsm"
#include "GrDC"
#include "GrPalette"
@@ -103,7 +119,6 @@ extern U8 *GrBitMap4ToBitMap8(U8 *dst,U8 *src,I64 src_size,I64 bkcolor);
#include "GrBitMap"
#include "GrPrimatives"
#include "GrComposites"
#include "GrChar"
#define GE_ABORT (-1)
#define GE_EXIT 0
@@ -112,9 +127,8 @@ extern U8 *GrBitMap4ToBitMap8(U8 *dst,U8 *src,I64 src_size,I64 bkcolor);
#include "GrSpritePlot"
#include "SpriteMesh"
#include "SpriteBitMap"
#include "SpriteCode"
#include "SpriteEd"
#include "SpriteMain"
#include "GrEnd"
#help_index ""
+62 -427
View File
@@ -1,405 +1,46 @@
#help_index "Graphics"
I64 *gr_1_to_8_bits,*gr_1_to_8_colors;
#help_index "Graphics/Char;Char/Graphics"
U32 *gr_text_base;
U16 *gr_win_z_buf;
#help_index "Graphics/Misc"
asm {
USE64
// ************************************
_PLOT_SCREEN_U8::
PUSH RBP
MOV RBP,RSP
MOV RBX,U64 SF_ARG2[RBP]
MOV RAX,U64 SF_ARG3[RBP]
TEST RBX,RBX
JS @@05
TEST RAX,RAX
JS @@05
CMP RBX,TEXT_COLS
JGE @@05
CMP RAX,TEXT_ROWS
JGE @@05
IMUL2 RAX,TEXT_COLS
ADD RBX,RAX
SHL RBX,2
ADD RBX,U64 [&gr_text_base]
MOV RAX,U64 SF_ARG1[RBP]
MOV U32 [RBX],EAX
MOV RAX,1
POP RBP
RET1 24
@@05: XOR RAX,RAX
POP RBP
RET1 24
// ************************************
_PLOT_WIN_U8::
PUSH RBP
MOV RBP,RSP
MOV RCX,U64 SF_ARG1[RBP]
MOV RBX,U64 CTask.scroll_x[RCX]
SAR RBX,3
ADD RBX,U64 SF_ARG3[RBP]
MOV RAX,U64 CTask.scroll_y[RCX]
SAR RAX,3
ADD RAX,U64 SF_ARG4[RBP]
TEST RBX,RBX
JS @@05
ADD RBX,U64 CTask.win_left[RCX]
CMP RBX,U64 CTask.win_right[RCX]
JG @@05
TEST RBX,RBX
JS @@05
CMP RBX,TEXT_COLS
JGE @@05
TEST RAX,RAX
JS @@05
ADD RAX,U64 CTask.win_top[RCX]
CMP RAX,U64 CTask.win_bottom[RCX]
JG @@05
TEST RAX,RAX
JS @@05
CMP RAX,TEXT_ROWS
JGE @@05
IMUL2 RAX,TEXT_COLS
ADD RBX,RAX
SHL RBX,2
ADD RBX,U64 [&gr_text_base]
MOV RAX,U64 SF_ARG2[RBP]
MOV U32 [RBX],EAX
MOV RAX,1
POP RBP
RET1 32
@@05: XOR RAX,RAX
POP RBP
RET1 32
// ************************************
/*
Bool PlotWinStr2(CTask *task,U8 *s,I64 len,
I64 attr,I64 x,I64 y)
*/
_PLOT_WIN_STR2::
PUSH RBP
MOV RBP,RSP
MOV R9,U64 [&gr_text_base]
PUSH RSI
PUSH RDI
MOV RBX,U64 SF_ARG1[RBP]
MOV RSI,U64 SF_ARG2[RBP]
MOV RDI,U64 CTask.scroll_x[RBX]
SAR RDI,3
ADD RDI,U64 SF_ARG5[RBP]
MOV RCX,U64 SF_ARG3[RBP]
TEST RDI,RDI
JNS @@05
ADD RCX,RDI
SUB RSI,RDI
XOR RDI,RDI
@@05: ADD RDI,U64 CTask.win_left[RBX]
MOV RDX,RCX
ADD RDX,RDI
DEC RDX
CMP RDX,U64 CTask.win_right[RBX]
JLE @@10
MOV RAX,RDX
SUB RAX,U64 CTask.win_right[RBX]
SUB RDX,RAX
SUB RCX,RAX
@@10: TEST RDI,RDI
JNS @@15
ADD RCX,RDI
SUB RSI,RDI
XOR RDI,RDI
@@15: INC RDX
SUB RDX,TEXT_COLS
JLE @@20
SUB RCX,RDX
@@20: CMP RCX,1
JL @@30
MOV RAX,U64 CTask.scroll_y[RBX]
SAR RAX,3
ADD RAX,U64 SF_ARG6[RBP]
TEST RAX,RAX
JS @@30
ADD RAX,U64 CTask.win_top[RBX]
CMP RAX,U64 CTask.win_bottom[RBX]
JG @@30
TEST RAX,RAX
JS @@30
CMP RAX,TEXT_ROWS
JGE @@30
IMUL2 RAX,TEXT_COLS
ADD RDI,RAX
SHL RDI,2
ADD RDI,R9
MOV RAX,U64 SF_ARG4[RBP]
@@25: LODSB
STOSD
DEC RCX
JNZ @@25
POP RDI
POP RSI
MOV RAX,TRUE
POP RBP
RET1 48
@@30: POP RDI
POP RSI
XOR RAX,RAX
POP RBP
RET1 48
// ************************************
/*
Bool PlotAttrStr2(CTask *task,U32 *hl,I64 len,I64 x,I64 y)
*/
_PLOT_ATTR_STR2::
PUSH RBP
MOV RBP,RSP
MOV R9,U64 [&gr_text_base]
PUSH RSI
PUSH RDI
MOV RBX,U64 SF_ARG1[RBP]
MOV RSI,U64 SF_ARG2[RBP]
MOV RDI,U64 CTask.scroll_x[RBX]
SAR RDI,3
ADD RDI,U64 SF_ARG4[RBP]
MOV RCX,U64 SF_ARG3[RBP]
TEST RDI,RDI
JNS @@05
ADD RCX,RDI
SHL RDI,2
SUB RSI,RDI
XOR RDI,RDI
@@05: ADD RDI,U64 CTask.win_left[RBX]
MOV RDX,RCX
ADD RDX,RDI
DEC RDX
CMP RDX,U64 CTask.win_right[RBX]
JLE @@10
MOV RAX,RDX
SUB RAX,U64 CTask.win_right[RBX]
SUB RDX,RAX
SUB RCX,RAX
@@10: TEST RDI,RDI
JNS @@15
ADD RCX,RDI
SHL RDI,2
SUB RSI,RDI
XOR RDI,RDI
@@15: INC RDX
SUB RDX,TEXT_COLS
JLE @@20
SUB RCX,RDX
@@20: CMP RCX,1
JL @@30
MOV RAX,U64 CTask.scroll_y[RBX]
SAR RAX,3
ADD RAX,U64 SF_ARG5[RBP]
TEST RAX,RAX
JS @@30
ADD RAX,U64 CTask.win_top[RBX]
CMP RAX,U64 CTask.win_bottom[RBX]
JG @@30
TEST RAX,RAX
JS @@30
CMP RAX,TEXT_ROWS
JGE @@30
IMUL2 RAX,TEXT_COLS
ADD RDI,RAX
SHL RDI,2
ADD RDI,R9
@@25: MOVSD
DEC RCX
JNZ @@25
POP RDI
POP RSI
MOV RAX,TRUE
POP RBP
RET1 40
@@30: POP RDI
POP RSI
XOR RAX,RAX
POP RBP
RET1 40
// ************************************
/*
Bool PlotAttr(CTask *task,I64 len,
I64 attr,I64 x,I64 y)
*/
_PLOT_ATTR::
PUSH RBP
MOV RBP,RSP
MOV R9,U64 [&gr_text_base]
PUSH RSI
PUSH RDI
MOV RBX,U64 SF_ARG1[RBP]
MOV RDI,U64 CTask.scroll_x[RBX]
SAR RDI,3
ADD RDI,U64 SF_ARG4[RBP]
MOV RCX,U64 SF_ARG2[RBP]
TEST RDI,RDI
JNS @@05
ADD RCX,RDI
XOR RDI,RDI
@@05: ADD RDI,U64 CTask.win_left[RBX]
MOV RDX,RCX
ADD RDX,RDI
DEC RDX
CMP RDX,U64 CTask.win_right[RBX]
JLE @@10
MOV RAX,RDX
SUB RAX,U64 CTask.win_right[RBX]
SUB RDX,RAX
SUB RCX,RAX
@@10: TEST RDI,RDI
JNS @@15
ADD RCX,RDI
XOR RDI,RDI
@@15: INC RDX
SUB RDX,TEXT_COLS
JLE @@20
SUB RCX,RDX
@@20: CMP RCX,1
JL @@35
MOV RAX,U64 CTask.scroll_y[RBX]
SAR RAX,3
ADD RAX,U64 SF_ARG5[RBP]
TEST RAX,RAX
JS @@35
ADD RAX,U64 CTask.win_top[RBX]
CMP RAX,U64 CTask.win_bottom[RBX]
JG @@35
TEST RAX,RAX
JS @@35
CMP RAX,TEXT_ROWS
JGE @@35
IMUL2 RAX,TEXT_COLS
ADD RDI,RAX
SHL RDI,2
ADD RDI,R9
MOV RBX,U64 SF_ARG3[RBP]
MOV RSI,RDI
@@25: LODSD
TEST AL,AL
JNZ @@30
MOV RAX,RBX
STOSD
DEC RCX
JNZ @@25
@@30: POP RDI
POP RSI
MOV RAX,TRUE
POP RBP
RET1 40
@@35: POP RDI
POP RSI
XOR RAX,RAX
POP RBP
RET1 40
// ************************************
_PLOT_BORDER_U8::
PUSH RBP
MOV RBP,RSP
MOV R9,U64 [&gr_text_base]
MOV RCX,U64 SF_ARG1[RBP]
MOV RBX,U64 CTask.scroll_x[RCX]
SAR RBX,3
ADD RBX,U64 SF_ARG3[RBP]
MOV RAX,U64 CTask.scroll_y[RCX]
SAR RAX,3
ADD RAX,U64 SF_ARG4[RBP]
MOV RDX,-1
CMP RBX,RDX
JL @@05
ADD RBX,U64 CTask.win_left[RCX]
MOV RDX,U64 CTask.win_right[RCX]
INC RDX
CMP RBX,RDX
JG @@05
TEST RBX,RBX
JS @@05
CMP RBX,TEXT_COLS
JGE @@05
MOV RDX,-1
CMP RAX,RDX
JL @@05
ADD RAX,U64 CTask.win_top[RCX]
MOV RDX,U64 CTask.win_bottom[RCX]
INC RDX
CMP RAX,RDX
JG @@05
TEST RAX,RAX
JS @@05
CMP RAX,TEXT_ROWS
JGE @@05
IMUL2 RAX,TEXT_COLS
ADD RBX,RAX
SHL RBX,2
ADD RBX,R9
MOV RAX,U64 SF_ARG2[RBP]
MOV U32 [RBX],EAX
MOV RAX,TRUE
POP RBP
RET1 32
@@05: XOR RAX,RAX
POP RBP
RET1 32
// ************************************
_GR_UPDATE_LINE32::
//************************************
_GR_UPDATE_LINE64::
PUSH RBP
MOV RBP,RSP
PUSH RSI
PUSH RDI
MOV RAX,U64 SF_ARG2[RBP]
MOV RSI,U64 [RAX] //rsi=src2
MOV RSI,U64 [RAX] //rsi=src
MOV RBX,U64 [&reverse_bits_table]
MOV RCX,U64 SF_ARG3[RBP] //rcx=d5
MOV RCX,U64 SF_ARG3[RBP] //rcx=d
MOV RAX,U64 SF_ARG4[RBP]
MOV RDI,U64 [RAX] //rdi=vga image
MOV RDI,U64 [RAX] //rdi=image
MOV RAX,U64 SF_ARG1[RBP]
MOV R8,U64 [RAX] //rbp=vga dst
MOV R8,U64 [RAX] //rbp=vga dst
@@05: LODSD
CMP U32 [RDI],EAX
@@05: LODSQ
CMP U64 [RDI],RAX
JE @@10
MOV U32 [RDI],EAX
MOV U64 [RDI],RAX
XLATB
ROR EAX,8
ROR RAX,8
XLATB
ROR EAX,8
ROR RAX,8
XLATB
ROR EAX,8
ROR RAX,8
XLATB
ROR EAX,8
MOV U32 [R8],EAX
@@10: ADD RDI,4
ADD R8,4
ROR RAX,8
XLATB
ROR RAX,8
XLATB
ROR RAX,8
XLATB
ROR RAX,8
XLATB
ROR RAX,8
MOV U64 [R8],RAX
@@10: ADD RDI,8
ADD R8,8
DEC RCX
JNZ @@05
@@ -413,36 +54,44 @@ _GR_UPDATE_LINE32::
POP RSI
POP RBP
RET1 32
// ************************************
_GR_UPDATE_LINE32_FLUSH_CACHE::
//************************************
_GR_UPDATE_LINE64_FLUSH_CACHE::
PUSH RBP
MOV RBP,RSP
PUSH RSI
PUSH RDI
MOV RAX,U64 SF_ARG2[RBP]
MOV RSI,U64 [RAX] //rsi=src2
MOV RSI,U64 [RAX] //rsi=src
MOV RBX,U64 [&reverse_bits_table]
MOV RCX,U64 SF_ARG3[RBP] //rcx=d5
MOV RCX,U64 SF_ARG3[RBP] //rcx=d
MOV RAX,U64 SF_ARG4[RBP]
MOV RDI,U64 [RAX] //rdi=vga image
MOV RDI,U64 [RAX] //rdi=image
MOV RAX,U64 SF_ARG1[RBP]
MOV R8,U64 [RAX] //rbp=vga dst
MOV R8,U64 [RAX] //rbp=vga dst
@@05: LODSD
MOV U32 [RDI],EAX
@@05: LODSQ
MOV U64 [RDI],RAX
XLATB
ROR EAX,8
ROR RAX,8
XLATB
ROR EAX,8
ROR RAX,8
XLATB
ROR EAX,8
ROR RAX,8
XLATB
ROR EAX,8
MOV U32 [R8],EAX
ADD RDI,4
ADD R8,4
ROR RAX,8
XLATB
ROR RAX,8
XLATB
ROR RAX,8
XLATB
ROR RAX,8
XLATB
ROR RAX,8
MOV U64 [R8],RAX
ADD RDI,8
ADD R8,8
DEC RCX
JNZ @@05
@@ -456,7 +105,7 @@ _GR_UPDATE_LINE32_FLUSH_CACHE::
POP RSI
POP RBP
RET1 32
// ************************************
//************************************
_DC_BLOT_COLOR4::
PUSH RBP
MOV RBP,RSP
@@ -601,7 +250,7 @@ _DC_BLOT_COLOR4::
POP RSI
POP RBP
RET1 32
// ************************************
//************************************
_IS_PIX_COVERED0::
PUSH RBP
MOV RBP,RSP
@@ -612,7 +261,7 @@ _IS_PIX_COVERED0::
SAR RAX,3
MOV RDX,U64 SF_ARG1[RBP]
IMUL2 RCX,TEXT_COLS
MOV RBX,U64 [&gr_win_z_buf]
MOV RBX,U64 [&gr.win_z_buf]
MOV DX,U16 CTask.win_z_num[RDX]
ADD RCX,RAX
XOR RAX,RAX
@@ -621,17 +270,17 @@ _IS_PIX_COVERED0::
INC RAX
@@05: POP RBP
RET1 24
// ************************************
//************************************
_GR_ROP_EQU_U8_NO_CLIPPING::
//Puts foreground char shape onto gr_dc2.
//Puts foreground char shape onto gr.dc2.
//ch.u8[1] is color as a whole byte
//ch DOCEt_UNDERLINE attr flag is used.
//ch ATTRf_UNDERLINE attr flag is used.
PUSH RBP
MOV RBP,RSP
MOVZX RAX,U8 SF_ARG1[RBP]
MOV RDX,U64 [&gr_font]
MOV RDX,U64 [&text.font]
MOV RAX,U64 [RDX+RAX*8] //RAX is 8x8 char font data, 64-bits
BT U64 SF_ARG1[RBP],DOCEt_UNDERLINE
BT U64 SF_ARG1[RBP],ATTRf_UNDERLINE
JNC @@05
MOV RBX,0xFF00000000000000
OR RAX,RBX
@@ -641,11 +290,11 @@ _GR_ROP_EQU_U8_NO_CLIPPING::
PUSH RSI
PUSH RDI
MOVZX RBX,U8 SF_ARG1+1[RBP] //Warning color is 8-bit
MOV RDX,U64 [&gr_1_to_8_colors]
MOV RDX,U64 [&gr.to_8_colors]
MOV R8,U64 [RDX+RBX*8] //R8 is color repeated 8 times.
MOV R9,U64 SF_ARG3[RBP] //R9 is width_internal
MOV RDI,U64 SF_ARG2[RBP]
MOV RSI,U64 [&gr_1_to_8_bits] //RSI is gr_1_to_8_bits
MOV RSI,U64 [&gr.to_8_bits] //RSI is gr.to_8_bits
// m=my_1_to_8_bits[ch&255];ch>>=8;
// *dst=*dst&~m|c&m;
@@ -749,27 +398,13 @@ _GR_ROP_EQU_U8_NO_CLIPPING::
@@10: POP RBP
RET1 24
}
#help_index "Graphics/Char;Char/Graphics"
public _extern _PLOT_SCREEN_U8 Bool PlotScreenU8(I64 w,I64 x,I64 y);
public _extern _PLOT_WIN_U8 Bool PlotWinU8(CTask *task,I64 w,I64 x,I64 y);
public _extern _PLOT_WIN_STR2 Bool PlotWinStr2(
CTask *task,U8 *s,I64 len,I64 attr,I64 x,I64 y);
public _extern _PLOT_ATTR_STR2 Bool PlotAttrStr2(
CTask *task,U32 *hl,I64 len,I64 x,I64 y);
public _extern _PLOT_ATTR Bool PlotWinAttr(
CTask *task,I64 len,I64 attr,I64 x,I64 y);
public _extern _PLOT_BORDER_U8 Bool PlotBorderU8(CTask *task,I64 w,I64 x,I64 y);
_extern _GR_ROP_EQU_U8_NO_CLIPPING U0 GrRopEquU8NoClipping(I64 ch,U8 *dst,I64 width_internal);
#help_index "Graphics/Misc"
//No clipping
public _extern _IS_PIX_COVERED0 Bool IsPixCovered0(CTask *task,I64 x,I64 y);
_extern _GR_UPDATE_LINE32 U0 GrUpdateLine32(
U32 **_dst3,U32 **_src2,I64 w,U8 **_vga);
_extern _GR_UPDATE_LINE32_FLUSH_CACHE U0 GrUpdateLine32FlushCache(
U32 **_dst3,U32 **_src2,I64 w,U8 **_vga);
_extern _GR_UPDATE_LINE64 U0 GrUpdateLine64(
U64 **_vga,U64 **_src,I64 d,U8 **_dst);
_extern _GR_UPDATE_LINE64_FLUSH_CACHE U0 GrUpdateLine64FlushCache(
U64 **_vga,U64 **_src,I64 d,U8 **_dst);
_extern _DC_BLOT_COLOR4 U0 DCBlotColor4(
U8 *dst,I64 *img,I64 *img_cache,I64 cnt);
+92 -93
View File
@@ -1,14 +1,14 @@
#help_index "Graphics"
public Bool GrPlot0(CDC *dc=gr_dc,I64 x,I64 y)
{ //No clipping or transformation or pen width
public Bool GrPlot0(CDC *dc=gr.dc,I64 x,I64 y)
{//2D. No clipping or transformation or pen width.
U8 *dst;
I32 *db;
I64 d,dist;
CColorROPU32 c,color=dc->color,bkcolor=dc->bkcolor;
if (dc->flags & DCF_LOCATE_NEAREST) {
dist=DistI64(x,y,dc->cur_x,dc->cur_y);
dist=DistSqrI64(x,y,dc->cur_x,dc->cur_y);
if (dist<=dc->nearest_dist) {
dc->nearest_sprite_elem_num=dc->cur_sprite_elem_num;
dc->nearest_dist=dist;
@@ -51,7 +51,7 @@ public Bool GrPlot0(CDC *dc=gr_dc,I64 x,I64 y)
break;
case ROPB_COLLISION:
c=*dst;
if (c!=COLOR_TRANSPARENT&&c!=bkcolor.c0.color)
if (c!=TRANSPARENT&&c!=bkcolor.c0.color)
dc->collision_cnt++;
break;
case ROPB_XOR:
@@ -61,15 +61,15 @@ public Bool GrPlot0(CDC *dc=gr_dc,I64 x,I64 y)
return TRUE;
}
public I64 GrPeek0(CDC *dc=gr_dc,I64 x,I64 y)
{ //No clipping or transformation
public I64 GrPeek0(CDC *dc=gr.dc,I64 x,I64 y)
{//2D. No clipping or transformation.
return dc->body[dc->width_internal*y+x];
}
#help_index "Graphics;Graphics/Device Contexts"
public I64 GrBlot(CDC *dc=gr_dc,I64 x,I64 y,CDC *img)
{ //Clipping but not transformation
public I64 GrBlot(CDC *dc=gr.dc,I64 x,I64 y,CDC *img)
{//2D. Clipping but not transformation..
I64 i,j,k,k1,kk,kk1,w1,h1,w2,h2,
leading_bits,leading_bit_mask,whole_bytes,trailing_bits,trailing_bit_mask,
reg bit_shift,dist,win_z_buf_line_inc,win_z_buf_line_dec,win_z_num,
@@ -99,8 +99,8 @@ public I64 GrBlot(CDC *dc=gr_dc,I64 x,I64 y,CDC *img)
x+=win_task->pix_left;
y+=win_task->pix_top;
}
if (dc->flags & DCF_LOCATE_NEAREST) { //TODO:Untested
dist=DistI64(x+img->width>>1,y+img->height>>1,dc->cur_x,dc->cur_y);
if (dc->flags & DCF_LOCATE_NEAREST) {//TODO:Untested
dist=DistSqrI64(x+img->width>>1,y+img->height>>1,dc->cur_x,dc->cur_y);
if (dist<=dc->nearest_dist) {
dc->nearest_sprite_elem_num=dc->cur_sprite_elem_num;
dc->nearest_dist=dist;
@@ -134,12 +134,12 @@ public I64 GrBlot(CDC *dc=gr_dc,I64 x,I64 y,CDC *img)
dc->color&=~ROPF_DITHER;
color=dc->color;
leading_bits=-(w1+x)&7;
leading_bit_mask=gr_1_to_8_bits[0xFF>>leading_bits];
leading_bit_mask=gr.to_8_bits[0xFF>>leading_bits];
bit_shift=-x&7;
whole_bytes=(w2-w1-leading_bits)>>3;
if (whole_bytes<0) whole_bytes=0;
trailing_bits=(x+w2)&7;
trailing_bit_mask=gr_1_to_8_bits[0xFF<<trailing_bits&0xFF];
trailing_bit_mask=gr.to_8_bits[0xFF<<trailing_bits&0xFF];
if (leading_bits+trailing_bits>w2-w1) {
leading_bit_mask|=trailing_bit_mask;
trailing_bits=0;
@@ -152,7 +152,7 @@ public I64 GrBlot(CDC *dc=gr_dc,I64 x,I64 y,CDC *img)
for (j=h2-h1;j;j--) {
for (i=w1;i<w2;i++) {
c=dc->body[k1+i];
if (c!=COLOR_TRANSPARENT&&c!=color&&img->body[k+i]!=COLOR_TRANSPARENT)
if (c!=TRANSPARENT&&c!=color&&img->body[k+i]!=TRANSPARENT)
dc->collision_cnt++;
}
k+=img->width_internal;
@@ -160,13 +160,13 @@ public I64 GrBlot(CDC *dc=gr_dc,I64 x,I64 y,CDC *img)
}
break;
case ROPB_MONO:
color_mask=gr_1_to_8_colors[color.c0.color];
color_mask=gr.to_8_colors[color.c0.color];
if (img->flags&DCF_NO_TRANSPARENTS) {
if (!(dc->flags & DCF_SCREEN_BITMAP) || dc->flags&DCF_ON_TOP)
win_z_buf_ptr=NULL;
else {
win_z_num=win_task->win_z_num;
win_z_buf_ptr=gr_win_z_buf(U8 *)+((h1+y)/FONT_HEIGHT*TEXT_COLS+(w1+x)/FONT_WIDTH)*sizeof(U16);
win_z_buf_ptr=gr.win_z_buf(U8 *)+((h1+y)/FONT_HEIGHT*TEXT_COLS+(w1+x)/FONT_WIDTH)*sizeof(U16);
win_z_buf_line_dec=whole_bytes;
if (leading_bits)
win_z_buf_line_dec++;
@@ -268,7 +268,7 @@ public I64 GrBlot(CDC *dc=gr_dc,I64 x,I64 y,CDC *img)
}
} else {
win_z_num =win_task->win_z_num;
win_z_buf_ptr =gr_win_z_buf(U8 *)+((h1+y)/FONT_HEIGHT*TEXT_COLS+(w1+x)/FONT_WIDTH)*sizeof(U16);
win_z_buf_ptr =gr.win_z_buf(U8 *)+((h1+y)/FONT_HEIGHT*TEXT_COLS+(w1+x)/FONT_WIDTH)*sizeof(U16);
win_z_buf_line_dec=whole_bytes;
if (leading_bits)
win_z_buf_line_dec++;
@@ -307,7 +307,7 @@ public I64 GrBlot(CDC *dc=gr_dc,I64 x,I64 y,CDC *img)
win_z_buf_ptr=NULL;
else {
win_z_num=win_task->win_z_num;
win_z_buf_ptr=gr_win_z_buf(U8 *)+((h1+y)/FONT_HEIGHT*TEXT_COLS+(w1+x)/FONT_WIDTH)*sizeof(U16);
win_z_buf_ptr=gr.win_z_buf(U8 *)+((h1+y)/FONT_HEIGHT*TEXT_COLS+(w1+x)/FONT_WIDTH)*sizeof(U16);
win_z_buf_line_dec=whole_bytes;
if (leading_bits)
win_z_buf_line_dec++;
@@ -405,7 +405,7 @@ here1a:
for (j=h1;j<h2;j++) {
for (i=w1;i<w2;i++) {
c=img->body[k+i];
if (c!=COLOR_TRANSPARENT) {
if (c!=TRANSPARENT) {
dc->color.c0.color=c;
GrPlot0(dc,x+i,y+j);
}
@@ -414,7 +414,7 @@ here1a:
}
} else {
win_z_num =win_task->win_z_num;
win_z_buf_ptr =gr_win_z_buf(U8 *)+((h1+y)/FONT_HEIGHT*TEXT_COLS+(w1+x)/FONT_WIDTH)*sizeof(U16);
win_z_buf_ptr =gr.win_z_buf(U8 *)+((h1+y)/FONT_HEIGHT*TEXT_COLS+(w1+x)/FONT_WIDTH)*sizeof(U16);
win_z_buf_line_dec=whole_bytes;
if (leading_bits)
win_z_buf_line_dec++;
@@ -430,7 +430,7 @@ here1a:
for (i=w1;i<w2;) {
if (color_mask) {
c=img->body[k+i];
if (c!=COLOR_TRANSPARENT) {
if (c!=TRANSPARENT) {
dc->color.c0.color=c;
GrPlot0(dc,x+i,y+j);
}
@@ -458,7 +458,7 @@ here1a:
win_z_buf_ptr=NULL;
else {
win_z_num=win_task->win_z_num;
win_z_buf_ptr=gr_win_z_buf(U8 *)+((h1+y)/FONT_HEIGHT*TEXT_COLS+(w1+x)/FONT_WIDTH)*sizeof(U16);
win_z_buf_ptr=gr.win_z_buf(U8 *)+((h1+y)/FONT_HEIGHT*TEXT_COLS+(w1+x)/FONT_WIDTH)*sizeof(U16);
win_z_buf_line_dec=whole_bytes;
if (leading_bits)
win_z_buf_line_dec++;
@@ -570,7 +570,7 @@ U8 *GrBitMap4ToBitMap8(U8 *dst,U8 *src,I64 src_size,I64 bkcolor)
if (Bt(src+i1 ,k)) c|=2;
if (Bt(src+i1*2,k)) c|=4;
if (Bt(src+i1*3,k)) c|=8;
if (c==bkcolor) c=COLOR_TRANSPARENT;
if (c==bkcolor) c=TRANSPARENT;
*dst++=c;
}
return dst;
@@ -582,18 +582,18 @@ U8 *GrBitMap1ToBitMap8(U8 *dst,U8 *src,I64 src_size,I64 bkcolor)
for (k=0;k<i;k++) {
c=0;
if (Bt(src,k)) c=COLOR_MONO;
if (c==bkcolor) c=COLOR_TRANSPARENT;
if (c==bkcolor) c=TRANSPARENT;
*dst++=c;
}
return dst;
}
public CDC *DCExtract(CDC *dc=gr_dc,I64 x1,I64 y1,I64 x2,I64 y2,CTask *task=NULL)
{
public CDC *DCExtract(CDC *dc=gr.dc,I64 x1,I64 y1,I64 x2,I64 y2,CTask *task=NULL)
{//Extract new device context rect from device context.
CDC *result;
CTask *win_task;
if (x1>x2) SwapU64(&x1,&x2);
if (y1>y2) SwapU64(&y1,&y2);
if (x1>x2) SwapI64(&x1,&x2);
if (y1>y2) SwapI64(&y1,&y2);
if (dc->flags & DCF_SCREEN_BITMAP) {
win_task=dc->win_task;
x1+=win_task->pix_left+win_task->scroll_x;
@@ -609,8 +609,8 @@ public CDC *DCExtract(CDC *dc=gr_dc,I64 x1,I64 y1,I64 x2,I64 y2,CTask *task=NULL
#help_index "Graphics/Char;Char/Graphics"
public I64 GrPutChar(CDC *dc=gr_dc,I64 x,I64 y,U8 ch)
{ //Clipping but not transformation
public I64 GrPutChar(CDC *dc=gr.dc,I64 x,I64 y,U8 ch)
{//2D. Clipping but not transformation.
U8 reg *src,reg *dst,*font_ptr;
I64 i,m,leading_bits,trailing_bits,leading_bit_mask,trailing_bit_mask,
j,k1,kk1,w1,h1,w2,h2,reg bit_shift,dist,reg color_mask;
@@ -638,8 +638,8 @@ public I64 GrPutChar(CDC *dc=gr_dc,I64 x,I64 y,U8 ch)
x+=win_task->pix_left;
y+=win_task->pix_top;
}
if (dc->flags & DCF_LOCATE_NEAREST) { //TODO:Untested
dist=DistI64(x+w2>>1,y+h2>>1,dc->cur_x,dc->cur_y);
if (dc->flags & DCF_LOCATE_NEAREST) {//TODO:Untested
dist=DistSqrI64(x+w2>>1,y+h2>>1,dc->cur_x,dc->cur_y);
if (dist<=dc->nearest_dist) {
dc->nearest_sprite_elem_num=dc->cur_sprite_elem_num;
dc->nearest_dist=dist;
@@ -670,15 +670,15 @@ public I64 GrPutChar(CDC *dc=gr_dc,I64 x,I64 y,U8 ch)
color=dc->color;
leading_bits=-(w1+x)&7;
if (!leading_bits) leading_bits=8;
leading_bit_mask=gr_1_to_8_bits[0xFF>>leading_bits];
leading_bit_mask=gr.to_8_bits[0xFF>>leading_bits];
bit_shift=-x&7;
trailing_bits=(x+w2)&7;
trailing_bit_mask=gr_1_to_8_bits[0xFF<<trailing_bits&0xFF];
trailing_bit_mask=gr.to_8_bits[0xFF<<trailing_bits&0xFF];
if (leading_bits+trailing_bits>w2-w1) {
leading_bit_mask|=trailing_bit_mask;
trailing_bits=0;
}
font_ptr=&gr_font[(FONT_WIDTH*(FONT_HEIGHT*ch+h1))>>3];
font_ptr=&text.font[(FONT_WIDTH*(FONT_HEIGHT*ch+h1))>>3];
if (color.c0.rop==ROPB_COLLISION) {
m=w1&(FONT_WIDTH-1);
#assert FONT_WIDTH==8
@@ -688,14 +688,14 @@ public I64 GrPutChar(CDC *dc=gr_dc,I64 x,I64 y,U8 ch)
src=font_ptr;
for (j=h2-h1;j;j--) {
c=dc->body[k1+i];
if (c!=COLOR_TRANSPARENT && c!=color && Bt(src,m))
if (c!=TRANSPARENT && c!=color && Bt(src,m))
dc->collision_cnt++;
k1+=dc->width_internal;
src++;
}
}
} else {
color_mask=gr_1_to_8_colors[color.c0.color];
color_mask=gr.to_8_colors[color.c0.color];
k1=x+w1;
kk1=(h1+y)*dc->width_internal+k1;
if (!(dc->flags & DCF_SCREEN_BITMAP) || dc->flags&DCF_ON_TOP) {
@@ -708,7 +708,7 @@ public I64 GrPutChar(CDC *dc=gr_dc,I64 x,I64 y,U8 ch)
case ROPB_EQU:
case ROPB_MONO:
for (j=h2-h1;j;j--) {
m=gr_1_to_8_bits[*src(U16 *)>>bit_shift&0xFF];
m=gr.to_8_bits[*src(U16 *)>>bit_shift&0xFF];
*dst(I64 *)=*dst(I64 *)&leading_bit_mask|(color_mask&m|*dst(I64 *)&~m)&~leading_bit_mask;
src++;
dst+=dc->width_internal;
@@ -717,7 +717,7 @@ public I64 GrPutChar(CDC *dc=gr_dc,I64 x,I64 y,U8 ch)
case ROPB_XOR:
if (color_mask) {
for (j=h2-h1;j;j--) {
*dst(I64 *)=*dst(I64 *)&leading_bit_mask|(*dst(I64 *)^gr_1_to_8_bits[*src(U16 *)>>bit_shift&0xFF])&~leading_bit_mask;
*dst(I64 *)=*dst(I64 *)&leading_bit_mask|(*dst(I64 *)^gr.to_8_bits[*src(U16 *)>>bit_shift&0xFF])&~leading_bit_mask;
src++;
dst+=dc->width_internal;
}
@@ -735,7 +735,7 @@ public I64 GrPutChar(CDC *dc=gr_dc,I64 x,I64 y,U8 ch)
case ROPB_EQU:
case ROPB_MONO:
for (j=h2-h1;j;j--) {
m=gr_1_to_8_bits[*src(U16 *)>>bit_shift&0xFF];
m=gr.to_8_bits[*src(U16 *)>>bit_shift&0xFF];
*dst(I64 *)=*dst(I64 *)&trailing_bit_mask|(color_mask&m|*dst(I64 *)&~m)&~trailing_bit_mask;
src++;
dst+=dc->width_internal;
@@ -744,7 +744,7 @@ public I64 GrPutChar(CDC *dc=gr_dc,I64 x,I64 y,U8 ch)
case ROPB_XOR:
if (color_mask) {
for (j=h2-h1;j;j--) {
*dst(I64 *)=*dst(I64 *)&trailing_bit_mask|(*dst(I64 *)^gr_1_to_8_bits[*src(U16 *)>>bit_shift&0xFF])&~trailing_bit_mask;
*dst(I64 *)=*dst(I64 *)&trailing_bit_mask|(*dst(I64 *)^gr.to_8_bits[*src(U16 *)>>bit_shift&0xFF])&~trailing_bit_mask;
src++;
dst+=dc->width_internal;
}
@@ -763,7 +763,7 @@ public I64 GrPutChar(CDC *dc=gr_dc,I64 x,I64 y,U8 ch)
case ROPB_MONO:
for (j=h1;j<h2;j++) {
if (!IsPixCovered0(win_task,k1,y+j)) {
m=gr_1_to_8_bits[*src(U16 *)>>bit_shift&0xFF];
m=gr.to_8_bits[*src(U16 *)>>bit_shift&0xFF];
*dst(I64 *)=*dst(I64 *)&leading_bit_mask|(color_mask&m|*dst(I64 *)&~m)&~leading_bit_mask;
}
src++;
@@ -774,7 +774,7 @@ public I64 GrPutChar(CDC *dc=gr_dc,I64 x,I64 y,U8 ch)
if (color_mask) {
for (j=h1;j<h2;j++) {
if (!IsPixCovered0(win_task,k1,y+j))
*dst(I64 *)=*dst(I64 *)&leading_bit_mask|(*dst(I64 *)^gr_1_to_8_bits[*src(U16 *)>>bit_shift&0xFF])&~leading_bit_mask;
*dst(I64 *)=*dst(I64 *)&leading_bit_mask|(*dst(I64 *)^gr.to_8_bits[*src(U16 *)>>bit_shift&0xFF])&~leading_bit_mask;
src++;
dst+=dc->width_internal;
}
@@ -794,7 +794,7 @@ public I64 GrPutChar(CDC *dc=gr_dc,I64 x,I64 y,U8 ch)
case ROPB_MONO:
for (j=h1;j<h2;j++) {
if (!IsPixCovered0(win_task,k1,y+j)) {
m=gr_1_to_8_bits[*src(U16 *)>>bit_shift&0xFF];
m=gr.to_8_bits[*src(U16 *)>>bit_shift&0xFF];
*dst(I64 *)=*dst(I64 *)&trailing_bit_mask|(color_mask&m|*dst(I64 *)&~m)&~trailing_bit_mask;
}
src++;
@@ -805,7 +805,7 @@ public I64 GrPutChar(CDC *dc=gr_dc,I64 x,I64 y,U8 ch)
if (color_mask) {
for (j=h1;j<h2;j++) {
if (!IsPixCovered0(win_task,k1,y+j))
*dst(I64 *)=*dst(I64 *)&trailing_bit_mask|(*dst(I64 *)^gr_1_to_8_bits[*src(U16 *)>>bit_shift&0xFF])&~trailing_bit_mask;
*dst(I64 *)=*dst(I64 *)&trailing_bit_mask|(*dst(I64 *)^gr.to_8_bits[*src(U16 *)>>bit_shift&0xFF])&~trailing_bit_mask;
src++;
dst+=dc->width_internal;
}
@@ -820,8 +820,8 @@ public I64 GrPutChar(CDC *dc=gr_dc,I64 x,I64 y,U8 ch)
return 0;
}
I64 GrPutS(CDC *dc=gr_dc,I64 x,I64 y,U8 *_s)
{ //Use $LK,"GrPrint",A="MN:GrPrint"$()
I64 GrPutS(CDC *dc=gr.dc,I64 x,I64 y,U8 *_s)
{//Use $LK,"GrPrint",A="MN:GrPrint"$()
I64 x0,ch,result;
if (!_s) return 0;
x0=x;
@@ -840,8 +840,8 @@ I64 GrPutS(CDC *dc=gr_dc,I64 x,I64 y,U8 *_s)
return result;
}
I64 GrVPutS(CDC *dc=gr_dc,I64 x,I64 y,U8 *_s)
{ //Vertical Text. Use $LK,"GrVPrint",A="MN:GrVPrint"$()
I64 GrVPutS(CDC *dc=gr.dc,I64 x,I64 y,U8 *_s)
{//Vertical Text. Use $LK,"GrVPrint",A="MN:GrVPrint"$()
I64 y0,result;
U8 buf[2];
if (!_s) return 0;
@@ -863,30 +863,30 @@ I64 GrVPutS(CDC *dc=gr_dc,I64 x,I64 y,U8 *_s)
return result;
}
public I64 GrPrint(CDC *dc=gr_dc,I64 x,I64 y,U8 *fmt,...)
{
public I64 GrPrint(CDC *dc=gr.dc,I64 x,I64 y,U8 *fmt,...)
{//2D. Clipping but not transformation.
I64 result;
U8 *buf=SPrintJoin(NULL,fmt,argc,argv);
U8 *buf=StrPrintJoin(NULL,fmt,argc,argv);
result=GrPutS(dc,x,y,buf);
Free(buf);
return result;
}
public I64 GrVPrint(CDC *dc=gr_dc,I64 x,I64 y,U8 *fmt,...)
{ //Vertical text
public I64 GrVPrint(CDC *dc=gr.dc,I64 x,I64 y,U8 *fmt,...)
{//2D. Vertical text. Clipping but not transformation.
I64 result;
U8 *buf=SPrintJoin(NULL,fmt,argc,argv);
U8 *buf=StrPrintJoin(NULL,fmt,argc,argv);
result=GrVPutS(dc,x,y,buf);
Free(buf);
return result;
}
#help_index "Graphics"
public I64 GrRect(CDC *dc=gr_dc,I64 x,I64 y,I64 w,I64 h)
{ //Clipping but not transformation
//Returns cnt of pixs changed
public I64 GrRect(CDC *dc=gr.dc,I64 x,I64 y,I64 w,I64 h)
{//2D. Width Height. Clipping but not transformation.
//Returns cnt of pixs changed.
I64 i,result=0,j,k1,kk1,w1,h1,w2,h2,dist,
leading_bits,whole_bytes,trailing_bits,leading_bit_mask,trailing_bit_mask,
leading_bits,original_leading_bits,whole_bytes,trailing_bits,leading_bit_mask,trailing_bit_mask,
win_z_buf_line_inc,win_z_buf_line_dec,win_z_num,color_mask;
U8 reg *dst;
U16 reg *win_z_buf_ptr;
@@ -915,13 +915,13 @@ public I64 GrRect(CDC *dc=gr_dc,I64 x,I64 y,I64 w,I64 h)
x+=win_task->pix_left;
y+=win_task->pix_top;
}
if (dc->flags & DCF_LOCATE_NEAREST) { //TODO:Untested
if (dc->flags & DCF_LOCATE_NEAREST) {//TODO:Untested
if (dc->cur_x>=x && dc->cur_y>=y &&
dc->cur_x<=x+w && dc->cur_y<=y+h) {
dc->nearest_sprite_elem_num=dc->cur_sprite_elem_num;
dc->nearest_dist=0;
} else {
dist=DistI64(x+w>>1,y+h>>1,dc->cur_x,dc->cur_y);
dist=DistSqrI64(x+w>>1,y+h>>1,dc->cur_x,dc->cur_y);
if (dist<=dc->nearest_dist) {
dc->nearest_sprite_elem_num=dc->cur_sprite_elem_num;
dc->nearest_dist=dist;
@@ -963,25 +963,25 @@ public I64 GrRect(CDC *dc=gr_dc,I64 x,I64 y,I64 w,I64 h)
}
} else
dither=FALSE;
leading_bits=-(w1+x)&7;
leading_bit_mask=gr_1_to_8_bits[0xFF>>leading_bits];
original_leading_bits=leading_bits=-(w1+x)&7;
leading_bit_mask=gr.to_8_bits[0xFF>>leading_bits];
whole_bytes=(w2-w1-leading_bits)>>3;
if (whole_bytes<0) whole_bytes=0;
trailing_bits=(x+w2)&7;
trailing_bit_mask=gr_1_to_8_bits[0xFF<<trailing_bits&0xFF];
trailing_bit_mask=gr.to_8_bits[0xFF<<trailing_bits&0xFF];
if (leading_bits+trailing_bits>w2-w1) {
leading_bit_mask|=trailing_bit_mask;
leading_bits=w2-w1; //Correct so it's right for result.
trailing_bits=0;
}
if (color.c0.rop==ROPB_COLLISION) { //TODO: Might want to check win_z_buf
if (color.c0.rop==ROPB_COLLISION) {//TODO: Might want to check win_z_buf
color =dc->bkcolor.c0.color;
k1=(h1+y)*dc->width_internal+x;
result=-dc->collision_cnt;
for (j=h2-h1;j;j--) {
for (i=w1;i<w2;i++) {
c=dc->body[k1+i];
if (c!=COLOR_TRANSPARENT && c!=color)
if (c!=TRANSPARENT && c!=color)
dc->collision_cnt++;
}
k1+=dc->width_internal;
@@ -992,7 +992,7 @@ public I64 GrRect(CDC *dc=gr_dc,I64 x,I64 y,I64 w,I64 h)
win_z_buf_ptr=NULL;
else {
win_z_num=win_task->win_z_num;
win_z_buf_ptr=gr_win_z_buf(U8 *)+((h1+y)/FONT_HEIGHT*TEXT_COLS+(w1+x)/FONT_WIDTH)*sizeof(U16);
win_z_buf_ptr=gr.win_z_buf(U8 *)+((h1+y)/FONT_HEIGHT*TEXT_COLS+(w1+x)/FONT_WIDTH)*sizeof(U16);
win_z_buf_line_dec=whole_bytes;
if (leading_bits)
win_z_buf_line_dec++;
@@ -1014,7 +1014,7 @@ public I64 GrRect(CDC *dc=gr_dc,I64 x,I64 y,I64 w,I64 h)
if (win_z_buf_ptr) {
result=0;
for (j=h1;j<h2;j++) {
color_mask=gr_1_to_8_colors[color.c0.color];
color_mask=gr.to_8_colors[color.c0.color];
dst=dc->body+kk1&~7;
if (leading_bits) {
if (win_z_num>=*win_z_buf_ptr++) {
@@ -1044,7 +1044,7 @@ public I64 GrRect(CDC *dc=gr_dc,I64 x,I64 y,I64 w,I64 h)
}
} else {
for (j=h2-h1;j;j--) {
color_mask=gr_1_to_8_colors[color.c0.color];
color_mask=gr.to_8_colors[color.c0.color];
dst=dc->body+kk1&~7;
if (leading_bits)
*dst(I64 *)++=*dst(I64 *)&leading_bit_mask|color_mask&~leading_bit_mask;
@@ -1065,7 +1065,7 @@ public I64 GrRect(CDC *dc=gr_dc,I64 x,I64 y,I64 w,I64 h)
if (win_z_buf_ptr) {
result=0;
for (j=h1;j<h2;j++) {
color_mask=gr_1_to_8_colors[color.c0.color];
color_mask=gr.to_8_colors[color.c0.color];
dst=dc->body+kk1&~7;
if (leading_bits) {
if (win_z_num>=*win_z_buf_ptr++) {
@@ -1095,7 +1095,7 @@ public I64 GrRect(CDC *dc=gr_dc,I64 x,I64 y,I64 w,I64 h)
}
} else {
for (j=h2-h1;j;j--) {
color_mask=gr_1_to_8_colors[color.c0.color];
color_mask=gr.to_8_colors[color.c0.color];
dst=dc->body+kk1&~7;
if (leading_bits)
*dst(I64 *)++=*dst(I64 *)&leading_bit_mask|*dst(I64 *)^color_mask&~leading_bit_mask;
@@ -1114,7 +1114,7 @@ public I64 GrRect(CDC *dc=gr_dc,I64 x,I64 y,I64 w,I64 h)
break;
}
} else {
if (((x+w1)^(y+h1))&1)
if (((x+w1-original_leading_bits)^(y+h1))&1)
SwapU16(&color.c0,&color.c1);
nobound_switch (color.c0.rop) {
case ROPB_EQU:
@@ -1122,8 +1122,8 @@ public I64 GrRect(CDC *dc=gr_dc,I64 x,I64 y,I64 w,I64 h)
if (win_z_buf_ptr) {
result=0;
for (j=h1;j<h2;j++) {
color_mask=gr_1_to_8_bits[0x55]&gr_1_to_8_colors[color.c0.color]|
gr_1_to_8_bits[0xAA]&gr_1_to_8_colors[color.c1.color];
color_mask=gr.to_8_bits[0x55]&gr.to_8_colors[color.c0.color]|
gr.to_8_bits[0xAA]&gr.to_8_colors[color.c1.color];
dst=dc->body+kk1&~7;
if (leading_bits) {
if (win_z_num>=*win_z_buf_ptr++) {
@@ -1150,8 +1150,8 @@ public I64 GrRect(CDC *dc=gr_dc,I64 x,I64 y,I64 w,I64 h)
}
} else {
for (j=h2-h1;j;j--) {
color_mask=gr_1_to_8_bits[0x55]&gr_1_to_8_colors[color.c0.color]|
gr_1_to_8_bits[0xAA]&gr_1_to_8_colors[color.c1.color];
color_mask=gr.to_8_bits[0x55]&gr.to_8_colors[color.c0.color]|
gr.to_8_bits[0xAA]&gr.to_8_colors[color.c1.color];
dst=dc->body+kk1&~7;
if (leading_bits)
*dst(I64 *)++=*dst(I64 *)&leading_bit_mask|color_mask&~leading_bit_mask;
@@ -1169,8 +1169,8 @@ public I64 GrRect(CDC *dc=gr_dc,I64 x,I64 y,I64 w,I64 h)
if (win_z_buf_ptr) {
result=0;
for (j=h1;j<h2;j++) {
color_mask=gr_1_to_8_bits[0x55]&gr_1_to_8_colors[color.c0.color]|
gr_1_to_8_bits[0xAA]&gr_1_to_8_colors[color.c1.color];
color_mask=gr.to_8_bits[0x55]&gr.to_8_colors[color.c0.color]|
gr.to_8_bits[0xAA]&gr.to_8_colors[color.c1.color];
dst=dc->body+kk1&~7;
if (leading_bits) {
if (win_z_num>=*win_z_buf_ptr++) {
@@ -1197,8 +1197,8 @@ public I64 GrRect(CDC *dc=gr_dc,I64 x,I64 y,I64 w,I64 h)
}
} else {
for (j=h2-h1;j;j--) {
color_mask=gr_1_to_8_bits[0x55]&gr_1_to_8_colors[color.c0.color]|
gr_1_to_8_bits[0xAA]&gr_1_to_8_colors[color.c1.color];
color_mask=gr.to_8_bits[0x55]&gr.to_8_colors[color.c0.color]|
gr.to_8_bits[0xAA]&gr.to_8_colors[color.c1.color];
dst=dc->body+kk1&~7;
if (leading_bits)
*dst(I64 *)++=*dst(I64 *)&leading_bit_mask|*dst(I64 *)^color_mask&~leading_bit_mask;
@@ -1215,7 +1215,7 @@ public I64 GrRect(CDC *dc=gr_dc,I64 x,I64 y,I64 w,I64 h)
}
}
} else {
color_mask=gr_1_to_8_colors[color.c0.color];
color_mask=gr.to_8_colors[color.c0.color];
nobound_switch (color.c0.rop) {
case ROPB_EQU:
case ROPB_MONO:
@@ -1307,7 +1307,6 @@ public I64 GrRect(CDC *dc=gr_dc,I64 x,I64 y,I64 w,I64 h)
return result;
}
I64 GrRayLenMinus(CDC *dc,I64 x,I64 y)
{
//Returns cnt of pixs changed
@@ -1461,7 +1460,7 @@ I64 GrRayLen(CDC *dc,I64 *x1,I64 y,I64 z=0,I32 *db=NULL)
if ((not_color && c!=dc->color2 ||
!not_color && c==dc->color2) && plot) {
if (dc->flags & DCF_LOCATE_NEAREST) {
dist=DistI64(x3,y3,dc->cur_x,dc->cur_y);
dist=DistSqrI64(x3,y3,dc->cur_x,dc->cur_y);
if (dist<=dc->nearest_dist) {
dc->nearest_sprite_elem_num=dc->cur_sprite_elem_num;
dc->nearest_dist=dist;
@@ -1491,7 +1490,7 @@ I64 GrRayLen(CDC *dc,I64 *x1,I64 y,I64 z=0,I32 *db=NULL)
break;
case ROPB_COLLISION:
c2=*dst;
if (c2!=COLOR_TRANSPARENT && c2!=bkcolor.c0.color)
if (c2!=TRANSPARENT && c2!=bkcolor.c0.color)
dc->collision_cnt++;
break;
case ROPB_XOR:
@@ -1540,7 +1539,7 @@ I64 GrRayLen(CDC *dc,I64 *x1,I64 y,I64 z=0,I32 *db=NULL)
if ((not_color && c!=dc->color2 ||
!not_color && c==dc->color2) && plot) {
if (dc->flags & DCF_LOCATE_NEAREST) {
dist=DistI64(x3,y3,dc->cur_x,dc->cur_y);
dist=DistSqrI64(x3,y3,dc->cur_x,dc->cur_y);
if (dist<=dc->nearest_dist) {
dc->nearest_sprite_elem_num=dc->cur_sprite_elem_num;
dc->nearest_dist=dist;
@@ -1570,7 +1569,7 @@ I64 GrRayLen(CDC *dc,I64 *x1,I64 y,I64 z=0,I32 *db=NULL)
break;
case ROPB_COLLISION:
c2=*dst;
if (c2!=COLOR_TRANSPARENT && c2!=bkcolor.c0.color)
if (c2!=TRANSPARENT && c2!=bkcolor.c0.color)
dc->collision_cnt++;
break;
case ROPB_XOR:
@@ -1587,10 +1586,10 @@ gr_done:
return 0;
}
public I64 GrHLine(CDC *dc=gr_dc,I64 x1,I64 x2,I64 y,I64 z1=0,I64 z2=0)
{ //No transformation or pen width
//returns cnt of pixs changed
//This uses $LK,"fixed-point",A="FI:::/Demo/Lectures/FixedPoint.CPP"$.
public I64 GrHLine(CDC *dc=gr.dc,I64 x1,I64 x2,I64 y,I64 z1=0,I64 z2=0)
{//3D. No transformation or pen width.
//Returns cnt of pixs changed
//Uses $LK,"fixed-point",A="FI:::/Demo/Lectures/FixedPoint.CPP"$.
I64 dx,dz,z,result=0,i,j,d,dist;
U8 *dst;
CColorROPU32 c,c2,color=dc->color,bkcolor=dc->bkcolor,dither_colors;
@@ -1599,7 +1598,7 @@ public I64 GrHLine(CDC *dc=gr_dc,I64 x1,I64 x2,I64 y,I64 z1=0,I64 z2=0)
CTask *win_task;
if (!dc->depth_buf) {
if (x2<x1) SwapU64(&x1,&x2);
if (x2<x1) SwapI64(&x1,&x2);
return GrRect(dc,x1,y,x2-x1+1,1);
}
@@ -1621,8 +1620,8 @@ public I64 GrHLine(CDC *dc=gr_dc,I64 x1,I64 x2,I64 y,I64 z1=0,I64 z2=0)
}
if (y<0) goto gr_done;
if (x2<x1) {
SwapU64(&x1,&x2);
SwapU64(&z1,&z2);
SwapI64(&x1,&x2);
SwapI64(&z1,&z2);
}
if (x2<0)
goto gr_done;
@@ -1724,7 +1723,7 @@ public I64 GrHLine(CDC *dc=gr_dc,I64 x1,I64 x2,I64 y,I64 z1=0,I64 z2=0)
break;
case ROPB_COLLISION:
c2=*dst;
if (c2!=COLOR_TRANSPARENT && c2!=bkcolor.c0.color)
if (c2!=TRANSPARENT && c2!=bkcolor.c0.color)
dc->collision_cnt++;
break;
case ROPB_XOR:
-104
View File
@@ -1,104 +0,0 @@
#help_index "Graphics/Char;Char/Graphics"
public U0 PlotScreenStr(U8 *s,I64 attr,I64 x,I64 y)
{
I64 ch;
attr<<=8;
while (ch=*s++) {
PlotScreenU8(ch+attr,x,y);
x++;
}
}
public U0 PlotWinStr(CTask *task,U8 *s,I64 attr,I64 x,I64 y)
{
I64 ch;
attr<<=8;
while (ch=*s++) {
PlotWinU8(task,ch+attr,x,y);
x++;
}
}
public U0 PlotBorderStr(CTask *task,U8 *s,I64 attr,I64 x,I64 y)
{
I64 ch;
attr<<=8;
while (ch=*s++) {
PlotBorderU8(task,ch+attr,x,y);
x++;
}
}
public U0 DrawBorder(CTask *task,Bool solid,I64 l,I64 r,I64 t,I64 b,I64 attr,Bool clip_to_win)
{
I64 i;
attr<<=8;
if (clip_to_win) {
if (solid) {
PlotWinU8(task,'É'+attr,l-1,t-1);
PlotWinU8(task,'»'+attr,r+1,t-1);
PlotWinU8(task,'È'+attr,l-1,b+1);
PlotWinU8(task,'¼'+attr,r+1,b+1);
for (i=l;i<=r;i++) {
PlotWinU8(task,'Í'+attr,i,t-1);
PlotWinU8(task,'Í'+attr,i,b+1);
}
for (i=t;i<=b;i++) {
PlotWinU8(task,'º'+attr,l-1,i);
PlotWinU8(task,'º'+attr,r+1,i);
}
} else {
PlotWinU8(task,'Ú'+attr,l-1,t-1);
PlotWinU8(task,'¿'+attr,r+1,t-1);
PlotWinU8(task,'À'+attr,l-1,b+1);
PlotWinU8(task,'Ù'+attr,r+1,b+1);
for (i=l;i<=r;i++) {
PlotWinU8(task,'Ä'+attr,i,t-1);
PlotWinU8(task,'Ä'+attr,i,b+1);
}
for (i=t;i<=b;i++) {
PlotWinU8(task,'³'+attr,l-1,i);
PlotWinU8(task,'³'+attr,r+1,i);
}
}
} else {
if (solid) {
PlotScreenU8('É'+attr,l-1,t-1);
PlotScreenU8('»'+attr,r+1,t-1);
PlotScreenU8('È'+attr,l-1,b+1);
PlotScreenU8('¼'+attr,r+1,b+1);
for (i=l;i<=r;i++) {
PlotScreenU8('Í'+attr,i,t-1);
PlotScreenU8('Í'+attr,i,b+1);
}
for (i=t;i<=b;i++) {
PlotScreenU8('º'+attr,l-1,i);
PlotScreenU8('º'+attr,r+1,i);
}
} else {
PlotScreenU8('Ú'+attr,l-1,t-1);
PlotScreenU8('¿'+attr,r+1,t-1);
PlotScreenU8('À'+attr,l-1,b+1);
PlotScreenU8('Ù'+attr,r+1,b+1);
for (i=l;i<=r;i++) {
PlotScreenU8('Ä'+attr,i,t-1);
PlotScreenU8('Ä'+attr,i,b+1);
}
for (i=t;i<=b;i++) {
PlotScreenU8('³'+attr,l-1,i);
PlotScreenU8('³'+attr,r+1,i);
}
}
}
}
U0 DrawTaskBorder(CTask *task)
{
PUSHFD
CLI
DrawBorder(task,task==sys_focus_task,
task->win_left,task->win_right,
task->win_top,task->win_bottom,
task->border_attr,FALSE);
POPFD
}
+129 -24
View File
@@ -1,13 +1,79 @@
#help_index "Graphics"
public I64 GrRectB(CDC *dc=gr_dc,I64 x1,I64 y1,I64 x2,I64 y2)
{
if (x2<x1) SwapU64(&x1,&x2);
if (y2<y1) SwapU64(&y1,&y2);
public I64 GrFillPoly3(CDC *dc=gr.dc,I64 n,CD3I32 *poly)
{//3D. Must be convex.
//Returns cnt of pixs changed
CD3I32 tri[3];
I64 i,j,x,y,z,result=0;
if (n<3) return 0;
if (dc->flags & DCF_SYMMETRY) {
for (i=1;i<n-1;i++) {
j=i-1;
if (i==1) {
x=poly[j].x; y=poly[j].y; z=poly[j].z;
if (dc->flags&DCF_TRANSFORMATION)
(*dc->transform)(dc,&x,&y,&z);
GrReflect(dc,&x,&y,&z);
tri[0].x=x; tri[0].y=y; tri[0].z=z;
}
j++;
if (i==1) {
x=poly[j].x; y=poly[j].y; z=poly[j].z;
if (dc->flags&DCF_TRANSFORMATION)
(*dc->transform)(dc,&x,&y,&z);
GrReflect(dc,&x,&y,&z);
}
tri[1].x=x; tri[1].y=y; tri[1].z=z;
j++;
x=poly[j].x; y=poly[j].y; z=poly[j].z;
if (dc->flags&DCF_TRANSFORMATION)
(*dc->transform)(dc,&x,&y,&z);
GrReflect(dc,&x,&y,&z);
tri[2].x=x; tri[2].y=y; tri[2].z=z;
result+=GrFillTri0(dc,&tri[0],&tri[1],&tri[2]);
}
}
if (dc->flags&DCF_JUST_MIRROR)
return result;
for (i=1;i<n-1;i++) {
j=i-1;
if (i==1) {
x=poly[j].x; y=poly[j].y; z=poly[j].z;
if (dc->flags&DCF_TRANSFORMATION)
(*dc->transform)(dc,&x,&y,&z);
tri[0].x=x; tri[0].y=y; tri[0].z=z;
}
j++;
if (i==1) {
x=poly[j].x; y=poly[j].y; z=poly[j].z;
if (dc->flags&DCF_TRANSFORMATION)
(*dc->transform)(dc,&x,&y,&z);
}
tri[1].x=x; tri[1].y=y; tri[1].z=z;
j++;
x=poly[j].x; y=poly[j].y; z=poly[j].z;
if (dc->flags&DCF_TRANSFORMATION)
(*dc->transform)(dc,&x,&y,&z);
tri[2].x=x; tri[2].y=y; tri[2].z=z;
result+=GrFillTri0(dc,&tri[0],&tri[1],&tri[2]);
}
return result;
}
public I64 GrRectB(CDC *dc=gr.dc,I64 x1,I64 y1,I64 x2,I64 y2)
{//2D. Two point. Clipping but not transformation.
if (x2<x1) SwapI64(&x1,&x2);
if (y2<y1) SwapI64(&y1,&y2);
return GrRect(dc,x1,y1,x2-x1+1,y2-y1+1);
}
public I64 GrRect3(CDC *dc=gr_dc,I64 x,I64 y,I64 z,I64 w,I64 h)
{ //Clipping and transformation
public I64 GrRect3(CDC *dc=gr.dc,I64 x,I64 y,I64 z,I64 w,I64 h)
{//3D. Width Height. Clipping and transformation.
CD3I32 poly[4];
poly[0].x=x;
poly[0].y=y;
@@ -24,18 +90,17 @@ public I64 GrRect3(CDC *dc=gr_dc,I64 x,I64 y,I64 z,I64 w,I64 h)
return GrFillPoly3(dc,4,poly);
}
public U0 GrLineRect4(CDC *dc=gr_dc,I64 x1,I64 y1,I64 x2,I64 y2,I64 step=1,I64 start=0)
{
//Can be used with ROPF_DITHER+WHITE<<16+BLACK
//for dotted rect.
public U0 GrBorder(CDC *dc=gr.dc,I64 x1,I64 y1,I64 x2,I64 y2,I64 step=1,I64 start=0)
{//2D. Transformation with pen width.
//Can be used with ROPF_DITHER+WHITE<<16+BLACK for dotted rect.
GrLine3(dc,x1,y1,0,x2,y1,0,step,start);
GrLine3(dc,x2,y1,0,x2,y2,0,step,start);
GrLine3(dc,x2,y2,0,x1,y2,0,step,start);
GrLine3(dc,x1,y2,0,x1,y1,0,step,start);
}
public Bool GrArrow3(CDC *dc=gr_dc,I64 x1,I64 y1,I64 z1,I64 x2,I64 y2,I64 z2,F64 w=2.75,I64 step=1,I64 start=0)
{ //transformation with pen width
public Bool GrArrow3(CDC *dc=gr.dc,I64 x1,I64 y1,I64 z1,I64 x2,I64 y2,I64 z2,F64 w=2.75,I64 step=1,I64 start=0)
{//3D. Transformation with pen width.
I64 _x1,_y1,_z1,_x2,_y2,_z2,dx,dy;
F64 d;
Bool result=FALSE,was_transform=FALSE,was_symmetry=FALSE;
@@ -78,10 +143,8 @@ gr_done:
}
#help_index "Graphics/Char;Char/Graphics"
public Bool GrTextBox3(CDC *dc=gr_dc,I64 x1,I64 y1,I64 z1,U8 *s,I64 border=2)
{ //transformation
//DCF_SYMMETRY is silly.
public Bool GrTextBox3(CDC *dc=gr.dc,I64 x1,I64 y1,I64 z1,U8 *s,I64 border=2)
{//3D. Transformation. DCF_SYMMETRY is silly.
U8 *ptr;
I64 ch,result,w,w_max,h;
if (!s) return FALSE;
@@ -111,9 +174,8 @@ public Bool GrTextBox3(CDC *dc=gr_dc,I64 x1,I64 y1,I64 z1,U8 *s,I64 border=2)
#define MAX_DIAMOND_SLOPE 2.75
public Bool GrTextDiamond3(CDC *dc=gr_dc,I64 x1,I64 y1,I64 z1,U8 *_s,I64 border=2)
{ //transformation
//DCF_SYMMETRY is silly.
public Bool GrTextDiamond3(CDC *dc=gr.dc,I64 x1,I64 y1,I64 z1,U8 *_s,I64 border=2)
{//3D. Transformation. DCF_SYMMETRY is silly.
Bool first=TRUE;
U8 ch,*ptr,*ptr_end,*st,*s;
I64 result=0,y,dx,dy,dx_old,dy_old,w,h=FONT_HEIGHT;
@@ -176,19 +238,62 @@ public Bool GrTextDiamond3(CDC *dc=gr_dc,I64 x1,I64 y1,I64 z1,U8 *_s,I64 border=
return ToBool(result);
}
#help_index "Graphics/Mesh"
public I64 Gr3Mesh(CDC *dc=gr.dc,I64 vertex_cnt,CD3I32 *p,I64 tri_cnt,CMeshTri *tri)
{//Returns cnt of pixs changed.
CColorROPU32 old_color=dc->color;
I64 i,x,y,z,result=0;
CD3I32 *pt,*pt_sym,*p_sym,*dst;
CMeshTri *tri_sym=tri;
if (dc->flags&DCF_TRANSFORMATION) {
dst=pt=MAlloc(sizeof(CD3I32)*vertex_cnt);
for (i=0;i<vertex_cnt;i++,p++,dst++) {
x=p->x; y=p->y; z=p->z;
(*dc->transform)(dc,&x,&y,&z);
dst->x=x; dst->y=y; dst->z=z;
}
p=pt;
} else
pt=NULL;
if (dc->flags & DCF_SYMMETRY) {
dst=pt_sym=MAlloc(sizeof(CD3I32)*vertex_cnt);
p_sym=p;
for (i=0;i<vertex_cnt;i++,p_sym++,dst++) {
x=p_sym->x; y=p_sym->y; z=p_sym->z;
GrReflect(dc,&x,&y,&z);
dst->x=x; dst->y=y; dst->z=z;
}
p_sym=pt_sym;
for (i=0;i<tri_cnt;i++,tri_sym++) {
(*dc->lighting)(dc,&p_sym[tri_sym->nums[0]],&p_sym[tri_sym->nums[2]],&p_sym[tri_sym->nums[1]],tri_sym->color);
result+=GrFillTri0(dc,&p_sym[tri_sym->nums[0]],&p_sym[tri_sym->nums[2]],&p_sym[tri_sym->nums[1]]);
}
Free(pt_sym);
if (dc->flags&DCF_JUST_MIRROR)
goto mesh_done;
}
for (i=0;i<tri_cnt;i++,tri++) {
(*dc->lighting)(dc,&p[tri->nums[0]],&p[tri->nums[1]],&p[tri->nums[2]],tri->color);
result+=GrFillTri0(dc,&p[tri->nums[0]],&p[tri->nums[1]],&p[tri->nums[2]]);
}
mesh_done:
dc->color=old_color;
Free(pt);
return result;
}
#help_index "Graphics/Misc;Input Pointer/Displayed Image"
//Called by $LK,"DrawInputPtr",A="MN:DrawInputPtr"$() which is
//called by $LK,"WinFinalUpdate",A="MN:WinFinalUpdate"$().
public U0 DrawStdInputPtr(CDC *dc,I64 x,I64 y)
{//This is a callback.
//Called by $LK,"DrawInputPtr",A="MN:DrawInputPtr"$() which is
//called by $LK,"WinFinalUpdate",A="MN:WinFinalUpdate"$().
dc->pen_width=1;
dc->flags&=~(DCF_TRANSFORMATION|DCF_SYMMETRY);
GrArrow3(dc,x+8,y+8,0,x,y,0);
}
public U0 (*fp_draw_input_ptr)(CDC *dc,I64 x,I64 y)=&DrawStdInputPtr;
public U0 (*fp_draw_grab_input_ptr)(CDC *dc,I64 x,I64 y,Bool closed)=NULL;
public U8 *gr_empty_sprite=NULL; //Gets assigned $LK,"gr_empty_sprite",A="FI:::/Adam/WallPaper.CPP"$
gr.fp_draw_input_ptr=&DrawStdInputPtr;
public U0 DrawWaitInputPtr(CDC *dc,I64 x,I64 y)
{//This is a callback.
+46 -44
View File
@@ -1,11 +1,10 @@
#help_index "Graphics/Math/3D Transformation"
#help_file "::/Doc/Transform"
//This uses $LK,"fixed-point",A="FI:::/Demo/Lectures/FixedPoint.CPP"$.
I64 gr_scale=1<<32;
#define GR_SCALE (1<<32)
public U0 GrRot(I64 r[4][4],I64 *_x,I64 *_y,I64 *_z)
{
//This uses $LK,"fixed-point",A="FI:::/Demo/Lectures/FixedPoint.CPP"$.
{//Rotate 3D point using 4x4 matrix. Uses $LK,"fixed-point",A="FI:::/Demo/Lectures/FixedPoint.CPP"$.
I64 x1,y1,z1,xx=*_x,yy=*_y,zz=*_z;
x1=(r[0][0]*xx+r[0][1]*yy+r[0][2]*zz+r[0][3])>>32;
y1=(r[1][0]*xx+r[1][1]*yy+r[1][2]*zz+r[1][3])>>32;
@@ -15,7 +14,7 @@ public U0 GrRot(I64 r[4][4],I64 *_x,I64 *_y,I64 *_z)
public U0 GrTransform(CDC *dc,I64 *_x,I64 *_y,I64 *_z)
{//This is a callback.
//This uses $LK,"fixed-point",A="FI:::/Demo/Lectures/FixedPoint.CPP"$.
//Uses $LK,"fixed-point",A="FI:::/Demo/Lectures/FixedPoint.CPP"$.
GrRot(dc->r,_x,_y,_z);
*_x+=dc->x;
*_y+=dc->y;
@@ -23,8 +22,7 @@ public U0 GrTransform(CDC *dc,I64 *_x,I64 *_y,I64 *_z)
}
public I64 *GrIdentNew(CTask *mem_task=NULL)
{
//This uses $LK,"fixed-point",A="FI:::/Demo/Lectures/FixedPoint.CPP"$.
{//MAlloc an identity matrix. Uses $LK,"fixed-point",A="FI:::/Demo/Lectures/FixedPoint.CPP"$.
I64 *r=CAlloc(sizeof(I64)*16,mem_task);
r[0] .i32[1]=1;
r[5] .i32[1]=1;
@@ -34,8 +32,7 @@ public I64 *GrIdentNew(CTask *mem_task=NULL)
}
public I64 *GrIdentEqu(I64 r[4][4])
{
//This uses $LK,"fixed-point",A="FI:::/Demo/Lectures/FixedPoint.CPP"$.
{//Set matrix to identity. Uses $LK,"fixed-point",A="FI:::/Demo/Lectures/FixedPoint.CPP"$.
MemSet(r,0,sizeof(I64)*16);
r[0][0].i32[1]=1;
r[1][1].i32[1]=1;
@@ -45,11 +42,12 @@ public I64 *GrIdentEqu(I64 r[4][4])
}
public U0 GrSetRotMat(CDC *dc=NULL,I64 r[4][4])
{//NULL means gr_dc
//This uses $LK,"fixed-point",A="FI:::/Demo/Lectures/FixedPoint.CPP"$.
// (1.0/Sqrt(3))*65536=37837.22
{//Set device context's rot matrix. Will be $LK,"Free",A="MN:Free"$d() in $LK,"DCDel",A="MN:DCDel"$(). Uses $LK,"fixed-point",A="FI:::/Demo/Lectures/FixedPoint.CPP"$.
//The main purpose is to set matrix norm for pen width scaling.
//NULL as dc means gr.dc
//Note: (1.0/Sqrt(3))*65536=37837.22
I64 xx=37838,yy=37837,zz=37837;
if (!dc) dc=gr_dc;
if (!dc) dc=gr.dc;
dc->r=r;
GrRot(r,&xx,&yy,&zz);
//scaled 32 bits
@@ -121,20 +119,20 @@ public U0 GrLighting(CDC *dc,CD3I32 *p1,CD3I32 *p2,CD3I32 *p3,CColorROPU32 color
}
#help_index "Graphics/Device Contexts"
public U0 DCFill(CDC *dc=NULL,CColorROPU32 val=COLOR_TRANSPARENT)
{
if (!dc) dc=gr_dc;
public U0 DCFill(CDC *dc=NULL,CColorROPU32 val=TRANSPARENT)
{//Fill entire device context with color.
if (!dc) dc=gr.dc;
MemSet(dc->body,val,dc->width_internal*dc->height);
}
public U0 DCClear(CDC *dc=NULL)
{
if (!dc) dc=gr_dc;
{//Set entire device context image body to 0 (BLACK).
if (!dc) dc=gr.dc;
DCFill(dc,0);
}
public U0 DCRst(CDC *dc)
{
{//Reset $LK,"CDC",A="MN:CDC"$ structure members but not image body, itself.
dc->color=BLACK;
dc->color2=BLACK;
dc->bkcolor=BLACK;
@@ -149,15 +147,16 @@ public U0 DCRst(CDC *dc)
dc->transform=&GrTransform;
dc->lighting =&GrLighting;
GrIdentEqu(dc->r);
dc->r_norm=gr_scale;
dc->r_norm=GR_SCALE;
dc->flags&=~(DCF_SYMMETRY|DCF_TRANSFORMATION|DCF_JUST_MIRROR);
}
public U0 DCExtentsInit(CDC *dc=NULL)
{//NULL means gr_dc
{//Init markers for extent of next newly drawn graphics.
//NULL means gr.dc
//See $LK,"::/Demo/Graphics/Extents.CPP"$
//You should clear the record flag yourself
if (!dc) dc=gr_dc;
if (!dc) dc=gr.dc;
dc->flags|=DCF_RECORD_EXTENTS;
dc->min_x=MAX_I64;
dc->max_x=MIN_I64;
@@ -166,9 +165,10 @@ public U0 DCExtentsInit(CDC *dc=NULL)
}
public CDC *DCAlias(CDC *dc=NULL,CTask *task=NULL)
{//NULL means gr_dc
{//Create alias of dc, so can change pen, color, etc.
//NULL means gr.dc
CDC *result;
if (!dc) dc=gr_dc;
if (!dc) dc=gr.dc;
if (!task) task=Fs;
if (dc->dc_signature!=DCS_SIGNATURE_VAL)
Dbg;
@@ -182,10 +182,10 @@ public CDC *DCAlias(CDC *dc=NULL,CTask *task=NULL)
return result;
}
public CDC *DCNew(I64 width,I64 height,CTask *task=NULL,Bool null_bitmap=FALSE)
{//This internally only allows widths which are divisible by 8
//Don't forget these $MA-X+PU,"sizeof(CDC)",LM="Grep(\"sizeof(CDC)\",\"/*\");View;"$.
{//Create new width x height device context.
//Internally only allows widths which are divisible by 8.
//Don't forget these $MA-X+PU,"sizeof(CDC)",LM="Grep(\"sizeof(CDC)\",\"/*\");View;"$.
CDC *result;
if (!task) task=Fs;
result=CAlloc(sizeof(CDC),task);
@@ -206,7 +206,7 @@ public CDC *DCNew(I64 width,I64 height,CTask *task=NULL,Bool null_bitmap=FALSE)
}
public U0 DCDel(CDC *dc)
{
{//Free dc, image body, rot mat and depth buf.
if (!dc) return;
if (dc->dc_signature!=DCS_SIGNATURE_VAL)
Dbg;
@@ -219,7 +219,7 @@ public U0 DCDel(CDC *dc)
}
public I64 DCSize(CDC *dc)
{
{//Mem size of header, image body and depth buffer.
if (dc)
return MSize2(dc)+MSize2(dc->body)+MSize2(dc->depth_buf);
else
@@ -227,20 +227,20 @@ public I64 DCSize(CDC *dc)
}
public U0 DCDepthBufRst(CDC *dc)
{
{//Reset device context depth buf to far away.
if (dc->depth_buf)
MemSetU32(dc->depth_buf,MAX_I32,dc->width_internal*dc->height);
}
public U0 DCAllocDepthBuf(CDC *dc)
{
{//Allocate a 32-bit depth buffer for device context.
Free(dc->depth_buf);
dc->depth_buf=MAlloc(dc->width_internal*dc->height*sizeof(I32),dc->mem_task);
DCDepthBufRst(dc);
}
public CDC *DCCopy(CDC *dc,CTask *task=NULL)
{
{//Alloc copy of dc, including image body, rot mat and depth buf.
CDC *result;
if (!dc) return NULL;
if (dc->dc_signature!=DCS_SIGNATURE_VAL)
@@ -249,12 +249,13 @@ public CDC *DCCopy(CDC *dc,CTask *task=NULL)
GrSetRotMat(result,MAllocIdentical(dc->r,task));
result->mem_task=task;
result->body=MAllocIdentical(dc->body,task);
result->depth_buf=MAllocIdentical(dc->depth_buf,task);
return result;
}
public U0 DCMono(CDC *dc,
I64 quest=COLOR_TRANSPARENT,I64 true_color=0,I64 false_color=COLOR_MONO)
{
I64 quest=TRANSPARENT,I64 true_color=0,I64 false_color=COLOR_MONO)
{//Set entire device context to one of two colors.
I64 i;
U8 *dst;
dst=dc->body;
@@ -266,8 +267,8 @@ public U0 DCMono(CDC *dc,
*dst++=false_color;
}
public I64 DCColorChg(CDC *dc,I64 src_color,I64 dst_color=COLOR_TRANSPARENT)
{
public I64 DCColorChg(CDC *dc,I64 src_color,I64 dst_color=TRANSPARENT)
{//Find and replace src color with dst in device context.
I64 i,result=0;
U8 *dst;
dst=dc->body;
@@ -282,7 +283,7 @@ public I64 DCColorChg(CDC *dc,I64 src_color,I64 dst_color=COLOR_TRANSPARENT)
}
public U8 *DCSave(CDC *dc,I64 *_size=NULL,Bool compressed=TRUE)
{ //stores to mem
{//Stores device context to mem, perhaps, with compression.
U8 *result,*ptr,*body;
Bool old_preempt;
CArcCompress *ac;
@@ -321,7 +322,7 @@ public U8 *DCSave(CDC *dc,I64 *_size=NULL,Bool compressed=TRUE)
}
public CDC *DCLoad(U8 *src,I64 *_size=NULL,CTask *task=NULL)
{ //loads from mem
{//Loads device context from mem.
CDC *result;
U8 *ptr=src;
CArcCompress *ac;
@@ -352,7 +353,7 @@ public CDC *DCLoad(U8 *src,I64 *_size=NULL,CTask *task=NULL)
#help_index "Graphics/Device Contexts;Graphics/GRA Files"
public I64 GRAWrite(U8 *filename,CDC *dc)
{ // TempleOS GRA File
{//TempleOS GRA File.
I64 size;
U8 *st=DftExt(filename,"GRA.Z"),
*src=DCSave(dc,&size);
@@ -363,7 +364,7 @@ public I64 GRAWrite(U8 *filename,CDC *dc)
}
public CDC *GRARead(U8 *filename,CTask *task=NULL)
{ // TempleOS GRA File
{//TempleOS GRA File.
CDC *dc=NULL;
U8 *st=DftExt(filename,"GRA.Z"),
*src=FileRead(st);
@@ -374,7 +375,7 @@ public CDC *GRARead(U8 *filename,CTask *task=NULL)
return dc;
}
#help_index "Graphics/Sprite;Graphics/GRA Files;Doc/Output"
#help_index "Graphics/Sprite;Graphics/GRA Files;DolDoc/Output"
public U0 DocGRAFile(CDoc *doc=NULL,U8 *filename)
{//Put a GRA file into a document as a sprite.
CDC *dc=GRARead(filename);
@@ -386,12 +387,13 @@ public U0 DocGRAFile(CDoc *doc=NULL,U8 *filename)
#help_index "Graphics/Device Contexts;Graphics/Screen"
public CDC *DCCaptureScreen(CTask *task=NULL)
{
{//Capture screen to a device context.
CDC *dc;
U8 *dst;
WinMgrSync(2,TRUE);
dc=DCCopy(gr_screen_image,task);
dc=DCCopy(gr.screen_image,task);
dst=MAlloc(dc->body_size,task);
//Pick background color that never occurs. COLOR_INVALID
GrBitMap4ToBitMap8(dst,dc->body,dc->body_size/2,COLOR_INVALID);
Free(dc->body);
dc->body=dst;
@@ -400,7 +402,7 @@ public CDC *DCCaptureScreen(CTask *task=NULL)
#help_index "Graphics/GRA Files;Graphics/Screen"
public I64 GRACaptureScreen(U8 *filename)
{ // TempleOS GRA File
{//Capture screen to a TempleOS GRA File.
I64 size;
CDC *dc=DCCaptureScreen;
size=GRAWrite(filename,dc);
+46 -39
View File
@@ -1,49 +1,56 @@
#help_index "Graphics/Device Contexts;Graphics/Screen"
public CDC *gr_screen_image, //This is read only.
*gr_dc=NULL; //Persistent
CDC *gr_dc1=NULL,
*gr_dc2=NULL, //Updated every refresh
*gr_dc_cache,
*gr_zoomed_dc;
#help_index "Graphics"
#help_index "Graphics/Screen"
U16 *gr_win_uncovered_bitmap=NULL,gr_highest_uncovered;
U16 *gr_vga_text_cache;
public I64 gr_pan_text_x=0,gr_pan_text_y=0; // [-7,7]
public U0 (*fp_final_screen_update)(CDC *dc)=NULL;
public U0 (*fp_wall_paper)(CTask *task)=NULL;
public class CGrGlbls
{
I64 *to_8_bits,*to_8_colors;
CDC *screen_image, //Read only.
*dc, //Persistent
*dc1,
*dc2, //Updated every refresh
*dc_cache,
*zoomed_dc;
U32 *text_base; //See $LK,"TextBase Layer",A="HI:TextBase Layer"$.
U16 *win_z_buf;
#define SPHT_ELEM_CODE 1
CHashTable *sprite_hash;
U16 *win_uncovered_bitmap;
I64 highest_uncovered;
U16 *vga_text_cache;
I64 pan_text_x,pan_text_y; //[-7,7]
U0 (*fp_final_screen_update)(CDC *dc);
U0 (*fp_wall_paper)(CTask *task);
U0 (*fp_draw_input_ptr)(CDC *dc,I64 x,I64 y);
U0 (*fp_draw_grab_input_ptr)(CDC *dc,I64 x,I64 y,Bool closed);
U8 *empty_sprite; //Gets assigned $LK,"gr.empty_sprite",A="FF:::/Adam/WallPaper.CPP,empty_sprite"$
#define GR_NUM_PEN_BRUSHES 64
CDC *gr_pen_brushes[GR_NUM_PEN_BRUSHES],
*gr_collision_pen_brushes[GR_NUM_PEN_BRUSHES],
*gr_even_pen_brushes[GR_NUM_PEN_BRUSHES],
*gr_odd_pen_brushes[GR_NUM_PEN_BRUSHES];
#define GR_MAX_SCREEN_ZOOM 8
U8 *gr_screen_zoom_tables[GR_MAX_SCREEN_ZOOM+1];
I64 gr_screen_zoom=1,grsx=0,grsy=0;
//When zoomed, this keeps the mouse centered.
public Bool gr_continuous_scroll=FALSE;
CDC *pen_brushes[GR_NUM_PEN_BRUSHES],
*collision_pen_brushes[GR_NUM_PEN_BRUSHES],
*even_pen_brushes[GR_NUM_PEN_BRUSHES],
*odd_pen_brushes[GR_NUM_PEN_BRUSHES];
#define GR_REFRESH_LOG_CNT 16
F64 gr_refresh_time_stamps[GR_REFRESH_LOG_CNT];
I64 gr_refresh_ts_ptr=0;
F64 refresh_time_stamps[GR_REFRESH_LOG_CNT];
I64 refresh_ts_ptr;
#define GR_MAX_SCREEN_ZOOM 8
U8 *screen_zoom_tables[GR_MAX_SCREEN_ZOOM+1];
I64 screen_zoom,sx,sy;
//When zoomed, this keeps the mouse centered.
Bool continuous_scroll;
} gr;
//See $LK,"SYS_BIOS_GR_MODE",A="FF:D:/Kernel/KStart.CPP,SYS_BIOS_GR_MODE:2"$
//See $LK,"SysGrInit",A="MN:SysGrInit"$()
//This allows consts to be used
//instead of vars.
DefinePrint("GR_WIDTH","%d",gr_width);
HashPublic("GR_WIDTH",HTT_DEFINE_STR);
DefinePrint("GR_HEIGHT","%d",gr_height);
HashPublic("GR_HEIGHT",HTT_DEFINE_STR);
;
//Allows consts to be used instead of vars.
HashPublic("GR_WIDTH",HTT_DEFINE_STR);;
HashPublic("GR_HEIGHT",HTT_DEFINE_STR);;
#help_index "Char"
DefinePrint("TEXT_ROWS","%d",text_rows);
HashPublic("TEXT_ROWS",HTT_DEFINE_STR);
DefinePrint("TEXT_COLS","%d",text_cols);
HashPublic("TEXT_COLS",HTT_DEFINE_STR);
;
DefinePrint("TEXT_ROWS","%d",text.rows);;;
HashPublic("TEXT_ROWS",HTT_DEFINE_STR);;;
DefinePrint("TEXT_COLS","%d",text.cols);;;
HashPublic("TEXT_COLS",HTT_DEFINE_STR);;;
+46 -68
View File
@@ -9,18 +9,18 @@ U0 GrSetUpTables()
for (i=0;i<256;i++)
for (j=0;j<8;j++)
if (Bt(&i,j))
gr_1_to_8_bits(U8 *)[k++]=0xFF;
gr.to_8_bits(U8 *)[k++]=0xFF;
else
gr_1_to_8_bits(U8 *)[k++]=0x00;
gr.to_8_bits(U8 *)[k++]=0x00;
k=0;
for (i=0;i<256;i++)
for (j=0;j<8;j++)
gr_1_to_8_colors(U8 *)[k++]=i;
gr.to_8_colors(U8 *)[k++]=i;
for (i=0;i<GR_NUM_PEN_BRUSHES;i++) {
k=i+1;
dc=DCNew(i,i);
gr_pen_brushes[i]=dc;
gr.pen_brushes[i]=dc;
dc->color=COLOR_MONO;
rr=k*k;
for (y=1;y<k;y++)
@@ -29,8 +29,8 @@ U0 GrSetUpTables()
GrPlot0(dc,x-1,y-1);
dc=DCNew(i,i);
gr_collision_pen_brushes[i]=dc;
dc->color=COLOR_INVALID;
gr.collision_pen_brushes[i]=dc;
dc->color=COLOR_INVALID;//Want color that never occurs.
rr=k*k;
for (y=1;y<k;y++)
for (x=1;x<k;x++)
@@ -38,7 +38,7 @@ U0 GrSetUpTables()
GrPlot0(dc,x-1,y-1);
dc=DCNew(i,i);
gr_even_pen_brushes[i]=dc;
gr.even_pen_brushes[i]=dc;
dc->color=COLOR_MONO;
rr=k*k;
for (y=1;y<k;y++)
@@ -47,7 +47,7 @@ U0 GrSetUpTables()
GrPlot0(dc,x-1,y-1);
dc=DCNew(i,i);
gr_odd_pen_brushes[i]=dc;
gr.odd_pen_brushes[i]=dc;
dc->color=COLOR_MONO;
rr=k*k;
for (y=1;y<k;y++)
@@ -55,18 +55,18 @@ U0 GrSetUpTables()
if (((x-1)^(y-1))&1 && SqrI64(y*2-k)+SqrI64(x*2-k)<rr)
GrPlot0(dc,x-1,y-1);
}
if (text_mode) {
if (!sys_bios_gr_mode) { //if text mode
MemSet(VGA_TEXT_MEM_BASE,0,TEXT_ROWS*TEXT_COLS*sizeof(U16));
MemSet(gr_vga_text_cache,0,TEXT_ROWS*TEXT_COLS*sizeof(U16));
MemSet(gr.vga_text_cache,0,TEXT_ROWS*TEXT_COLS*sizeof(U16));
} else {
OutU8(VGA_SC_INDEX,VGA_MAP_MASK);
OutU8(VGA_SC_DATA,0x0F);
//Virtual Box crashes on the following for some reason.
// MemSet(VGA_GRAPHIC_MEM_BASE,0,GR_HEIGHT*GR_WIDTH>>3);
MemSet(gr_screen_image->body,0,GR_WIDTH*GR_HEIGHT>>1);
MemSet(gr.screen_image->body,0,GR_WIDTH*GR_HEIGHT>>1);
}
for (i=1;i<=GR_MAX_SCREEN_ZOOM;i++) {
dst=gr_screen_zoom_tables[i]=MAlloc(256*i);
dst=gr.screen_zoom_tables[i]=MAlloc(256*i);
for (j=0;j<256;j++) {
m=0;
for (k=0;k<8;k++) {
@@ -80,13 +80,13 @@ U0 GrSetUpTables()
}
}
for (i=0;i<GR_REFRESH_LOG_CNT;i++)
gr_refresh_time_stamps[i]=tS;
gr.refresh_time_stamps[i]=tS;
}
#help_index "Graphics/Screen;Windows"
U0 WinZBufFill(CTask *task)
{ //Not public
{//Not public
I64 y,t,b,l,r,w;
if (!Bt(&task->display_flags,DISPLAYf_NO_BORDER)) {
if (task->win_top-1>0)
@@ -129,19 +129,19 @@ U0 WinZBufFill(CTask *task)
r=ClampI64(r,l,TEXT_COLS-1);
if (w=r-l+1)
for (y=t;y<=b;y++)
MemSetU16(gr_win_z_buf(U8 *)+(y*TEXT_COLS+l)*sizeof(U16),
MemSetU16(gr.win_z_buf(U8 *)+(y*TEXT_COLS+l)*sizeof(U16),
task->win_z_num,w);
}
public U0 WinZBufUpdate()
{ //You might have to call this if you are doing graphics outside
//the window mgr callback routines. Call it if, for example,
//a pop-up window closes and you need to refresh before graphics.
{//Might have to call this if you are doing graphics outside winmgr callback routines.
//Call it if, for example, when a pop-up window closes and you need to refresh
//before graphics.
I64 i,z=1;
U16 *ptr;
CTask *task,*task1;
Bool old_preempt=Preempt(OFF);
if (gr_win_z_buf) {
if (gr.win_z_buf) {
LBtr(&sys_semas[SYS_SEMA_UPDATE_WIN_Z_BUF],0);
task1=task=sys_winmgr_task;
do {
@@ -153,71 +153,49 @@ public U0 WinZBufUpdate()
task=task->next_task;
} while (task!=task1 && z<0x10000);
MemSet(gr_win_uncovered_bitmap,0,(gr_highest_uncovered+7)>>3+1);
gr_highest_uncovered=z-1;
for (ptr=gr_win_z_buf,i=TEXT_ROWS*TEXT_COLS;i;i--)
Bts(gr_win_uncovered_bitmap,*ptr++);
MemSet(gr.win_uncovered_bitmap,0,(gr.highest_uncovered+7)>>3+1);
gr.highest_uncovered=z-1;
for (ptr=gr.win_z_buf,i=TEXT_ROWS*TEXT_COLS;i;i--)
Bts(gr.win_uncovered_bitmap,*ptr++);
}
Preempt(old_preempt);
}
#help_index "Graphics/Char;Char"
public U0 WinTextFill(I64 d,CTask *task=NULL)
{//You probably don't want this.
I64 y,w,t,b,l,r;
if (!task) task=Fs;
if (!TaskValidate(task)) return;
if (task->win_top>0)
t=task->win_top;
else
t=0;
if (task->win_bottom<TEXT_ROWS)
b=task->win_bottom;
else
b=TEXT_ROWS-1;
if (task->win_left>0)
l=task->win_left;
else
l=0;
if (task->win_right<TEXT_COLS)
r=task->win_right;
else
r=TEXT_COLS-1;
if (w=r-l+1)
for (y=t;y<=b;y++)
MemSetU32(gr_text_base(U8 *)+(y*TEXT_COLS+l)*sizeof(U32),
d,w);
}
#help_index "Graphics"
U0 GrInit2()
{
MemSet(&gr,0,sizeof(CGrGlbls));
gr.sprite_hash=HashTableNew(512);
HashDefineLstAdd("ST_SPRITE_ELEM_CODES",SPHT_ELEM_CODE,gr.sprite_hash);
gr.screen_zoom=1;
SetStdPalette;
fp_set_std_palette=&SetStdPalette;
SetVGAPalette4Indices;
gr_1_to_8_bits =MAlloc(256*sizeof(I64));
gr_1_to_8_colors=MAlloc(256*sizeof(I64));
gr.to_8_bits =MAlloc(256*sizeof(I64));
gr.to_8_colors=MAlloc(256*sizeof(I64));
gr_text_base=CAlloc(TEXT_ROWS*TEXT_COLS*sizeof(U32));
gr_vga_text_cache=MAlloc(TEXT_ROWS*TEXT_COLS*sizeof(U16));
gr_win_uncovered_bitmap=CAlloc(65536/8);
gr_highest_uncovered=0;
gr_win_z_buf=MAlloc(TEXT_ROWS*TEXT_COLS*sizeof(U16));
gr.text_base=CAlloc(TEXT_ROWS*TEXT_COLS*sizeof(U32));
gr.vga_text_cache=MAlloc(TEXT_ROWS*TEXT_COLS*sizeof(U16));
gr.win_uncovered_bitmap=CAlloc(65536/8);
gr.highest_uncovered=0;
gr.win_z_buf=MAlloc(TEXT_ROWS*TEXT_COLS*sizeof(U16));
gr_dc2=DCNew(GR_WIDTH,GR_HEIGHT);
gr_dc2->flags|=DCF_SCREEN_BITMAP;
gr_dc_cache=DCNew(GR_WIDTH,GR_HEIGHT);
gr.dc2=DCNew(GR_WIDTH,GR_HEIGHT);
gr.dc2->flags|=DCF_SCREEN_BITMAP;
gr.dc_cache=DCNew(GR_WIDTH,GR_HEIGHT);
gr_dc=DCNew(GR_WIDTH,GR_HEIGHT);
gr_dc->flags|=DCF_SCREEN_BITMAP|DCF_ON_TOP;
gr.dc=DCNew(GR_WIDTH,GR_HEIGHT);
gr.dc->flags|=DCF_SCREEN_BITMAP|DCF_ON_TOP;
DCFill;
gr_dc1=DCNew(GR_WIDTH,GR_HEIGHT);
gr_dc1->flags|=DCF_SCREEN_BITMAP;
gr.dc1=DCNew(GR_WIDTH,GR_HEIGHT);
gr.dc1->flags|=DCF_SCREEN_BITMAP;
gr_screen_image=DCNew(GR_WIDTH,GR_HEIGHT); //4-bit
gr_zoomed_dc =DCNew(GR_WIDTH,GR_HEIGHT); //4-bit
gr_zoomed_dc->flags|=DCF_SCREEN_BITMAP;
gr.screen_image=DCNew(GR_WIDTH,GR_HEIGHT); //4-bit
gr.zoomed_dc =DCNew(GR_WIDTH,GR_HEIGHT); //4-bit
gr.zoomed_dc->flags|=DCF_SCREEN_BITMAP;
}
GrInit2;
+8 -8
View File
@@ -10,15 +10,15 @@ DefineLstLoad("ST_RAINBOW_10",
"GREEN\0BLUE\0PURPLE\0LTGRAY\0WHITE\0");
U0 SetVGAPalette4Indices()
{//4-bit (16 color)
/*There is a level of indirection we wish to identity map.
{/*4-bit (16 color)
There is a level of indirection we wish to identity map.
This sets the 16-colors to use
the first 16 DAC rgb entries, so
we never need to worry about indexes,
just DAC palette settings.
*/
I64 i;
if (text_mode) return;
if (!sys_bios_gr_mode) return;
PUSHFD
CLI
while (LBts(&sys_semas[SYS_SEMA_VGA],0))
@@ -36,8 +36,8 @@ just DAC palette settings.
}
public U0 SetVGAPaletteColor(I64 color_num,CBGR bgr)
{ //6-bits per r,dc and g
if (text_mode) return;
{//6-bits per b, g and r.
if (!sys_bios_gr_mode) return;
PUSHFD
CLI
while (LBts(&sys_semas[SYS_SEMA_VGA],0))
@@ -52,9 +52,9 @@ public U0 SetVGAPaletteColor(I64 color_num,CBGR bgr)
}
public CBGR GetVGAPaletteColor(I64 color_num)
{ //6-bits per r,dc and g
{//6-bits per b, g and r.
CBGR result=0;
if (text_mode) return 0;
if (!sys_bios_gr_mode) return 0;
PUSHFD
CLI
while (LBts(&sys_semas[SYS_SEMA_VGA],0))
@@ -96,6 +96,6 @@ public U0 SetVGAPalette4(CBGR *bgr)
}
public U0 SetStdPalette()
{
{//Activate std palette.
SetVGAPalette4(vga_palette4_std);
}
+85 -208
View File
@@ -1,7 +1,7 @@
#help_index "Graphics"
public Bool GrClamp(CDC *dc=gr_dc,I64 *left,I64 *top,I64 *right,I64 *bottom,I64 width=0,I64 height=0)
{ //returns screen, not window coordinates
public Bool GrClamp(CDC *dc=gr.dc,I64 *left,I64 *top,I64 *right,I64 *bottom,I64 width=0,I64 height=0)
{//Returns screen, not window coordinates.
CTask *win_task;
*left=0;
*top=0;
@@ -29,8 +29,8 @@ public Bool GrClamp(CDC *dc=gr_dc,I64 *left,I64 *top,I64 *right,I64 *bottom,I64
return *left<=*right && *top<=*bottom;
}
Bool DCClipLine(CDC *dc=gr_dc,I64 *x1,I64 *y1,I64 *x2,I64 *y2,I64 width=0,I64 height=0)
{ //also converts window to screen coordinates
Bool DCClipLine(CDC *dc=gr.dc,I64 *x1,I64 *y1,I64 *x2,I64 *y2,I64 width=0,I64 height=0)
{//Also converts window to screen coordinates
I64 left,top,right,bottom;
CTask *win_task;
if (GrClamp(dc,&left,&top,&right,&bottom,width,height)) {
@@ -46,8 +46,8 @@ Bool DCClipLine(CDC *dc=gr_dc,I64 *x1,I64 *y1,I64 *x2,I64 *y2,I64 width=0,I64 he
return FALSE;
}
public Bool GrPlot(CDC *dc=gr_dc,I64 x,I64 y)
{ //Clipping but No transformation or pen width
public Bool GrPlot(CDC *dc=gr.dc,I64 x,I64 y)
{//2D. Clipping but No transformation or pen width.
I32 *db=dc->depth_buf;
CTask *win_task;
CColorROPU32 old_color;
@@ -76,8 +76,8 @@ public Bool GrPlot(CDC *dc=gr_dc,I64 x,I64 y)
return TRUE;
}
Bool GrPlot1(CDC *dc=gr_dc,I64 x,I64 y)
{ //Clipping but No transformation or pen width, called with db_z set
Bool GrPlot1(CDC *dc=gr.dc,I64 x,I64 y)
{//Clipping but No transformation or pen width, called with db_z set
CTask *win_task;
CColorROPU32 old_color;
if (dc->brush) {
@@ -106,9 +106,9 @@ Bool GrPlot1(CDC *dc=gr_dc,I64 x,I64 y)
return TRUE;
}
public I64 GrPeek(CDC *dc=gr_dc,I64 x,I64 y)
public I64 GrPeek(CDC *dc=gr.dc,I64 x,I64 y)
{//2D. Clipping but no transformation.
//Returns pix color or -1 if off-screen or covered.
{ //Clipping but No transformation
CTask *win_task;
if (dc->flags & DCF_SCREEN_BITMAP) {
win_task=dc->win_task;
@@ -234,10 +234,8 @@ I64 GrFloodFillRay(CDC *dc,I64 x,I64 y,I64 z,I32 *db)
return result;
}
public I64 GrFloodFill(CDC *dc=gr_dc,I64 x,I64 y,Bool not_color=FALSE,I64 z=0,I32 *db=NULL)
{
//Ignore z and db.
public I64 GrFloodFill(CDC *dc=gr.dc,I64 x,I64 y,Bool not_color=FALSE,I64 z=0,I32 *db=NULL)
{//3D. Ignore z and db.
//not_color=TRUE means fill up to everything which is not the current color.
//not_color=FALSE means fill all parts equal to the color under the point.
//Returns cnt of pixs changed
@@ -273,8 +271,8 @@ ff_done:
return result;
}
public Bool GrPlot3B(CDC *dc=gr_dc,I64 x,I64 y,I64 z)
{ //Clipping and transformation but no pen_width
public Bool GrPlot3B(CDC *dc=gr.dc,I64 x,I64 y,I64 z)
{//3D. Clipping and transformation but no pen_width.
I64 _x,_y,_z;
Bool was_transform=FALSE,was_symmetry=FALSE;
if (dc->flags & DCF_TRANSFORMATION) {
@@ -302,9 +300,8 @@ gr_done:
return TRUE;
}
public Bool GrPlot3(CDC *dc=gr_dc,I64 x,I64 y,I64 z)
{ //clipping and transformation and pen width
public Bool GrPlot3(CDC *dc=gr.dc,I64 x,I64 y,I64 z)
{//3D. Clipping and transformation and pen width.
I64 _x,_y,_z,i,j,w,dist;
CColorROPU32 old_color=dc->color;
Bool record,was_transform=FALSE,was_symmetry=FALSE;
@@ -334,43 +331,43 @@ public Bool GrPlot3(CDC *dc=gr_dc,I64 x,I64 y,I64 z)
if (dc->color.c1.rop&ROPBF_DITHER) {
dc->color.c1.rop=dc->color.c0.rop;
if (((x-w)^(y-w))&1) {
record=GrBlot3(dc,x-w,y-w,z,gr_odd_pen_brushes[dc->pen_width]);
record=GrBlot3(dc,x-w,y-w,z,gr.odd_pen_brushes[dc->pen_width]);
dc->color.c0=dc->color.c1;
record=GrBlot3(dc,x-w,y-w,z,gr_even_pen_brushes[dc->pen_width]);
record=GrBlot3(dc,x-w,y-w,z,gr.even_pen_brushes[dc->pen_width]);
} else {
record=GrBlot3(dc,x-w,y-w,z,gr_even_pen_brushes[dc->pen_width]);
record=GrBlot3(dc,x-w,y-w,z,gr.even_pen_brushes[dc->pen_width]);
dc->color.c0=dc->color.c1;
record=GrBlot3(dc,x-w,y-w,z,gr_odd_pen_brushes[dc->pen_width]);
record=GrBlot3(dc,x-w,y-w,z,gr.odd_pen_brushes[dc->pen_width]);
}
} else {
if (dc->color.c0.rop==ROPB_COLLISION) {
if (dc->color.c0.color!=dc->bkcolor.c0.color && dc->color.c0.color!=COLOR_TRANSPARENT)
record=GrBlot3(dc,x-w,y-w,z,gr_collision_pen_brushes[dc->pen_width]);
if (dc->color.c0.color!=dc->bkcolor.c0.color && dc->color.c0.color!=TRANSPARENT)
record=GrBlot3(dc,x-w,y-w,z,gr.collision_pen_brushes[dc->pen_width]);
else
record=FALSE;
} else
record=GrBlot3(dc,x-w,y-w,z,gr_pen_brushes[dc->pen_width]);
record=GrBlot3(dc,x-w,y-w,z,gr.pen_brushes[dc->pen_width]);
}
} else {
if (dc->color.c1.rop&ROPBF_DITHER) {
dc->color.c1.rop=dc->color.c0.rop;
if (((x-w)^(y-w))&1) {
record=GrBlot(dc,x-w,y-w,gr_odd_pen_brushes[dc->pen_width]);
record=GrBlot(dc,x-w,y-w,gr.odd_pen_brushes[dc->pen_width]);
dc->color.c0=dc->color.c1;
record=GrBlot(dc,x-w,y-w,gr_even_pen_brushes[dc->pen_width]);
record=GrBlot(dc,x-w,y-w,gr.even_pen_brushes[dc->pen_width]);
} else {
record=GrBlot(dc,x-w,y-w,gr_even_pen_brushes[dc->pen_width]);
record=GrBlot(dc,x-w,y-w,gr.even_pen_brushes[dc->pen_width]);
dc->color.c0=dc->color.c1;
record=GrBlot(dc,x-w,y-w,gr_odd_pen_brushes[dc->pen_width]);
record=GrBlot(dc,x-w,y-w,gr.odd_pen_brushes[dc->pen_width]);
}
} else {
if (dc->color.c0.rop==ROPB_COLLISION) {
if (dc->color.c0.color!=dc->bkcolor.c0.color && dc->color.c0.color!=COLOR_TRANSPARENT)
record=GrBlot(dc,x-w,y-w,gr_collision_pen_brushes[dc->pen_width]);
if (dc->color.c0.color!=dc->bkcolor.c0.color && dc->color.c0.color!=TRANSPARENT)
record=GrBlot(dc,x-w,y-w,gr.collision_pen_brushes[dc->pen_width]);
else
record=FALSE;
} else
record=GrBlot(dc,x-w,y-w,gr_pen_brushes[dc->pen_width]);
record=GrBlot(dc,x-w,y-w,gr.pen_brushes[dc->pen_width]);
}
}
if (record) {
@@ -380,7 +377,7 @@ public Bool GrPlot3(CDC *dc=gr_dc,I64 x,I64 y,I64 z)
y+=win_task->pix_top+win_task->scroll_y;
}
if (dc->flags & DCF_LOCATE_NEAREST) {
dist=DistI64(x,y,dc->cur_x,dc->cur_y);
dist=DistSqrI64(x,y,dc->cur_x,dc->cur_y);
if (dist<dc->nearest_dist) {
dc->nearest_sprite_elem_num=dc->cur_sprite_elem_num;
dc->nearest_dist=dist;
@@ -398,7 +395,7 @@ public Bool GrPlot3(CDC *dc=gr_dc,I64 x,I64 y,I64 z)
}
}
}
} else if (dc->pen_width & 1) { //TODO Dither
} else if (dc->pen_width & 1) {//TODO Dither
for (i=-w;i<=w;i++)
for (j=-w;j<=w;j++)
GrPlot1(dc,x+i,y+j);
@@ -436,8 +433,8 @@ Bool GrLinePlot(CDC *dc,I64 x,I64 y,I64 z)
return TRUE;
}
public Bool GrLine(CDC *dc=gr_dc,I64 x1,I64 y1,I64 x2,I64 y2,I64 step=1,I64 start=0)
{
public Bool GrLine(CDC *dc=gr.dc,I64 x1,I64 y1,I64 x2,I64 y2,I64 step=1,I64 start=0)
{//2D. Clipping but not transformation.
Bool result=FALSE;
I32 *db=dc->depth_buf;
dc->depth_buf=NULL;
@@ -450,9 +447,9 @@ public Bool GrLine(CDC *dc=gr_dc,I64 x1,I64 y1,I64 x2,I64 y2,I64 step=1,I64 star
return result;
}
public Bool GrCircle(CDC *dc=gr_dc,I64 cx,I64 cy,I64 radius,
public Bool GrCircle(CDC *dc=gr.dc,I64 cx,I64 cy,I64 radius,
I64 step=1,F64 start_radians=0,F64 len_radians=2*ã)
{
{//2D. Clipping but not transformation.
Bool result;
I32 *db=dc->depth_buf;
dc->depth_buf=NULL;
@@ -461,14 +458,14 @@ public Bool GrCircle(CDC *dc=gr_dc,I64 cx,I64 cy,I64 radius,
return result;
}
public Bool GrEllipse(CDC *dc=gr_dc,
public Bool GrEllipse(CDC *dc=gr.dc,
I64 cx,I64 cy,
I64 x_radius,I64 y_radius,
F64 rot_angle=0,
I64 step=1,
F64 start_radians=0,
F64 len_radians=2*ã)
{
{//2D. Clipping but not transformation.
Bool result;
I32 *db=dc->depth_buf;
dc->depth_buf=NULL;
@@ -477,14 +474,14 @@ public Bool GrEllipse(CDC *dc=gr_dc,
return result;
}
public Bool GrRegPoly(CDC *dc=gr_dc,
public Bool GrRegPoly(CDC *dc=gr.dc,
I64 cx,I64 cy,
I64 x_radius,I64 y_radius,I64 sides,
F64 rot_angle=0,
I64 step=1,
F64 start_radians=0,
F64 len_radians=2*ã)
{
{//2D. Clipping but no transform or pen width.
Bool result;
I32 *db=dc->depth_buf;
dc->depth_buf=NULL;
@@ -494,28 +491,28 @@ public Bool GrRegPoly(CDC *dc=gr_dc,
return result;
}
public Bool Gr2Bezier(CDC *dc=gr_dc,CD3I32 *ctrl)
{
public Bool Gr2Bezier(CDC *dc=gr.dc,CD3I32 *ctrl)
{//2nd order. Clipping but no transform or pen width.
return Bezier2(dc,ctrl,&GrLinePlot);
}
public Bool Gr3Bezier(CDC *dc=gr_dc,CD3I32 *ctrl)
{
public Bool Gr3Bezier(CDC *dc=gr.dc,CD3I32 *ctrl)
{//3rd order. Clipping but no transform or pen width.
return Bezier3(dc,ctrl,&GrLinePlot);
}
public Bool Gr2BSpline(CDC *dc=gr_dc,CD3I32 *ctrl,I64 cnt,Bool closed=FALSE)
{
public Bool Gr2BSpline(CDC *dc=gr.dc,CD3I32 *ctrl,I64 cnt,Bool closed=FALSE)
{//2nd order. Clipping but no transform or pen width.
return BSpline2(dc,ctrl,cnt,&GrLinePlot,closed);
}
public Bool Gr3BSpline(CDC *dc=gr_dc,CD3I32 *ctrl,I64 cnt,Bool closed=FALSE)
{
public Bool Gr3BSpline(CDC *dc=gr.dc,CD3I32 *ctrl,I64 cnt,Bool closed=FALSE)
{//3rd order. Clipping but no transform or pen width.
return BSpline3(dc,ctrl,cnt,&GrLinePlot,closed);
}
public Bool GrLine3(CDC *dc=gr_dc,I64 x1,I64 y1,I64 z1,I64 x2,I64 y2,I64 z2,I64 step=1,I64 start=0)
{
public Bool GrLine3(CDC *dc=gr.dc,I64 x1,I64 y1,I64 z1,I64 x2,I64 y2,I64 z2,I64 step=1,I64 start=0)
{//3D. Transformation with pen width.
I64 _x1,_y1,_z1,_x2,_y2,_z2;
Bool result=FALSE,was_transform=FALSE,was_symmetry=FALSE;
if (dc->flags & DCF_TRANSFORMATION) {
@@ -530,7 +527,7 @@ public Bool GrLine3(CDC *dc=gr_dc,I64 x1,I64 y1,I64 z1,I64 x2,I64 y2,I64 z2,I64
_x2=x2; _y2=y2; _z2=z2;
GrReflect(dc,&_x2,&_y2,&_z2);
dc->flags&=~DCF_SYMMETRY;
if (step==1 && !start && !dc->brush && dc->pen_width<2 && !dc->depth_buf) { //TODO: clip z for depth buf
if (step==1 && !start && !dc->brush && dc->pen_width<2 && !dc->depth_buf) {//TODO: clip z for depth buf
if (DCClipLine(dc,&_x1,&_y1,&_x2,&_y2))
result=Line(dc,_x1,_y1,0,_x2,_y2,0,&GrLinePlot0,step,start);
} else
@@ -539,7 +536,7 @@ public Bool GrLine3(CDC *dc=gr_dc,I64 x1,I64 y1,I64 z1,I64 x2,I64 y2,I64 z2,I64
if (dc->flags&DCF_JUST_MIRROR)
goto gr_done;
}
if (step==1 && !start && !dc->brush && dc->pen_width<2 && !dc->depth_buf) { //TODO: clip z for depth buf
if (step==1 && !start && !dc->brush && dc->pen_width<2 && !dc->depth_buf) {//TODO: clip z for depth buf
if (DCClipLine(dc,&x1,&y1,&x2,&y2))
result|=Line(dc,x1,y1,0,x2,y2,0,&GrLinePlot0,step,start);
} else
@@ -554,18 +551,16 @@ gr_done:
#help_index "Graphics/Char;Char/Graphics"
public Bool GrPutChar3(CDC *dc=gr_dc,I64 x,I64 y,I64 z,U8 ch)
{ //transformation
//DCF_SYMMETRY is silly.
public Bool GrPutChar3(CDC *dc=gr.dc,I64 x,I64 y,I64 z,U8 ch)
{//3D. Transformation. DCF_SYMMETRY is silly.
if (dc->flags & DCF_TRANSFORMATION)
(*dc->transform)(dc,&x,&y,&z);
return GrPutChar(dc,x,y,ch);
}
public I64 GrPrint3(CDC *dc=gr_dc,I64 x,I64 y,I64 z,U8 *fmt,...)
{ //transformation
//DCF_SYMMETRY is silly.
U8 *buf=SPrintJoin(NULL,fmt,argc,argv);
public I64 GrPrint3(CDC *dc=gr.dc,I64 x,I64 y,I64 z,U8 *fmt,...)
{//3D. Transformation. DCF_SYMMETRY is silly.
U8 *buf=StrPrintJoin(NULL,fmt,argc,argv);
I64 result;
if (dc->flags & DCF_TRANSFORMATION)
(*dc->transform)(dc,&x,&y,&z);
@@ -574,11 +569,9 @@ public I64 GrPrint3(CDC *dc=gr_dc,I64 x,I64 y,I64 z,U8 *fmt,...)
return result;
}
public I64 GrVPrint3(CDC *dc=gr_dc,I64 x,I64 y,I64 z,U8 *fmt,...)
{ //Vertical text
//transformation
//DCF_SYMMETRY is silly.
U8 *buf=SPrintJoin(NULL,fmt,argc,argv);
public I64 GrVPrint3(CDC *dc=gr.dc,I64 x,I64 y,I64 z,U8 *fmt,...)
{//3D. Vertical text. Transformation. DCF_SYMMETRY is silly.
U8 *buf=StrPrintJoin(NULL,fmt,argc,argv);
I64 result;
if (dc->flags & DCF_TRANSFORMATION)
(*dc->transform)(dc,&x,&y,&z);
@@ -589,14 +582,14 @@ public I64 GrVPrint3(CDC *dc=gr_dc,I64 x,I64 y,I64 z,U8 *fmt,...)
#help_index "Graphics"
public Bool GrEllipse3(CDC *dc=gr_dc,
public Bool GrEllipse3(CDC *dc=gr.dc,
I64 cx,I64 cy,I64 cz,
I64 x_radius,I64 y_radius,
F64 rot_angle=0,
I64 step=1,
F64 start_radians=0,
F64 len_radians=2*ã)
{
{//3D. Transformation with pen width.
Bool result;
I64 x,y,z,xx,yy,zz;
F64 m1,a1,m2,a2,s,c;
@@ -642,23 +635,23 @@ public Bool GrEllipse3(CDC *dc=gr_dc,
return result;
}
public Bool GrCircle3(CDC *dc=gr_dc,I64 cx,I64 cy,I64 cz,I64 radius,
public Bool GrCircle3(CDC *dc=gr.dc,I64 cx,I64 cy,I64 cz,I64 radius,
I64 step=1,F64 start_radians=0,F64 len_radians=2*ã)
{ //transformation with pen width
{//3D. Transformation with pen width.
if (dc->flags & DCF_TRANSFORMATION)
return GrEllipse3(dc,cx,cy,cz,radius,radius,0,step,start_radians,len_radians);
else
return Circle(dc,cx,cy,cz,radius,&GrPlot3,step,start_radians,len_radians);
}
public Bool GrRegPoly3(CDC *dc=gr_dc,
public Bool GrRegPoly3(CDC *dc=gr.dc,
I64 cx,I64 cy,I64 cz,
I64 x_radius,I64 y_radius,I64 sides,
F64 rot_angle=0,
I64 step=1,
F64 start_radians=0,
F64 len_radians=2*ã)
{
{//3D. Clipping and transform and pen width.
Bool result;
I64 x,y,z,xx,yy,zz;
F64 m1,a1,m2,a2,s,c;
@@ -704,8 +697,8 @@ public Bool GrRegPoly3(CDC *dc=gr_dc,
return result;
}
public I64 GrFloodFill3(CDC *dc=gr_dc,I64 x1,I64 y1,I64 z1,Bool not_color=FALSE)
{ //transformation
public I64 GrFloodFill3(CDC *dc=gr.dc,I64 x1,I64 y1,I64 z1,Bool not_color=FALSE)
{//3D. Transformation.
//not_color=TRUE means fill up to everything which is not the current color.
//not_color=FALSE means fill all parts equal to the color under the point.
//Returns cnt of pixs changed
@@ -731,9 +724,8 @@ gr_done:
#help_index "Graphics;Graphics/Device Contexts"
public I64 GrBlot3(CDC *dc=gr_dc,I64 x1,I64 y1,I64 z1,CDC *img)
{ //Clipping and transformation
//This uses $LK,"fixed-point",A="FI:::/Demo/Lectures/FixedPoint.CPP"$.
public I64 GrBlot3(CDC *dc=gr.dc,I64 x1,I64 y1,I64 z1,CDC *img)
{//3D. Clipping and transformation. Uses $LK,"fixed-point",A="FI:::/Demo/Lectures/FixedPoint.CPP"$.
CColorROPU32 old_color=dc->color;
I64 color,reg i,j,w=img->width,h=img->height,
d1,dx1,dy1,dz1,
@@ -828,7 +820,7 @@ public I64 GrBlot3(CDC *dc=gr_dc,I64 x1,I64 y1,I64 z1,CDC *img)
GrPlot(dc,_x2.i32[1],_y2.i32[1]);
}
} else {
if (color!=COLOR_TRANSPARENT) {
if (color!=TRANSPARENT) {
dc->color=old_color&~COLORROP_NO_ROP0_MASK|color;
if (dc->depth_buf) {
dc->db_z=_z2.i32[1];
@@ -918,7 +910,7 @@ normal_image:
GrPlot(dc,x2.i32[1],y2.i32[1]);
}
} else {
if (color!=COLOR_TRANSPARENT) {
if (color!=TRANSPARENT) {
dc->color=old_color&~COLORROP_NO_ROP0_MASK|color;//COLOR
if (dc->depth_buf) {
dc->db_z=z2.i32[1];
@@ -948,8 +940,8 @@ gr_done:
#help_index "Graphics"
public Bool Gr2Bezier3(CDC *dc=gr_dc,CD3I32 *ctrl)
{
public Bool Gr2Bezier3(CDC *dc=gr.dc,CD3I32 *ctrl)
{//2nd order. Clipping and transform and pen width.
Bool result=FALSE;
I64 i,x,y,z,
old_flags=dc->flags;
@@ -993,8 +985,8 @@ gr_done:
return result;
}
public Bool Gr3Bezier3(CDC *dc=gr_dc,CD3I32 *ctrl)
{
public Bool Gr3Bezier3(CDC *dc=gr.dc,CD3I32 *ctrl)
{//3rd order. Clipping and transform and pen width.
Bool result=FALSE;
I64 i,x,y,z,
old_flags=dc->flags;
@@ -1038,8 +1030,8 @@ gr_done:
return result;
}
public I64 Gr2BSpline3(CDC *dc=gr_dc,CD3I32 *ctrl,I64 cnt,Bool closed=FALSE)
{
public I64 Gr2BSpline3(CDC *dc=gr.dc,CD3I32 *ctrl,I64 cnt,Bool closed=FALSE)
{//2nd order. Clipping and transform and pen width.
Bool result=FALSE;
I64 i,x,y,z,
old_flags=dc->flags;
@@ -1083,8 +1075,8 @@ gr_done:
return result;
}
public Bool Gr3BSpline3(CDC *dc=gr_dc,CD3I32 *ctrl,I64 cnt,Bool closed=FALSE)
{
public Bool Gr3BSpline3(CDC *dc=gr.dc,CD3I32 *ctrl,I64 cnt,Bool closed=FALSE)
{//3rd order. Clipping and transform and pen width.
Bool result=FALSE;
I64 i,x,y,z,
old_flags=dc->flags;
@@ -1128,21 +1120,20 @@ gr_done:
return result;
}
public I64 GrFillTri0(CDC *dc=gr_dc,CD3I32 *p1,CD3I32 *p2,CD3I32 *p4)
{
//This uses $LK,"fixed-point",A="FI:::/Demo/Lectures/FixedPoint.CPP"$.
public I64 GrFillTri0(CDC *dc=gr.dc,CD3I32 *p1,CD3I32 *p2,CD3I32 *p4)
{//3D. Uses $LK,"fixed-point",A="FI:::/Demo/Lectures/FixedPoint.CPP"$.
//Returns cnt of pixs changed
I64 x1,x2,y,z1,z2,dx1,dy1,dz1,dx2,dy2,dz2,result=0,i,y_min,y_max;
CTask *win_task;
//p1 is min x
if (p4->x<p2->x)
SwapU64(&p4,&p2);
SwapI64(&p4,&p2);
if (p2->x<p1->x)
SwapU64(&p2,&p1);
SwapI64(&p2,&p1);
//p2y<=p4y
if (p4->y<p2->y)
SwapU64(&p4,&p2);
SwapI64(&p4,&p2);
y_min=0;
y_max=dc->height;
@@ -1364,7 +1355,6 @@ p4y
4
2
1
4
@@ -1447,116 +1437,3 @@ p4y
ft_done:
return result;
}
public I64 GrFillPoly3(CDC *dc=gr_dc,I64 n,CD3I32 *poly)
{ //Must be convex.
//Returns cnt of pixs changed
CD3I32 tri[3];
I64 i,j,x,y,z,result=0;
if (n<3) return 0;
if (dc->flags & DCF_SYMMETRY) {
for (i=1;i<n-1;i++) {
j=i-1;
if (i==1) {
x=poly[j].x; y=poly[j].y; z=poly[j].z;
if (dc->flags&DCF_TRANSFORMATION)
(*dc->transform)(dc,&x,&y,&z);
GrReflect(dc,&x,&y,&z);
tri[0].x=x; tri[0].y=y; tri[0].z=z;
}
j++;
if (i==1) {
x=poly[j].x; y=poly[j].y; z=poly[j].z;
if (dc->flags&DCF_TRANSFORMATION)
(*dc->transform)(dc,&x,&y,&z);
GrReflect(dc,&x,&y,&z);
}
tri[1].x=x; tri[1].y=y; tri[1].z=z;
j++;
x=poly[j].x; y=poly[j].y; z=poly[j].z;
if (dc->flags&DCF_TRANSFORMATION)
(*dc->transform)(dc,&x,&y,&z);
GrReflect(dc,&x,&y,&z);
tri[2].x=x; tri[2].y=y; tri[2].z=z;
result+=GrFillTri0(dc,&tri[0],&tri[1],&tri[2]);
}
}
if (dc->flags&DCF_JUST_MIRROR)
return result;
for (i=1;i<n-1;i++) {
j=i-1;
if (i==1) {
x=poly[j].x; y=poly[j].y; z=poly[j].z;
if (dc->flags&DCF_TRANSFORMATION)
(*dc->transform)(dc,&x,&y,&z);
tri[0].x=x; tri[0].y=y; tri[0].z=z;
}
j++;
if (i==1) {
x=poly[j].x; y=poly[j].y; z=poly[j].z;
if (dc->flags&DCF_TRANSFORMATION)
(*dc->transform)(dc,&x,&y,&z);
}
tri[1].x=x; tri[1].y=y; tri[1].z=z;
j++;
x=poly[j].x; y=poly[j].y; z=poly[j].z;
if (dc->flags&DCF_TRANSFORMATION)
(*dc->transform)(dc,&x,&y,&z);
tri[2].x=x; tri[2].y=y; tri[2].z=z;
result+=GrFillTri0(dc,&tri[0],&tri[1],&tri[2]);
}
return result;
}
#help_index "Graphics/Mesh"
public I64 Gr3Mesh(CDC *dc=gr_dc,I64 vertex_cnt,CD3I32 *p,I64 tri_cnt,CMeshTri *tri)
{
//Returns cnt of pixs changed
CColorROPU32 old_color=dc->color;
I64 i,x,y,z,result=0;
CD3I32 *pt,*pt_sym,*p_sym,*dst;
CMeshTri *tri_sym=tri;
if (dc->flags&DCF_TRANSFORMATION) {
dst=pt=MAlloc(sizeof(CD3I32)*vertex_cnt);
for (i=0;i<vertex_cnt;i++,p++,dst++) {
x=p->x; y=p->y; z=p->z;
(*dc->transform)(dc,&x,&y,&z);
dst->x=x; dst->y=y; dst->z=z;
}
p=pt;
} else
pt=NULL;
if (dc->flags & DCF_SYMMETRY) {
dst=pt_sym=MAlloc(sizeof(CD3I32)*vertex_cnt);
p_sym=p;
for (i=0;i<vertex_cnt;i++,p_sym++,dst++) {
x=p_sym->x; y=p_sym->y; z=p_sym->z;
GrReflect(dc,&x,&y,&z);
dst->x=x; dst->y=y; dst->z=z;
}
p_sym=pt_sym;
for (i=0;i<tri_cnt;i++,tri_sym++) {
(*dc->lighting)(dc,&p_sym[tri_sym->nums[0]],&p_sym[tri_sym->nums[2]],&p_sym[tri_sym->nums[1]],tri_sym->color);
result+=GrFillTri0(dc,&p_sym[tri_sym->nums[0]],&p_sym[tri_sym->nums[2]],&p_sym[tri_sym->nums[1]]);
}
Free(pt_sym);
if (dc->flags&DCF_JUST_MIRROR)
goto mesh_done;
}
for (i=0;i<tri_cnt;i++,tri++) {
(*dc->lighting)(dc,&p[tri->nums[0]],&p[tri->nums[1]],&p[tri->nums[2]],tri->color);
result+=GrFillTri0(dc,&p[tri->nums[0]],&p[tri->nums[1]],&p[tri->nums[2]]);
}
mesh_done:
dc->color=old_color;
Free(pt);
return result;
}
+128 -139
View File
@@ -1,14 +1,14 @@
#help_index "Graphics/Screen"
U0 GrUpdateWins()
{ //Only called by WinMgr
{//Only called by WinMgr
I64 i;
CTask *task,*task1;
CD3I64 saved_scroll;
CDC *dc;
Preempt(OFF);
try {
refresh_ode_time=0;
winmgr.ode_time=0;
if (Bt(&sys_semas[SYS_SEMA_UPDATE_WIN_Z_BUF],0))
WinZBufUpdate;
task1=task=sys_winmgr_task;
@@ -22,22 +22,22 @@ U0 GrUpdateWins()
if (!TaskValidate(task))
break;
if (Bt(&task->display_flags,DISPLAYf_SHOW) &&
Bt(gr_win_uncovered_bitmap,task->win_z_num))
Bt(gr.win_uncovered_bitmap,task->win_z_num))
try {
if (!Bt(&task->display_flags,DISPLAYf_NO_BORDER))
DrawTaskBorder(task);
WinTextFill(task->text_attr<<8,task);
TextBorder(Fs,task->win_left,task->win_right,task->win_top,
task->win_bottom,task->border_attr,task==sys_focus_task);
TextRect(task->win_left,task->win_right,
task->win_top,task->win_bottom,task->text_attr<<8);
Preempt(ON);
if (task==sys_winmgr_task) {
if (fp_wall_paper)
(*fp_wall_paper)(task);
} else {
if (!(task->win_inhibit&WIF_DOC))
DocUpdateTaskDocs(task);
}
if (gr.fp_wall_paper)
(*gr.fp_wall_paper)(task);
} else if (!(task->win_inhibit&WIF_SELF_DOC))
DocUpdateTaskDocs(task);
if (TaskValidate(task)) {
if (task->draw_it) {
dc=DCAlias(gr_dc2,task);
dc=DCAlias(gr.dc2,task);
(*task->draw_it)(task,dc);
DCDel(dc);
}
@@ -74,7 +74,7 @@ U0 GrUpdateWins()
ODEsUpdate(task);
Preempt(OFF);
} catch {
LBts(&task->win_inhibit,WIf_ODE);
LBts(&task->win_inhibit,WIf_SELF_ODE);
"Exception in WinMgr: ODE\n";
PutExcept;
Sleep(3000);
@@ -90,44 +90,44 @@ U0 GrUpdateWins()
Dbg("Exception in WinMgr");
}
last_refresh_ode_time=refresh_ode_time;
winmgr.last_ode_time=winmgr.ode_time;
ode_allocated_factor=LowPass1(0.1,ode_allocated_factor,
Clamp(Gs->idle_factor-0.1,0.2,0.8),1/win_actual_refresh);
Clamp(Gs->idle_factor-0.1,0.2,0.8),1/winmgr.fps);
sys_task_being_screen_updated=NULL;
gr_refresh_time_stamps[gr_refresh_ts_ptr++&(GR_REFRESH_LOG_CNT-1)]=tS;
win_actual_refresh=(GR_REFRESH_LOG_CNT-1)/
(gr_refresh_time_stamps[(gr_refresh_ts_ptr-1)&(GR_REFRESH_LOG_CNT-1)]-
gr_refresh_time_stamps[gr_refresh_ts_ptr&(GR_REFRESH_LOG_CNT-1)]);
gr.refresh_time_stamps[gr.refresh_ts_ptr++&(GR_REFRESH_LOG_CNT-1)]=tS;
winmgr.fps=(GR_REFRESH_LOG_CNT-1)/
(gr.refresh_time_stamps[(gr.refresh_ts_ptr-1)&(GR_REFRESH_LOG_CNT-1)]-
gr.refresh_time_stamps[gr.refresh_ts_ptr&(GR_REFRESH_LOG_CNT-1)]);
}
U0 GrFixZoomScale()
{
gr_screen_zoom=ClampI64(gr_screen_zoom,1,GR_MAX_SCREEN_ZOOM);
if (gr_screen_zoom==1) {
grsx=0;
grsy=0;
gr.screen_zoom=ClampI64(gr.screen_zoom,1,GR_MAX_SCREEN_ZOOM);
if (gr.screen_zoom==1) {
gr.sx=0;
gr.sy=0;
} else {
grsx=ClampI64(grsx,0,GR_WIDTH-GR_WIDTH/gr_screen_zoom)&~7;
grsy=ClampI64(grsy,0,GR_HEIGHT-GR_HEIGHT/gr_screen_zoom);
gr.sx=ClampI64(gr.sx,0,GR_WIDTH-GR_WIDTH/gr.screen_zoom)&~7;
gr.sy=ClampI64(gr.sy,0,GR_HEIGHT-GR_HEIGHT/gr.screen_zoom);
}
}
public U0 GrScaleZoom(F64 scale)
{
{//Multiply zoom factor larger or smaller.
Bool old_preempt=Preempt(OFF);
F64 s=gr_screen_zoom;
gr_screen_zoom=gr_screen_zoom*scale;
F64 s=gr.screen_zoom;
gr.screen_zoom=gr.screen_zoom*scale;
GrFixZoomScale;
s/=gr_screen_zoom;
ipx_scale*=s;
ipy_scale*=s;
ipz_scale*=s;
ipx_offset=ipx-(ipx-ipx_offset)*s;
ipy_offset=ipy-(ipy-ipy_offset)*s;
ipz_offset=ipz-(ipz-ipz_offset)*s;
grsx=ipx-gr_zoomed_dc->width >>1/gr_screen_zoom;
grsy=ipy-gr_zoomed_dc->height>>1/gr_screen_zoom;
s/=gr.screen_zoom;
ip.scale.x*=s;
ip.scale.y*=s;
ip.scale.z*=s;
ip.offset.x=ip.pos.x-(ip.pos.x-ip.offset.x)*s;
ip.offset.y=ip.pos.y-(ip.pos.y-ip.offset.y)*s;
ip.offset.z=ip.pos.z-(ip.pos.z-ip.offset.z)*s;
gr.sx=ip.pos.x-gr.zoomed_dc->width >>1/gr.screen_zoom;
gr.sy=ip.pos.y-gr.zoomed_dc->height>>1/gr.screen_zoom;
GrFixZoomScale;
Preempt(old_preempt);
}
@@ -136,26 +136,26 @@ U0 GrZoomInScreen()
{
GrFixZoomScale;
I64 plane,row,col,k,l,
d2=gr_zoomed_dc->width>>3/gr_screen_zoom,
d4=gr_zoomed_dc->width_internal>>3,
d5=d4-d2*gr_screen_zoom,
d3=gr_zoomed_dc->height/gr_screen_zoom,
d6=(gr_zoomed_dc->height-d3)*gr_dc1->width_internal>>3,
d7=gr_zoomed_dc->height%gr_screen_zoom*d4;
U8 *src,*src2,*dst,*src3,*map=gr_screen_zoom_tables[gr_screen_zoom];
d2=gr.zoomed_dc->width>>3/gr.screen_zoom,
d4=gr.zoomed_dc->width_internal>>3,
d5=d4-d2*gr.screen_zoom,
d3=gr.zoomed_dc->height/gr.screen_zoom,
d6=(gr.zoomed_dc->height-d3)*gr.dc1->width_internal>>3,
d7=gr.zoomed_dc->height%gr.screen_zoom*d4;
U8 *src,*src2,*dst,*src3,*map=gr.screen_zoom_tables[gr.screen_zoom];
src=gr_dc1->body+grsx>>3+grsy*gr_dc1->width_internal>>3;
dst=gr_zoomed_dc->body;
src=gr.dc1->body+gr.sx>>3+gr.sy*gr.dc1->width_internal>>3;
dst=gr.zoomed_dc->body;
for (plane=1;plane<0x10;plane<<=1) {
row=d3;
while (row--) {
k=gr_screen_zoom;
k=gr.screen_zoom;
while (k--) {
src2=src;
col=d2;
while (col--) {
src3=&map[*src2++];
l=gr_screen_zoom;
l=gr.screen_zoom;
while (l--) {
*dst++=*src3;
src3+=256;
@@ -174,30 +174,30 @@ U0 GrZoomInScreen()
}
}
U0 GrUpdateBackgroundOfText()
U0 GrUpdateTextBG()
{
I64 reg RSI *dst=gr_dc2->body,reg R13 c,row,col,
I64 reg RSI *dst=gr.dc2->body,reg R13 c,row,col,
num_rows=TEXT_ROWS,num_cols=TEXT_COLS,i,j,cur_ch,
reg R12 w1=gr_dc2->width_internal,w2=-7*w1+8,w3=7*w1,w4=0;
U32 *src=gr_text_base;
reg R12 w1=gr.dc2->width_internal,w2=-7*w1+8,w3=7*w1,w4=0;
U32 *src=gr.text_base;
Bool blink_flag=Blink;
U8 *dst2=dst;
if (gr_pan_text_x) {
gr_pan_text_x=ClampI64(gr_pan_text_x,-7,7);
j=AbsI64(gr_pan_text_x)/FONT_WIDTH+1;
if (gr.pan_text_x) {
gr.pan_text_x=ClampI64(gr.pan_text_x,-7,7);
j=AbsI64(gr.pan_text_x)/FONT_WIDTH+1;
num_cols-=j;
if (gr_pan_text_x<0) {
if (gr.pan_text_x<0) {
src+=j;
i=FONT_WIDTH*j+gr_pan_text_x;
i=FONT_WIDTH*j+gr.pan_text_x;
} else
i=gr_pan_text_x;
i=gr.pan_text_x;
dst2=dst(U8 *)+i;
w4=j;
w3+=j*FONT_WIDTH;
j*=FONT_WIDTH;
dst(U8 *)=gr_dc2->body;
dst(U8 *)=gr.dc2->body;
for (row=num_rows*FONT_HEIGHT;row--;) {
for (col=i;col--;)
*dst(U8 *)++=0;
@@ -208,22 +208,22 @@ U0 GrUpdateBackgroundOfText()
}
dst=dst2;
if (gr_pan_text_y) {
gr_pan_text_y=ClampI64(gr_pan_text_y,-7,7);
j=AbsI64(gr_pan_text_y)/FONT_HEIGHT+1;
if (gr.pan_text_y) {
gr.pan_text_y=ClampI64(gr.pan_text_y,-7,7);
j=AbsI64(gr.pan_text_y)/FONT_HEIGHT+1;
num_rows-=j;
if (gr_pan_text_y<0) {
if (gr.pan_text_y<0) {
src+=w1/FONT_WIDTH*j;
i=w1*(FONT_HEIGHT*j+gr_pan_text_y);
i=w1*(FONT_HEIGHT*j+gr.pan_text_y);
} else
i=w1*gr_pan_text_y;
i=w1*gr.pan_text_y;
dst2=dst(U8 *)+i;
j*=w1*FONT_HEIGHT;
dst(U8 *)=gr_dc2->body;
dst(U8 *)=gr.dc2->body;
for (row=i;row--;)
*dst(U8 *)++=0;
dst(U8 *)=gr_dc2->body+TEXT_ROWS*TEXT_COLS*FONT_HEIGHT*FONT_WIDTH-j;
dst(U8 *)=gr.dc2->body+TEXT_ROWS*TEXT_COLS*FONT_HEIGHT*FONT_WIDTH-j;
for (row=j;row--;)
*dst(U8 *)++=0;
}
@@ -232,15 +232,15 @@ U0 GrUpdateBackgroundOfText()
for (row=num_rows;row--;) {
for (col=num_cols;col--;) {
cur_ch=*src++;
if (cur_ch & (DOCET_SELECTED | DOCET_INVERT | DOCET_BLINK)) {
if (cur_ch & DOCET_SELECTED)
if (cur_ch & (ATTRF_SELECTED|ATTRF_INVERT|ATTRF_BLINK)) {
if (cur_ch & ATTRF_SELECTED)
cur_ch.u8[1]=cur_ch.u8[1]^0xFF;
if (cur_ch & DOCET_INVERT)
if (cur_ch & ATTRF_INVERT)
cur_ch.u8[1]=cur_ch.u8[1]<<4+cur_ch.u8[1]>>4;
if (cur_ch & DOCET_BLINK && blink_flag)
if (cur_ch & ATTRF_BLINK && blink_flag)
cur_ch.u8[1]=cur_ch.u8[1]<<4+cur_ch.u8[1]>>4;
}
c=gr_1_to_8_colors[cur_ch.u8[1]>>4];
c=gr.to_8_colors[cur_ch.u8[1]>>4];
MOV U64 [RSI],R13
ADD RSI,R12
MOV U64 [RSI],R13
@@ -263,30 +263,20 @@ U0 GrUpdateBackgroundOfText()
}
}
//$AN,"ExtScreenCodes",A="ExtScreenCodes"$
// Bits 0-7 ASCII (Screen Code)
// Bits 8-11 Foreground color
// Bits 12-15 Background color
// Bits 16-20 Signed X pos shift val
// Bits 21-25 Signed Y pos shift val
// Bit 28 Blink
// Bit 29 Inverted (Swap foreground and background)
// Bit 30 Selected (XOR colors with FF)
// Bit 31 Underline
U0 GrUpdateForegroundOfText()
{
U32 *src=gr_text_base;
I64 i,j,cur_ch,*dst=gr_dc2->body,
w1=gr_dc2->width_internal,w2=7*w1,w4=0,
U0 GrUpdateTextFG()
{//See $LK,"TextBase Layer",A="HI:TextBase Layer"$.
U32 *src=gr.text_base;
I64 i,j,cur_ch,*dst=gr.dc2->body,
w1=gr.dc2->width_internal,w2=7*w1,w4=0,
num_rows=TEXT_ROWS,num_cols=TEXT_COLS,row,col;
U8 *dst_start=gr_dc2->body,*dst_end=dst_start+w1*gr_dc2->height-7*w1-8;
U8 *dst_start=gr.dc2->body,*dst_end=dst_start+w1*gr.dc2->height-7*w1-8;
Bool blink_flag=Blink;
if (gr_pan_text_x) {
gr_pan_text_x=ClampI64(gr_pan_text_x,-7,7);
j=AbsI64(gr_pan_text_x)/FONT_WIDTH+1;
if (gr.pan_text_x) {
gr.pan_text_x=ClampI64(gr.pan_text_x,-7,7);
j=AbsI64(gr.pan_text_x)/FONT_WIDTH+1;
num_cols-=j;
if (gr_pan_text_x<0) {
if (gr.pan_text_x<0) {
src+=j;
dst(U8 *)+=FONT_WIDTH*j;
}
@@ -294,11 +284,11 @@ U0 GrUpdateForegroundOfText()
w2+=j*FONT_WIDTH;
}
if (gr_pan_text_y) {
gr_pan_text_y=ClampI64(gr_pan_text_y,-7,7);
j=AbsI64(gr_pan_text_y)/FONT_HEIGHT+1;
if (gr.pan_text_y) {
gr.pan_text_y=ClampI64(gr.pan_text_y,-7,7);
j=AbsI64(gr.pan_text_y)/FONT_HEIGHT+1;
num_rows-=j;
if (gr_pan_text_y<0) {
if (gr.pan_text_y<0) {
src+=w1/FONT_WIDTH*j;
dst(U8 *)+=w1*FONT_HEIGHT*j;
}
@@ -307,24 +297,24 @@ U0 GrUpdateForegroundOfText()
for (row=num_rows;row--;) {
for (col=num_cols;col--;) {
cur_ch=*src++;
if (cur_ch & (DOCET_UNDERLINE | DOCET_SELECTED | DOCET_INVERT | DOCET_BLINK)) {
if (cur_ch & DOCET_SELECTED)
if (cur_ch & (ATTRF_UNDERLINE|ATTRF_SELECTED|ATTRF_INVERT|ATTRF_BLINK)) {
if (cur_ch & ATTRF_SELECTED)
cur_ch.u8[1]=cur_ch.u8[1]^0xFF;
if (cur_ch & DOCET_INVERT)
if (cur_ch & ATTRF_INVERT)
cur_ch.u8[1]=cur_ch.u8[1]<<4+cur_ch.u8[1]>>4;
if (cur_ch & DOCET_BLINK && blink_flag)
if (cur_ch & ATTRF_BLINK && blink_flag)
cur_ch.u8[1]=cur_ch.u8[1]<<4+cur_ch.u8[1]>>4;
}
if (i=cur_ch.u16[1]&0x3FF+gr_pan_text_x+gr_pan_text_y<<5) {
if (i=cur_ch.u16[1]&0x3FF+gr.pan_text_x+gr.pan_text_y<<5) {
j=i&0x1F;
if (j&0x10) j|=~0x1F;
i>>=5;
if (i&0x10) i|=~0x1F;
i=w1*i+j;
if (dst_start<=dst(U8 *)+i<dst_end)
GrRopEquU8NoClipping(cur_ch&(DOCET_UNDERLINE+0xFFF),dst(U8 *)+i,w1);
GrRopEquU8NoClipping(cur_ch&(ATTRF_UNDERLINE+0xFFF),dst(U8 *)+i,w1);
} else
GrRopEquU8NoClipping(cur_ch&(DOCET_UNDERLINE+0xFFF),dst,w1);
GrRopEquU8NoClipping(cur_ch&(ATTRF_UNDERLINE+0xFFF),dst,w1);
dst(U8 *)+=8;
}
src+=w4;
@@ -334,11 +324,11 @@ U0 GrUpdateForegroundOfText()
U0 DCBlotColor8(CDC *dc,CDC *img)
{
U8 reg *src=img->body,*b0=dc->body;
I64 reg j,reg k,reg d0=img->width_internal*img->height;
U8 *src=img->body,*b0=dc->body;
I64 j,k,d0=img->width_internal*img->height;
for (k=0;k<d0;k++) {
j=*src++;
if (j!=COLOR_TRANSPARENT)
if (j!=TRANSPARENT)
*b0++=j;
else
b0++;
@@ -347,19 +337,19 @@ U0 DCBlotColor8(CDC *dc,CDC *img)
U0 GrUpdateTextModeText()
{
U32 *src=gr_text_base;
U32 *src=gr.text_base;
I64 cur_ch,i,d0=TEXT_COLS*TEXT_ROWS;
U16 *dst=VGA_TEXT_MEM_BASE,*dst2=gr_vga_text_cache;
U16 *dst=VGA_TEXT_MEM_BASE,*dst2=gr.vga_text_cache;
Bool blink_flag=Blink;
if (LBtr(&sys_semas[SYS_SEMA_FLUSH_VGA_IMAGE],0)) {
i=d0;
while (i--) {
cur_ch=*src++;
if (cur_ch & DOCET_SELECTED)
if (cur_ch & ATTRF_SELECTED)
cur_ch.u8[1]=cur_ch.u8[1]^0xFF;
if (cur_ch & DOCET_INVERT)
if (cur_ch & ATTRF_INVERT)
cur_ch.u8[1]=cur_ch.u8[1]<<4+cur_ch.u8[1]>>4;
if (cur_ch & DOCET_BLINK)
if (cur_ch & ATTRF_BLINK)
if (blink_flag)
cur_ch.u8[1]= cur_ch.u8[1]<<4+ cur_ch.u8[1]>>4;
cur_ch&=0x7FFF;
@@ -369,11 +359,11 @@ U0 GrUpdateTextModeText()
i=d0;
while (i--) {
cur_ch=*src++;
if (cur_ch & DOCET_SELECTED)
if (cur_ch & ATTRF_SELECTED)
cur_ch.u8[1]=cur_ch.u8[1]^0xFF;
if (cur_ch & DOCET_INVERT)
if (cur_ch & ATTRF_INVERT)
cur_ch.u8[1]=cur_ch.u8[1]<<4+cur_ch.u8[1]>>4;
if (cur_ch & DOCET_BLINK)
if (cur_ch & ATTRF_BLINK)
if (blink_flag)
cur_ch.u8[1]= cur_ch.u8[1]<<4+ cur_ch.u8[1]>>4;
cur_ch&=0x7FFF;
@@ -388,63 +378,62 @@ U0 GrUpdateTextModeText()
}
U0 GrUpdateVGAGraphics()
{
I64 row,plane,d2=gr_zoomed_dc->width_internal>>5;
U32 *src,*dst,*dst2;
//Update Graphic Card
if (gr_screen_zoom==1)
src=gr_dc1->body;
{//Update Graphic Card
I64 row,plane,d=gr.zoomed_dc->width_internal>>6;
U32 *src,*vga,*dst;
if (gr.screen_zoom==1)
src=gr.dc1->body;
else {
GrZoomInScreen;
src=gr_zoomed_dc->body;
src=gr.zoomed_dc->body;
}
dst2=gr_screen_image->body;
dst=gr.screen_image->body;
if (LBtr(&sys_semas[SYS_SEMA_FLUSH_VGA_IMAGE],0)) {
for (plane=1;plane<0x10;plane<<=1) {
OutU8(VGA_SC_INDEX,VGA_MAP_MASK);
OutU8(VGA_SC_DATA,plane);
dst=VGA_GRAPHIC_MEM_BASE;
row=gr_zoomed_dc->height;
vga=VGA_GRAPHIC_MEM_BASE;
row=gr.zoomed_dc->height;
while (row--)
GrUpdateLine32FlushCache(&dst,&src,d2,&dst2);
GrUpdateLine64FlushCache(&vga,&src,d,&dst);
}
} else {
for (plane=1;plane<0x10;plane<<=1) {
OutU8(VGA_SC_INDEX,VGA_MAP_MASK);
OutU8(VGA_SC_DATA,plane);
dst=VGA_GRAPHIC_MEM_BASE;
row=gr_zoomed_dc->height;
vga=VGA_GRAPHIC_MEM_BASE;
row=gr.zoomed_dc->height;
while (row--)
GrUpdateLine32(&dst,&src,d2,&dst2);
GrUpdateLine64(&vga,&src,d,&dst);
}
}
}
U0 GrUpdateScreen()
{
{//Called by the Window Manager $LK,"HERE",A="FF:::/Adam/Win2b.CPP,GrUpdateScreen"$, 60 times a second.
CDC *dc;
Preempt(ON);
if (text_mode) //If 640x480 VGA is not available, falls back to text mode.
if (!sys_bios_gr_mode) //if text mode
GrUpdateWins;
else {
GrUpdateBackgroundOfText;
GrUpdateForegroundOfText;
GrUpdateTextBG;
GrUpdateTextFG;
GrUpdateWins;
DCBlotColor8(gr_dc2,gr_dc);
DCBlotColor8(gr.dc2,gr.dc);
}
Preempt(OFF);
dc=DCAlias(gr_dc2,Fs);
dc=DCAlias(gr.dc2,Fs);
dc->flags|=DCF_ON_TOP;
if (fp_final_screen_update)
(*fp_final_screen_update)(dc);
if (gr.fp_final_screen_update)
(*gr.fp_final_screen_update)(dc);
DCDel(dc);
if (text_mode)
if (!sys_bios_gr_mode) //if text mode
GrUpdateTextModeText;
else {
DCBlotColor4(gr_dc1->body,gr_dc2->body,gr_dc_cache->body,
gr_dc2->height*gr_dc2->width_internal>>3);
DCBlotColor4(gr.dc1->body,gr.dc2->body,gr.dc_cache->body,
gr.dc2->height*gr.dc2->width_internal>>3);
GrUpdateVGAGraphics;
}
}
+90 -98
View File
@@ -3,28 +3,26 @@
$LK,"CSprite",A="MN:CSprite"$s are stored as a sequence of var
length operations with a 1-byte type leading
each operation. The types available are lsted
here, $LK,"GRST_PT",A="MN:GRST_PT"$. They are stored, one after another,
in a chunk of memory terminated by a type $LK,"GRST_END",A="MN:GRST_END"$.
here, $LK,"SPT_PT",A="MN:SPT_PT"$. They are stored, one after another,
in a chunk of memory terminated by a type $LK,"SPT_END",A="MN:SPT_END"$.
$LK,"Sprite3",A="MN:Sprite3"$() and $LK,"SpriteMain",A="MN:SpriteMain"$() shows how the
unions are used. It's kind-of a mess using a union.
$LK,"Sprite3",A="MN:Sprite3"$() shows how the $LK,"CSprite",A="MN:CSprite"$ unions are used.
It's kind-of a mess using a union.
$LK,"SpriteSize",A="MN:SpriteSize"$() will return the size of a single
operation, while $LK,"SpriteSize",A="MN:SpriteSize"$() with an 's' will
return the size of an entire lst. Look at
$LK,"sprite_base_size",A="MN:sprite_base_size"$.
$LK,"SpriteElemSize",A="MN:SpriteElemSize"$() will return the size of a single
element, while $LK,"SpriteSize",A="MN:SpriteSize"$() will return the size
of an entire lst. Look at $LK,"sprite_elem_base_sizes",A="MN:sprite_elem_base_sizes"$.
To get familiar, type <CTRL-R> on sprite in
a document and select "Display as Text". It
will show the raw data for each CSprite. This
is how they are stored in files, as well.
See $LK,"SpriteElem2Code",A="MN:SpriteElem2Code"$() to infer the raw storage
format. They are stored as raw binary values
when saved to files, not text code.
See $MA-X+PU,"::/Apps/GrModels",LM="Cd(\"::/Apps/GrModels\");Dir;View;\n"$ for an example of
making CSprite by hand. Those are type
$LK,"GRST_MESH",A="MN:GRST_MESH"$, one of the most complicated.
$LK,"SPT_MESH",A="MN:SPT_MESH"$, one of the most complicated.
*/
public U0 Sprite3(CDC *dc=gr_dc,I64 x,I64 y,I64 z,U8 *elems,Bool just_one=FALSE)
public U0 Sprite3(CDC *dc=gr.dc,I64 x,I64 y,I64 z,U8 *elems,Bool just_one=FALSE)
{//Plot a sprite into a CDC.
CSprite *tempg=elems-offset(CSprite.start);
I64 i,j,k,x1,y1,z1,x2,y2,
@@ -40,19 +38,19 @@ public U0 Sprite3(CDC *dc=gr_dc,I64 x,I64 y,I64 z,U8 *elems,Bool just_one=FALSE)
while (tempg->type) {
dc->cur_sprite_elem_num=cur_sprite_elem_num++;
switch (tempg->type) {
case GRST_COLOR8:
dc->color=dc->color&~(COLORROP_COLORS_MASK|ROPF_DITHER)|tempg->color8;
case SPT_COLOR:
dc->color=dc->color&~(COLORROP_COLORS_MASK|ROPF_DITHER)|tempg->color;
break;
case GRST_DITHER_COLOR8:
case SPT_DITHER_COLOR:
dc->color=dc->color&~COLORROP_COLORS_MASK|
tempg->dither_color8.u8[0]|
tempg->dither_color8.u8[1]<<COLORROP_BITS|ROPF_DITHER;
tempg->dither_color.u8[0]|
tempg->dither_color.u8[1]<<COLORROP_BITS|ROPF_DITHER;
break;
case GRST_WIDTH:
case SPT_WIDTH:
dc->pen_width=tempg->width;
GrScalePenWidth(dc);
break;
case GRST_TRANSFORM_ON:
case SPT_TRANSFORM_ON:
if (!(dc->flags&DCF_TRANSFORMATION)) {
x-=dc->x;
y-=dc->y;
@@ -60,7 +58,7 @@ public U0 Sprite3(CDC *dc=gr_dc,I64 x,I64 y,I64 z,U8 *elems,Bool just_one=FALSE)
}
dc->flags|=DCF_TRANSFORMATION;
break;
case GRST_TRANSFORM_OFF:
case SPT_TRANSFORM_OFF:
if (dc->flags&DCF_TRANSFORMATION) {
x+=dc->x;
y+=dc->y;
@@ -68,44 +66,44 @@ public U0 Sprite3(CDC *dc=gr_dc,I64 x,I64 y,I64 z,U8 *elems,Bool just_one=FALSE)
}
dc->flags&=~DCF_TRANSFORMATION;
break;
case GRST_PT:
case SPT_PT:
GrPlot3(dc,tempg->x1+x,tempg->y1+y,z);
break;
case GRST_TEXT:
case SPT_TEXT:
GrPrint3(dc,tempg->x1+x,tempg->y1+y,z,"%s",tempg->st);
break;
case GRST_TEXT_BOX:
case SPT_TEXT_BOX:
GrTextBox3(dc,tempg->x1+x,tempg->y1+y,z,tempg->st);
break;
case GRST_TEXT_DIAMOND:
case SPT_TEXT_DIAMOND:
GrTextDiamond3(dc,tempg->x1+x,tempg->y1+y,z,tempg->st);
break;
case GRST_FLOOD_FILL:
case SPT_FLOOD_FILL:
GrFloodFill3(dc,tempg->x1+x,tempg->y1+y,z,FALSE);
break;
case GRST_FLOOD_FILL_NOT:
case SPT_FLOOD_FILL_NOT:
i=dc->color;
dc->color=dc->color.c0;
GrFloodFill3(dc,tempg->x1+x,tempg->y1+y,z,TRUE);
dc->color=i;
break;
case GRST_SHIFT:
case SPT_SHIFT:
x+=tempg->x1;
y+=tempg->y1;
break;
case GRST_LINE:
case SPT_LINE:
GrLine3(dc,tempg->x1+x,tempg->y1+y,z,tempg->x2+x,tempg->y2+y,z);
break;
case GRST_ARROW:
case SPT_ARROW:
GrArrow3(dc,tempg->x1+x,tempg->y1+y,z,tempg->x2+x,tempg->y2+y,z);
break;
case GRST_PLANAR_SYMMETRY:
case SPT_PLANAR_SYMMETRY:
if (GrSetSymmetry3(dc,tempg->x1+x,tempg->y1+y,z,tempg->x2+x,tempg->y2+y,z,tempg->x2+x,tempg->y2+y,z+1))
dc->flags|=DCF_SYMMETRY;
else
dc->flags&=~DCF_SYMMETRY;
break;
case GRST_BITMAP8:
case SPT_BITMAP:
img=CAlloc(sizeof(CDC));
img->width=tempg->width;
img->width_internal=(tempg->width+7)&~7;
@@ -116,10 +114,10 @@ public U0 Sprite3(CDC *dc=gr_dc,I64 x,I64 y,I64 z,U8 *elems,Bool just_one=FALSE)
GrBlot3(dc,tempg->x2+x,tempg->y2+y,z,img);
Free(img);
break;
case GRST_RECT:
case SPT_RECT:
GrRect3(dc,tempg->x1+x,tempg->y1+y,z,tempg->x2-tempg->x1,tempg->y2-tempg->y1);
break;
case GRST_ROTATED_RECT:
case SPT_ROTATED_RECT:
x1=tempg->x1+x;
y1=tempg->y1+y;
z1=z;
@@ -135,16 +133,16 @@ public U0 Sprite3(CDC *dc=gr_dc,I64 x,I64 y,I64 z,U8 *elems,Bool just_one=FALSE)
GrSetRotMat(dc,old_r);
dc->flags=dc->flags&~DCF_TRANSFORMATION|old_flags;
break;
case GRST_CIRCLE:
case SPT_CIRCLE:
GrCircle3(dc,tempg->x1+x,tempg->y1+y,z,tempg->x2);
break;
case GRST_ELLIPSE:
case SPT_ELLIPSE:
GrEllipse3(dc,tempg->x2+x,tempg->y2+y,z,tempg->width,tempg->height,tempg->rot_angle);
break;
case GRST_POLYGON:
case SPT_POLYGON:
GrRegPoly3(dc,tempg->x2+x,tempg->y2+y,z,tempg->width,tempg->height,tempg->sides,tempg->rot_angle);
break;
case GRST_POLYLINE:
case SPT_POLYLINE:
ptr=&tempg->y1;
x1=ptr[0];
y1=ptr[1];
@@ -155,7 +153,7 @@ public U0 Sprite3(CDC *dc=gr_dc,I64 x,I64 y,I64 z,U8 *elems,Bool just_one=FALSE)
x1=x2;y1=y2;
}
break;
case GRST_POLYPT:
case SPT_POLYPT:
ptr=&tempg->y1;
x1=ptr[0];
y1=ptr[1];
@@ -176,16 +174,16 @@ public U0 Sprite3(CDC *dc=gr_dc,I64 x,I64 y,I64 z,U8 *elems,Bool just_one=FALSE)
p->y+=y;
p->z+=z;
}
case GRST_BSPLINE2:
case SPT_BSPLINE2:
Gr2BSpline3(dc,&tempg->y1,tempg->num,FALSE);
break;
case GRST_BSPLINE3:
case SPT_BSPLINE3:
Gr3BSpline3(dc,&tempg->y1,tempg->num,FALSE);
break;
case GRST_BSPLINE2_CLOSED:
case SPT_BSPLINE2_CLOSED:
Gr2BSpline3(dc,&tempg->y1,tempg->num,TRUE);
break;
case GRST_BSPLINE3_CLOSED:
case SPT_BSPLINE3_CLOSED:
Gr3BSpline3(dc,&tempg->y1,tempg->num,TRUE);
break;
sub_switch_end:
@@ -196,7 +194,7 @@ public U0 Sprite3(CDC *dc=gr_dc,I64 x,I64 y,I64 z,U8 *elems,Bool just_one=FALSE)
p->z-=z;
}
break;
case GRST_MESH:
case SPT_MESH:
p=&tempg->x2;
for (i=0;i<tempg->vertex_cnt;i++,p++) {
p->x+=x;
@@ -211,7 +209,7 @@ public U0 Sprite3(CDC *dc=gr_dc,I64 x,I64 y,I64 z,U8 *elems,Bool just_one=FALSE)
p->z-=z;
}
break;
case GRST_SHIFTABLE_MESH:
case SPT_SHIFTABLE_MESH:
if (dc->flags&DCF_TRANSFORMATION) {
dc->x+=tempg->x1;
dc->y+=tempg->y1;
@@ -255,7 +253,7 @@ public U0 Sprite3(CDC *dc=gr_dc,I64 x,I64 y,I64 z,U8 *elems,Bool just_one=FALSE)
old_flags&(DCF_SYMMETRY|DCF_TRANSFORMATION);
}
public U0 Sprite3B(CDC *dc=gr_dc,I64 x,I64 y,I64 z,U8 *elems)
public U0 Sprite3B(CDC *dc=gr.dc,I64 x,I64 y,I64 z,U8 *elems)
{//Plot a sprite into a CDC, post transform xyz translation.
I64 old_x=dc->x,old_y=dc->y,old_z=dc->z,
old_flags=dc->flags&DCF_TRANSFORMATION;
@@ -266,8 +264,8 @@ public U0 Sprite3B(CDC *dc=gr_dc,I64 x,I64 y,I64 z,U8 *elems)
dc->flags=dc->flags&~DCF_TRANSFORMATION|old_flags;
}
public U0 SpriteMat3B(CDC *dc=gr_dc,I64 x,I64 y,I64 z,U8 *elems,I64 *m)
{//Plot rotated by matrix
public U0 SpriteMat3B(CDC *dc=gr.dc,I64 x,I64 y,I64 z,U8 *elems,I64 *m)
{//Plot rotated by matrix.
I64 *old_r=dc->r,old_m[16],
old_flags=dc->flags&DCF_TRANSFORMATION;
MemCpy(old_m,m,16*sizeof(I64));
@@ -281,22 +279,22 @@ public U0 SpriteMat3B(CDC *dc=gr_dc,I64 x,I64 y,I64 z,U8 *elems,I64 *m)
dc->flags=dc->flags&~DCF_TRANSFORMATION|old_flags;
}
public U0 SpriteX3B(CDC *dc=gr_dc,I64 x,I64 y,I64 z,U8 *elems,F64 è=0)
{//Plot rotated around X axis
public U0 SpriteX3B(CDC *dc=gr.dc,I64 x,I64 y,I64 z,U8 *elems,F64 è=0)
{//Plot rotated around X axis.
I64 *r=GrRotXNew(è);
SpriteMat3B(dc,x,y,z,elems,r);
Free(r);
}
public U0 SpriteY3B(CDC *dc=gr_dc,I64 x,I64 y,I64 z,U8 *elems,F64 ê=0)
{//Plot rotated around Y axis
public U0 SpriteY3B(CDC *dc=gr.dc,I64 x,I64 y,I64 z,U8 *elems,F64 ê=0)
{//Plot rotated around Y axis.
I64 *r=GrRotYNew(ê);
SpriteMat3B(dc,x,y,z,elems,r);
Free(r);
}
public U0 SpriteZ3B(CDC *dc=gr_dc,I64 x,I64 y,I64 z,U8 *elems,F64 é=0)
{//Plot rotated around Z axis
public U0 SpriteZ3B(CDC *dc=gr.dc,I64 x,I64 y,I64 z,U8 *elems,F64 é=0)
{//Plot rotated around Z axis.
I64 *r=GrRotZNew(é);
SpriteMat3B(dc,x,y,z,elems,r);
Free(r);
@@ -304,7 +302,7 @@ public U0 SpriteZ3B(CDC *dc=gr_dc,I64 x,I64 y,I64 z,U8 *elems,F64
public U0 SpriteExtents(U8 *elems,I64 *min_x=NULL,I64 *max_x=NULL,
I64 *min_y=NULL,I64 *max_y=NULL)
{ //Ignores flood fills.
{//Ignores flood fills.
CDC *dc=DCNew(MAX_I32,MAX_I32,Fs,TRUE);
DCExtentsInit(dc);
Sprite3(dc,MAX_I32/2,MAX_I32/2,MAX_I32/2,elems);
@@ -324,7 +322,7 @@ public U0 SpriteExtents(U8 *elems,I64 *min_x=NULL,I64 *max_x=NULL,
}
public CDC *Sprite2DC(U8 *elems)
{
{//Convert sprite to device context.
CDC *result;
I64 min_x,max_x,min_y,max_y;
SpriteExtents(elems,&min_x,&max_x,&min_y,&max_y);
@@ -334,11 +332,9 @@ public CDC *Sprite2DC(U8 *elems)
}
public U8 *SpriteInterpolate(U8 *elems0,U8 *elems1,F64 t)
{
//The two CSprite should be identical
//except for points shifted around.
//t ranges from 0.0 to 1.0
I64 i,t1=gr_scale*t,t0=gr_scale-t1;
{//The two CSprite should be identical except for points shifted around.
//t ranges from 0.0 to 1.0.
I64 i,t1=GR_SCALE*t,t0=GR_SCALE-t1;
I32 *ptr0,*ptr1,*ptrr;
CD3I32 *p0,*p1,*pr;
U8 *result;
@@ -358,41 +354,41 @@ public U8 *SpriteInterpolate(U8 *elems0,U8 *elems1,F64 t)
if (tempg0->type!=tempg1->type)
throw('Graphics');
switch (tempg0->type) {
case GRST_ROTATED_RECT:
tempgr->rot_angle=(tempg0->rot_angle*t0+tempg1->rot_angle*t1)/gr_scale;
case GRST_RECT:
case GRST_LINE:
case GRST_ARROW:
case GRST_PLANAR_SYMMETRY:
case SPT_ROTATED_RECT:
tempgr->rot_angle=(tempg0->rot_angle*t0+tempg1->rot_angle*t1)/GR_SCALE;
case SPT_RECT:
case SPT_LINE:
case SPT_ARROW:
case SPT_PLANAR_SYMMETRY:
tempgr->x2=(tempg0->x2*t0+tempg1->x2*t1)>>32;
tempgr->y2=(tempg0->y2*t0+tempg1->y2*t1)>>32;
case GRST_TEXT:
case GRST_TEXT_BOX:
case GRST_TEXT_DIAMOND:
case GRST_PT:
case GRST_FLOOD_FILL:
case GRST_FLOOD_FILL_NOT:
case GRST_SHIFT:
case SPT_TEXT:
case SPT_TEXT_BOX:
case SPT_TEXT_DIAMOND:
case SPT_PT:
case SPT_FLOOD_FILL:
case SPT_FLOOD_FILL_NOT:
case SPT_SHIFT:
tempgr->x1=(tempg0->x1*t0+tempg1->x1*t1)>>32;
tempgr->y1=(tempg0->y1*t0+tempg1->y1*t1)>>32;
break;
case GRST_CIRCLE:
case SPT_CIRCLE:
tempgr->x2=(tempg0->x2*t0+tempg1->x2*t1)>>32;
tempgr->x1=(tempg0->x1*t0+tempg1->x1*t1)>>32;
tempgr->y1=(tempg0->y1*t0+tempg1->y1*t1)>>32;
break;
case GRST_ELLIPSE:
case GRST_POLYGON:
case SPT_ELLIPSE:
case SPT_POLYGON:
tempgr->x2=(tempg0->x2*t0+tempg1->x2*t1)>>32;
tempgr->y2=(tempg0->y2*t0+tempg1->y2*t1)>>32;
tempgr->width=(tempg0->width*t0+tempg1->width*t1)>>32;
tempgr->height=(tempg0->height*t0+tempg1->height*t1)>>32;
break;
case GRST_BITMAP8:
case SPT_BITMAP:
tempgr->x2=(tempg0->x2*t0+tempg1->x2*t1)>>32;
tempgr->y2=(tempg0->y2*t0+tempg1->y2*t1)>>32;
break;
case GRST_POLYLINE:
case SPT_POLYLINE:
ptr0=&tempg0->y1;
ptr1=&tempg1->y1;
ptrr=&tempgr->y1;
@@ -401,17 +397,17 @@ public U8 *SpriteInterpolate(U8 *elems0,U8 *elems1,F64 t)
ptrr[i<<1+1]=(ptr0[i<<1+1]*t0+ptr1[i<<1+1]*t1)>>32;
}
break;
case GRST_POLYPT:
case SPT_POLYPT:
ptr0=&tempg0->y1;
ptr1=&tempg1->y1;
ptrr=&tempgr->y1;
ptrr[0]=(ptr0[0]*t0+ptr1[0]*t1)>>32;
ptrr[1]=(ptr0[1]*t0+ptr1[1]*t1)>>32;
break;
case GRST_BSPLINE2:
case GRST_BSPLINE3:
case GRST_BSPLINE2_CLOSED:
case GRST_BSPLINE3_CLOSED:
case SPT_BSPLINE2:
case SPT_BSPLINE3:
case SPT_BSPLINE2_CLOSED:
case SPT_BSPLINE3_CLOSED:
p0=&tempg0->y1;
p1=&tempg1->y1;
pr=&tempgr->y1;
@@ -421,7 +417,7 @@ public U8 *SpriteInterpolate(U8 *elems0,U8 *elems1,F64 t)
pr[i].z=(p0[i].z*t0+p1[i].z*t1)>>32;
}
break;
case GRST_MESH:
case SPT_MESH:
p0=&tempg0->x2;
p1=&tempg1->x2;
pr=&tempgr->x2;
@@ -431,7 +427,7 @@ public U8 *SpriteInterpolate(U8 *elems0,U8 *elems1,F64 t)
pr[i].z=(p0[i].z*t0+p1[i].z*t1)>>32;
}
break;
case GRST_SHIFTABLE_MESH:
case SPT_SHIFTABLE_MESH:
p0=(&tempg0->shiftable_tri_cnt)(U8 *)+sizeof(I32);
p1=(&tempg1->shiftable_tri_cnt)(U8 *)+sizeof(I32);
pr=(&tempgr->shiftable_tri_cnt)(U8 *)+sizeof(I32);
@@ -449,11 +445,10 @@ public U8 *SpriteInterpolate(U8 *elems0,U8 *elems1,F64 t)
return result;
}
#help_index "Graphics/Sprite;Doc/Output"
#help_index "Graphics/Sprite;DolDoc/Output"
public CDocEntry *DocSprite(CDoc *doc=NULL,U8 *elems,U8 *fmt=NULL)
{//Put a sprite into a document. You can, optionally, supply a fmt string
//for $LK,"Dollar",A="FI:::/Doc/Dollar.TXT"$ cmd with a %d for the bin_num.
//for $LK,"DolDoc",A="FI:::/Doc/DolDocOverview.TXT"$ cmd with a %d for the bin_num.
I64 size;
U8 *st;
Bool unlock;
@@ -470,13 +465,13 @@ public CDocEntry *DocSprite(CDoc *doc=NULL,U8 *elems,U8 *fmt=NULL)
tempb->use_cnt=1;
QueIns(tempb,doc->bin_root.last);
if (fmt)
st=MPrint(fmt,doc->cur_bin_num++);
st=MStrPrint(fmt,doc->cur_bin_num++);
else
st=MPrint("$$SP,\"\",BI=%d$$",doc->cur_bin_num++);
st=MStrPrint("$$SP,\"\",BI=%d$$",doc->cur_bin_num++);
doc_e=DocPrint(doc,"%s",st);
Free(st);
doc_e->bin_data=tempb;
if (doc_e && doc_e->flags1&DOCEF1_TAG && doc_e->tag && *doc_e->tag)
if (doc_e && doc_e->de_flags&DOCEF_TAG && doc_e->tag && *doc_e->tag)
tempb->tag=StrNew(doc_e->tag,doc->mem_task);
if (unlock)
DocUnlock(doc);
@@ -484,11 +479,8 @@ public CDocEntry *DocSprite(CDoc *doc=NULL,U8 *elems,U8 *fmt=NULL)
}
public CDocEntry *Sprite(U8 *elems,U8 *fmt=NULL)
{
//If you set fmt,
//then include dollarsigns ("$$SP ...$$")
//and leave a %d for the number.
{//Put sprite to the command-line, $LK,"DocPut",A="MN:DocPut"$.
//If you set fmt, then include dollars ("$$SP ...$$") and leave %d for num.
CDoc *doc;
if (doc=DocPut)
return DocSprite(doc,elems,fmt);
+370
View File
@@ -0,0 +1,370 @@
#help_index "TextBase Layer;Char/TextBase Layer"
#help_file "::/Doc/TextBase"
asm {
USE64
//************************************
_TEXT_CHAR:://Bool TextChar(CTask *task,Bool allow_border=FALSE,I64 x,I64 y,I64 d);
//Must be called 60fps in Fs->draw_it() callback.
PUSH RBP
MOV RBP,RSP
MOV RCX,U64 SF_ARG1[RBP]
MOV RBX,U64 CTask.scroll_x[RCX]
SAR RBX,3
ADD RBX,U64 SF_ARG3[RBP]
MOV RAX,U64 CTask.scroll_y[RCX]
SAR RAX,3
ADD RAX,U64 SF_ARG4[RBP]
TEST U8 SF_ARG2[RBP],0xFF
JNZ @@10
//Border not allowed
TEST RBX,RBX //Check X
JS @@05
ADD RBX,U64 CTask.win_left[RCX]
CMP RBX,U64 CTask.win_right[RCX]
JG @@05
TEST RBX,RBX
JS @@05
CMP RBX,TEXT_COLS
JGE @@05
TEST RAX,RAX //Check Y
JS @@05
ADD RAX,U64 CTask.win_top[RCX]
CMP RAX,U64 CTask.win_bottom[RCX]
JG @@05
TEST RAX,RAX
JS @@05
CMP RAX,TEXT_ROWS
JGE @@05
JMP @@15
@@05: XOR RAX,RAX //return FALSE
POP RBP
RET1 40
//Border allowed
@@10: MOV RDX,-1 //Check X
CMP RBX,RDX
JL @@05
ADD RBX,U64 CTask.win_left[RCX]
MOV RDX,U64 CTask.win_right[RCX]
INC RDX
CMP RBX,RDX
JG @@05
TEST RBX,RBX
JS @@05
CMP RBX,TEXT_COLS
JGE @@05
MOV RDX,-1 //Check Y
CMP RAX,RDX
JL @@05
ADD RAX,U64 CTask.win_top[RCX]
MOV RDX,U64 CTask.win_bottom[RCX]
INC RDX
CMP RAX,RDX
JG @@05
TEST RAX,RAX
JS @@05
CMP RAX,TEXT_ROWS
JGE @@05
@@15: IMUL2 RAX,TEXT_COLS
ADD RBX,RAX
SHL RBX,2
ADD RBX,U64 [&gr.text_base]
MOV RAX,U64 SF_ARG5[RBP]
MOV U32 [RBX],EAX
MOV RAX,TRUE
POP RBP
RET1 40
//************************************
_TEXT_LEN_STR:://Bool TextLenStr(CTask *task,I64 x,I64 y,I64 len,I64 attr,U8 *s)
//Must be called 60fps in Fs->draw_it() callback.
PUSH RBP
MOV RBP,RSP
PUSH RSI
PUSH RDI
MOV RBX,U64 SF_ARG1[RBP]
MOV RSI,U64 SF_ARG6[RBP]
MOV RDI,U64 CTask.scroll_x[RBX]
SAR RDI,3
ADD RDI,U64 SF_ARG2[RBP]
MOV RCX,U64 SF_ARG4[RBP]
TEST RDI,RDI
JNS @@05
ADD RCX,RDI
SUB RSI,RDI
XOR RDI,RDI
@@05: ADD RDI,U64 CTask.win_left[RBX]
MOV RDX,RCX
ADD RDX,RDI
DEC RDX
CMP RDX,U64 CTask.win_right[RBX]
JLE @@10
MOV RAX,RDX
SUB RAX,U64 CTask.win_right[RBX]
SUB RDX,RAX
SUB RCX,RAX
@@10: TEST RDI,RDI
JNS @@15
ADD RCX,RDI
SUB RSI,RDI
XOR RDI,RDI
@@15: INC RDX
SUB RDX,TEXT_COLS
JLE @@20
SUB RCX,RDX
@@20: CMP RCX,1
JL @@30
MOV RAX,U64 CTask.scroll_y[RBX]
SAR RAX,3
ADD RAX,U64 SF_ARG3[RBP]
TEST RAX,RAX
JS @@30
ADD RAX,U64 CTask.win_top[RBX]
CMP RAX,U64 CTask.win_bottom[RBX]
JG @@30
TEST RAX,RAX
JS @@30
CMP RAX,TEXT_ROWS
JGE @@30
IMUL2 RAX,TEXT_COLS
ADD RDI,RAX
SHL RDI,2
ADD RDI,U64 [&gr.text_base]
MOV RAX,U64 SF_ARG5[RBP]
@@25: LODSB
STOSD
DEC RCX
JNZ @@25
POP RDI
POP RSI
MOV RAX,TRUE
POP RBP
RET1 48
@@30: POP RDI
POP RSI
XOR RAX,RAX
POP RBP
RET1 48
//************************************
_TEXT_LEN_ATTR_STR:://Bool TextLenAttrStr(CTask *task,I64 x,I64 y,I64 len,U32 *_attr)
//Must be called 60fps in Fs->draw_it() callback.
PUSH RBP
MOV RBP,RSP
PUSH RSI
PUSH RDI
MOV RBX,U64 SF_ARG1[RBP]
MOV RSI,U64 SF_ARG5[RBP]
MOV RDI,U64 CTask.scroll_x[RBX]
SAR RDI,3
ADD RDI,U64 SF_ARG2[RBP]
MOV RCX,U64 SF_ARG4[RBP]
TEST RDI,RDI
JNS @@05
ADD RCX,RDI
SHL RDI,2
SUB RSI,RDI
XOR RDI,RDI
@@05: ADD RDI,U64 CTask.win_left[RBX]
MOV RDX,RCX
ADD RDX,RDI
DEC RDX
CMP RDX,U64 CTask.win_right[RBX]
JLE @@10
MOV RAX,RDX
SUB RAX,U64 CTask.win_right[RBX]
SUB RDX,RAX
SUB RCX,RAX
@@10: TEST RDI,RDI
JNS @@15
ADD RCX,RDI
SHL RDI,2
SUB RSI,RDI
XOR RDI,RDI
@@15: INC RDX
SUB RDX,TEXT_COLS
JLE @@20
SUB RCX,RDX
@@20: CMP RCX,1
JL @@30
MOV RAX,U64 CTask.scroll_y[RBX]
SAR RAX,3
ADD RAX,U64 SF_ARG3[RBP]
TEST RAX,RAX
JS @@30
ADD RAX,U64 CTask.win_top[RBX]
CMP RAX,U64 CTask.win_bottom[RBX]
JG @@30
TEST RAX,RAX
JS @@30
CMP RAX,TEXT_ROWS
JGE @@30
IMUL2 RAX,TEXT_COLS
ADD RDI,RAX
SHL RDI,2
ADD RDI,U64 [&gr.text_base]
@@25: MOVSD
DEC RCX
JNZ @@25
POP RDI
POP RSI
MOV RAX,TRUE
POP RBP
RET1 40
@@30: POP RDI
POP RSI
XOR RAX,RAX
POP RBP
RET1 40
//************************************
_TEXT_LEN_ATTR:://Bool TextLenAttr(CTask *task,I64 x,I64 y,I64 len,I64 attr)
//Must be called 60fps in Fs->draw_it() callback.
PUSH RBP
MOV RBP,RSP
PUSH RSI
PUSH RDI
MOV RBX,U64 SF_ARG1[RBP]
MOV RDI,U64 CTask.scroll_x[RBX]
SAR RDI,3
ADD RDI,U64 SF_ARG2[RBP]
MOV RCX,U64 SF_ARG4[RBP]
TEST RDI,RDI
JNS @@05
ADD RCX,RDI
XOR RDI,RDI
@@05: ADD RDI,U64 CTask.win_left[RBX]
MOV RDX,RCX
ADD RDX,RDI
DEC RDX
CMP RDX,U64 CTask.win_right[RBX]
JLE @@10
MOV RAX,RDX
SUB RAX,U64 CTask.win_right[RBX]
SUB RDX,RAX
SUB RCX,RAX
@@10: TEST RDI,RDI
JNS @@15
ADD RCX,RDI
XOR RDI,RDI
@@15: INC RDX
SUB RDX,TEXT_COLS
JLE @@20
SUB RCX,RDX
@@20: CMP RCX,1
JL @@35
MOV RAX,U64 CTask.scroll_y[RBX]
SAR RAX,3
ADD RAX,U64 SF_ARG3[RBP]
TEST RAX,RAX
JS @@35
ADD RAX,U64 CTask.win_top[RBX]
CMP RAX,U64 CTask.win_bottom[RBX]
JG @@35
TEST RAX,RAX
JS @@35
CMP RAX,TEXT_ROWS
JGE @@35
IMUL2 RAX,TEXT_COLS
ADD RDI,RAX
SHL RDI,2
ADD RDI,U64 [&gr.text_base]
MOV RBX,U64 SF_ARG5[RBP]
MOV RSI,RDI
@@25: LODSD
TEST AL,AL
JNZ @@30
MOV RAX,RBX
STOSD
DEC RCX
JNZ @@25
@@30: POP RDI
POP RSI
MOV RAX,TRUE
POP RBP
RET1 40
@@35: POP RDI
POP RSI
XOR RAX,RAX
POP RBP
RET1 40
}
public _extern _TEXT_CHAR Bool TextChar(CTask *task,Bool allow_border=FALSE,I64 x,I64 y,I64 d); //Plot char. Must be called 60fps in Fs->draw_it() callback.
public _extern _TEXT_LEN_STR Bool TextLenStr(CTask *task,I64 x,I64 y,I64 len,I64 attr,U8 *s); //Plot str with len. Must be called 60fps in Fs->draw_it() callback.
public _extern _TEXT_LEN_ATTR_STR Bool TextLenAttrStr(CTask *task,I64 x,I64 y,I64 len,U32 *_attr); //Plot attr str with len. Must be called 60fps in Fs->draw_it() callback.
public _extern _TEXT_LEN_ATTR Bool TextLenAttr(CTask *task,I64 x,I64 y,I64 len,I64 attr); //Plot attrs with len. Must be called 60fps in Fs->draw_it() callback.
public U0 TextPrint(CTask *task,I64 x,I64 y,I64 attr,U8 *fmt,...)
{//Plot chars. Must be called 60fps in Fs->draw_it() callback.
//You probably want $LK,"GrPrint",A="MN:GrPrint"$() or just $LK,"Print",A="MN:Print"$().
U8 *buf=StrPrintJoin(NULL,fmt,argc,argv);
TextLenStr(task,x,y,StrLen(buf),attr<<8,buf);
Free(buf);
}
public U0 TextBorder(CTask *task=NULL,I64 l,I64 r,I64 t,I64 b,I64 attr,Bool solid)
{//Plot border square. Must be called 60fps in Fs->draw_it() callback.
//Draws window borders or DolDoc text button borders.
//Set task=sys_winmgr_task for no clipping.
I64 i;
if (!task) task=Fs;
attr<<=8;
if (solid) {
TextChar(task,,l-1,t-1,'É'+attr);
TextChar(task,,r+1,t-1,'»'+attr);
TextChar(task,,l-1,b+1,'È'+attr);
TextChar(task,,r+1,b+1,'¼'+attr);
for (i=l;i<=r;i++) {
TextChar(task,,i,t-1,'Í'+attr);
TextChar(task,,i,b+1,'Í'+attr);
}
for (i=t;i<=b;i++) {
TextChar(task,,l-1,i,'º'+attr);
TextChar(task,,r+1,i,'º'+attr);
}
} else {
TextChar(task,,l-1,t-1,'Ú'+attr);
TextChar(task,,r+1,t-1,'¿'+attr);
TextChar(task,,l-1,b+1,'À'+attr);
TextChar(task,,r+1,b+1,'Ù'+attr);
for (i=l;i<=r;i++) {
TextChar(task,,i,t-1,'Ä'+attr);
TextChar(task,,i,b+1,'Ä'+attr);
}
for (i=t;i<=b;i++) {
TextChar(task,,l-1,i,'³'+attr);
TextChar(task,,r+1,i,'³'+attr);
}
}
}
public U0 TextRect(I64 l,I64 r,I64 t,I64 b,I64 d)
{//Fill text rect. Must be called 60fps in Fs->draw_it() callback.
I64 y,w;
if (l>r || t>b) return;
if (t<0) t=0;
if (b>=TEXT_ROWS) b=TEXT_ROWS-1;
if (l<0) l=0;
if (r>=TEXT_COLS) r=TEXT_COLS-1;
if (w=r-l+1)
for (y=t;y<=b;y++)
MemSetU32(gr.text_base(U8 *)+(y*TEXT_COLS+l)*sizeof(U32),d,w);
}
+65 -76
View File
@@ -10,8 +10,8 @@ public Bool Line(U8 *aux_data,
I64 x2,I64 y2,I64 z2,
Bool (*fp_plot)(U8 *aux,I64 x,I64 y,I64 z),
I64 step=1,I64 start=0)
{
//This uses $LK,"fixed-point",A="FI:::/Demo/Lectures/FixedPoint.CPP"$.
{//Step through line segment calling callback.
//Uses $LK,"fixed-point",A="FI:::/Demo/Lectures/FixedPoint.CPP"$.
I64 i,j,d,dx=x2-x1,dy=y2-y1,dz=z2-z1,_x,_y,_z,
adx=AbsI64(dx),ady=AbsI64(dy),adz=AbsI64(dz);
Bool first=TRUE;
@@ -81,56 +81,52 @@ public Bool Line(U8 *aux_data,
#help_index "Graphics/Math/3D Transformation"
public I64 *GrRotXNew(F64 è,CTask *mem_task=NULL)
{
//This uses $LK,"fixed-point",A="FI:::/Demo/Lectures/FixedPoint.CPP"$.
F64 my_cos=Cos(è)*gr_scale,
my_sin=Sin(è)*gr_scale;
{//MAlloc 4x4 matrix to rot about X axis. Uses $LK,"fixed-point",A="FI:::/Demo/Lectures/FixedPoint.CPP"$.
F64 my_cos=Cos(è)*GR_SCALE,
my_sin=Sin(è)*GR_SCALE;
I64 *r=CAlloc(sizeof(I64)*16,mem_task);
r[5]=my_cos;
r[10]=my_cos;
r[9]=my_sin;
r[6]=-my_sin;
r[0]=gr_scale;
r[15]=gr_scale;
r[0]=GR_SCALE;
r[15]=GR_SCALE;
return r;
}
public I64 *GrRotYNew(F64 ê,CTask *mem_task=NULL)
{
//This uses $LK,"fixed-point",A="FI:::/Demo/Lectures/FixedPoint.CPP"$.
F64 my_cos=Cos(ê)*gr_scale,
my_sin=Sin(ê)*gr_scale;
{//MAlloc 4x4 matrix to rot about Y axis. Uses $LK,"fixed-point",A="FI:::/Demo/Lectures/FixedPoint.CPP"$.
F64 my_cos=Cos(ê)*GR_SCALE,
my_sin=Sin(ê)*GR_SCALE;
I64 *r=CAlloc(sizeof(I64)*16,mem_task);
r[0]=my_cos;
r[10]=my_cos;
r[8]=-my_sin;
r[2]=my_sin;
r[5]=gr_scale;
r[15]=gr_scale;
r[5]=GR_SCALE;
r[15]=GR_SCALE;
return r;
}
public I64 *GrRotZNew(F64 é,CTask *mem_task=NULL)
{
//This uses $LK,"fixed-point",A="FI:::/Demo/Lectures/FixedPoint.CPP"$.
F64 my_cos=Cos(é)*gr_scale,
my_sin=Sin(é)*gr_scale;
{//MAlloc 4x4 matrix to rot about Z axis. Uses $LK,"fixed-point",A="FI:::/Demo/Lectures/FixedPoint.CPP"$.
F64 my_cos=Cos(é)*GR_SCALE,
my_sin=Sin(é)*GR_SCALE;
I64 *r=CAlloc(sizeof(I64)*16,mem_task);
r[0]=my_cos;
r[5]=my_cos;
r[4]=my_sin;
r[1]=-my_sin;
r[10]=gr_scale;
r[15]=gr_scale;
r[10]=GR_SCALE;
r[15]=GR_SCALE;
return r;
}
public I64 *GrScaleNew(I64 *m1,F64 s,CTask *mem_task=NULL)
{
//This uses $LK,"fixed-point",A="FI:::/Demo/Lectures/FixedPoint.CPP"$.
{//MAlloc matrix that is scaled version of a 4x4 matrix. Uses $LK,"fixed-point",A="FI:::/Demo/Lectures/FixedPoint.CPP"$.
I64 i,*r=CAlloc(sizeof(I64)*16,mem_task);
for (i=0;i<16;i++)
r[i]=m1[i]*s;
@@ -138,9 +134,8 @@ public I64 *GrScaleNew(I64 *m1,F64 s,CTask *mem_task=NULL)
}
public I64 *GrMulMat(I64 *m1,I64 *m2,CTask *mem_task=NULL)
{
//This uses $LK,"fixed-point",A="FI:::/Demo/Lectures/FixedPoint.CPP"$.
//Conceptually, the transform m1 is applied after m2
{//Multiply 4x4 matrices, return MAlloced matrix. Uses $LK,"fixed-point",A="FI:::/Demo/Lectures/FixedPoint.CPP"$.
//Conceptually, the transform m1 is applied after m2
I64 i,j,k,*r=CAlloc(sizeof(I64)*16,mem_task);
F64 d;
for (i=0;i<4;i++) {
@@ -148,7 +143,7 @@ public I64 *GrMulMat(I64 *m1,I64 *m2,CTask *mem_task=NULL)
for (k=0;k<4;k++) {
d=m1[k+4*j];
d*=m2[i+4*k]; //TODO! Possible overflow if norm > one.
d/=gr_scale;
d/=GR_SCALE;
r[i+4*j]+=d;
}
}
@@ -157,18 +152,17 @@ public I64 *GrMulMat(I64 *m1,I64 *m2,CTask *mem_task=NULL)
}
public I64 *GrRotXEqu(I64 *m1,F64 è)
{
//This uses $LK,"fixed-point",A="FI:::/Demo/Lectures/FixedPoint.CPP"$.
F64 my_cos=Cos(è)*gr_scale,
my_sin=Sin(è)*gr_scale;
{//Rot matrix about X axis. Uses $LK,"fixed-point",A="FI:::/Demo/Lectures/FixedPoint.CPP"$.
F64 my_cos=Cos(è)*GR_SCALE,
my_sin=Sin(è)*GR_SCALE;
I64 r[16],*r2;
MemSet(r,0,sizeof(r));
r[5]=my_cos;
r[10]=my_cos;
r[9]=my_sin;
r[6]=-my_sin;
r[0]=gr_scale;
r[15]=gr_scale;
r[0]=GR_SCALE;
r[15]=GR_SCALE;
r2=GrMulMat(r,m1);
MemCpy(m1,r2,sizeof(I64)*16);
@@ -177,18 +171,17 @@ public I64 *GrRotXEqu(I64 *m1,F64
}
public I64 *GrRotYEqu(I64 *m1,F64 ê)
{
//This uses $LK,"fixed-point",A="FI:::/Demo/Lectures/FixedPoint.CPP"$.
F64 my_cos=Cos(ê)*gr_scale,
my_sin=Sin(ê)*gr_scale;
{//Rot matrix about Y axis. Uses $LK,"fixed-point",A="FI:::/Demo/Lectures/FixedPoint.CPP"$.
F64 my_cos=Cos(ê)*GR_SCALE,
my_sin=Sin(ê)*GR_SCALE;
I64 r[16],*r2;
MemSet(r,0,sizeof(r));
r[0]=my_cos;
r[10]=my_cos;
r[8]=-my_sin;
r[2]=my_sin;
r[5]=gr_scale;
r[15]=gr_scale;
r[5]=GR_SCALE;
r[15]=GR_SCALE;
r2=GrMulMat(r,m1);
MemCpy(m1,r2,sizeof(I64)*16);
@@ -197,18 +190,17 @@ public I64 *GrRotYEqu(I64 *m1,F64
}
public I64 *GrRotZEqu(I64 *m1,F64 é)
{
//This uses $LK,"fixed-point",A="FI:::/Demo/Lectures/FixedPoint.CPP"$.
F64 my_cos=Cos(é)*gr_scale,
my_sin=Sin(é)*gr_scale;
{//Rot matrix about Z axis. Uses $LK,"fixed-point",A="FI:::/Demo/Lectures/FixedPoint.CPP"$.
F64 my_cos=Cos(é)*GR_SCALE,
my_sin=Sin(é)*GR_SCALE;
I64 r[16],*r2;
MemSet(r,0,sizeof(r));
r[0]=my_cos;
r[5]=my_cos;
r[4]=my_sin;
r[1]=-my_sin;
r[10]=gr_scale;
r[15]=gr_scale;
r[10]=GR_SCALE;
r[15]=GR_SCALE;
r2=GrMulMat(r,m1);
MemCpy(m1,r2,sizeof(I64)*16);
@@ -217,15 +209,15 @@ public I64 *GrRotZEqu(I64 *m1,F64
}
public I64 *GrScaleEqu(I64 *m1,F64 s)
{
{//Scale 4x4 matrix by value.
I64 i;
for (i=0;i<16;i++)
m1[i]*=s;
return m1;
}
public U0 GrScalePenWidth(CDC *dc=gr_dc)
{
public U0 GrScalePenWidth(CDC *dc=gr.dc)
{//Scale device context's pen width by norm of transformation.
I64 d;
if (dc->flags&DCF_TRANSFORMATION) {
if (dc->pen_width) {
@@ -238,27 +230,25 @@ public U0 GrScalePenWidth(CDC *dc=gr_dc)
}
public I64 *GrSetTranslation(I64 r[4][4],I64 x,I64 y,I64 z)
{
//This uses $LK,"fixed-point",A="FI:::/Demo/Lectures/FixedPoint.CPP"$.
{//Set translation values in 4x4 matrix. Uses $LK,"fixed-point",A="FI:::/Demo/Lectures/FixedPoint.CPP"$.
r[0][3]=x<<32;
r[1][3]=y<<32;
r[2][3]=z<<32;
r[3][3]=gr_scale;
r[3][3]=GR_SCALE;
return r;
}
public I64 *GrAddTranslation(I64 r[4][4],I64 x,I64 y,I64 z)
{
//This uses $LK,"fixed-point",A="FI:::/Demo/Lectures/FixedPoint.CPP"$.
{//Add translation to 4x4 matrix. Uses $LK,"fixed-point",A="FI:::/Demo/Lectures/FixedPoint.CPP"$.
r[0][3]+=x<<32;
r[1][3]+=y<<32;
r[2][3]+=z<<32;
r[3][3]=gr_scale;
r[3][3]=GR_SCALE;
return r;
}
public Bool GrSetSymmetry(CDC *dc=gr_dc,I64 x1,I64 y1,I64 x2,I64 y2)
{
public Bool GrSetSymmetry(CDC *dc=gr.dc,I64 x1,I64 y1,I64 x2,I64 y2)
{//2D. Set device context's symmetry.
F64 d;
if (y1==y2 && x1==x2)
return FALSE;
@@ -268,7 +258,7 @@ public Bool GrSetSymmetry(CDC *dc=gr_dc,I64 x1,I64 y1,I64 x2,I64 y2)
if (d=Sqrt(SqrI64(dc->sym.snx)+
SqrI64(dc->sym.sny)+
SqrI64(dc->sym.snz))) {
d=gr_scale/d;
d=GR_SCALE/d;
dc->sym.snx *= d;
dc->sym.sny *= d;
dc->sym.snz *= d;
@@ -279,8 +269,8 @@ public Bool GrSetSymmetry(CDC *dc=gr_dc,I64 x1,I64 y1,I64 x2,I64 y2)
return TRUE;
}
public Bool GrSetSymmetry3(CDC *dc=gr_dc,I64 x1,I64 y1,I64 z1,I64 x2,I64 y2,I64 z2,I64 x3,I64 y3,I64 z3)
{
public Bool GrSetSymmetry3(CDC *dc=gr.dc,I64 x1,I64 y1,I64 z1,I64 x2,I64 y2,I64 z2,I64 x3,I64 y3,I64 z3)
{//3D. Set device context's symmetry.
F64 d,x,y,z,xx,yy,zz;
I64 xx1,yy1,zz1,xx2,yy2,zz2,*r;
xx1=x1-x2; yy1=y1-y2; zz1=z1-z2;
@@ -301,7 +291,7 @@ public Bool GrSetSymmetry3(CDC *dc=gr_dc,I64 x1,I64 y1,I64 z1,I64 x2,I64 y2,I64
x=xx; y=yy; z=zz;
}
if (d=Sqrt(Sqr(x)+Sqr(y)+Sqr(z))) {
d=gr_scale/d;
d=GR_SCALE/d;
dc->sym.snx = d*x;
dc->sym.sny = d*y;
dc->sym.snz = d*z;
@@ -315,8 +305,7 @@ public Bool GrSetSymmetry3(CDC *dc=gr_dc,I64 x1,I64 y1,I64 z1,I64 x2,I64 y2,I64
}
public U0 GrReflect(CDC *dc,I64 *_x,I64 *_y,I64 *_z)
{
//This uses $LK,"fixed-point",A="FI:::/Demo/Lectures/FixedPoint.CPP"$.
{//Reflect 3D point about device context's symmetry. Uses $LK,"fixed-point",A="FI:::/Demo/Lectures/FixedPoint.CPP"$.
I64 x=*_x<<32,y=*_y<<32,z=*_z<<32,
xx=*_x-dc->sym.sx,yy=*_y-dc->sym.sy,zz=*_z-dc->sym.sz,
d=(xx*dc->sym.snx+yy*dc->sym.sny+zz*dc->sym.snz)>>16,
@@ -352,7 +341,7 @@ public Bool Circle(U8 *aux_data,
I64 step=1,
F64 start_radians=0,
F64 len_radians=2*ã)
{
{//Step through circle arc calling callback.
I64 i,j,len=Ceil(len_radians*radius),
x,y,x1,y1,s1,s2,c;
F64 t;
@@ -396,7 +385,7 @@ public Bool Ellipse(U8 *aux_data,
I64 step=1,
F64 start_radians=0,
F64 len_radians=2*ã)
{
{//Step through ellipse arc calling callback.
I64 i,j,len,
x,y,_x,_y,x1,y1,x2,y2, s1,s2,c, s12,s22,c2;
F64 t;
@@ -468,7 +457,7 @@ public Bool RegPoly(U8 *aux_data,
I64 step=1,
F64 start_radians=0,
F64 len_radians=2*ã)
{
{//Step through regular polygon calling callback.
I64 i,n,x,y,x1,y1,x2,y2,
xx1,yy1,xx2,yy2,
s1,s2,c, s12,s22,c2;
@@ -523,30 +512,30 @@ public Bool RegPoly(U8 *aux_data,
return TRUE;
}
#help_index "Graphics/CD3I32;Math/CD3I32"
#help_index "Graphics/Data Types;Math/Data Types"
public F64 D3I32Dist(CD3I32 *p1,CD3I32 *p2)
{
{//Dist between p1 and p2.
return Sqrt(SqrI64(p1->x-p2->x)+SqrI64(p1->y-p2->y)+SqrI64(p1->z-p2->z));
}
public I64 D3I32SqrDist(CD3I32 *p1,CD3I32 *p2)
{
public I64 D3I32DistSqr(CD3I32 *p1,CD3I32 *p2)
{//Dist Squared between p1 and p2.
return SqrI64(p1->x-p2->x)+SqrI64(p1->y-p2->y)+SqrI64(p1->z-p2->z);
}
public F64 D3I32Norm(CD3I32 *p)
{
{//Norm of p.
return Sqrt(SqrI64(p->x)+SqrI64(p->y)+SqrI64(p->z));
}
public I64 D3I32SqrNorm(CD3I32 *p)
{
public I64 D3I32NormSqr(CD3I32 *p)
{//Norm Squared of p.
return SqrI64(p->x)+SqrI64(p->y)+SqrI64(p->z);
}
#help_index "Graphics/Math"
public Bool Bezier2(U8 *aux_data,CD3I32 *ctrl,Bool (*fp_plot)(U8 *aux,I64 x,I64 y,I64 z),Bool first=TRUE)
{//2nd order
{//Go in 2nd order bezier calling callback.
I64 x,y,z,xx,yy,zz,dx,dy,dz,d_max;
F64 x0=ctrl[0].x,y0=ctrl[0].y,z0=ctrl[0].z,
x1=ctrl[1].x-x0,y1=ctrl[1].y-y0,z1=ctrl[1].z-z0,
@@ -590,7 +579,7 @@ public Bool Bezier2(U8 *aux_data,CD3I32 *ctrl,Bool (*fp_plot)(U8 *aux,I64 x,I64
}
public Bool Bezier3(U8 *aux_data,CD3I32 *ctrl,Bool (*fp_plot)(U8 *aux,I64 x,I64 y,I64 z),Bool first=TRUE)
{ //3rd order
{//Go in 3rd order bezier calling callback.
I64 x,y,z,xx,yy,zz,dx,dy,dz,d_max;
F64 x0=ctrl[0].x,y0=ctrl[0].y,z0=ctrl[0].z,
x1=ctrl[1].x-x0,y1=ctrl[1].y-y0,z1=ctrl[1].z-z0,
@@ -638,7 +627,7 @@ public Bool Bezier3(U8 *aux_data,CD3I32 *ctrl,Bool (*fp_plot)(U8 *aux,I64 x,I64
}
public Bool BSpline2(U8 *aux_data,CD3I32 *ctrl,I64 cnt,Bool (*fp_plot)(U8 *aux,I64 x,I64 y,I64 z),Bool closed=FALSE)
{ //2nd order
{//Go in 2nd order spline calling callback.
I64 i,j;
CD3I32 *c;
Bool first;
@@ -704,7 +693,7 @@ public Bool BSpline2(U8 *aux_data,CD3I32 *ctrl,I64 cnt,Bool (*fp_plot)(U8 *aux,I
}
public Bool BSpline3(U8 *aux_data,CD3I32 *ctrl,I64 cnt,Bool (*fp_plot)(U8 *aux,I64 x,I64 y,I64 z),Bool closed=FALSE)
{ //3rd order
{//Go in 3rd order spline calling callback.
I64 i,j;
F64 x,y,z;
CD3I32 *c;
@@ -798,7 +787,7 @@ public Bool BSpline3(U8 *aux_data,CD3I32 *ctrl,I64 cnt,Bool (*fp_plot)(U8 *aux,I
#define CC_BOTTOM 8
public Bool ClipLine(I64 *_x1,I64 *_y1,I64 *_x2,I64 *_y2,I64 left,I64 top,I64 right,I64 bottom)
{
{//Clip x1,y1 x2,y2 with left,top,right,bottom.
I64 x,y,x1=*_x1,y1=*_y1,x2=*_x2,y2=*_y2,
cc,cc1,cc2;
if (y1>bottom)
+251 -252
View File
@@ -1,33 +1,33 @@
#help_index "Graphics/Sprite"
#define GEBM_EXIT 0
#define GEBM_MAIN_MENU 1
#define GEBM_COLOR 2
#define GEBM_DITHER_COLOR 3
#define GEBM_WIDTH 4
#define GEBM_PT 5
#define GEBM_LINE 6
#define GEBM_ARROW 7
#define GEBM_RECT 8
#define GEBM_CIRCLE 9
#define GEBM_TEXT 10
#define GEBM_TEXT_BOX 11
#define GEBM_TEXT_DIAMOND 12
#define GEBM_FLOOD_FILL 13
#define GEBM_FLOOD_FILL_NOT 14
#define GEBM_POLYLINE 15
#define GEBM_POLYPT 16
#define GEBM_COPY 17
#define GEBM_DELETE 18
#define GEBM_PASTE 19
#define GEBM_PASTE_TRANSPARENT 20
#define GEBM_FIND_AND_REPLACE 21
#define GEBM_TRIM_TO_EXTENTS 22
#define GEBM_ADD_OUTLINE 23
#define GEBM_ETCH 24
#define GEBM_UNDO 25
#define GEBM_SAVE_BMP 26
#define GEBM_SAVE_GRA 27
#define GBM_EXIT 0
#define GBM_MAIN_MENU 1
#define GBM_COLOR 2
#define GBM_DITHER_COLOR 3
#define GBM_WIDTH 4
#define GBM_PT 5
#define GBM_LINE 6
#define GBM_ARROW 7
#define GBM_RECT 8
#define GBM_CIRCLE 9
#define GBM_TEXT 10
#define GBM_TEXT_BOX 11
#define GBM_TEXT_DIAMOND 12
#define GBM_FLOOD_FILL 13
#define GBM_FLOOD_FILL_NOT 14
#define GBM_POLYLINE 15
#define GBM_POLYPT 16
#define GBM_COPY 17
#define GBM_DELETE 18
#define GBM_PASTE 19
#define GBM_PASTE_TRANSPARENT 20
#define GBM_FIND_AND_REPLACE 21
#define GBM_TRIM_TO_EXTENTS 22
#define GBM_ADD_OUTLINE 23
#define GBM_ETCH 24
#define GBM_UNDO 25
#define GBM_SAVE_BMP 26
#define GBM_SAVE_GRA 27
U0 GrInit4()
{
@@ -46,7 +46,7 @@ I64 PopUpSpriteBitMap(CColorROPU32 color,I64 width)
U8 *st1,*st2,buf[136];
CDoc *doc=DocNew;
Color2Text(buf,color);
Color2Str(buf,color);
if (color&ROPF_DITHER) {
st1="";
st2=buf;
@@ -57,34 +57,34 @@ I64 PopUpSpriteBitMap(CColorROPU32 color,I64 width)
DocPrint(doc,"$$PURPLE$$$$TX+CX,\"Sprite BitMap Menu\"$$\n"
"$$LK+PU+CX,\"Click for Help\",A=\"FI:::/Doc/SpriteBitMap.TXT.Z\"$$\n"
"\n$$LTBLUE$$$$MU-UL,\"Color %s\",LE=GEBM_COLOR$$\n"
"$$MU-UL,\"Dither Color %s\",LE=GEBM_DITHER_COLOR$$\n"
"$$MU-UL,\"Width %d\",LE=GEBM_WIDTH$$\n"
"$$MU-UL,\"Find & Replace Color\",LE=GEBM_FIND_AND_REPLACE$$\n"
"$$MU-UL,\"Trim to Extents\",LE=GEBM_TRIM_TO_EXTENTS$$\n"
"$$MU-UL,\"Add Outline\",LE=GEBM_ADD_OUTLINE$$\n"
"$$MU-UL,\"Etch\",LE=GEBM_ETCH$$\n"
"\n$$MU-UL,\"Point\",LE=GEBM_PT$$\n"
"$$MU-UL,\"Line\",LE=GEBM_LINE$$\n"
"$$MU-UL,\"Arrow\",LE=GEBM_ARROW$$\n"
"$$MU-UL,\"Rect\",LE=GEBM_RECT$$\n"
"$$MU-UL,\"Circle\",LE=GEBM_CIRCLE$$\n"
"$$MU-UL,\"Text\",LE=GEBM_TEXT$$\n"
"$$MU-UL,\"Text Box\",LE=GEBM_TEXT_BOX$$\n"
"$$MU-UL,\"Text Diamond\",LE=GEBM_TEXT_DIAMOND$$\n"
"$$MU-UL,\"Flood Fill\",LE=GEBM_FLOOD_FILL$$\n"
"$$MU-UL,\"Flood Fill Not Color\",LE=GEBM_FLOOD_FILL_NOT$$\n"
"$$MU-UL,\"PolyLine\",LE=GEBM_POLYLINE$$\n"
"$$MU-UL,\"PolyPoint\",LE=GEBM_POLYPT$$\n"
"\n$$MU-UL,\"Copy to Clipboard\",LE=GEBM_COPY$$\n"
"$$MU-UL,\"Delete to Clipboard\",LE=GEBM_DELETE$$\n"
"$$MU-UL,\"Paste Clipboard\",LE=GEBM_PASTE$$\n"
"$$MU-UL,\"Paste Transparent Clipboard\",LE=GEBM_PASTE_TRANSPARENT$$\n"
"\n$$MU-UL,\"Save BMP File\",LE=GEBM_SAVE_BMP$$\n"
"$$MU-UL,\"Save GRA File\",LE=GEBM_SAVE_GRA$$\n"
"\n$$MU-UL,\"Undo\",LE=GEBM_UNDO$$\n"
"\n$$PURPLE$$$$MU-UL,\"+] Sprite Main Menu\",LE=GEBM_MAIN_MENU$$$$LTBLUE$$\n"
"$$MU-UL,\"Exit Sprite\",LE=GEBM_EXIT$$\n"
"\n$$LTBLUE$$$$MU-UL,\"Color %s\",LE=GBM_COLOR$$\n"
"$$MU-UL,\"Dither Color %s\",LE=GBM_DITHER_COLOR$$\n"
"$$MU-UL,\"Width %d\",LE=GBM_WIDTH$$\n"
"$$MU-UL,\"Find & Replace Color\",LE=GBM_FIND_AND_REPLACE$$\n"
"$$MU-UL,\"Trim to Extents\",LE=GBM_TRIM_TO_EXTENTS$$\n"
"$$MU-UL,\"Add Outline\",LE=GBM_ADD_OUTLINE$$\n"
"$$MU-UL,\"Etch\",LE=GBM_ETCH$$\n"
"\n$$MU-UL,\"Point\",LE=GBM_PT$$\n"
"$$MU-UL,\"Line\",LE=GBM_LINE$$\n"
"$$MU-UL,\"Arrow\",LE=GBM_ARROW$$\n"
"$$MU-UL,\"Rect\",LE=GBM_RECT$$\n"
"$$MU-UL,\"Circle\",LE=GBM_CIRCLE$$\n"
"$$MU-UL,\"Text\",LE=GBM_TEXT$$\n"
"$$MU-UL,\"Text Box\",LE=GBM_TEXT_BOX$$\n"
"$$MU-UL,\"Text Diamond\",LE=GBM_TEXT_DIAMOND$$\n"
"$$MU-UL,\"Flood Fill\",LE=GBM_FLOOD_FILL$$\n"
"$$MU-UL,\"Flood Fill Not Color\",LE=GBM_FLOOD_FILL_NOT$$\n"
"$$MU-UL,\"PolyLine\",LE=GBM_POLYLINE$$\n"
"$$MU-UL,\"PolyPoint\",LE=GBM_POLYPT$$\n"
"\n$$MU-UL,\"Copy to Clipboard\",LE=GBM_COPY$$\n"
"$$MU-UL,\"Delete to Clipboard\",LE=GBM_DELETE$$\n"
"$$MU-UL,\"Paste Clipboard\",LE=GBM_PASTE$$\n"
"$$MU-UL,\"Paste Transparent Clipboard\",LE=GBM_PASTE_TRANSPARENT$$\n"
"\n$$MU-UL,\"Save BMP File\",LE=GBM_SAVE_BMP$$\n"
"$$MU-UL,\"Save GRA File\",LE=GBM_SAVE_GRA$$\n"
"\n$$MU-UL,\"Undo\",LE=GBM_UNDO$$\n"
"\n$$PURPLE$$$$MU-UL,\"+] Sprite Main Menu\",LE=GBM_MAIN_MENU$$$$LTBLUE$$\n"
"$$MU-UL,\"Exit Sprite\",LE=GBM_EXIT$$\n"
"$$MU-UL,\"Abort Sprite\",LE=DOCM_CANCEL$$\n",st1,st2,width);
DocPrint(doc,"\nRight-Click to get back to this menu.");
i=PopUpMenu(doc);
@@ -92,13 +92,13 @@ I64 PopUpSpriteBitMap(CColorROPU32 color,I64 width)
return i;
}
U0 GrBMEdPrepPersistentDC(CDC *dc,I64 xx1,I64 yy1,CDC *img)
U0 GrBitMapEdPrepPersistentDC(CDC *dc,I64 xx1,I64 yy1,CDC *img)
{
DCFill(dc);
GrBlot(dc,xx1,yy1,img);
}
U0 GrBMETrimToExtents(CDC **_img,I64 *_xx1,I64 *_yy1,I64 *_xx2,I64 *_yy2,CColorROPU32 bkcolor)
U0 GrBitMapEdTrimToExtents(CDC **_img,I64 *_xx1,I64 *_yy1,I64 *_xx2,I64 *_yy2,CColorROPU32 bkcolor)
{
CDC *img=*_img;
I64 i,c,
@@ -106,7 +106,7 @@ U0 GrBMETrimToExtents(CDC **_img,I64 *_xx1,I64 *_yy1,I64 *_xx2,I64 *_yy2,CColorR
while (y1<y2) {
for (i=x1;i<=x2;i++) {
c=GrPeek(img,i,y1);
if (c!=bkcolor&&c!=COLOR_TRANSPARENT) goto tr_y2;
if (c!=bkcolor&&c!=TRANSPARENT) goto tr_y2;
}
y1++;
}
@@ -115,7 +115,7 @@ tr_y2:
while (y1<y2) {
for (i=x1;i<=x2;i++) {
c=GrPeek(img,i,y2);
if (c!=bkcolor&&c!=COLOR_TRANSPARENT) goto tr_x1;
if (c!=bkcolor&&c!=TRANSPARENT) goto tr_x1;
}
y2--;
}
@@ -124,7 +124,7 @@ tr_x1:
while (x1<x2) {
for (i=y1;i<=y2;i++) {
c=GrPeek(img,x1,i);
if (c!=bkcolor&&c!=COLOR_TRANSPARENT) goto tr_x2;
if (c!=bkcolor&&c!=TRANSPARENT) goto tr_x2;
}
x1++;
}
@@ -133,7 +133,7 @@ tr_x2:
while (x1<x2) {
for (i=y1;i<=y2;i++) {
c=GrPeek(img,x2,i);
if (c!=bkcolor&&c!=COLOR_TRANSPARENT) goto tr_done;
if (c!=bkcolor&&c!=TRANSPARENT) goto tr_done;
}
x2--;
}
@@ -145,8 +145,7 @@ tr_done:
DCDel(img);
}
U0 GrBMEAddOutline(CDC *img,I64 width,CColorROPU32 color,CColorROPU32 bkcolor)
U0 GrBitMapEdAddOutline(CDC *img,I64 width,CColorROPU32 color,CColorROPU32 bkcolor)
{
I64 i,j,k,c;
CColorROPU32 old_color;
@@ -172,7 +171,7 @@ U0 GrBMEAddOutline(CDC *img,I64 width,CColorROPU32 color,CColorROPU32 bkcolor)
}
}
U0 GrBMEEtch(CDC *img,I64 width,CColorROPU32 bkcolor)
U0 GrBitMapEdEtch(CDC *img,I64 width,CColorROPU32 bkcolor)
{
I64 i,j,k,c;
CColorROPU32 old_color;
@@ -198,11 +197,11 @@ U0 GrBMEEtch(CDC *img,I64 width,CColorROPU32 bkcolor)
}
}
I64 SpriteBitMap(CDoc *,CDocEntry *doc_e,CDC *dc,I64 *_xx1,I64 *_yy1,I64 *_xx2,I64 *_yy2,CDC **_img,CColorROPU32 bkcolor)
I64 SpriteBitMapEd(CDoc *,CDocEntry *doc_e,CDC *dc,I64 *_xx1,I64 *_yy1,I64 *_xx2,I64 *_yy2,CDC **_img,CColorROPU32 bkcolor)
{
I64 i,j,mode=GEBM_LINE,color=BLACK,width=1,msg_code,p1,p2,x1,y1,x11,y11,x22,y22,
I64 i,j,mode=GBM_LINE,color=BLACK,width=1,msg_code,a1,a2,x1,y1,x11,y11,x22,y22,
result,xx1=*_xx1,yy1=*_yy1,xx2=*_xx2,yy2=*_yy2,
old_e_flags1=doc_e->flags1;
old_de_flags=doc_e->de_flags;
Bool down=FALSE;
U8 *st=NULL;
CEdFileName filename;
@@ -210,25 +209,25 @@ I64 SpriteBitMap(CDoc *,CDocEntry *doc_e,CDC *dc,I64 *_xx1,I64 *_yy1,I64 *_xx2,I
*clipboard=NULL,*undo=NULL,*dc2;
SettingsPush; //See $LK,"SettingsPush",A="MN:SettingsPush"$
doc_e->flags1|=DOCEF1_DONT_DRAW;
doc_e->de_flags|=DOCEF_DONT_DRAW;
goto bm_menu;
while (TRUE) {
if (sys_cur_scan_code&SCF_CTRL)//grab scroll update?
GrBMEdPrepPersistentDC(dc,xx1,yy1,img);
if (kbd.scan_code&SCF_CTRL)//grab scroll update?
GrBitMapEdPrepPersistentDC(dc,xx1,yy1,img);
dc->color=ROPF_DITHER+WHITE<<16+BLACK;
dc->pen_width=1;
GrLineRect4(dc,xx1-1,yy1-1,xx2,yy2);//This is done little bit too often.
GrBorder(dc,xx1-1,yy1-1,xx2,yy2);//This is done little bit too often.
while (msg_code=ScanMsg(&p1,&p2,1<<MSG_IP_L_DOWN|1<<MSG_IP_L_UP|1<<MSG_IP_R_DOWN|
while (msg_code=ScanMsg(&a1,&a2,1<<MSG_IP_L_DOWN|1<<MSG_IP_L_UP|1<<MSG_IP_R_DOWN|
1<<MSG_IP_MOVE|1<<MSG_KEY_DOWN)) {
switch (msg_code) {
case MSG_KEY_DOWN:
if (p1==CH_SHIFT_ESC) {
if (a1==CH_SHIFT_ESC) {
result=GE_ABORT;
goto bm_key_up_done;
} else if (p1==CH_ESC) {
} else if (a1==CH_ESC) {
result=GE_CONT;
goto bm_key_up_done;
}
@@ -245,73 +244,73 @@ bm_menu:
case DOCM_CANCEL:
result=GE_ABORT;
goto bm_done;
case GEBM_EXIT:
case GBM_EXIT:
result=GE_EXIT;
goto bm_done;
case GEBM_MAIN_MENU:
case GBM_MAIN_MENU:
result=GE_CONT;
goto bm_done;
case GEBM_COLOR:
case GBM_COLOR:
i=PopUpColor(,,FALSE);
if (i>=0) color=i;
goto bm_menu;
case GEBM_FIND_AND_REPLACE:
case GBM_FIND_AND_REPLACE:
i=PopUpColor("Find Color\n",,FALSE);
if (i>=0) {
j=PopUpColor("Replace Color\n",,FALSE);
if (j>=0) {
DCColorChg(img,i,j);
GrBMEdPrepPersistentDC(dc,xx1,yy1,img);
GrBitMapEdPrepPersistentDC(dc,xx1,yy1,img);
}
}
goto bm_menu;
case GEBM_TRIM_TO_EXTENTS:
GrBMETrimToExtents(&img,&xx1,&yy1,&xx2,&yy2,bkcolor);
GrBMEdPrepPersistentDC(dc,xx1,yy1,img);
case GBM_TRIM_TO_EXTENTS:
GrBitMapEdTrimToExtents(&img,&xx1,&yy1,&xx2,&yy2,bkcolor);
GrBitMapEdPrepPersistentDC(dc,xx1,yy1,img);
goto bm_menu;
case GEBM_ADD_OUTLINE:
case GBM_ADD_OUTLINE:
i=PopUpRangeI64(1,16,1,"Outline Width\n");
if (i>=0) {
GrBMEAddOutline(img,i,color,bkcolor);
GrBMEdPrepPersistentDC(dc,xx1,yy1,img);
GrBitMapEdAddOutline(img,i,color,bkcolor);
GrBitMapEdPrepPersistentDC(dc,xx1,yy1,img);
}
goto bm_menu;
case GEBM_ETCH:
case GBM_ETCH:
i=PopUpRangeI64(1,16,1,"Etch Width\n");
if (i>=0) {
GrBMEEtch(img,i,bkcolor);
GrBMEdPrepPersistentDC(dc,xx1,yy1,img);
GrBitMapEdEtch(img,i,bkcolor);
GrBitMapEdPrepPersistentDC(dc,xx1,yy1,img);
}
goto bm_menu;
case GEBM_SAVE_BMP:
case GBM_SAVE_BMP:
*filename.name=0;
if (DocFormDo(&filename) && *filename.name)
BMPFileWrite(filename.name,img);
goto bm_menu;
case GEBM_SAVE_GRA:
case GBM_SAVE_GRA:
*filename.name=0;
if (DocFormDo(&filename) && *filename.name)
GRAWrite(filename.name,img);
goto bm_menu;
case GEBM_DITHER_COLOR:
case GBM_DITHER_COLOR:
i=PopUpColorDither;
if (i>=0) color=i;
goto bm_menu;
case GEBM_WIDTH:
case GBM_WIDTH:
i=PopUpRangeI64(1,16,1,"Pen Width\n");
if (i>=0) width=i;
goto bm_menu;
case GEBM_UNDO:
case GBM_UNDO:
if (undo) {
Beep;
img->color=ROP_EQU;
@@ -321,27 +320,27 @@ bm_menu:
}
goto bm_menu;
case GEBM_PT:
case GEBM_LINE:
case GEBM_ARROW:
case GEBM_RECT:
case GEBM_CIRCLE:
case GEBM_FLOOD_FILL:
case GEBM_FLOOD_FILL_NOT:
case GEBM_POLYPT:
case GEBM_POLYLINE:
case GEBM_COPY:
case GEBM_DELETE:
case GEBM_PASTE:
case GEBM_PASTE_TRANSPARENT:
case GBM_PT:
case GBM_LINE:
case GBM_ARROW:
case GBM_RECT:
case GBM_CIRCLE:
case GBM_FLOOD_FILL:
case GBM_FLOOD_FILL_NOT:
case GBM_POLYPT:
case GBM_POLYLINE:
case GBM_COPY:
case GBM_DELETE:
case GBM_PASTE:
case GBM_PASTE_TRANSPARENT:
mode=i;
break;
case GEBM_TEXT:
case GEBM_TEXT_BOX:
case GEBM_TEXT_DIAMOND:
case GBM_TEXT:
case GBM_TEXT_BOX:
case GBM_TEXT_DIAMOND:
Free(st);
st=PopUpMGetS("Enter text and press <ESC>.\n");
st=PopUpGetStr("Enter text and press <ESC>.\n");
if (st && *st)
mode=i;
else
@@ -353,316 +352,316 @@ bm_menu:
undo=DCExtract(img,0,0,img->width-1,img->height-1);
undo->bkcolor=bkcolor;
WinMgrSync(2,TRUE); //Let popup close
GrBMEdPrepPersistentDC(dc,xx1,yy1,img);
GrBitMapEdPrepPersistentDC(dc,xx1,yy1,img);
down=FALSE;
break;
case MSG_IP_L_DOWN:
switch (mode) {
case GEBM_PT:
case GBM_PT:
img->color=color;
img->pen_width=width;
GrPlot3(img,p1-xx1,p2-yy1,0);
GrBMEdPrepPersistentDC(dc,xx1,yy1,img);
GrPlot3(img,a1-xx1,a2-yy1,0);
GrBitMapEdPrepPersistentDC(dc,xx1,yy1,img);
break;
case GEBM_LINE:
case GEBM_ARROW:
case GEBM_RECT:
case GEBM_CIRCLE:
case GEBM_COPY:
case GEBM_DELETE:
case GBM_LINE:
case GBM_ARROW:
case GBM_RECT:
case GBM_CIRCLE:
case GBM_COPY:
case GBM_DELETE:
if (down)
GrBMEdPrepPersistentDC(dc,xx1,yy1,img);
x1=p1; y1=p2;
GrBitMapEdPrepPersistentDC(dc,xx1,yy1,img);
x1=a1; y1=a2;
down=TRUE;
dc->color=color;
dc->pen_width=width;
switch (mode) {
case GEBM_LINE:
GrLine3(dc,x1,y1,0,p1,p2,0);
case GBM_LINE:
GrLine3(dc,x1,y1,0,a1,a2,0);
break;
case GEBM_ARROW:
GrArrow3(dc,x1,y1,0,p1,p2,0);
case GBM_ARROW:
GrArrow3(dc,x1,y1,0,a1,a2,0);
break;
case GEBM_RECT:
case GBM_RECT:
GrRect(dc,x1,y1,1,1);
break;
case GEBM_CIRCLE:
case GBM_CIRCLE:
GrCircle3(dc,x1,y1,0,1);
break;
case GEBM_COPY:
case GEBM_DELETE:
case GBM_COPY:
case GBM_DELETE:
dc->color=ROPF_DITHER+WHITE<<16+BLACK;
dc->pen_width=1;
GrLineRect4(dc,x1,y1,x1,y1);
GrBorder(dc,x1,y1,x1,y1);
break;
}
break;
case GEBM_PASTE:
case GEBM_PASTE_TRANSPARENT:
case GBM_PASTE:
case GBM_PASTE_TRANSPARENT:
if (clipboard) {
GrBMEdPrepPersistentDC(dc,xx1,yy1,img);
if (mode==GEBM_PASTE) {
GrBitMapEdPrepPersistentDC(dc,xx1,yy1,img);
if (mode==GBM_PASTE) {
clipboard->flags|=DCF_NO_TRANSPARENTS;
GrBlot(dc,p1,p2,clipboard);
GrBlot(dc,a1,a2,clipboard);
clipboard->flags&=~DCF_NO_TRANSPARENTS;
} else {
dc2=DCCopy(clipboard);
DCColorChg(dc2,bkcolor);
GrBlot(dc,p1,p2,dc2);
GrBlot(dc,a1,a2,dc2);
DCDel(dc2);
}
}
break;
case GEBM_TEXT:
GrBMEdPrepPersistentDC(dc,xx1,yy1,img);
case GBM_TEXT:
GrBitMapEdPrepPersistentDC(dc,xx1,yy1,img);
dc->color=color;
GrPrint(dc,p1,p2,"%s",st);
GrPrint(dc,a1,a2,"%s",st);
break;
case GEBM_TEXT_BOX:
GrBMEdPrepPersistentDC(dc,xx1,yy1,img);
case GBM_TEXT_BOX:
GrBitMapEdPrepPersistentDC(dc,xx1,yy1,img);
dc->color=color;
GrTextBox3(dc,p1,p2,0,st);
GrTextBox3(dc,a1,a2,0,st);
break;
case GEBM_TEXT_DIAMOND:
GrBMEdPrepPersistentDC(dc,xx1,yy1,img);
case GBM_TEXT_DIAMOND:
GrBitMapEdPrepPersistentDC(dc,xx1,yy1,img);
dc->color=color;
GrTextDiamond3(dc,p1,p2,0,st);
GrTextDiamond3(dc,a1,a2,0,st);
break;
case GEBM_FLOOD_FILL:
case GBM_FLOOD_FILL:
img->color=color;
GrFloodFill(img,p1-xx1,p2-yy1);
GrBMEdPrepPersistentDC(dc,xx1,yy1,img);
GrFloodFill(img,a1-xx1,a2-yy1);
GrBitMapEdPrepPersistentDC(dc,xx1,yy1,img);
break;
case GEBM_FLOOD_FILL_NOT:
case GBM_FLOOD_FILL_NOT:
img->color=color;
GrFloodFill(img,p1-xx1,p2-yy1,TRUE);
GrBMEdPrepPersistentDC(dc,xx1,yy1,img);
GrFloodFill(img,a1-xx1,a2-yy1,TRUE);
GrBitMapEdPrepPersistentDC(dc,xx1,yy1,img);
break;
case GEBM_POLYLINE:
case GBM_POLYLINE:
if (!down) {
x1=p1; y1=p2;
x1=a1; y1=a2;
down=TRUE;
dc->color=color;
dc->pen_width=width;
GrLine3(dc,x1,y1,0,p1,p2,0);
GrLine3(dc,x1,y1,0,a1,a2,0);
}
break;
case GEBM_POLYPT:
x1=p1; y1=p2;
case GBM_POLYPT:
x1=a1; y1=a2;
down=TRUE;
img->color=color;
img->pen_width=width;
GrLine3(img,x1-xx1,y1-yy1,0,p1-xx1,p2-yy1,0);
GrBMEdPrepPersistentDC(dc,xx1,yy1,img);
GrLine3(img,x1-xx1,y1-yy1,0,a1-xx1,a2-yy1,0);
GrBitMapEdPrepPersistentDC(dc,xx1,yy1,img);
break;
}
break;
case MSG_IP_MOVE:
switch (mode) {
case GEBM_LINE:
case GEBM_ARROW:
case GEBM_POLYLINE:
case GBM_LINE:
case GBM_ARROW:
case GBM_POLYLINE:
if (down) {
GrBMEdPrepPersistentDC(dc,xx1,yy1,img);
GrBitMapEdPrepPersistentDC(dc,xx1,yy1,img);
dc->color=color;
dc->pen_width=width;
if (mode==GEBM_ARROW)
GrArrow3(dc,x1,y1,0,p1,p2,0);
if (mode==GBM_ARROW)
GrArrow3(dc,x1,y1,0,a1,a2,0);
else
GrLine3(dc,x1,y1,0,p1,p2,0);
GrLine3(dc,x1,y1,0,a1,a2,0);
}
break;
case GEBM_RECT:
case GBM_RECT:
if (down) {
GrBMEdPrepPersistentDC(dc,xx1,yy1,img);
if (x1<p1) {
GrBitMapEdPrepPersistentDC(dc,xx1,yy1,img);
if (x1<a1) {
x11=x1;
x22=p1;
x22=a1;
} else {
x11=p1;
x11=a1;
x22=x1;
}
if (y1<p2) {
if (y1<a2) {
y11=y1;
y22=p2;
y22=a2;
} else {
y11=p2;
y11=a2;
y22=y1;
}
dc->color=color;
GrRect(dc,x11,y11,x22-x11+1,y22-y11+1);
}
break;
case GEBM_COPY:
case GEBM_DELETE:
case GBM_COPY:
case GBM_DELETE:
if (down) {
GrBMEdPrepPersistentDC(dc,xx1,yy1,img);
if (x1<p1) {
GrBitMapEdPrepPersistentDC(dc,xx1,yy1,img);
if (x1<a1) {
x11=x1;
x22=p1;
x22=a1;
} else {
x11=p1;
x11=a1;
x22=x1;
}
if (y1<p2) {
if (y1<a2) {
y11=y1;
y22=p2;
y22=a2;
} else {
y11=p2;
y11=a2;
y22=y1;
}
dc->color=ROPF_DITHER+WHITE<<16+BLACK;
dc->pen_width=1;
GrLineRect4(dc,x11,y11,x22,y22);
GrBorder(dc,x11,y11,x22,y22);
}
break;
case GEBM_CIRCLE:
case GBM_CIRCLE:
if (down) {
GrBMEdPrepPersistentDC(dc,xx1,yy1,img);
GrBitMapEdPrepPersistentDC(dc,xx1,yy1,img);
dc->color=color;
dc->pen_width=width;
GrCircle3(dc,x1,y1,0,Sqrt(SqrI64(p1-x1)+SqrI64(p2-y1)));
GrCircle3(dc,x1,y1,0,Sqrt(SqrI64(a1-x1)+SqrI64(a2-y1)));
}
break;
case GEBM_PASTE:
case GEBM_PASTE_TRANSPARENT:
case GBM_PASTE:
case GBM_PASTE_TRANSPARENT:
if (clipboard) {
GrBMEdPrepPersistentDC(dc,xx1,yy1,img);
if (mode==GEBM_PASTE) {
GrBitMapEdPrepPersistentDC(dc,xx1,yy1,img);
if (mode==GBM_PASTE) {
clipboard->flags|=DCF_NO_TRANSPARENTS;
GrBlot(dc,p1,p2,clipboard);
GrBlot(dc,a1,a2,clipboard);
clipboard->flags&=~DCF_NO_TRANSPARENTS;
} else {
dc2=DCCopy(clipboard);
DCColorChg(dc2,bkcolor);
GrBlot(dc,p1,p2,dc2);
GrBlot(dc,a1,a2,dc2);
DCDel(dc2);
}
}
break;
case GEBM_TEXT:
GrBMEdPrepPersistentDC(dc,xx1,yy1,img);
case GBM_TEXT:
GrBitMapEdPrepPersistentDC(dc,xx1,yy1,img);
dc->color=color;
GrPrint(dc,p1,p2,"%s",st);
GrPrint(dc,a1,a2,"%s",st);
break;
case GEBM_TEXT_BOX:
GrBMEdPrepPersistentDC(dc,xx1,yy1,img);
case GBM_TEXT_BOX:
GrBitMapEdPrepPersistentDC(dc,xx1,yy1,img);
dc->color=color;
GrTextBox3(dc,p1,p2,0,st);
GrTextBox3(dc,a1,a2,0,st);
break;
case GEBM_TEXT_DIAMOND:
GrBMEdPrepPersistentDC(dc,xx1,yy1,img);
case GBM_TEXT_DIAMOND:
GrBitMapEdPrepPersistentDC(dc,xx1,yy1,img);
dc->color=color;
GrTextDiamond3(dc,p1,p2,0,st);
GrTextDiamond3(dc,a1,a2,0,st);
break;
case GEBM_POLYPT:
case GBM_POLYPT:
if (down) {
img->color=color;
img->pen_width=width;
GrLine3(img,x1-xx1,y1-yy1,0,p1-xx1,p2-yy1,0);
GrBMEdPrepPersistentDC(dc,xx1,yy1,img);
x1=p1; y1=p2;
GrLine3(img,x1-xx1,y1-yy1,0,a1-xx1,a2-yy1,0);
GrBitMapEdPrepPersistentDC(dc,xx1,yy1,img);
x1=a1; y1=a2;
}
break;
}
break;
case MSG_IP_L_UP:
switch (mode) {
case GEBM_LINE:
case GEBM_ARROW:
case GEBM_POLYPT:
case GEBM_POLYLINE:
case GBM_LINE:
case GBM_ARROW:
case GBM_POLYPT:
case GBM_POLYLINE:
img->color=color;
img->pen_width=width;
if (mode==GEBM_ARROW)
GrArrow3(img,x1-xx1,y1-yy1,0,p1-xx1,p2-yy1,0);
if (mode==GBM_ARROW)
GrArrow3(img,x1-xx1,y1-yy1,0,a1-xx1,a2-yy1,0);
else
GrLine3(img,x1-xx1,y1-yy1,0,p1-xx1,p2-yy1,0);
GrBMEdPrepPersistentDC(dc,xx1,yy1,img);
if (mode==GEBM_POLYLINE) {
x1=p1; y1=p2;
GrLine3(img,x1-xx1,y1-yy1,0,a1-xx1,a2-yy1,0);
GrBitMapEdPrepPersistentDC(dc,xx1,yy1,img);
if (mode==GBM_POLYLINE) {
x1=a1; y1=a2;
} else
down=FALSE;
break;
case GEBM_RECT:
case GBM_RECT:
img->color=color;
if (x1<p1) {
if (x1<a1) {
x11=x1;
x22=p1;
x22=a1;
} else {
x11=p1;
x11=a1;
x22=x1;
}
if (y1<p2) {
if (y1<a2) {
y11=y1;
y22=p2;
y22=a2;
} else {
y11=p2;
y11=a2;
y22=y1;
}
GrRect(img,x11-xx1,y11-yy1,x22-x11+1,y22-y11+1);
down=FALSE;
GrBMEdPrepPersistentDC(dc,xx1,yy1,img);
GrBitMapEdPrepPersistentDC(dc,xx1,yy1,img);
break;
case GEBM_COPY:
case GEBM_DELETE:
if (x1<p1) {
case GBM_COPY:
case GBM_DELETE:
if (x1<a1) {
x11=x1;
x22=p1;
x22=a1;
} else {
x11=p1;
x11=a1;
x22=x1;
}
if (y1<p2) {
if (y1<a2) {
y11=y1;
y22=p2;
y22=a2;
} else {
y11=p2;
y11=a2;
y22=y1;
}
DCDel(clipboard);
clipboard=DCExtract(img,x11-xx1,y11-yy1,x22-xx1,y22-yy1);
clipboard->bkcolor=bkcolor;
if (mode==GEBM_DELETE) {
if (mode==GBM_DELETE) {
img->color=bkcolor;
GrRect(img,x11-xx1,y11-yy1,x22-x11+1,y22-y11+1);
}
goto bm_menu;
case GEBM_CIRCLE:
case GBM_CIRCLE:
img->color=color;
img->pen_width=width;
GrCircle3(img,x1-xx1,y1-yy1,0,Sqrt(SqrI64(p1-x1)+SqrI64(p2-y1)));
GrCircle3(img,x1-xx1,y1-yy1,0,Sqrt(SqrI64(a1-x1)+SqrI64(a2-y1)));
down=FALSE;
GrBMEdPrepPersistentDC(dc,xx1,yy1,img);
GrBitMapEdPrepPersistentDC(dc,xx1,yy1,img);
break;
case GEBM_PASTE:
case GEBM_PASTE_TRANSPARENT:
case GBM_PASTE:
case GBM_PASTE_TRANSPARENT:
if (clipboard) {
GrBMEdPrepPersistentDC(dc,xx1,yy1,img);
if (mode==GEBM_PASTE) {
GrBitMapEdPrepPersistentDC(dc,xx1,yy1,img);
if (mode==GBM_PASTE) {
clipboard->flags|=DCF_NO_TRANSPARENTS;
GrBlot(img,p1-xx1,p2-yy1,clipboard);
GrBlot(img,a1-xx1,a2-yy1,clipboard);
clipboard->flags&=~DCF_NO_TRANSPARENTS;
} else {
dc2=DCCopy(clipboard);
DCColorChg(dc2,bkcolor);
GrBlot(img,p1-xx1,p2-yy1,dc2);
GrBlot(img,a1-xx1,a2-yy1,dc2);
DCDel(dc2);
}
GrBMEdPrepPersistentDC(dc,xx1,yy1,img);
GrBitMapEdPrepPersistentDC(dc,xx1,yy1,img);
}
break;
case GEBM_TEXT:
case GBM_TEXT:
img->color=color;
GrPrint(img,p1-xx1,p2-yy1,"%s",st);
GrPrint(img,a1-xx1,a2-yy1,"%s",st);
goto bm_menu;
case GEBM_TEXT_BOX:
case GBM_TEXT_BOX:
img->color=color;
GrTextBox3(img,p1-xx1,p2-yy1,0,st);
GrTextBox3(img,a1-xx1,a2-yy1,0,st);
goto bm_menu;
case GEBM_TEXT_DIAMOND:
case GBM_TEXT_DIAMOND:
img->color=color;
GrTextDiamond3(img,p1-xx1,p2-yy1,0,st);
GrTextDiamond3(img,a1-xx1,a2-yy1,0,st);
goto bm_menu;
}
break;
@@ -678,7 +677,7 @@ bm_done:
Free(st);
DCFill(dc);
SettingsPop;
doc_e->flags1=old_e_flags1;
doc_e->de_flags=old_de_flags;
*_img=img;
*_xx1=xx1,*_yy1=yy1,*_xx2=xx2,*_yy2=yy2;
return result;
+607
View File
@@ -0,0 +1,607 @@
#help_index "Graphics/Sprite"
U0 SpriteElem2Code(CDoc *doc,CSprite *tempg)
{
U8 buf1[256],buf2[136];
I32 *ptr;
I64 i,j,k,col,width_internal;
CD3I32 *p;
CMeshTri *tri;
if (!doc) doc=DocPut;
DocPrint(doc,"%Z",tempg->type,"ST_SPRITE_ELEM_CODES");
switch (tempg->type) {
case SPT_COLOR:
DocPrint(doc,"{%s}",
Color2Str(buf1,tempg->color));
break;
case SPT_DITHER_COLOR:
DocPrint(doc,"{%s}",
Color2Str(buf2,ROPF_DITHER|tempg->dither_color.u8[0]|tempg->dither_color.u8[1]<<COLORROP_BITS));
break;
case SPT_TRANSFORM_ON:
DocPrint(doc,"{ON}");
break;
case SPT_TRANSFORM_OFF:
DocPrint(doc,"{OFF}");
break;
case SPT_LINE:
case SPT_ARROW:
case SPT_PLANAR_SYMMETRY:
DocPrint(doc,"{(%d,%d),(%d,%d)}",tempg->x1,tempg->y1,tempg->x2,tempg->y2);
break;
case SPT_RECT:
DocPrint(doc,"{(%d,%d):(%d,%d)}",tempg->x1,tempg->y1,
tempg->x2-tempg->x1,tempg->y2-tempg->y1);
break;
case SPT_ROTATED_RECT:
DocPrint(doc,"{(%d,%d):(%d,%d),%0.4f}",tempg->x1,tempg->y1,
tempg->x2-tempg->x1,tempg->y2-tempg->y1,
180/ã*Wrap(tempg->rot_angle));
break;
case SPT_PT:
case SPT_FLOOD_FILL:
case SPT_SHIFT:
DocPrint(doc,"{(%d,%d)}",tempg->x1,tempg->y1);
break;
case SPT_FLOOD_FILL_NOT:
DocPrint(doc,"{(%d,%d),TRUE}",tempg->x1,tempg->y1);
break;
case SPT_CIRCLE:
DocPrint(doc,"{(%d,%d):%d}",tempg->x1,tempg->y1,tempg->x2);
break;
case SPT_WIDTH:
DocPrint(doc,"{%d}",tempg->width);
break;
case SPT_ELLIPSE:
DocPrint(doc,"{(%d,%d):(%d,%d),%0.4f}",tempg->x2,tempg->y2,
tempg->width,tempg->height,180/ã*Wrap(tempg->rot_angle));
break;
case SPT_POLYGON:
DocPrint(doc,"{%d,(%d,%d):(%d,%d),%0.4f}",tempg->sides,tempg->x2,tempg->y2,
tempg->width,tempg->height,180/ã*Wrap(tempg->rot_angle));
break;
case SPT_TEXT:
case SPT_TEXT_BOX:
case SPT_TEXT_DIAMOND:
DocPrint(doc,"{(%d,%d),\"%Q\"}",tempg->x1,tempg->y1,tempg->st);
break;
case SPT_POLYLINE:
ptr=&tempg->y1;
DocPrint(doc,"{(%d,%d)",ptr[0],ptr[1]);
if (tempg->num>1) DocPrint(doc,",");
ptr+=2;
for (i=1;i<tempg->num;i++) {
DocPrint(doc,"(%d,%d)",ptr[0],ptr[1]);
if (i+1<tempg->num) DocPrint(doc,",");
if (i&3==3 && i+1<tempg->num)
DocPrint(doc,"\n");
ptr+=2;
}
DocPrint(doc,"}");
break;
case SPT_BSPLINE2:
case SPT_BSPLINE3:
case SPT_BSPLINE2_CLOSED:
case SPT_BSPLINE3_CLOSED:
ptr=&tempg->y1;
DocPrint(doc,"{(%d,%d,%d)",ptr[0],ptr[1],ptr[2]);
ptr+=3;
if (tempg->num>1) DocPrint(doc,",");
for (i=1;i<tempg->num;i++,ptr+=3) {
DocPrint(doc,"(%d,%d,%d)",ptr[0],ptr[1],ptr[2]);
if (i+1<tempg->num) DocPrint(doc,",");
if (i&3==3 && i+1<tempg->num)
DocPrint(doc,"\n");
}
if (tempg->type==SPT_BSPLINE2||tempg->type==SPT_BSPLINE3)
DocPrint(doc,",FALSE}");
else
DocPrint(doc,",TRUE}");
break;
case SPT_POLYPT:
ptr=&tempg->y1;
DocPrint(doc,"{(%d,%d),",ptr[0],ptr[1]);
ptr+=2;
col=16;
for (i=0;i<tempg->num;i++) {
DocPrint(doc,"%d",BFieldExtU32(ptr,i*3,3));
if (++col>=64 && i+1<tempg->num) {
DocPrint(doc,"\n");
col=0;
}
}
DocPrint(doc,"}");
break;
case SPT_BITMAP:
DocPrint(doc,"{(%d,%d):(%d,%d),\n",tempg->x2,tempg->y2,tempg->width,tempg->height);
width_internal=(tempg->width+7)&~7;
if (width_internal<80)
k=width_internal;
else
k=64;
ptr=tempg(U8 *)+offset(CSprite.linespeed);
col=0;
for (j=0;j<tempg->height;j++)
for (i=0;i<width_internal;i++,ptr(U8 *)++) {
if (i>=tempg->width)
DocPrint(doc,"_");
else if (*ptr(U8 *)<16)
DocPrint(doc,"%X",*ptr(U8 *));
else
DocPrint(doc,"%c",CH_SHIFT_SPACE);
if (++col>=k && (i+1<width_internal||j+1<tempg->height)) {
DocPrint(doc,"\n");
col=0;
}
}
DocPrint(doc,"}");
break;
case SPT_MESH:
DocPrint(doc,"{FALSE,");
p=(&tempg->tri_cnt)(U8 *)+sizeof(I32);
col=0;
for (i=0;i<tempg->vertex_cnt;i++,p++) {
DocPrint(doc,"(%d,%d,%d)",p->x,p->y,p->z);
if (i+1<tempg->vertex_cnt) DocPrint(doc,",");
if (++col==4) {
DocPrint(doc,"\t//%d\n",i);
col=0;
}
}
DocPrint(doc,":");
tri=p;
for (i=0;i<tempg->tri_cnt;i++,tri++) {
DocPrint(doc,"(%s,%d,%d,%d)",Color2Str(buf1,tri->color),
tri->nums[0],tri->nums[1],tri->nums[2]);
if (i+1<tempg->tri_cnt) DocPrint(doc,",");
if (++col>=3 && i+1<tempg->tri_cnt) {
DocPrint(doc,"\n");
col=0;
}
}
DocPrint(doc,"}");
break;
case SPT_SHIFTABLE_MESH:
DocPrint(doc,"{TRUE,(%d,%d,%d):",tempg->x1,tempg->y1,tempg->z1);
p=(&tempg->shiftable_tri_cnt)(U8 *)+sizeof(I32);
col=1;
for (i=0;i<tempg->shiftable_vertex_cnt;i++,p++) {
DocPrint(doc,"(%d,%d,%d)",p->x,p->y,p->z);
if (i+1<tempg->shiftable_vertex_cnt) DocPrint(doc,",");
if (++col==4) {
DocPrint(doc,"\t//%d\n",i);
col=0;
}
}
DocPrint(doc,":");
tri=p;
for (i=0;i<tempg->shiftable_tri_cnt;i++,tri++) {
DocPrint(doc,"(%s,%d,%d,%d)",Color2Str(buf1,tri->color),
tri->nums[0],tri->nums[1],tri->nums[2]);
if (i+1<tempg->shiftable_tri_cnt) DocPrint(doc,",");
if (++col>=3 && i+1<tempg->shiftable_tri_cnt) {
DocPrint(doc,"\n");
col=0;
}
}
DocPrint(doc,"}");
break;
}
DocPrint(doc,";\n");
}
public U0 Sprite2Code(CDoc *doc=NULL,U8 *elems)
{//Sprite to text.
CSprite *tempg=elems-offset(CSprite.start);
while (tempg->type) {
SpriteElem2Code(doc,tempg);
tempg(U8 *)+=SpriteElemSize(tempg);
}
}
CSprite *Code2SpriteElem(CLex *lx,I64 type)
{
I64 i,num1,num2,size;
CSprite *result,g;
CColorROPU32 color;
U8 *st,*ptr;
CQueD3I32 rootp,*tempp,*tempa1;
CQueMeshTri roott,*tempt,*tempt1;
CQueVectU8 *tempv;
MemSet(&g,0,sizeof(CSprite));
switch (type) {
sub_switch_start:
case SPT_COLOR:
case SPT_DITHER_COLOR:
st=LexFirstRem(lx,"}");
color=Str2ColorU32(st);
Free(st);
Lex(lx); //Skip color
g.color=color.c0.color;
if (color&ROPF_DITHER) {
g.dither_color.u8[1]=color.c1.color;
g.type=SPT_DITHER_COLOR;
} else
g.type=SPT_COLOR;
break;
case SPT_TRANSFORM_ON:
case SPT_TRANSFORM_OFF:
Lex(lx); //Skip {
if (LexExpressionI64(lx))
g.type=SPT_TRANSFORM_ON;
else
g.type=SPT_TRANSFORM_OFF;
break;
case SPT_LINE:
case SPT_ARROW:
case SPT_PLANAR_SYMMETRY:
Lex(lx); //Skip {
g.type=type;
LexD2I32(lx,&g.x1);
if (lx->token!=',')
LexExcept(lx,"expecting ',' at ");
Lex(lx); //Skip ,
LexD2I32(lx,&g.x2);
break;
case SPT_RECT:
case SPT_ROTATED_RECT:
Lex(lx); //Skip {
LexD2I32(lx,&g.x1);
if (lx->token!=':')
LexExcept(lx,"expecting ':' at ");
Lex(lx); //Skip :
LexD2I32(lx,&g.x2);
g.x2+=g.x1;
g.y2+=g.y1;
if (lx->token==',') {
Lex(lx); //Skip ,
g.rot_angle=ã/180*LexExpressionF64(lx);
g.type=SPT_ROTATED_RECT;
} else
g.type=SPT_RECT;
break;
case SPT_PT:
case SPT_SHIFT:
Lex(lx); //Skip {
g.type=type;
LexD2I32(lx,&g.x1);
break;
case SPT_FLOOD_FILL:
case SPT_FLOOD_FILL_NOT:
Lex(lx); //Skip {
LexD2I32(lx,&g.x1);
if (lx->token==',') {
Lex(lx); //Skip ,
i=LexExpressionI64(lx);
} else
i=0;
if (i)
g.type=SPT_FLOOD_FILL_NOT;
else
g.type=SPT_FLOOD_FILL;
break;
case SPT_WIDTH:
Lex(lx); //Skip {
g.width=LexExpressionI64(lx);
g.type=SPT_WIDTH;
break;
case SPT_CIRCLE:
Lex(lx); //Skip {
g.type=SPT_CIRCLE;
LexD2I32(lx,&g.x1);
if (lx->token!=':')
LexExcept(lx,"expecting ':' at ");
Lex(lx); //Skip :
g.x2=LexExpressionI64(lx);
break;
case SPT_POLYGON:
Lex(lx); //Skip {
g.sides=LexExpressionI64(lx);
if (lx->token!=',')
LexExcept(lx,"expecting ',' at ");
Lex(lx); //Skip ,
case SPT_ELLIPSE:
Lex(lx); //Skip {
g.type=type;
LexD2I32(lx,&g.x2);
if (lx->token!=':')
LexExcept(lx,"expecting ':' at ");
Lex(lx); //Skip :
LexD2I32(lx,&g.width);
if (lx->token!=',')
LexExcept(lx,"expecting ',' at ");
Lex(lx); //Skip ,
g.rot_angle=ã/180*LexExpressionF64(lx);
break;
sub_switch_end:
size=SpriteElemSize(&g)+offset(CSprite.start);
result=MAlloc(size);
MemCpy(result,&g,size);
break;
case SPT_TEXT:
case SPT_TEXT_BOX:
case SPT_TEXT_DIAMOND:
Lex(lx); //Skip {
g.type=type;
LexD2I32(lx,&g.x1);
if (lx->token!=',')
LexExcept(lx,"expecting ',' at ");
if (Lex(lx)==TK_STR) //Skip ,
st=LexExtStr(lx);
else
LexExcept(lx,"expecting string at ");
size=SpriteElemQuedBaseSize(type);
i=StrLen(st)+1;
result=MAlloc(size+i);
MemCpy(result,&g,size);
MemCpy(result(U8 *)+size,st,i);
Free(st);
break;
case SPT_POLYLINE:
Lex(lx); //Skip {
g.type=SPT_POLYLINE;
QueInit(&rootp);
while (lx->token=='(') {
tempp=CAlloc(sizeof(CQueD3I32));
LexD2I32(lx,&tempp->p);
QueIns(tempp,rootp.last);
g.num++;
if (lx->token==',')
Lex(lx); //Skip ,
}
if (!g.num)
LexExcept(lx,"expecting point at ");
size=SpriteElemQuedBaseSize(SPT_POLYLINE);
i=g.num*sizeof(CD2I32);
result=MAlloc(size+i);
MemCpy(result,&g,size);
ptr=&result->y1;
tempp=rootp.next;
while (tempp!=&rootp) {
tempa1=tempp->next;
MemCpy(ptr,&tempp->p,sizeof(CD2I32));
ptr+=sizeof(CD2I32);
Free(tempp);
tempp=tempa1;
}
break;
case SPT_BSPLINE2:
case SPT_BSPLINE3:
case SPT_BSPLINE2_CLOSED:
case SPT_BSPLINE3_CLOSED:
Lex(lx); //Skip {
QueInit(&rootp);
while (lx->token=='(') {
tempp=CAlloc(sizeof(CQueD3I32));
LexD3I32(lx,&tempp->p);
QueIns(tempp,rootp.last);
g.num++;
if (lx->token==',')
Lex(lx); //Skip ,
}
if (!g.num)
LexExcept(lx,"expecting point at ");
size=SpriteElemQuedBaseSize(type);
i=g.num*sizeof(CD3I32);
result=MAlloc(size+i);
if (LexExpressionI64(lx)) {
if (type==SPT_BSPLINE2||type==SPT_BSPLINE2_CLOSED)
g.type=SPT_BSPLINE2_CLOSED;
else
g.type=SPT_BSPLINE3_CLOSED;
} else {
if (type==SPT_BSPLINE2||type==SPT_BSPLINE2_CLOSED)
g.type=SPT_BSPLINE2;
else
g.type=SPT_BSPLINE3;
}
MemCpy(result,&g,size);
ptr=&result->y1;
tempp=rootp.next;
while (tempp!=&rootp) {
tempa1=tempp->next;
MemCpy(ptr,&tempp->p,sizeof(CD3I32));
ptr+=sizeof(CD3I32);
Free(tempp);
tempp=tempa1;
}
break;
case SPT_POLYPT:
Lex(lx); //Skip {
LexD2I32(lx,&g.y1);
if (lx->token!=',')
LexExcept(lx,"expecting ',' at ");
tempv=QueVectU8New;
while (TRUE) {
if (!(i=LexGetChar(lx)))
LexExcept(lx,"expecting '}' at ");
if (i=='}')
break;
if ('0'<=i<='7')
QueVectU8Put(tempv,g.num++,i-'0');
}
Bts(&lx->flags,Lf_USE_LAST_U16);
Lex(lx); //Load '}'
g.type=SPT_POLYPT;
size=SpriteElemQuedBaseSize(SPT_POLYPT);
i=(g.num*3+7)>>3;
result=CAlloc(size+i);
MemCpy(result,&g,size);
ptr=&result->y2;
for (i=0;i<g.num;i++)
BFieldOrU32(ptr,i*3,QueVectU8Get(tempv,i));
QueVectU8Del(tempv);
break;
case SPT_BITMAP:
Lex(lx); //Skip {
LexD2I32(lx,&g.x2);
if (lx->token!=':')
LexExcept(lx,"expecting ':' at ");
Lex(lx); //Skip :
LexD2I32(lx,&g.width);
if (lx->token!=',')
LexExcept(lx,"expecting ',' at ");
tempv=QueVectU8New;
num1=0;
while (TRUE) {
if (!(i=ToUpper(LexGetChar(lx))))
LexExcept(lx,"expecting '}' at ");
if (i=='}')
break;
if ('0'<=i<='9')
QueVectU8Put(tempv,num1++,i-'0');
else if ('A'<=i<='F')
QueVectU8Put(tempv,num1++,i-'A'+10);
else if (i==CH_SPACE||i==CH_SHIFT_SPACE)
QueVectU8Put(tempv,num1++,TRANSPARENT);
else if (i=='_')
QueVectU8Put(tempv,num1++,0);
}
Bts(&lx->flags,Lf_USE_LAST_U16);
Lex(lx); //Load '}'
g.type=SPT_BITMAP;
size=SpriteElemQuedBaseSize(SPT_BITMAP);
result=CAlloc(size+num1);
MemCpy(result,&g,size);
ptr=&result->linespeed;
for (i=0;i<num1;i++)
*ptr++=QueVectU8Get(tempv,i);
QueVectU8Del(tempv);
break;
case SPT_MESH:
case SPT_SHIFTABLE_MESH:
Lex(lx); //Skip {
if (LexExpressionI64(lx)) {
g.type=SPT_SHIFTABLE_MESH;
if (lx->token!=',')
LexExcept(lx,"expecting ',' at ");
Lex(lx); //Skip ,
LexD3I32(lx,&g.x1);
if (lx->token!=':')
LexExcept(lx,"expecting ':' at ");
Lex(lx); //Skip :
} else {
g.type=SPT_MESH;
if (lx->token!=',')
LexExcept(lx,"expecting ',' at ");
Lex(lx); //Skip ,
}
num1=0;
QueInit(&rootp);
while (lx->token=='(') {
tempp=CAlloc(sizeof(CQueD3I32));
LexD3I32(lx,&tempp->p);
QueIns(tempp,rootp.last);
num1++;
if (lx->token==',')
Lex(lx); //Skip ,
}
if (lx->token!=':')
LexExcept(lx,"expecting ':' at ");
Lex(lx); //Skip :
num2=0;
QueInit(&roott);
while (lx->token=='(') {
tempt=CAlloc(sizeof(CQueMeshTri));
st=LexFirstRem(lx,",");
tempt->color=Str2ColorU32(st);
Free(st);
Lex(lx); //Skip color
if (lx->token!=',')
LexExcept(lx,"expecting ',' at ");
Lex(lx); //Skip ,
tempt->nums[0]=LexExpressionI64(lx);
if (lx->token!=',')
LexExcept(lx,"expecting ',' at ");
Lex(lx); //Skip ,
tempt->nums[1]=LexExpressionI64(lx);
if (lx->token!=',')
LexExcept(lx,"expecting ',' at ");
Lex(lx); //Skip ,
tempt->nums[2]=LexExpressionI64(lx);
if (lx->token!=')')
LexExcept(lx,"expecting ')' at ");
Lex(lx); //Skip )
QueIns(tempt,roott.last);
num2++;
if (lx->token==',')
Lex(lx); //Skip ,
}
if (g.type==SPT_MESH) {
g.vertex_cnt=num1;
g.tri_cnt=num2;
size=SpriteElemQuedBaseSize(SPT_MESH);
} else {
g.shiftable_vertex_cnt=num1;
g.shiftable_tri_cnt=num2;
}
size=SpriteElemQuedBaseSize(g.type);
result=MAlloc(size+num1*sizeof(CD3I32)+num2*sizeof(CMeshTri));
MemCpy(result,&g,size);
ptr=result(U8 *)+size;
tempp=rootp.next;
while (tempp!=&rootp) {
tempa1=tempp->next;
MemCpy(ptr,&tempp->p,sizeof(CD3I32));
ptr+=sizeof(CD3I32);
Free(tempp);
tempp=tempa1;
}
tempt=roott.next;
while (tempt!=&roott) {
tempt1=tempt->next;
MemCpy(ptr,&tempt->start,sizeof(CMeshTri));
ptr+=sizeof(CMeshTri);
Free(tempt);
tempt=tempt1;
}
break;
}
if (lx->token!='}')
LexExcept(lx,"expecting '}' at ");
if (Lex(lx)!=';')
LexExcept(lx,"expecting ';' at ");
return result;
}
public U8 *Code2Sprite(CDoc *doc,I64 *_size=NULL)
{//Text to sprite.
CSprite root;
U8 *result;
Bool okay=TRUE,unlock_doc=DocLock(doc);
CLex *lx=LexNew(,LF_DONT_FREE_BUF);
CHashTable *old_hash_table_lst=lx->htc.hash_table_lst;
CHashGeneric *temph;
I64 i,size=0;
QueInit(&root);
LexAttachDoc(lx,,doc);
try {
do {
lx->htc.hash_table_lst=NULL;
if (Lex(lx)==TK_IDENT && //Skip ;
(temph=HashFind(lx->cur_str,gr.sprite_hash,SPHT_ELEM_CODE))) {
i=temph->user_data0;
lx->htc.hash_table_lst=old_hash_table_lst;
if (Lex(lx)=='{') //Skip ident
QueIns(Code2SpriteElem(lx,i),root.last);
} else if (lx->token)
LexExcept(lx,"expecting sprite element type name at ");
} while (lx->token);
okay=TRUE;
} catch {
Fs->catch_except=TRUE;
okay=FALSE;
}
if (unlock_doc)
DocUnlock(doc);
if (okay) {
LexDel(lx); //TODO: can crash
result=SpriteQue2Sprite(&root,&size);
} else {
result=NULL;
size=0;
}
if (_size) *_size=size;
QueDel(&root);
return result;
}
+290 -329
View File
File diff suppressed because it is too large. Load diff
+370 -366
View File
File diff suppressed because it is too large. Load diff
+302 -310
View File
File diff suppressed because it is too large. Load diff
+96 -94
View File
@@ -1,73 +1,75 @@
#help_index "Graphics/Sprite"
#help_file "::/Doc/Sprite"
I64 sprite_base_size[GRST_NUM_TYPES]=
U8 polypt_map[9]={0,1,2,3,0,4,5,6,7};
I64 sprite_elem_base_sizes[SPT_NUM_TYPES]=
{
offset(CSprite.x1)-offset(CSprite.start), //GRST_END
1+offset(CSprite.color8)-offset(CSprite.start), //GRST_COLOR8
2+offset(CSprite.dither_color8)-offset(CSprite.start), //GRST_DITHER_COLOR8
offset(CSprite.y1)-offset(CSprite.start), //GRST_WIDTH
offset(CSprite.linespeed)-offset(CSprite.start), //GRST_PLANAR_SYMMETRY
offset(CSprite.x1)-offset(CSprite.start), //GRST_TRANSFORM_ON
offset(CSprite.x1)-offset(CSprite.start), //GRST_TRANSFORM_OFF
offset(CSprite.x2)-offset(CSprite.start), //GRST_SHIFT
offset(CSprite.x2)-offset(CSprite.start), //GRST_PT
offset(CSprite.y1)-offset(CSprite.start), //GRST_POLYPT
offset(CSprite.linespeed)-offset(CSprite.start), //GRST_LINE
offset(CSprite.y1)-offset(CSprite.start), //GRST_POLYLINE
offset(CSprite.linespeed)-offset(CSprite.start), //GRST_RECT
offset(CSprite.sides)-offset(CSprite.start), //GRST_ROTATED_RECT
offset(CSprite.y2)-offset(CSprite.start), //GRST_CIRCLE
offset(CSprite.sides)-offset(CSprite.start), //GRST_ELLIPSE
sizeof(CSprite)-offset(CSprite.start), //GRST_POLYGON
offset(CSprite.y1)-offset(CSprite.start), //GRST_BSPLINE2
offset(CSprite.y1)-offset(CSprite.start), //GRST_BSPLINE2_CLOSED
offset(CSprite.y1)-offset(CSprite.start), //GRST_BSPLINE3
offset(CSprite.y1)-offset(CSprite.start), //GRST_BSPLINE3_CLOSED
offset(CSprite.x2)-offset(CSprite.start), //GRST_FLOOD_FILL
offset(CSprite.x2)-offset(CSprite.start), //GRST_FLOOD_FILL_NOT
offset(CSprite.linespeed)-offset(CSprite.start), //GRST_BITMAP8
offset(CSprite.x2)-offset(CSprite.start), //GRST_MESH
offset(CSprite.shiftable_tri_cnt)+sizeof(I32)-offset(CSprite.start), //GRST_SHIFTABLE_MESH
offset(CSprite.linespeed)-offset(CSprite.start), //GRST_ARROW
offset(CSprite.st)-offset(CSprite.start), //GRST_TEXT
offset(CSprite.st)-offset(CSprite.start), //GRST_TEXT_BOX
offset(CSprite.st)-offset(CSprite.start), //GRST_TEXT_DIAMOND
offset(CSprite.x1)-offset(CSprite.start), //SPT_END
1+offset(CSprite.color)-offset(CSprite.start), //SPT_COLOR
2+offset(CSprite.dither_color)-offset(CSprite.start), //SPT_DITHER_COLOR
offset(CSprite.y1)-offset(CSprite.start), //SPT_WIDTH
offset(CSprite.linespeed)-offset(CSprite.start), //SPT_PLANAR_SYMMETRY
offset(CSprite.x1)-offset(CSprite.start), //SPT_TRANSFORM_ON
offset(CSprite.x1)-offset(CSprite.start), //SPT_TRANSFORM_OFF
offset(CSprite.x2)-offset(CSprite.start), //SPT_SHIFT
offset(CSprite.x2)-offset(CSprite.start), //SPT_PT
offset(CSprite.y2)-offset(CSprite.start), //SPT_POLYPT
offset(CSprite.linespeed)-offset(CSprite.start), //SPT_LINE
offset(CSprite.y1)-offset(CSprite.start), //SPT_POLYLINE
offset(CSprite.linespeed)-offset(CSprite.start), //SPT_RECT
offset(CSprite.sides)-offset(CSprite.start), //SPT_ROTATED_RECT
offset(CSprite.y2)-offset(CSprite.start), //SPT_CIRCLE
offset(CSprite.sides)-offset(CSprite.start), //SPT_ELLIPSE
sizeof(CSprite)-offset(CSprite.start), //SPT_POLYGON
offset(CSprite.y1)-offset(CSprite.start), //SPT_BSPLINE2
offset(CSprite.y1)-offset(CSprite.start), //SPT_BSPLINE2_CLOSED
offset(CSprite.y1)-offset(CSprite.start), //SPT_BSPLINE3
offset(CSprite.y1)-offset(CSprite.start), //SPT_BSPLINE3_CLOSED
offset(CSprite.x2)-offset(CSprite.start), //SPT_FLOOD_FILL
offset(CSprite.x2)-offset(CSprite.start), //SPT_FLOOD_FILL_NOT
offset(CSprite.linespeed)-offset(CSprite.start), //SPT_BITMAP
offset(CSprite.x2)-offset(CSprite.start), //SPT_MESH
offset(CSprite.shiftable_tri_cnt)+sizeof(I32)-offset(CSprite.start), //SPT_SHIFTABLE_MESH
offset(CSprite.linespeed)-offset(CSprite.start), //SPT_ARROW
offset(CSprite.st)-offset(CSprite.start), //SPT_TEXT
offset(CSprite.st)-offset(CSprite.start), //SPT_TEXT_BOX
offset(CSprite.st)-offset(CSprite.start), //SPT_TEXT_DIAMOND
};
I64 SpriteQuedBaseSize(I64 type)
I64 SpriteElemQuedBaseSize(I64 type)
{
return sprite_base_size[type]+offset(CSprite.start);
return sprite_elem_base_sizes[type]+offset(CSprite.start);
}
I64 SpriteElemSize(CSprite *tempg)
{
I64 i=sprite_base_size[tempg->type];
I64 i=sprite_elem_base_sizes[tempg->type];
switch (tempg->type) {
case GRST_POLYLINE:
i+=tempg->num<<1*sizeof(I32);
case SPT_POLYLINE:
i+=tempg->num*sizeof(CD2I32);
break;
case GRST_TEXT:
case GRST_TEXT_BOX:
case GRST_TEXT_DIAMOND:
case SPT_TEXT:
case SPT_TEXT_BOX:
case SPT_TEXT_DIAMOND:
i+=StrLen(tempg->st)+1;
break;
case GRST_BITMAP8:
case SPT_BITMAP:
i+=((tempg->width+7)&~7)*tempg->height;
break;
case GRST_POLYPT:
i+=sizeof(I32)<<1+(tempg->num*3+7)>>3;
case SPT_POLYPT:
i+=(tempg->num*3+7)>>3;
break;
case GRST_BSPLINE2:
case GRST_BSPLINE3:
case GRST_BSPLINE2_CLOSED:
case GRST_BSPLINE3_CLOSED:
case SPT_BSPLINE2:
case SPT_BSPLINE3:
case SPT_BSPLINE2_CLOSED:
case SPT_BSPLINE3_CLOSED:
i+=tempg->num*sizeof(CD3I32);
break;
case GRST_MESH:
case SPT_MESH:
i+=tempg->vertex_cnt*sizeof(CD3I32)+tempg->tri_cnt*sizeof(CMeshTri);
break;
case GRST_SHIFTABLE_MESH:
case SPT_SHIFTABLE_MESH:
i+=tempg->shiftable_vertex_cnt*sizeof(CD3I32)+tempg->shiftable_tri_cnt*sizeof(CMeshTri);
break;
}
@@ -75,11 +77,11 @@ I64 SpriteElemSize(CSprite *tempg)
}
public I64 SpriteSize(U8 *elems)
{
{//Walk sprite elements and return size of sprite as binary data.
CSprite *tempg=elems-offset(CSprite.start),*tempg1=tempg;
while (tempg->type)
tempg(U8 *)+=SpriteElemSize(tempg);
return tempg(U8 *)-tempg1(U8 *)+sprite_base_size[GRST_END];
return tempg(U8 *)-tempg1(U8 *)+sprite_elem_base_sizes[SPT_END];
}
I64 SpriteTypeMask(U8 *elems)
@@ -87,8 +89,8 @@ I64 SpriteTypeMask(U8 *elems)
I64 result=0;
CSprite *tempg=elems-offset(CSprite.start);
while (tempg->type) {
if (tempg->type>=GRST_NUM_TYPES)
return 1<<GRST_NUM_TYPES;
if (tempg->type>=SPT_NUM_TYPES)
return 1<<SPT_NUM_TYPES;
Bts(&result,tempg->type);
tempg(U8 *)+=SpriteElemSize(tempg);
}
@@ -96,13 +98,13 @@ I64 SpriteTypeMask(U8 *elems)
}
public U8 *DC2Sprite(CDC *tempb)
{
{//Convert device context to sprite.
CSprite *tempg;
tempg=CAlloc(sprite_base_size[GRST_BITMAP8]+
tempg=CAlloc(sprite_elem_base_sizes[SPT_BITMAP]+
tempb->width_internal*tempb->height+
sprite_base_size[GRST_END])
sprite_elem_base_sizes[SPT_END])
(U8 *)-offset(CSprite.start);
tempg->type=GRST_BITMAP8;
tempg->type=SPT_BITMAP;
tempg->width=tempb->width;
tempg->height=tempb->height;
tempg->x2=0;
@@ -112,62 +114,62 @@ public U8 *DC2Sprite(CDC *tempb)
return tempg(U8 *)+offset(CSprite.start);
}
public U8 *Sprite2Text(CSprite *tempg)
{ //Study $LK,"::/Demo/Graphics/SpriteText.CPP"$.
public U8 *SpriteElem2OneLineSummary(CSprite *tempg)
{//Study $LK,"::/Demo/Graphics/SpriteText.CPP"$.
U8 buf[256],buf2[136];
I32 *ptr;
SPrint(buf,"%Z",tempg->type,"ST_SPRITE_TYPES");
StrPrint(buf,"%Z",tempg->type,"ST_SPRITE_ELEM_TYPES");
switch (tempg->type) {
case GRST_COLOR8:
CatPrint(buf," %s",Color2Text(buf2,tempg->color8));
case SPT_COLOR:
CatPrint(buf," %s",Color2Str(buf2,tempg->color));
break;
case GRST_PT:
case GRST_FLOOD_FILL:
case GRST_FLOOD_FILL_NOT:
case GRST_SHIFT:
CatPrint(buf," %d,%d",tempg->x1,tempg->y1);
case SPT_DITHER_COLOR:
CatPrint(buf," %s",Color2Str(buf2,ROPF_DITHER|tempg->dither_color.u8[0]|tempg->dither_color.u8[1]<<COLORROP_BITS));
break;
case GRST_LINE:
case GRST_ARROW:
case GRST_PLANAR_SYMMETRY:
case GRST_RECT:
case GRST_ROTATED_RECT:
CatPrint(buf," (%d,%d)-(%d,%d)",tempg->x1,tempg->y1,tempg->x2,tempg->y2);
case SPT_PT:
case SPT_FLOOD_FILL:
case SPT_FLOOD_FILL_NOT:
case SPT_SHIFT:
CatPrint(buf," (%d,%d)",tempg->x1,tempg->y1);
break;
case GRST_CIRCLE:
CatPrint(buf," %d,%d:%dR",tempg->x1,tempg->y1,tempg->x2);
case SPT_LINE:
case SPT_ARROW:
case SPT_PLANAR_SYMMETRY:
case SPT_RECT:
case SPT_ROTATED_RECT:
CatPrint(buf," (%d,%d),(%d,%d)",tempg->x1,tempg->y1,tempg->x2,tempg->y2);
break;
case GRST_WIDTH:
case SPT_CIRCLE:
CatPrint(buf," (%d,%d):%dR",tempg->x1,tempg->y1,tempg->x2);
break;
case SPT_WIDTH:
CatPrint(buf," %d",tempg->width);
break;
case GRST_TEXT:
case GRST_TEXT_BOX:
case GRST_TEXT_DIAMOND:
case SPT_TEXT:
case SPT_TEXT_BOX:
case SPT_TEXT_DIAMOND:
CatPrint(buf," %d,%d:%-16tQ",tempg->x1,tempg->y1,tempg->st);
break;
case GRST_DITHER_COLOR8:
CatPrint(buf," %s",Color2Text(buf2,ROPF_DITHER|tempg->dither_color8.u8[0]|tempg->dither_color8.u8[1]<<COLORROP_BITS));
break;
case GRST_POLYLINE:
case GRST_POLYPT:
case SPT_POLYLINE:
case SPT_POLYPT:
ptr=&tempg->y1;
CatPrint(buf," %d %d,%d",tempg->num,ptr[0],ptr[1]);
CatPrint(buf," %d (%d,%d)",tempg->num,ptr[0],ptr[1]);
break;
case GRST_ELLIPSE:
case GRST_POLYGON:
case GRST_BITMAP8:
CatPrint(buf," %dW,%dH:%d,%d",tempg->width,tempg->height,tempg->x2,tempg->y2);
case SPT_ELLIPSE:
case SPT_POLYGON:
case SPT_BITMAP:
CatPrint(buf," (%d,%d):%dW,%dH",tempg->x2,tempg->y2,tempg->width,tempg->height);
break;
case GRST_BSPLINE2:
case GRST_BSPLINE3:
case GRST_BSPLINE2_CLOSED:
case GRST_BSPLINE3_CLOSED:
case SPT_BSPLINE2:
case SPT_BSPLINE3:
case SPT_BSPLINE2_CLOSED:
case SPT_BSPLINE3_CLOSED:
CatPrint(buf," %d",tempg->num);
break;
case GRST_MESH:
case SPT_MESH:
CatPrint(buf," %dV,%dT",tempg->vertex_cnt,tempg->tri_cnt);
break;
case GRST_SHIFTABLE_MESH:
case SPT_SHIFTABLE_MESH:
CatPrint(buf," %dV,%dT",tempg->shiftable_vertex_cnt,tempg->shiftable_tri_cnt);
break;
}