1b85a0aab6905af8b329539b7573a7555b727d5e5cdalton
2b85a0aab6905af8b329539b7573a7555b727d5e5cdalton/*
3b85a0aab6905af8b329539b7573a7555b727d5e5cdalton * Copyright 2014 Google Inc.
4b85a0aab6905af8b329539b7573a7555b727d5e5cdalton *
5b85a0aab6905af8b329539b7573a7555b727d5e5cdalton * Use of this source code is governed by a BSD-style license that can be
6b85a0aab6905af8b329539b7573a7555b727d5e5cdalton * found in the LICENSE file.
7b85a0aab6905af8b329539b7573a7555b727d5e5cdalton */
8b85a0aab6905af8b329539b7573a7555b727d5e5cdalton
9b85a0aab6905af8b329539b7573a7555b727d5e5cdalton#include "GrGLPathRange.h"
10b85a0aab6905af8b329539b7573a7555b727d5e5cdalton#include "GrGLPath.h"
11c7103a104fdc7150b4e3c0d3efc42735ad359616cdalton#include "GrGLPathRendering.h"
12b85a0aab6905af8b329539b7573a7555b727d5e5cdalton#include "GrGpuGL.h"
13b85a0aab6905af8b329539b7573a7555b727d5e5cdalton
14855d83ff79c6c822b2ad653f2f890178ad0f637bcdaltonGrGLPathRange::GrGLPathRange(GrGpuGL* gpu, PathGenerator* pathGenerator, const SkStrokeRec& stroke)
15855d83ff79c6c822b2ad653f2f890178ad0f637bcdalton    : INHERITED(gpu, pathGenerator, stroke),
16855d83ff79c6c822b2ad653f2f890178ad0f637bcdalton      fBasePathID(gpu->glPathRendering()->genPaths(this->getNumPaths())),
17855d83ff79c6c822b2ad653f2f890178ad0f637bcdalton      fGpuMemorySize(0) {
18855d83ff79c6c822b2ad653f2f890178ad0f637bcdalton    this->registerWithCache();
19855d83ff79c6c822b2ad653f2f890178ad0f637bcdalton}
20855d83ff79c6c822b2ad653f2f890178ad0f637bcdalton
21855d83ff79c6c822b2ad653f2f890178ad0f637bcdaltonGrGLPathRange::GrGLPathRange(GrGpuGL* gpu,
22855d83ff79c6c822b2ad653f2f890178ad0f637bcdalton                             GrGLuint basePathID,
23855d83ff79c6c822b2ad653f2f890178ad0f637bcdalton                             int numPaths,
24855d83ff79c6c822b2ad653f2f890178ad0f637bcdalton                             size_t gpuMemorySize,
25855d83ff79c6c822b2ad653f2f890178ad0f637bcdalton                             const SkStrokeRec& stroke)
26855d83ff79c6c822b2ad653f2f890178ad0f637bcdalton    : INHERITED(gpu, numPaths, stroke),
27855d83ff79c6c822b2ad653f2f890178ad0f637bcdalton      fBasePathID(basePathID),
28855d83ff79c6c822b2ad653f2f890178ad0f637bcdalton      fGpuMemorySize(gpuMemorySize) {
29855d83ff79c6c822b2ad653f2f890178ad0f637bcdalton    this->registerWithCache();
30b85a0aab6905af8b329539b7573a7555b727d5e5cdalton}
31b85a0aab6905af8b329539b7573a7555b727d5e5cdalton
32b85a0aab6905af8b329539b7573a7555b727d5e5cdaltonGrGLPathRange::~GrGLPathRange() {
33b85a0aab6905af8b329539b7573a7555b727d5e5cdalton    this->release();
34b85a0aab6905af8b329539b7573a7555b727d5e5cdalton}
35b85a0aab6905af8b329539b7573a7555b727d5e5cdalton
36855d83ff79c6c822b2ad653f2f890178ad0f637bcdaltonvoid GrGLPathRange::onInitPath(int index, const SkPath& skPath) const {
37b85a0aab6905af8b329539b7573a7555b727d5e5cdalton    GrGpuGL* gpu = static_cast<GrGpuGL*>(this->getGpu());
38b85a0aab6905af8b329539b7573a7555b727d5e5cdalton    if (NULL == gpu) {
39b85a0aab6905af8b329539b7573a7555b727d5e5cdalton        return;
40b85a0aab6905af8b329539b7573a7555b727d5e5cdalton    }
41b85a0aab6905af8b329539b7573a7555b727d5e5cdalton
42b85a0aab6905af8b329539b7573a7555b727d5e5cdalton    // Make sure the path at this index hasn't been initted already.
435b653577994fe298e08e5f7a5c1fa39fe53c9203kkinnunen    SkDEBUGCODE(
445b653577994fe298e08e5f7a5c1fa39fe53c9203kkinnunen        GrGLboolean isPath;
455b653577994fe298e08e5f7a5c1fa39fe53c9203kkinnunen        GR_GL_CALL_RET(gpu->glInterface(), isPath, IsPath(fBasePathID + index)));
465b653577994fe298e08e5f7a5c1fa39fe53c9203kkinnunen    SkASSERT(GR_GL_FALSE == isPath);
47b85a0aab6905af8b329539b7573a7555b727d5e5cdalton
48855d83ff79c6c822b2ad653f2f890178ad0f637bcdalton    GrGLPath::InitPathObject(gpu, fBasePathID + index, skPath, this->getStroke());
49855d83ff79c6c822b2ad653f2f890178ad0f637bcdalton
50855d83ff79c6c822b2ad653f2f890178ad0f637bcdalton    // TODO: Use a better approximation for the individual path sizes.
51855d83ff79c6c822b2ad653f2f890178ad0f637bcdalton    fGpuMemorySize += 100;
52b85a0aab6905af8b329539b7573a7555b727d5e5cdalton}
53b85a0aab6905af8b329539b7573a7555b727d5e5cdalton
54b85a0aab6905af8b329539b7573a7555b727d5e5cdaltonvoid GrGLPathRange::onRelease() {
5549f085dddff10473b6ebf832a974288300224e60bsalomon    SkASSERT(this->getGpu());
56b85a0aab6905af8b329539b7573a7555b727d5e5cdalton
57b85a0aab6905af8b329539b7573a7555b727d5e5cdalton    if (0 != fBasePathID && !this->isWrapped()) {
58855d83ff79c6c822b2ad653f2f890178ad0f637bcdalton        static_cast<GrGpuGL*>(this->getGpu())->glPathRendering()->deletePaths(fBasePathID,
59855d83ff79c6c822b2ad653f2f890178ad0f637bcdalton                                                                              this->getNumPaths());
60b85a0aab6905af8b329539b7573a7555b727d5e5cdalton        fBasePathID = 0;
61b85a0aab6905af8b329539b7573a7555b727d5e5cdalton    }
62b85a0aab6905af8b329539b7573a7555b727d5e5cdalton
63b85a0aab6905af8b329539b7573a7555b727d5e5cdalton    INHERITED::onRelease();
64b85a0aab6905af8b329539b7573a7555b727d5e5cdalton}
65b85a0aab6905af8b329539b7573a7555b727d5e5cdalton
66b85a0aab6905af8b329539b7573a7555b727d5e5cdaltonvoid GrGLPathRange::onAbandon() {
67b85a0aab6905af8b329539b7573a7555b727d5e5cdalton    fBasePathID = 0;
68b85a0aab6905af8b329539b7573a7555b727d5e5cdalton
69b85a0aab6905af8b329539b7573a7555b727d5e5cdalton    INHERITED::onAbandon();
70b85a0aab6905af8b329539b7573a7555b727d5e5cdalton}
71