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

📄 jscanvasrenderingcontext2dcustom.cpp

📁 linux下开源浏览器WebKit的源码,市面上的很多商用浏览器都是移植自WebKit
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/* * Copyright (C) 2006, 2007 Apple Inc. All rights reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public License * along with this library; see the file COPYING.LIB.  If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */#include "config.h"#include "JSCanvasRenderingContext2D.h"#include "CanvasGradient.h"#include "CanvasPattern.h"#include "CanvasRenderingContext2D.h"#include "CanvasStyle.h"#include "ExceptionCode.h"#include "FloatRect.h"#include "HTMLCanvasElement.h"#include "HTMLImageElement.h"#include "ImageData.h"#include "JSCanvasGradient.h"#include "JSCanvasPattern.h"#include "JSHTMLCanvasElement.h"#include "JSHTMLImageElement.h"#include "JSImageData.h"#include <runtime/Error.h>using namespace JSC;namespace WebCore {static JSValuePtr toJS(ExecState* exec, CanvasStyle* style){    if (style->canvasGradient())        return toJS(exec, style->canvasGradient());    if (style->canvasPattern())        return toJS(exec, style->canvasPattern());    return jsString(exec, style->color());}static PassRefPtr<CanvasStyle> toHTMLCanvasStyle(ExecState*, JSValuePtr value){    if (value.isString())        return CanvasStyle::create(asString(value)->value());    if (!value.isObject())        return 0;    JSObject* object = asObject(value);    if (object->inherits(&JSCanvasGradient::s_info))        return CanvasStyle::create(static_cast<JSCanvasGradient*>(object)->impl());    if (object->inherits(&JSCanvasPattern::s_info))        return CanvasStyle::create(static_cast<JSCanvasPattern*>(object)->impl());    return 0;}JSValuePtr JSCanvasRenderingContext2D::strokeStyle(ExecState* exec) const{    return toJS(exec, impl()->strokeStyle());        }void JSCanvasRenderingContext2D::setStrokeStyle(ExecState* exec, JSValuePtr value){    impl()->setStrokeStyle(toHTMLCanvasStyle(exec, value));}JSValuePtr JSCanvasRenderingContext2D::fillStyle(ExecState* exec) const{    return toJS(exec, impl()->fillStyle());}void JSCanvasRenderingContext2D::setFillStyle(ExecState* exec, JSValuePtr value){    impl()->setFillStyle(toHTMLCanvasStyle(exec, value));}JSValuePtr JSCanvasRenderingContext2D::setFillColor(ExecState* exec, const ArgList& args){    CanvasRenderingContext2D* context = impl();    // string arg = named color    // number arg = gray color    // string arg, number arg = named color, alpha    // number arg, number arg = gray color, alpha    // 4 args = r, g, b, a    // 5 args = c, m, y, k, a    switch (args.size()) {        case 1:            if (args.at(exec, 0).isString())                context->setFillColor(asString(args.at(exec, 0))->value());            else                context->setFillColor(args.at(exec, 0).toFloat(exec));            break;        case 2:            if (args.at(exec, 0).isString())                context->setFillColor(asString(args.at(exec, 0))->value(), args.at(exec, 1).toFloat(exec));            else                context->setFillColor(args.at(exec, 0).toFloat(exec), args.at(exec, 1).toFloat(exec));            break;        case 4:            context->setFillColor(args.at(exec, 0).toFloat(exec), args.at(exec, 1).toFloat(exec),                                  args.at(exec, 2).toFloat(exec), args.at(exec, 3).toFloat(exec));            break;        case 5:            context->setFillColor(args.at(exec, 0).toFloat(exec), args.at(exec, 1).toFloat(exec),                                  args.at(exec, 2).toFloat(exec), args.at(exec, 3).toFloat(exec), args.at(exec, 4).toFloat(exec));            break;        default:            return throwError(exec, SyntaxError);    }    return jsUndefined();}    JSValuePtr JSCanvasRenderingContext2D::setStrokeColor(ExecState* exec, const ArgList& args){     CanvasRenderingContext2D* context = impl();    // string arg = named color    // number arg = gray color    // string arg, number arg = named color, alpha    // number arg, number arg = gray color, alpha    // 4 args = r, g, b, a    // 5 args = c, m, y, k, a    switch (args.size()) {        case 1:            if (args.at(exec, 0).isString())                context->setStrokeColor(asString(args.at(exec, 0))->value());            else                context->setStrokeColor(args.at(exec, 0).toFloat(exec));            break;        case 2:            if (args.at(exec, 0).isString())                context->setStrokeColor(asString(args.at(exec, 0))->value(), args.at(exec, 1).toFloat(exec));            else                context->setStrokeColor(args.at(exec, 0).toFloat(exec), args.at(exec, 1).toFloat(exec));            break;        case 4:            context->setStrokeColor(args.at(exec, 0).toFloat(exec), args.at(exec, 1).toFloat(exec),                                    args.at(exec, 2).toFloat(exec), args.at(exec, 3).toFloat(exec));            break;        case 5:            context->setStrokeColor(args.at(exec, 0).toFloat(exec), args.at(exec, 1).toFloat(exec),                                    args.at(exec, 2).toFloat(exec), args.at(exec, 3).toFloat(exec), args.at(exec, 4).toFloat(exec));            break;        default:            return throwError(exec, SyntaxError);    }        return jsUndefined();}JSValuePtr JSCanvasRenderingContext2D::strokeRect(ExecState* exec, const ArgList& args){     CanvasRenderingContext2D* context = impl();        if (args.size() <= 4)        context->strokeRect(args.at(exec, 0).toFloat(exec), args.at(exec, 1).toFloat(exec),                            args.at(exec, 2).toFloat(exec), args.at(exec, 3).toFloat(exec));    else        context->strokeRect(args.at(exec, 0).toFloat(exec), args.at(exec, 1).toFloat(exec),                            args.at(exec, 2).toFloat(exec), args.at(exec, 3).toFloat(exec), args.at(exec, 4).toFloat(exec));    return jsUndefined();    }JSValuePtr JSCanvasRenderingContext2D::drawImage(ExecState* exec, const ArgList& args){     CanvasRenderingContext2D* context = impl();    // DrawImage has three variants:    //     drawImage(img, dx, dy)    //     drawImage(img, dx, dy, dw, dh)    //     drawImage(img, sx, sy, sw, sh, dx, dy, dw, dh)    // Composite operation is specified with globalCompositeOperation.    // The img parameter can be a <img> or <canvas> element.    JSValuePtr value = args.at(exec, 0);    if (!value.isObject())        return throwError(exec, TypeError);    JSObject* o = asObject(value);        ExceptionCode ec = 0;    if (o->inherits(&JSHTMLImageElement::s_info)) {        HTMLImageElement* imgElt = static_cast<HTMLImageElement*>(static_cast<JSHTMLElement*>(o)->impl());        switch (args.size()) {            case 3:                context->drawImage(imgElt, args.at(exec, 1).toFloat(exec), args.at(exec, 2).toFloat(exec));

⌨️ 快捷键说明

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