1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/gfx/skia/trunk/src/svg/SkSVGGradient.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,114 @@ 1.4 + 1.5 +/* 1.6 + * Copyright 2006 The Android Open Source Project 1.7 + * 1.8 + * Use of this source code is governed by a BSD-style license that can be 1.9 + * found in the LICENSE file. 1.10 + */ 1.11 + 1.12 + 1.13 +#include "SkSVGGradient.h" 1.14 +#include "SkSVGParser.h" 1.15 +#include "SkSVGStop.h" 1.16 + 1.17 +SkSVGGradient::SkSVGGradient() { 1.18 +} 1.19 + 1.20 +SkSVGElement* SkSVGGradient::getGradient() { 1.21 + return this; 1.22 +} 1.23 + 1.24 +bool SkSVGGradient::isDef() { 1.25 + return true; 1.26 +} 1.27 + 1.28 +bool SkSVGGradient::isNotDef() { 1.29 + return false; 1.30 +} 1.31 + 1.32 +void SkSVGGradient::translate(SkSVGParser& parser, bool defState) { 1.33 + INHERITED::translate(parser, defState); 1.34 + // !!! no support for 'objectBoundingBox' yet 1.35 + bool first = true; 1.36 + bool addedFirst = false; 1.37 + bool addedLast = false; 1.38 + SkString offsets("["); 1.39 + SkString* lastOffset = NULL; 1.40 + for (SkSVGElement** ptr = fChildren.begin(); ptr < fChildren.end(); ptr++) { 1.41 + SkASSERT((*ptr)->getType() == SkSVGType_Stop); 1.42 + SkSVGStop* stop = (SkSVGStop*) *ptr; 1.43 + if (first && stop->f_offset.equals("0") == false) { 1.44 + addedFirst = true; 1.45 + offsets.append("0,"); 1.46 + } 1.47 + SkString* thisOffset = &stop->f_offset; 1.48 + if (lastOffset && thisOffset->equals(*lastOffset)) { 1.49 + if (thisOffset->equals("1")) { 1.50 + offsets.remove(offsets.size() - 2, 2); 1.51 + offsets.append(".999,"); 1.52 + } else { 1.53 + SkASSERT(0); // !!! need to write this case 1.54 + } 1.55 + } 1.56 + offsets.append(*thisOffset); 1.57 + if (ptr == fChildren.end() - 1) { // last 1.58 + if (stop->f_offset.equals("1") == false) { 1.59 + offsets.append(",1"); 1.60 + addedLast = true; 1.61 + } 1.62 + } else 1.63 + offsets.appendUnichar(','); 1.64 + first = false; 1.65 + lastOffset = thisOffset; 1.66 + } 1.67 + offsets.appendUnichar(']'); 1.68 + parser._addAttribute("offsets", offsets); 1.69 + if (addedFirst) 1.70 + parser.translate(*fChildren.begin(), defState); 1.71 + for (SkSVGElement** ptr = fChildren.begin(); ptr < fChildren.end(); ptr++) 1.72 + parser.translate(*ptr, defState); 1.73 + if (addedLast) 1.74 + parser.translate(*(fChildren.end() - 1), defState); 1.75 +} 1.76 + 1.77 +void SkSVGGradient::translateGradientUnits(SkString& units) { 1.78 + // !!! no support for 'objectBoundingBox' yet 1.79 + SkASSERT(strcmp(units.c_str(), "userSpaceOnUse") == 0); 1.80 +} 1.81 + 1.82 +void SkSVGGradient::write(SkSVGParser& parser, SkString& baseColor) { 1.83 + if (baseColor.c_str()[0] != '#') 1.84 + return; 1.85 + SkSVGPaint* saveHead = parser.fHead; 1.86 + parser.fHead = &fPaintState; 1.87 + parser.fSuppressPaint = true; 1.88 + SkString originalID(f_id); 1.89 + f_id.set("mask"); // write out gradient named given name + color (less initial #) 1.90 + f_id.append(baseColor.c_str() + 1); 1.91 + SkString originalColors; 1.92 + for (SkSVGElement** ptr = fChildren.begin(); ptr < fChildren.end(); ptr++) { 1.93 + SkSVGStop* colorElement = (SkSVGStop*) *ptr; 1.94 + SkString& color = colorElement->fPaintState.f_stopColor; 1.95 + originalColors.append(color); 1.96 + originalColors.appendUnichar(','); 1.97 + SkASSERT(color.c_str()[0] == '#'); 1.98 + SkString replacement; 1.99 + replacement.set("0x"); 1.100 + replacement.append(color.c_str() + 1, 2); // add stop colors using given color, turning existing stop color into alpha 1.101 + SkASSERT(baseColor.c_str()[0] == '#'); 1.102 + SkASSERT(baseColor.size() == 7); 1.103 + replacement.append(baseColor.c_str() + 1); 1.104 + color.set(replacement); 1.105 + } 1.106 + translate(parser, true); 1.107 + const char* originalPtr = originalColors.c_str(); // restore original gradient values 1.108 + for (SkSVGElement** ptr = fChildren.begin(); ptr < fChildren.end(); ptr++) { 1.109 + SkSVGStop* color = (SkSVGStop*) *ptr; 1.110 + const char* originalEnd = strchr(originalPtr, ','); 1.111 + color->fPaintState.f_stopColor.set(originalPtr, originalEnd - originalPtr); 1.112 + originalPtr = originalEnd + 1; 1.113 + } 1.114 + f_id.set(originalID); 1.115 + parser.fSuppressPaint = false; 1.116 + parser.fHead = saveHead; 1.117 +}