From edf336499c33fd9f2abac3bd0277f6048cb2b03c Mon Sep 17 00:00:00 2001 From: Hajime Hoshi Date: Tue, 1 Nov 2016 23:28:24 +0900 Subject: [PATCH] affine: Revert ColorM implementation to use float64 array --- internal/affine/colorm.go | 142 ++++++++++++++++----------------- internal/affine/colorm_js.go | 46 ----------- internal/affine/colorm_nojs.go | 57 ------------- 3 files changed, 68 insertions(+), 177 deletions(-) delete mode 100644 internal/affine/colorm_js.go delete mode 100644 internal/affine/colorm_nojs.go diff --git a/internal/affine/colorm.go b/internal/affine/colorm.go index 8b70896c4..eb68ef439 100644 --- a/internal/affine/colorm.go +++ b/internal/affine/colorm.go @@ -16,48 +16,11 @@ package affine import ( "math" - - "github.com/hajimehoshi/ebiten/internal/endian" ) // ColorMDim is a dimension of a ColorM. const ColorMDim = 5 -func uint64ToBytes(value uint64) []uint8 { - result := make([]uint8, 8) - if endian.IsLittle() { - for i := 0; i < 8; i++ { - result[i] = uint8(value) - value >>= 8 - } - } else { - for i := 7; 0 <= i; i-- { - result[i] = uint8(value) - value >>= 8 - } - } - return result -} - -func colorMValueString(values [ColorMDim - 1][ColorMDim]float64) string { - b := make([]uint8, 0, (ColorMDim-1)*(ColorMDim)*8) - for i := 0; i < ColorMDim-1; i++ { - for j := 0; j < ColorMDim; j++ { - b = append(b, uint64ToBytes(math.Float64bits(values[i][j]))...) - } - } - return string(b) -} - -var ( - colorMIdentityValue = colorMValueString([ColorMDim - 1][ColorMDim]float64{ - {1, 0, 0, 0, 0}, - {0, 1, 0, 0, 0}, - {0, 0, 1, 0, 0}, - {0, 0, 0, 1, 0}, - }) -) - // A ColorM represents a matrix to transform coloring when rendering an image. // // A ColorM is applied to the source alpha color @@ -67,22 +30,48 @@ var ( // // The initial value is identity. type ColorM struct { - // when values is empty, this matrix is identity. - values string + initialized bool + es [(ColorMDim - 1) * (ColorMDim)]float64 } func (c *ColorM) dim() int { return ColorMDim } +func (c *ColorM) initialize() { + c.initialized = true + for i := 0; i < ColorMDim-1; i++ { + c.es[i*ColorMDim+i] = 1 + } +} + +// Element returns a value of a matrix at (i, j). +func (c *ColorM) Element(i, j int) float64 { + if !c.initialized { + if i == j { + return 1 + } + return 0 + } + return c.es[i*ColorMDim+j] +} + +// SetElement sets an element at (i, j). +func (c *ColorM) SetElement(i, j int, element float64) { + if !c.initialized { + c.initialize() + } + c.es[i*ColorMDim+j] = element +} + func (c *ColorM) Equals(other *ColorM) bool { - if c.values == "" { - c.values = colorMIdentityValue + if !c.initialized { + c.initialize() } - if other.values == "" { - other.values = colorMIdentityValue + if !other.initialized { + other.initialize() } - return c.values == other.values + return c.es == other.es } // Concat multiplies a color matrix with the other color matrix. @@ -130,20 +119,22 @@ var ( // Cr: [-0.5 - 0.5] rgbToYCbCr = ColorM{ - values: colorMValueString([ColorMDim - 1][ColorMDim]float64{ - {0.2990, 0.5870, 0.1140, 0, 0}, - {-0.1687, -0.3313, 0.5000, 0, 0}, - {0.5000, -0.4187, -0.0813, 0, 0}, - {0, 0, 0, 1, 0}, - }), + initialized: true, + es: [...]float64{ + 0.2990, 0.5870, 0.1140, 0, 0, + -0.1687, -0.3313, 0.5000, 0, 0, + 0.5000, -0.4187, -0.0813, 0, 0, + 0, 0, 0, 1, 0, + }, } yCbCrToRgb = ColorM{ - values: colorMValueString([ColorMDim - 1][ColorMDim]float64{ - {1, 0, 1.40200, 0, 0}, - {1, -0.34414, -0.71414, 0, 0}, - {1, 1.77200, 0, 0, 0}, - {0, 0, 0, 1, 0}, - }), + initialized: true, + es: [...]float64{ + 1, 0, 1.40200, 0, 0, + 1, -0.34414, -0.71414, 0, 0, + 1, 1.77200, 0, 0, 0, + 0, 0, 0, 1, 0, + }, } ) @@ -157,12 +148,13 @@ func (c *ColorM) ChangeHSV(hueTheta float64, saturationScale float64, valueScale sin, cos := math.Sincos(hueTheta) c.Concat(rgbToYCbCr) c.Concat(ColorM{ - values: colorMValueString([ColorMDim - 1][ColorMDim]float64{ - {1, 0, 0, 0, 0}, - {0, cos, -sin, 0, 0}, - {0, sin, cos, 0, 0}, - {0, 0, 0, 1, 0}, - }), + initialized: true, + es: [...]float64{ + 1, 0, 0, 0, 0, + 0, cos, -sin, 0, 0, + 0, sin, cos, 0, 0, + 0, 0, 0, 1, 0, + }, }) s := saturationScale v := valueScale @@ -184,24 +176,26 @@ func Monochrome() ColorM { // ScaleColor is deprecated as of 1.2.0-alpha. Use Scale instead. func ScaleColor(r, g, b, a float64) ColorM { return ColorM{ - values: colorMValueString([ColorMDim - 1][ColorMDim]float64{ - {r, 0, 0, 0, 0}, - {0, g, 0, 0, 0}, - {0, 0, b, 0, 0}, - {0, 0, 0, a, 0}, - }), + initialized: true, + es: [...]float64{ + r, 0, 0, 0, 0, + 0, g, 0, 0, 0, + 0, 0, b, 0, 0, + 0, 0, 0, a, 0, + }, } } // TranslateColor is deprecated as of 1.2.0-alpha. Use Translate instead. func TranslateColor(r, g, b, a float64) ColorM { return ColorM{ - values: colorMValueString([ColorMDim - 1][ColorMDim]float64{ - {1, 0, 0, 0, r}, - {0, 1, 0, 0, g}, - {0, 0, 1, 0, b}, - {0, 0, 0, 1, a}, - }), + initialized: true, + es: [...]float64{ + 1, 0, 0, 0, r, + 0, 1, 0, 0, g, + 0, 0, 1, 0, b, + 0, 0, 0, 1, a, + }, } } diff --git a/internal/affine/colorm_js.go b/internal/affine/colorm_js.go deleted file mode 100644 index bdbfcc2ce..000000000 --- a/internal/affine/colorm_js.go +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright 2016 The Ebiten Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// +build js - -package affine - -import ( - "github.com/gopherjs/gopherjs/js" -) - -// Element returns a value of a matrix at (i, j). -func (c *ColorM) Element(i, j int) float64 { - if c.values == "" { - if i == j { - return 1 - } - return 0 - } - a := js.NewArrayBuffer([]uint8(c.values)) - af64 := js.Global.Get("Float64Array").New(a) - return af64.Index(i*ColorMDim + j).Float() -} - -// SetElement sets an element at (i, j). -func (c *ColorM) SetElement(i, j int, value float64) { - if c.values == "" { - c.values = colorMIdentityValue - } - a := js.NewArrayBuffer([]uint8(c.values)) - a8 := js.Global.Get("Uint8Array").New(a) - af64 := js.Global.Get("Float64Array").New(a) - af64.SetIndex(i*ColorMDim+j, value) - c.values = string(a8.Interface().([]uint8)) -} diff --git a/internal/affine/colorm_nojs.go b/internal/affine/colorm_nojs.go deleted file mode 100644 index 672fdd89c..000000000 --- a/internal/affine/colorm_nojs.go +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright 2016 The Ebiten Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// +build !js - -package affine - -import ( - "math" - - "github.com/hajimehoshi/ebiten/internal/endian" -) - -// Element returns a value of a matrix at (i, j). -func (c *ColorM) Element(i, j int) float64 { - if c.values == "" { - if i == j { - return 1 - } - return 0 - } - offset := 8 * (i*ColorMDim + j) - v := uint64(0) - if endian.IsLittle() { - for k := 7; 0 <= k; k-- { - v <<= 8 - v += uint64(c.values[offset+k]) - } - } else { - for k := 0; k < 8; k++ { - v <<= 8 - v += uint64(c.values[offset+k]) - } - } - return math.Float64frombits(v) -} - -// SetElement sets an element at (i, j). -func (c *ColorM) SetElement(i, j int, value float64) { - if c.values == "" { - c.values = colorMIdentityValue - } - b := uint64ToBytes(math.Float64bits(value)) - offset := 8 * (i*ColorMDim + j) - c.values = c.values[:offset] + string(b) + c.values[offset+8:] -}