зеркало из https://github.com/mozilla/pjs.git
#ifdef the whole file for Mac builds :S
This commit is contained in:
Родитель
9546182f05
Коммит
ad21b6fe26
|
@ -1,306 +0,0 @@
|
|||
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.0 (the "NPL"); you may not use this file except in
|
||||
* compliance with the NPL. You may obtain a copy of the NPL at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
||||
* for the specific language governing rights and limitations under the
|
||||
* NPL.
|
||||
*
|
||||
* The Initial Developer of this code under the NPL is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
||||
* Reserved.
|
||||
*/
|
||||
|
||||
/*
|
||||
* laydom.c - Parse CSS/DOM values, constructors and destructors for data storage
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#include "xp.h"
|
||||
#include "layout.h"
|
||||
#include "dom.h"
|
||||
#include "laydom.h"
|
||||
#include "laystyle.h"
|
||||
|
||||
JSBool
|
||||
lo_atoi(const char *str, uint32 *num, void *closure)
|
||||
{
|
||||
*num = XP_ATOI(str);
|
||||
return JS_TRUE;
|
||||
}
|
||||
|
||||
JSBool
|
||||
lo_SSUnitsToData(const char *str, uint32 *data, void *closure)
|
||||
{
|
||||
/* XXX NYI */
|
||||
*data = XP_ATOI(str);
|
||||
return JS_TRUE;
|
||||
}
|
||||
|
||||
JSBool
|
||||
FontWeightToData(const char *str, uint32 *data, void *closure)
|
||||
{
|
||||
uint32 weight;
|
||||
/* XXX use proper CSS-value parsing stuff */
|
||||
if (!strcasecomp(str, "bolder")) {
|
||||
weight = FONT_WEIGHT_BOLDER;
|
||||
} else if (!strcasecomp(str, "lighter")) {
|
||||
weight = FONT_WEIGHT_LIGHTER;
|
||||
} else if (!strcasecomp(str, "bold")) {
|
||||
weight = 700;
|
||||
} else if (!strcasecomp(str, "normal")) {
|
||||
weight = 400;
|
||||
} else {
|
||||
weight = XP_ATOI(str);
|
||||
weight -= weight % 100;
|
||||
}
|
||||
*data = weight;
|
||||
return JS_TRUE;
|
||||
}
|
||||
|
||||
#define SET_ATTR_BIT_IF(style, bit) \
|
||||
if (!strcasecomp(decors, style)) \
|
||||
attrs |= bit;
|
||||
|
||||
JSBool
|
||||
TextDecorationToData(const char *decors, uint32 *data, void *closure)
|
||||
{
|
||||
uint32 attrs = 0;
|
||||
/* XXX handle multiple tokens */
|
||||
SET_ATTR_BIT_IF(BLINK_STYLE, LO_ATTR_BLINK)
|
||||
else
|
||||
SET_ATTR_BIT_IF(STRIKEOUT_STYLE, LO_ATTR_STRIKEOUT)
|
||||
else
|
||||
SET_ATTR_BIT_IF(UNDERLINE_STYLE, LO_ATTR_UNDERLINE)
|
||||
else
|
||||
if (!strcasecomp(decors, "none"))
|
||||
attrs = 0;
|
||||
|
||||
*data = attrs;
|
||||
return JS_TRUE;
|
||||
}
|
||||
|
||||
#undef SET_ATTR_BIT_IF
|
||||
|
||||
JSBool
|
||||
PositionParser(const char *position, uint32 *data, void *closure)
|
||||
{
|
||||
if (!XP_STRCASECMP(position, ABSOLUTE_STYLE))
|
||||
*data = 0;
|
||||
else if (!XP_STRCASECMP(position, RELATIVE_STYLE))
|
||||
*data = 1;
|
||||
else
|
||||
*data = 2;
|
||||
return JS_TRUE;
|
||||
}
|
||||
|
||||
JSBool
|
||||
lo_ColorStringToData(const char *color, uint32 *data, void *closure)
|
||||
{
|
||||
LO_Color col;
|
||||
if (!LO_ParseStyleSheetRGB((char *)color, &col.red, &col.green, &col.blue))
|
||||
return JS_FALSE;
|
||||
*data = *(uint32 *)&col;
|
||||
return JS_TRUE;
|
||||
}
|
||||
|
||||
/*
|
||||
* Update LO_AdjustSSUnits() in laystyle.c to deal with DOM_StyleUnits
|
||||
*/
|
||||
|
||||
JSBool
|
||||
lo_ParseSSNum(const char *str, uint32 *num, DOM_StyleUnits *units)
|
||||
{
|
||||
const char *ptr, *num_ptr;
|
||||
|
||||
ptr = str;
|
||||
|
||||
/* skip any whitespace */
|
||||
while(XP_IS_SPACE(*ptr)) ptr++;
|
||||
|
||||
/* save a pointer to the first non white char */
|
||||
num_ptr = ptr;
|
||||
|
||||
/* go past any sign in front of the number */
|
||||
if(*ptr == '-' || *ptr == '+') ptr++;
|
||||
|
||||
/* go forward until a non number is encountered */
|
||||
while(XP_IS_DIGIT(*ptr)) ptr++;
|
||||
|
||||
/* go past a decimal */
|
||||
if(*ptr == '.') ptr++;
|
||||
|
||||
while(XP_IS_DIGIT(*ptr)) ptr++;
|
||||
|
||||
/* skip any whitespace between the number and units */
|
||||
while(XP_IS_SPACE(*ptr)) ptr++;
|
||||
|
||||
/*
|
||||
* no need to clear out the string at the end since
|
||||
* atof will do that for us, and writting to the string
|
||||
* will make us crash
|
||||
*
|
||||
* ptr_value = *ptr;
|
||||
* *ptr = '\0';
|
||||
* *ptr = ptr_value;
|
||||
*/
|
||||
*num = XP_ATOI(num_ptr);
|
||||
|
||||
if(!XP_STRNCASECMP(ptr, "em", 2))
|
||||
*units = STYLE_UNITS_EMS;
|
||||
else if(!XP_STRNCASECMP(ptr, "ex", 2))
|
||||
*units = STYLE_UNITS_EXS;
|
||||
else if(!XP_STRNCASECMP(ptr, "px", 2))
|
||||
*units = STYLE_UNITS_PXS;
|
||||
else if(!XP_STRNCASECMP(ptr, "pt", 2))
|
||||
*units = STYLE_UNITS_PTS;
|
||||
else if(!XP_STRNCASECMP(ptr, "pc", 2))
|
||||
*units = STYLE_UNITS_PCS;
|
||||
else if(!XP_STRNCASECMP(ptr, "in", 2))
|
||||
*units = STYLE_UNITS_INS;
|
||||
else if(!XP_STRNCASECMP(ptr, "cm", 2))
|
||||
*units = STYLE_UNITS_CMS;
|
||||
else if(!XP_STRNCASECMP(ptr, "mm", 2))
|
||||
*units = STYLE_UNITS_MMS;
|
||||
else if(!XP_STRNCMP(ptr, "%", 1))
|
||||
*units = STYLE_UNITS_PERCENT;
|
||||
else if(!*ptr)
|
||||
*units = STYLE_UNITS_REL;
|
||||
else
|
||||
*units = STYLE_UNITS_PXS;
|
||||
|
||||
return JS_TRUE;
|
||||
}
|
||||
|
||||
JSBool
|
||||
lo_ParseSSNumToData(const char *str, uint32 *data, void *closure)
|
||||
{
|
||||
struct SSUnitContext *argp = closure;
|
||||
int32 num;
|
||||
|
||||
if (!lo_ParseSSNum(str, &num, (DOM_StyleUnits *)&argp->units))
|
||||
return JS_FALSE;
|
||||
|
||||
if (argp->units == STYLE_UNITS_PERCENT) {
|
||||
num = argp->enclosingVal * num / 100;
|
||||
}
|
||||
|
||||
if (argp->axisAdjust == AXIS_X)
|
||||
num = FEUNITS_X(num, argp->context);
|
||||
else if (argp->axisAdjust == AXIS_Y)
|
||||
num = FEUNITS_Y(num, argp->context);
|
||||
|
||||
*data = num;
|
||||
|
||||
return JS_TRUE;
|
||||
}
|
||||
|
||||
/* XXX Merge with lo_ParseSSNum */
|
||||
|
||||
JSBool
|
||||
lo_ParseFontSize(const char *str, uint32 *num, DOM_StyleUnits *units)
|
||||
{
|
||||
const char *ptr, *num_ptr;
|
||||
double *value = XP_NEW(double);
|
||||
|
||||
if (!value)
|
||||
return JS_FALSE;
|
||||
|
||||
ptr = str;
|
||||
|
||||
/* skip any whitespace */
|
||||
while(XP_IS_SPACE(*ptr)) ptr++;
|
||||
|
||||
/* save a pointer to the first non white char */
|
||||
num_ptr = ptr;
|
||||
|
||||
/* go past any sign in front of the number */
|
||||
if(*ptr == '-' || *ptr == '+') ptr++;
|
||||
|
||||
/* go forward until a non number is encountered */
|
||||
while(XP_IS_DIGIT(*ptr)) ptr++;
|
||||
|
||||
/* go past a decimal */
|
||||
if(*ptr == '.') ptr++;
|
||||
|
||||
while(XP_IS_DIGIT(*ptr)) ptr++;
|
||||
|
||||
/* skip any whitespace between the number and units */
|
||||
while(XP_IS_SPACE(*ptr)) ptr++;
|
||||
|
||||
/*
|
||||
* no need to clear out the string at the end since
|
||||
* atof will do that for us, and writting to the string
|
||||
* will make us crash
|
||||
*
|
||||
* ptr_value = *ptr;
|
||||
* *ptr = '\0';
|
||||
* *ptr = ptr_value;
|
||||
*/
|
||||
*value = atof(num_ptr); /* Calculate value */
|
||||
*num = (int32)value; /* Save pointer to value in data */
|
||||
|
||||
if(!XP_STRNCASECMP(ptr, "em", 2))
|
||||
*units = STYLE_UNITS_EMS;
|
||||
else if(!XP_STRNCASECMP(ptr, "ex", 2))
|
||||
*units = STYLE_UNITS_EXS;
|
||||
else if(!XP_STRNCASECMP(ptr, "px", 2))
|
||||
*units = STYLE_UNITS_PXS;
|
||||
else if(!XP_STRNCASECMP(ptr, "pt", 2))
|
||||
*units = STYLE_UNITS_PTS;
|
||||
else if(!XP_STRNCASECMP(ptr, "pc", 2))
|
||||
*units = STYLE_UNITS_PCS;
|
||||
else if(!XP_STRNCASECMP(ptr, "in", 2))
|
||||
*units = STYLE_UNITS_INS;
|
||||
else if(!XP_STRNCASECMP(ptr, "cm", 2))
|
||||
*units = STYLE_UNITS_CMS;
|
||||
else if(!XP_STRNCASECMP(ptr, "mm", 2))
|
||||
*units = STYLE_UNITS_MMS;
|
||||
else if(!XP_STRNCMP(ptr, "%", 1))
|
||||
*units = STYLE_UNITS_PERCENT;
|
||||
else if(!*ptr)
|
||||
*units = STYLE_UNITS_REL;
|
||||
else
|
||||
*units = STYLE_UNITS_PXS;
|
||||
|
||||
return JS_TRUE;
|
||||
}
|
||||
|
||||
JSBool
|
||||
lo_ParseFontSizeToData(const char *str, uint32 *data, void *closure)
|
||||
{
|
||||
struct SSUnitContext *argp = closure;
|
||||
int32 num;
|
||||
|
||||
if (!lo_ParseFontSize(str, &num, (DOM_StyleUnits *)&argp->units))
|
||||
return JS_FALSE;
|
||||
|
||||
if (argp->units == STYLE_UNITS_PERCENT) {
|
||||
num = argp->enclosingVal * num / 100;
|
||||
}
|
||||
|
||||
if (argp->axisAdjust == AXIS_X)
|
||||
num = FEUNITS_X(num, argp->context);
|
||||
else if (argp->axisAdjust == AXIS_Y)
|
||||
num = FEUNITS_Y(num, argp->context);
|
||||
|
||||
*data = num;
|
||||
|
||||
return JS_TRUE;
|
||||
}
|
||||
|
||||
JSBool
|
||||
lo_DeleteFontSize(DOM_AttributeEntry *entry)
|
||||
{
|
||||
if (!entry)
|
||||
return JS_FALSE;
|
||||
|
||||
XP_FREEIF((double *)entry->data);
|
||||
return JS_TRUE;
|
||||
}
|
|
@ -1,82 +0,0 @@
|
|||
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.0 (the "NPL"); you may not use this file except in
|
||||
* compliance with the NPL. You may obtain a copy of the NPL at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
||||
* for the specific language governing rights and limitations under the
|
||||
* NPL.
|
||||
*
|
||||
* The Initial Developer of this code under the NPL is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
||||
* Reserved.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Perignon: parse style information to store in the DOM.
|
||||
*/
|
||||
|
||||
#ifndef LAY_DOM_H
|
||||
#define LAY_DOM_H
|
||||
|
||||
#define AXIS_NONE 0
|
||||
#define AXIS_X 1
|
||||
#define AXIS_Y 2
|
||||
|
||||
#define FONT_WEIGHT_BOLDER 0x10000
|
||||
#define FONT_WEIGHT_LIGHTER 0x20000
|
||||
|
||||
struct SSUnitContext {
|
||||
MWContext *context;
|
||||
uint32 enclosingVal;
|
||||
uint8 units;
|
||||
uint8 axisAdjust;
|
||||
};
|
||||
|
||||
typedef enum DOM_StyleUnits {
|
||||
STYLE_UNITS_UNKNOWN = -1,
|
||||
STYLE_UNITS_NONE,
|
||||
STYLE_UNITS_PERCENT,
|
||||
STYLE_UNITS_EMS,
|
||||
STYLE_UNITS_EXS,
|
||||
STYLE_UNITS_PTS, /* points */
|
||||
STYLE_UNITS_PXS, /* pixels */
|
||||
STYLE_UNITS_PCS,
|
||||
STYLE_UNITS_REL,
|
||||
STYLE_UNITS_INS, /* inches */
|
||||
STYLE_UNITS_CMS, /* centimeters */
|
||||
STYLE_UNITS_MMS, /* millimeters */
|
||||
} DOM_StyleUnits;
|
||||
|
||||
extern JSBool
|
||||
lo_atoi(const char *str, uint32 *num, void *closure);
|
||||
|
||||
extern JSBool
|
||||
lo_ColorStringToData(const char *color, uint32 *data, void *closure);
|
||||
|
||||
extern JSBool
|
||||
lo_SSUnitsToData(const char *units, uint32 *data, void *closure);
|
||||
|
||||
extern JSBool
|
||||
FontWeightToData(const char *str, uint32 *data, void *closure);
|
||||
|
||||
extern JSBool
|
||||
TextDecorationToData(const char *decors, uint32 *data, void *closure);
|
||||
|
||||
extern JSBool
|
||||
PositionParser(const char *position, uint32 *data, void *closure);
|
||||
|
||||
extern JSBool
|
||||
lo_ParseSSNumToData(const char *str, uint32 *data, void *closure);
|
||||
|
||||
extern JSBool
|
||||
lo_ParseFontSizeToData(const char *str, uint32 *data, void *closure);
|
||||
|
||||
extern JSBool
|
||||
lo_DeleteFontSize(DOM_AttributeEntry *entry);
|
||||
|
||||
#endif /* LAY_DOM_H */
|
Загрузка…
Ссылка в новой задаче