⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 displaylist.cc

📁 linux下的flash播放器源程序
💻 CC
📖 第 1 页 / 共 2 页
字号:
    if ( y == h->y && (h->x >= start && h->x < end) )        h->hit = 1;}typedef struct {    FlashMovie *movie;    DisplayListEntry *bhit;} ButtonHit;static int button_hit(void *opaque, Program *prg, DisplayListEntry *e){    ButtonHit *h = (ButtonHit *) opaque;    HitTable hit_table;    FlashMovie *movie = h->movie;    Rect bb,boundary;    Matrix mat;    ButtonState save;    hit_table.x = movie->mouse_x;    hit_table.y = movie->mouse_y / FRAC;    hit_table.hit = 0;        // Compute the bounding box in screen coordinates    save = e->renderState;    e->renderState = stateHitTest;    e->character->getBoundingBox(&boundary,e);    e->renderState = save;    mat = (*movie->gd->adjust) * e->renderMatrix;    transformBoundingBox(&bb, &mat, &boundary, 1);    // Check if mouse is within bb    if (movie->mouse_x < bb.xmin) return 0;    if (movie->mouse_x > bb.xmax) return 0;    if (movie->mouse_y < bb.ymin) return 0;    if (movie->mouse_y > bb.ymax) return 0;    e->character->getRegion(movie->gd, &e->renderMatrix,                             &hit_table, button_hit_func);                    if (hit_table.hit) {        h->bhit = e;        return 1;    } else {        return 0;    }}static int button_reset(void *opaque, Program *prg, DisplayListEntry *e){    if (e->renderState != stateUp) {	    e->owner->updateBoundingBox(e);	    e->oldState = e->renderState;	    e->renderState = stateUp;	    ((Button *)e->character)->updateButtonState(e);	    e->owner->updateBoundingBox(e);    }    return 0;}/* update the button states according to the current mouse state & return the list of actions */voidDisplayList::updateButtons(FlashMovie *movie){    DisplayListEntry *bhit;    ButtonHit h;    if (movie->mouse_active) {        h.bhit = NULL;        h.movie = movie;        exploreButtons(movie, &h, button_hit);        bhit = h.bhit;        /* set every button to not hit */        exploreButtons(movie, NULL, button_reset);        if (bhit) {	    ButtonState state;            if (movie->button_pressed) {                state = stateDown;            } else {                state = stateOver;            }	    if (state != bhit->renderState) {		    bhit->owner->updateBoundingBox(bhit);		    bhit->renderState = state;		    ((Button *)bhit->character)->updateButtonState(bhit);		    bhit->owner->updateBoundingBox(bhit);		    movie->cur_focus = bhit;		    if (movie->cursorOnOff)			    movie->cursorOnOff(1,movie->cursorOnOffClientData);	    }        } else {	    if (movie->cursorOnOff)		    movie->cursorOnOff(0,movie->cursorOnOffClientData);	}    }}typedef struct {    ActionRecord *action;	// Action to do    Program	 *prg;		// Context program} ButtonAction;static int button_action(void *opaque, Program *prg, DisplayListEntry *e){    ButtonAction *h = (ButtonAction *)opaque;    static ActionRecord actionRefresh;    static ActionRecord soundFx;    Button *b;    ActionRecord **paction;    int n;    actionRefresh.action = ActionRefresh;    actionRefresh.next = 0;        soundFx.action = ActionPlaySound;    soundFx.next = &actionRefresh;    b = (Button *)e->character;    if (e->oldState != e->renderState) {                paction = &actionRefresh.next;                if (b->conditionList) {            *paction = b->getActionFromTransition(e->renderState, e->oldState);        } else if (e->renderState == stateDown) {            /* if the button is pressed and                no condition list is defined*/            *paction = b->actionRecords;        }                switch(e->renderState) {        case stateUp:            n = 0;            break;        case stateOver:            n = 1;            break;        default:            /* case stateDown: */            n = 2;            break;        }                if (b->sound[n]) {            soundFx.sound = b->sound[n];            h->action = &soundFx;        } else {            h->action = &actionRefresh;        }                e->oldState = e->renderState;        h->prg = prg;        return 2;    }    h->action = 0;	// Nothing to do about this    return 0;}int computeActions(FlashMovie *movie, Program **prg, ActionRecord **ar){    ButtonAction h;    h.action = NULL;    exploreButtons(movie, &h, button_action);    if (h.action) {    	*prg = h.prg;	*ar = h.action;	return 1;    }    return 0;}#define FOCUS_ZOOM       1.5/* in pixels */#define FOCUS_SIZE_MIN   50#define FOCUS_TRANSLATE  15intDisplayList::render(GraphicDevice *gd, Matrix *render_matrix, Cxform *cxform){	DisplayListEntry *e,*cur_focus;	int sprite = 0;	long n = 0;        Cxform cxf,*cxf1;	Rect bb,boundary;        cur_focus = NULL;	/*	if (isSprite == 0) {		if (this->bbox.xmin == LONG_MAX) return 0;		gd->updateClippingRegion(&this->bbox, render_matrix);		gd->clearCanvas();	}	*/	for (e = list; e; e = e->next)	{#if PRINT		printf("Character %3d @ %3d\n", e->character ? e->character->getTagId() : 0, e->depth);#endif		if (e->character) {			Matrix mat;			if (render_matrix) {				mat = *render_matrix;			}			if (e->matrix) {				mat = mat * (*e->matrix);			}                        /* fast clipping */			// If object boundaries are outside current clip region give up with rendering                        e->character->getBoundingBox(&boundary,e);                        if (boundary.xmin != LONG_MAX) {                            Matrix tmat;                            tmat = (*gd->adjust) * mat;                            transformBoundingBox(&bb, &tmat, &boundary, 1);                            bb.xmin = bb.xmin >> FRAC_BITS;                            bb.ymin = bb.ymin >> FRAC_BITS;                            bb.xmax = (bb.xmax + FRAC - 1) >> FRAC_BITS;                            bb.ymax = (bb.ymax + FRAC - 1) >> FRAC_BITS;                            if (bb.xmin >= gd->clip_rect.xmax ||                                bb.xmax <= gd->clip_rect.xmin ||                                bb.ymin >= gd->clip_rect.ymax ||                                bb.ymax <= gd->clip_rect.ymin) {                                continue;                            }                        }                        if (cxform == NULL) {                            cxf1 = e->cxform;                        }			else if (e->cxform == NULL) {                            cxf1 = cxform;                        }			else {                            cxf1 = &cxf;                            cxf.ra = cxform->ra * e->cxform->ra;                            cxf.ga = cxform->ga * e->cxform->ga;                            cxf.ba = cxform->ba * e->cxform->ba;                            cxf.aa = cxform->aa * e->cxform->aa;                                                        cxf.rb = (long)(cxform->ra * e->cxform->rb + cxform->rb);                            cxf.gb = (long)(cxform->ga * e->cxform->gb + cxform->gb);                            cxf.bb = (long)(cxform->ba * e->cxform->bb + cxform->bb);                            cxf.ab = (long)(cxform->aa * e->cxform->ab + cxform->ab);                        }                        if (e->character->isButton()) {                            Button *b = (Button *) e->character;                            e->renderMatrix = mat;                            if (e->renderState != stateUp && movie->mouse_active == 0) {                                cur_focus = e;				((Button *)e->character)->updateButtonState(e);                            }                            if (b->execute(gd, &mat, cxf1, e->renderState)) {				sprite = 1;                            }                        } else {                            if (e->character->execute(gd, &mat, cxf1)) {				sprite = 1;                            }                        }			n++;		}	}#if 0    {	/* display the bounding box (debug) */	Matrix tmat;	long x1,x2,y1,y2;	Color white;	white.red = 255;	white.green = white.blue = 0;	gd->setForegroundColor(white);	if (render_matrix) {		tmat = (*gd->adjust) * (*render_matrix);	} else {		tmat = *gd->adjust;	}	x1 = bbox.xmin;	y1 = bbox.ymin;	x2 = bbox.xmax;	y2 = bbox.ymax;	gd->drawLine(tmat.getX(x1,y1),tmat.getY(x1,y1),tmat.getX(x2,y1),tmat.getY(x2,y1),10*FRAC);	gd->drawLine(tmat.getX(x2,y1),tmat.getY(x2,y1),tmat.getX(x2,y2),tmat.getY(x2,y2),10*FRAC);	gd->drawLine(tmat.getX(x2,y2),tmat.getY(x2,y2),tmat.getX(x1,y2),tmat.getY(x1,y2),10*FRAC);	gd->drawLine(tmat.getX(x1,y2),tmat.getY(x1,y2),tmat.getX(x1,y1),tmat.getY(x1,y1),10*FRAC);	bbox.print();    }#endif        	// Reset clipping zone        bbox.reset();	return sprite;}voidDisplayList::getBoundary(Rect *bb){	DisplayListEntry *e;	Rect boundary;	bb->reset();	for (e = list; e; e = e->next)	{		if (e->character) {			e->character->getBoundingBox(&boundary,e);			transformBoundingBox(bb, e->matrix, &boundary, 0);		}	}}extern "C" {void dump_buttons(FlashHandle flashHandle){#if 0    Rect rect;    DisplayListEntry *e;    FlashMovie *movie;    movie = (FlashMovie *)flashHandle;    for (e = movie->first_button; e; e = e->next_button) {        computeBBox(movie,&rect,e);        printf("button: id=%d pos=%d %d %d %d\n",               e->character->getTagId(),               rect.xmin, rect.ymin, rect.xmax, rect.ymax);    }#endif}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -