JDK14/Java14源码在线阅读

/*
 * Copyright (c) 2007, 2008, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.  Oracle designates this
 * particular file as subject to the "Classpath" exception as provided
 * by Oracle in the LICENSE file that accompanied this code.
 *
 * This code 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 General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */

#include <malloc.h>
#include <string.h>

#include "ShaderList.h"
#include "Trace.h"

/**
 * Creates a new ShaderInfo that wraps the given fragment program handle
 * and related data and stores it at the front of the provided ShaderList.
 * If the addition causes the ShaderList to outgrow its defined capacity,
 * the least-recently used item in the list (including its fragment program
 * object) will be disposed.
 */
void
ShaderList_AddProgram(ShaderList *programList,
                      jlong programID,
                      jint compType, jint compMode, jint flags)
{
    ShaderInfo *info;

    J2dTraceLn(J2D_TRACE_INFO, "ShaderList_AddProgram");

    // create new ShaderInfo
    info = (ShaderInfo *)malloc(sizeof(ShaderInfo));
    if (info == NULL) {
        J2dTraceLn(J2D_TRACE_ERROR,
                   "D3DContext_AddProgram: could not allocate ShaderInfo");
        return;
    }

    // fill in the information
    info->next = programList->head;
    info->programID = programID;
    info->compType = compType;
    info->compMode = compMode;
    info->flags = flags;

    // insert it at the head of the list
    programList->head = info;

    // run through the list and see if we need to delete the least
    // recently used item
    {
        int i = 1;
        ShaderInfo *prev = NULL;
        ShaderInfo *curr = info->next;
        while (curr != NULL) {
            if (i >= programList->maxItems) {
                prev->next = NULL;
                programList->dispose(curr->programID);
                free(curr);
                break;
            }
            i++;
            prev = curr;
            curr = curr->next;
        }
    }
}

/**
 * Locates a fragment program handle given a list of shader programs
 * (ShaderInfos), using the provided composite state and flags as search
 * parameters.  The "flags" parameter is a bitwise-or'd value that helps
 * differentiate one program for another; the interpretation of this value
 * varies depending on the type of shader (BufImgOp, Paint, etc) but here
 * it is only used to find another ShaderInfo with that same "flags" value.
 * If no matching program can be located, this method returns 0.
 */
jlong
ShaderList_FindProgram(ShaderList *programList,
                       jint compType, jint compMode, jint flags)
{
    ShaderInfo *prev = NULL;
    ShaderInfo *info = programList->head;

    J2dTraceLn(J2D_TRACE_INFO, "ShaderList_FindProgram");

    while (info != NULL) {
        if (compType == info->compType &&
            compMode == info->compMode &&
            flags == info->flags)
        {
            // it's a match: move it to the front of the list (if it's not
            // there already) and patch up the links
            if (info != programList->head) {
                prev->next = info->next;
                info->next = programList->head;
                programList->head = info;
            }
            return info->programID;
        }
        prev = info;
        info = info->next;
    }

/**代码未完, 请加载全部代码(NowJava.com).**/
展开阅读全文

关注时代Java

关注时代Java