Skip to content

Commit 4e29576

Browse files
committed
Merge pull request cocos2d#2446 from VisualSJ/browser_version
Issue cocos2d#2417: Fixed EGLView
2 parents 84c2668 + fc7350d commit 4e29576

File tree

3 files changed

+106
-50
lines changed

3 files changed

+106
-50
lines changed

cocos2d/core/platform/CCEGLView.js

+100-40
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,60 @@ cc.DENSITYDPI_HIGH = "high-dpi";
3535
cc.DENSITYDPI_MEDIUM = "medium-dpi";
3636
cc.DENSITYDPI_LOW = "low-dpi";
3737

38+
cc.__BrowserGetter = {
39+
init: function(){
40+
this.html = document.getElementsByTagName("html")[0];
41+
},
42+
availWidth: function(frame){
43+
if(!frame || frame === this.html)
44+
return window.innerWidth;
45+
else
46+
return frame.clientWidth;
47+
},
48+
availHeight: function(frame){
49+
if(!frame || frame === this.html)
50+
return window.innerHeight;
51+
else
52+
return frame.clientHeight;
53+
},
54+
meta: {
55+
"width": "device-width",
56+
"user-scalable": "no"
57+
}
58+
};
59+
60+
switch(cc.sys.browserType){
61+
case cc.sys.BROWSER_TYPE_SAFARI:
62+
cc.__BrowserGetter.meta["minimal-ui"] = "true";
63+
break;
64+
case cc.sys.BROWSER_TYPE_CHROME:
65+
cc.__BrowserGetter.__defineGetter__("target-densitydpi", function(){
66+
return cc.view._targetDensityDPI;
67+
});
68+
case cc.sys.BROWSER_TYPE_UC:
69+
cc.__BrowserGetter.availWidth = function(frame){
70+
return frame.clientWidth;
71+
};
72+
cc.__BrowserGetter.availHeight = function(frame){
73+
return frame.clientHeight;
74+
};
75+
break;
76+
case cc.sys.BROWSER_TYPE_MIUI:
77+
cc.__BrowserGetter.init = function(view){
78+
if(view.__resizeWithBrowserSize) return;
79+
var resize = function(){
80+
view.setDesignResolutionSize(
81+
view._designResolutionSize.width,
82+
view._designResolutionSize.height,
83+
view._resolutionPolicy
84+
);
85+
window.removeEventListener("resize", resize, false);
86+
};
87+
window.addEventListener("resize", resize, false);
88+
};
89+
break;
90+
}
91+
3892
/**
3993
* cc.view is the singleton object which represents the game window.<br/>
4094
* It's main task include: <br/>
@@ -102,6 +156,9 @@ cc.EGLView = cc.Class.extend(/** @lends cc.view# */{
102156
*/
103157
ctor: function () {
104158
var _t = this, d = document, _strategyer = cc.ContainerStrategy, _strategy = cc.ContentStrategy;
159+
160+
cc.__BrowserGetter.init(this);
161+
105162
_t._frame = (cc.container.parentNode === d.body) ? d.documentElement : cc.container.parentNode;
106163
_t._frameSize = cc.size(0, 0);
107164
_t._initFrameSize();
@@ -205,8 +262,8 @@ cc.EGLView = cc.Class.extend(/** @lends cc.view# */{
205262

206263
_initFrameSize: function () {
207264
var locFrameSize = this._frameSize;
208-
locFrameSize.width = this._frame.clientWidth;
209-
locFrameSize.height = this._frame.clientHeight;
265+
locFrameSize.width = cc.__BrowserGetter.availWidth(this._frame);
266+
locFrameSize.height = cc.__BrowserGetter.availHeight(this._frame);
210267
},
211268

212269
// hack
@@ -234,14 +291,7 @@ cc.EGLView = cc.Class.extend(/** @lends cc.view# */{
234291
vp.name = "viewport";
235292
vp.content = "";
236293

237-
// For avoiding Android Firefox issue, to remove once firefox fixes its issue.
238-
if (cc.sys.isMobile && cc.sys.browserType == cc.sys.BROWSER_TYPE_FIREFOX) {
239-
viewportMetas = {"width": "device-width", "initial-scale": "1.0"};
240-
}else{
241-
viewportMetas = {"width": "device-width", "user-scalable": "no", "maximum-scale": "1.0", "initial-scale": "1.0"};
242-
}
243-
if(cc.sys.isMobile)
244-
viewportMetas["target-densitydpi"] = this._targetDensityDPI;
294+
viewportMetas = cc.__BrowserGetter.meta;
245295

246296
content = currentVP ? currentVP.content : "";
247297
for (var key in viewportMetas) {
@@ -250,7 +300,7 @@ cc.EGLView = cc.Class.extend(/** @lends cc.view# */{
250300
content += "," + key + "=" + viewportMetas[key];
251301
}
252302
}
253-
if(content != "")
303+
if(/^,/.test(content))
254304
content = content.substr(1);
255305

256306
vp.content = content;
@@ -494,46 +544,56 @@ cc.EGLView = cc.Class.extend(/** @lends cc.view# */{
494544
*/
495545
setDesignResolutionSize: function (width, height, resolutionPolicy) {
496546
// Defensive code
497-
if (isNaN(width) || width == 0 || isNaN(height) || height == 0) {
547+
if( !(width > 0 || height > 0) ){
498548
cc.log(cc._LogInfos.EGLView_setDesignResolutionSize);
499549
return;
500550
}
501-
var _t = this;
502-
_t.setResolutionPolicy(resolutionPolicy);
503-
var policy = _t._resolutionPolicy;
504-
if (policy)
505-
policy.preApply(_t);
506-
else {
551+
552+
this.setResolutionPolicy(resolutionPolicy);
553+
var policy = this._resolutionPolicy;
554+
if (!policy){
507555
cc.log(cc._LogInfos.EGLView_setDesignResolutionSize_2);
508556
return;
509557
}
558+
policy.preApply(this);
510559

511560
// Reinit frame size
512-
if (cc.sys.isMobile)
513-
_t._setViewPortMeta();
514-
_t._initFrameSize();
515-
_t._designResolutionSize = cc.size(width, height);
516-
_t._originalDesignResolutionSize = cc.size(width, height);
561+
if(cc.sys.isMobile)
562+
this._setViewPortMeta();
563+
564+
this._initFrameSize();
565+
566+
this._originalDesignResolutionSize.width = this._designResolutionSize.width = width;
567+
this._originalDesignResolutionSize.height = this._designResolutionSize.height = height;
568+
569+
var result = policy.apply(this, this._designResolutionSize);
517570

518-
var result = policy.apply(_t, _t._designResolutionSize);
519-
if (result.scale && result.scale.length == 2) {
520-
_t._scaleX = result.scale[0];
521-
_t._scaleY = result.scale[1];
571+
if(result.scale && result.scale.length == 2){
572+
this._scaleX = result.scale[0];
573+
this._scaleY = result.scale[1];
522574
}
523-
if (result.viewport) {
524-
var vp = _t._viewPortRect = result.viewport, visible = _t._visibleRect;
525-
visible.width = cc._canvas.width / _t._scaleX;
526-
visible.height = cc._canvas.height / _t._scaleY;
527-
visible.x = -vp.x/2 / _t._scaleX;
528-
visible.y = -vp.y/2 / _t._scaleY;
575+
576+
if(result.viewport){
577+
var vp = this._viewPortRect,
578+
vb = this._visibleRect,
579+
rv = result.viewport;
580+
581+
vp.x = rv.x;
582+
vp.y = rv.y;
583+
vp.width = rv.width;
584+
vp.height = rv.height;
585+
586+
vb.x = -vp.x / this._scaleX;
587+
vb.y = -vp.y / this._scaleY;
588+
vb.width = cc._canvas.width / this._scaleX;
589+
vb.height = cc._canvas.height / this._scaleY;
529590
}
530591

531592
// reset director's member variables to fit visible rect
532593
var director = cc.director;
533-
director._winSizeInPoints.width = _t._designResolutionSize.width;
534-
director._winSizeInPoints.height = _t._designResolutionSize.height;
535-
536-
policy.postApply(_t);
594+
director._winSizeInPoints.width = this._designResolutionSize.width;
595+
director._winSizeInPoints.height = this._designResolutionSize.height;
596+
policy.postApply(this);
537597
cc.winSize.width = director._winSizeInPoints.width;
538598
cc.winSize.height = director._winSizeInPoints.height;
539599

@@ -543,12 +603,12 @@ cc.EGLView = cc.Class.extend(/** @lends cc.view# */{
543603
director.setGLDefaultValues();
544604
}
545605

546-
_t._originalScaleX = _t._scaleX;
547-
_t._originalScaleY = _t._scaleY;
606+
this._originalScaleX = this._scaleX;
607+
this._originalScaleY = this._scaleY;
548608
// For editbox
549609
if (cc.DOM)
550610
cc.DOM._resetEGLViewDiv();
551-
cc.visibleRect && cc.visibleRect.init(_t._visibleRect);
611+
cc.visibleRect && cc.visibleRect.init(this._visibleRect);
552612
},
553613

554614
/**

cocos2d/core/platform/CCVisibleRect.js

+6-9
Original file line numberDiff line numberDiff line change
@@ -61,16 +61,13 @@ cc.visibleRect = {
6161
* @param {cc.Rect} visibleRect
6262
*/
6363
init:function(visibleRect){
64-
var view = cc.EGLView;
65-
var scaleX = view.getScaleX ? view.getScaleX() : 1;
66-
var scaleY = view.getScaleY ? view.getScaleY() : 1;
6764

68-
var w = this.width = visibleRect.width / scaleX;
69-
var h = this.height = visibleRect.height / scaleY;
70-
var l = visibleRect.x / scaleX,
71-
b = visibleRect.y / scaleY,
72-
t = (b + h) / scaleY,
73-
r = (l + w) / scaleX;
65+
var w = this.width = visibleRect.width;
66+
var h = this.height = visibleRect.height;
67+
var l = visibleRect.x,
68+
b = visibleRect.y,
69+
t = b + h,
70+
r = l + w;
7471

7572
//top
7673
this.topLeft.x = l;

cocos2d/core/scenes/CCLoaderScene.js

-1
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@ cc.LoaderScene = cc.Scene.extend({
4747

4848
// bg
4949
var bgLayer = self._bgLayer = new cc.LayerColor(cc.color(32, 32, 32, 255));
50-
bgLayer.setPosition(cc.visibleRect.bottomLeft);
5150
self.addChild(bgLayer, 0);
5251

5352
//image move to CCSceneFile.js

0 commit comments

Comments
 (0)