예제 #1
0
*/	RXIEXT int RXD_Graphics(int cmd, RXIFRM *frm, void *data)
/*
**		Graphics command extension dispatcher.
**
***********************************************************************/
{
	switch (cmd) {

	case CMD_GRAPHICS_SHOW:
		Show_Gob((REBGOB*)RXA_SERIES(frm, 1));
		break;

    case CMD_GRAPHICS_SIZE_TEXT:
        if (Rich_Text) {
            RXA_TYPE(frm, 2) = RXT_PAIR;
            rt_size_text(Rich_Text, (REBGOB*)RXA_SERIES(frm, 1),&RXA_PAIR(frm, 2));
            RXA_PAIR(frm, 1).x = RXA_PAIR(frm, 2).x;
            RXA_PAIR(frm, 1).y = RXA_PAIR(frm, 2).y;
            RXA_TYPE(frm, 1) = RXT_PAIR;
            return RXR_VALUE;
        }

        break;

    case CMD_GRAPHICS_OFFSET_TO_CARET:
        if (Rich_Text) {
            REBINT element = 0, position = 0;
            REBSER* dialect;
            REBSER* block;
            RXIARG val; //, str;
            REBCNT n, type;

            rt_offset_to_caret(Rich_Text, (REBGOB*)RXA_SERIES(frm, 1), RXA_PAIR(frm, 2), &element, &position);
//            RL_Print("OTC: %d, %d\n", element, position);
            dialect = (REBSER *)GOB_CONTENT((REBGOB*)RXA_SERIES(frm, 1));
            block = RL_MAKE_BLOCK(RL_SERIES(dialect, RXI_SER_TAIL));
            for (n = 0; type = RL_GET_VALUE(dialect, n, &val); n++) {
                if (n == element) val.index = position;
                RL_SET_VALUE(block, n, val, type);
            }

            RXA_TYPE(frm, 1) = RXT_BLOCK;
            RXA_SERIES(frm, 1) = block;
            RXA_INDEX(frm, 1) = element;

            return RXR_VALUE;
        }

        break;

    case CMD_GRAPHICS_CARET_TO_OFFSET:
        if (Rich_Text) {
            REBXYF result;
            REBINT elem,pos;
            if (RXA_TYPE(frm, 2) == RXT_INTEGER){
                elem = RXA_INT64(frm, 2)-1;
            } else {
                elem = RXA_INDEX(frm, 2);
            }
            if (RXA_TYPE(frm, 3) == RXT_INTEGER){
                pos = RXA_INT64(frm, 3)-1;
            } else {
                pos = RXA_INDEX(frm, 3);
            }
//            RL_Print("CTO: %d, %d\n", element, position);
            rt_caret_to_offset(Rich_Text, (REBGOB*)RXA_SERIES(frm, 1), &result, elem, pos);

            RXA_PAIR(frm, 1).x = result.x;
            RXA_PAIR(frm, 1).y = result.y;
            RXA_TYPE(frm, 1) = RXT_PAIR;
            return RXR_VALUE;
        }
        break;

    case CMD_GRAPHICS_CURSOR:
        {
            REBINT n = 0;
            REBSER image = 0;

            if (RXA_TYPE(frm, 1) == RXT_IMAGE) {
                image = RXA_IMAGE_BITS(frm,1);
            } else {
                n = RXA_INT64(frm,1);
            }

            if (Custom_Cursor) {
                //Destroy cursor object only if it is a custom image
                DestroyCursor(Cursor);
                Custom_Cursor = FALSE;
            }

            if (n > 0)
                Cursor = LoadCursor(NULL, (LPCTSTR)n);
            else if (image) {
                Cursor = Image_To_Cursor(image, RXA_IMAGE_WIDTH(frm,1), RXA_IMAGE_HEIGHT(frm,1));
                Custom_Cursor = TRUE;
            } else
                Cursor = NULL;

            SetCursor(Cursor);

        }
        break;

    case CMD_GRAPHICS_DRAW:
        {
            REBYTE* img = 0;
            REBINT w,h;
            if (RXA_TYPE(frm, 1) == RXT_IMAGE) {
                img = RXA_IMAGE_BITS(frm, 1);
                w = RXA_IMAGE_WIDTH(frm, 1);
                h = RXA_IMAGE_HEIGHT(frm, 1);
            } else {
                REBSER* i;
                w = RXA_PAIR(frm,1).x;
                h = RXA_PAIR(frm,1).y;
                i = RL_MAKE_IMAGE(w,h);
                img = (REBYTE *)RL_SERIES(i, RXI_SER_DATA);

                RXA_TYPE(frm, 1) = RXT_IMAGE;
                RXA_ARG(frm, 1).width = w;
                RXA_ARG(frm, 1).height = h;
                RXA_ARG(frm, 1).image = i;
            }
            Draw_Image(img, w, h, RXA_SERIES(frm, 2));
            return RXR_VALUE;
        }
        break;

    case CMD_GRAPHICS_GUI_METRIC:
        {
            REBINT x,y;
            u32 w = RL_FIND_WORD(graphics_ext_words,RXA_WORD(frm, 1));

            switch(w)
            {
                case W_GRAPHICS_SCREEN_SIZE:
                    x = GetSystemMetrics(SM_CXSCREEN);
                    y = GetSystemMetrics(SM_CYSCREEN);
                    break;

                case W_GRAPHICS_TITLE_SIZE:
                    x = 0;
                    y = GetSystemMetrics(SM_CYCAPTION);
                    break;

                case W_GRAPHICS_BORDER_SIZE:
                    x = GetSystemMetrics(SM_CXSIZEFRAME);
                    y = GetSystemMetrics(SM_CYSIZEFRAME);
                    break;

                case W_GRAPHICS_BORDER_FIXED:
                    x = GetSystemMetrics(SM_CXFIXEDFRAME);
                    y = GetSystemMetrics(SM_CYFIXEDFRAME);
                    break;

                case W_GRAPHICS_WORK_ORIGIN:
                    {
                        RECT rect;
                        SystemParametersInfo(SPI_GETWORKAREA, 0, &rect, 0);
                        x = rect.left;
                        y = rect.top;
                    }
                    break;

                case W_GRAPHICS_WORK_SIZE:
                    {
                        RECT rect;
                        SystemParametersInfo(SPI_GETWORKAREA, 0, &rect, 0);
                        x = rect.right;
                        y = rect.bottom;
                    }
                    break;
            }

            if (w){
                RXA_PAIR(frm, 1).x = x;
                RXA_PAIR(frm, 1).y = y;
                RXA_TYPE(frm, 1) = RXT_PAIR;
            } else {
                RXA_TYPE(frm, 1) = RXT_NONE;
            }
            return RXR_VALUE;
        }
        break;

	case CMD_GRAPHICS_INIT:
		Gob_Root = (REBGOB*)RXA_SERIES(frm, 1); // system/view/screen-gob
		Gob_Root->size.x = (REBD32)GetSystemMetrics(SM_CXSCREEN);
		Gob_Root->size.y = (REBD32)GetSystemMetrics(SM_CYSCREEN);

		//Initialize text rendering context
		if (Rich_Text) Destroy_RichText(Rich_Text);
		Rich_Text = Create_RichText();

		break;

    case CMD_GRAPHICS_INIT_WORDS:
        //temp hack - will be removed later
        graphics_ext_words = RL_MAP_WORDS(RXA_SERIES(frm,1));
        break;

	default:
		return RXR_NO_COMMAND;
	}
    return RXR_UNSET;
}
예제 #2
0
RXIEXT int RX_Call(int cmd, RXIFRM *frm, REBCEC *ctx) {
	REBYTE *str;

	switch (cmd) {

	case 0:
		RXA_INT64(frm, 1) = 0;
		RXA_TYPE(frm, 1) = RXT_INTEGER;
		break;

	case 1:
		break; // same as arg

	case 2:
		RXA_INT64(frm, 1) = RXA_INT64(frm, 2);
		RXA_TYPE(frm, 1)  = RXA_TYPE(frm, 2);
		break;

	case 3:
		RXA_WORD(frm, 1) = RL_MAP_WORD("system"); //?? is frame always long enough??
		RXA_TYPE(frm, 1) = RXT_WORD;
		break;

	case 4:
		RL_GET_STRING(RXA_SERIES(frm, 1), 0, (void*)(&str)); // latin-1 only for test
		RXA_WORD(frm, 1) = RL_MAP_WORD(str);
		RXA_TYPE(frm, 1) = RXT_WORD;
		break;

	case 5:
		RXA_TYPE(frm, 1) = RL_GET_FIELD(RXA_OBJECT(frm, 1), RXA_WORD(frm, 2), &RXA_ARG(frm, 1));
		break;

	case 6:
		RXA_TYPE(frm, 1) = Test_Sync_Callback(RXA_OBJECT(frm, 1), RXA_WORD(frm, 2), &RXA_ARG(frm, 1));
		break;

	case 7:
		RXA_LOGIC(frm, 1) = Test_Async_Callback(RXA_OBJECT(frm, 1), RXA_WORD(frm, 2));
		RXA_TYPE(frm, 1) = RXT_LOGIC;
		break;

	case 8:
		RXA_TYPE(frm, 1) = RXT_IMAGE;
		RXA_SERIES(frm, 1) = RL_MAKE_IMAGE(2, 3);
		break;

	case 9:
		{
			REBCEC cec;
			cec.envr = 0;
			cec.block = RXA_SERIES(frm, 1);
			cec.index = 0;
			RL_DO_COMMANDS(RXA_SERIES(frm, 1), 0, &cec);
		}
		return RXR_UNSET;

	case 10:
		RXA_INT64(frm, 1) = (i64)(ctx ? ctx->index : -1);
		RXA_TYPE(frm, 1) = RXT_INTEGER;
		break;

	default:
		return RXR_NO_COMMAND;
	}
    return RXR_VALUE;
}